UART truyền dữ liệu không đồng bộ, có nghĩa là không có tín hiệu xung clock để đồng bộ hóa đầu ra của các bit từ UART truyền đến việc lấy mẫu các bit bởi UART nhận.. Bộ nhận UART- Receiv
TỔNG QUAN
Đặt vấn đề
Ngày nay, khoa học và công nghệ đang phát triển mạnh mẽ, đạt được nhiều thành tựu trong mọi lĩnh vực, đặc biệt là lĩnh vực điện tử Ứng dụng của FPGA (Field Programmable Gate Arrays) là thiết bị lập trình thông dụng, lập trình cho các vi mạch bán dẫn nhỏ, công suất thấp để tạo ra các hệ thống điều khiển tự động và giải quyết nhiều bài toán phức tạp
Các giao thức truyền thông đóng một vai trò quan trọng trong việc tổ chức giao giữa các thiết bị Được thiết kế khác nhau tùy thuộc vào yêu cầu hệ thống, các giao thức này có các quy tắc cụ thể được thống nhất giữa các thiết bị để truyền dữ liệu thành công, điển hình là UART Các hệ thống nhúng, vi điều khiển và máy tính thường sử dụng UART như một dạng giao thức giao tiếp phần cứng giữa thiết bị với thiết bị Giao tiếp UART hiện được sử dụng trong nhiều ứng dụng để giao tiếp với các module như Wifi, Bluetooth, Arduino và các vi điều khiển khác Nó cũng là một tiêu chuẩn giao tiếp được sử dụng rộng rãi trong ngành công nghiệp Để tìm hiểu thêm về giao tiếp giữa các thiết bị số, chúng em chọn và nghiên cứu về UART và thực hiện thiết kế kiểm thử 1 IC UART bằng ngôn ngữ mô tả phần cứng Verilog.
Mục tiêu
Hiểu thế nào là UART
Nắm vững vai trò, chức năng của UART
Hiểu rõ cấu trúc, hoạt động và chức năng từng khối của UART.
Bố cục
Chương 2: Cơ sở lý thuyết
Chương 3: Thiết kế giao thức UART
Chương 4: Đánh giá qua testbench
Giới hạn
Do đề tài này chúng em chỉ thực hiện nghiên cứu lý thuyết và mô phỏng trên phần mềm Xilinx nên vẫn còn bị giới hạn ở phần thực hành trên kit test
CƠ SỞ LÝ THUYẾT
Giới thiệu về chuẩn giao tiếp UART
Theo định nghĩa, UART (Universal Asynchronous Receiver Transmitter) là một giao thức truyền thông phần cứng sử dụng giao tiếp nối tiếp không đồng bộ với tốc độ có thể định cấu hình UART truyền dữ liệu không đồng bộ, có nghĩa là không có tín hiệu xung clock để đồng bộ hóa đầu ra của các bit từ UART truyền đến việc lấy mẫu các bit bởi UART nhận Thay vì tín hiệu xung clock, UART truyền thêm các bit start và stop vào gói dữ liệu được chuyển Các bit này xác định điểm bắt đầu và điểm kết thúc của gói dữ liệu để UART nhận biết khi nào bắt đầu đọc các bit
Trong giao tiếp UART, hai UART giao tiếp trực tiếp với nhau UART truyền chuyển đổi dữ liệu song song từ một thiết bị điều khiển như CPU thành dạng nối tiếp, truyền nó nối tiếp đến UART nhận, sau đó chuyển đổi dữ liệu nối tiếp trở lại thành dữ liệu song song cho thiết bị nhận
Khi UART nhận phát hiện một bit start, nó bắt đầu đọc các bit đến ở một tần số cụ thể được gọi là tốc độ truyền (baud rate) Tốc độ truyền là thước đo tốc độ
4 truyền dữ liệu, được biểu thị bằng bit trên giây (bps – bit per second) Cả hai UART đều phải hoạt động ở cùng một tốc độ truyền Tốc độ truyền giữa UART truyền và nhận chỉ có thể chênh lệch khoảng 10% trước khi thời gian của các bit bị lệch quá xa
Cả hai UART cũng phải được cấu hình để truyền và nhận cùng một cấu trúc gói dữ liệu
2.1.2 Thông số cơ bản và khung truyền dữ liệu
Sơ đồ khung truyền UART
Số lượng dây sử dụng 2
Tốc độ truyền (Tốc độ baud)
Phương pháp truyền Bất đồng bộ
Truyền nối tiếp hay song song? Nối tiếp
Số lượng thiết bị chủ tối đa 1
Số lượng thiết bị tớ tối đa 1
Các thông số cơ bản cần nắm trong giao tiếp UART bao gồm:
Baud rate (tốc độ Baud): Khoảng thời gian để 1 bit được truyền đi Phải được cài đặt giống nhau ở cả phần gửi và nhận Các thông số tốc độ Baudrate thường hay sử dụng dể giao tiếp với máy tính là 1200, 2400, 4800, 9600, , 115200 IDLE( chế độ trống): lúc này tín hiệu luôn ở mức 1 khi dữ liệu trống, không có frame nào được truyền đi
Bit START: Để bắt đầu truyền dữ liệu, UART chuyển đường truyền từ mức
“1” xuống mức “0” trong một chu kỳ clock Khi đó, nó bắt đầu đọc các bit trong khung dữ liệu theo tần số của tốc độ truyền Đây là một bit bắt buộc cần có trong giao thức UART
Frame (khung truyền): Khung truyền quy định về mỗi lần truyền bao nhiêu Data: Dữ liệu để truyền đi có độ dài từ 5 bit đến 8 bit nếu dùng bit chẵn lẻ Nếu không dùng bit chẵn lẻ, data có thể dài đến 9 bit Thông thường, Bit có trọng số nhỏ nhất LSB được truyền trước sau đó đến bit MSB
Bit parity sẽ là phương án giúp UART nhận cho biết liệu có bất kỳ dữ liệu nào đã thay đổi trong quá trình truyền hay không Bit có thể bị thay đổi bởi bức xạ điện từ, tốc độ truyền không khớp hoặc truyền dữ liệu khoảng cách xa Sau khi UART nhận đọc khung dữ liệu, nó sẽ đếm số bit có giá trị là 1 và kiểm tra xem tổng số là số chẵn hay lẻ
Có 2 loại Parity đó là Parity chẵn (even parity) và parity lẻ (odd parity) Parity chẵn nghĩa là số bit 1 trong trong data truyền cùng với bit Parity luôn là số chẵn, ngược lại nếu Parity lẽ nghĩa là số bit 1 trong data truyền cùng với bit Parity luôn là số lẽ Bit Parity không phải là bit bắt buộc và vì thế chúng ta có thể loại bỏ bit này ra khỏi khung truyền
Bit stop: Ngược lại với bit start,bit Stop sẽ truyền mức “1”dùng để thông báo kết thúc quá trình truyền dữ liệu Bit stop có thể là 1; 1,5 hoặc 2 (là bit bắt buộc như Start bit)
(array-base), bộ đệm này được thực hiện dựa trên một mảng Kèm theo đó là 2 con trỏ Write và Read Mỗi khi nhận lệnh ghi, con trỏ pWrite sẽ ghi data vào bộ đệm, sau đó sẽ tăng lên 1 đơn vị Mỗi khi nhận lệnh đọc, con trỏ pRead sẽ tăng lên một Sau đó đọc giá trị từ bộ đệm ra Khi 1 con trỏ tới được cuối mảng, nó sẽ cuộn lại vị trí đầu tiên Đó là lý do vì sao gọi đây là bộ đệm vòng
Bộ đệm này gồm 2 cờ: empty (trống) và full (đầy)
- Cờ full: là trạng thái khi con trỏ ghi đã thực hiện ghi dữ liệu được một vòng tròn và gặp con trỏ đọc tại vòng tròn thứ 2 Nói cách khác, con trỏ đọc trùng với con trỏ ghi khi vòng quay con trỏ ghi lớn hơn con trỏ đọc 1 vòng Dữ liệu chưa được đọc ra mà đã có tín hiệu ghi vào ô nhớ đó Khi đó ta sẽ không được phép ghi dữ liệu vào nữa
- Cờ empty: là trạng thái con trỏ đọc trùng với con trỏ ghi khi cả 2 con trỏ cùng một vòng Dữ liệu chưa được ghi vào đã có tín hiệu đọc ra, xem như dữ liệu cũng bị mất
- Độ sâu của FIFO: tương ứng số phần tử tối đa mà FIFO có thể lưu trữ được
- Băng thông của FIFO: tương đương với kích thướng của một phần tử dữ liệu được đọc/viết trong một chu kỳ đọc/viết
Khối nhận là một trong hai khối quan trọng nhất cấu thành UART (khối nhận và khối phát)
- Bộ nhận (UART reveiver): mạch lấy dữ liệu thông qua quá trình lấy mẫu
- Bộ tạo tốc độ truyền (Baud rate generator): mạch tạo ra các tín hiệu enable lấy mẫu với tần số dựa vào tần số baud truyền
- Mạch giao diện (Interface circuit): mạch cung cấp bộ nhớ đệm và kiểm soát trạng thái để cho điều khiển truy xuất và xử lí dữ liệu
Bộ nhận (UART- Receiver) là bộ phận chính của khối thực hiện việc nhận dữ liệu nối tiếp từ đường truyền và kiểm tra, sau đó chuyển dữ liệu từ nối tiếp thành song song và đưa tới vi điều khiển hoặc máy tính
Mạch giao diện (Interface circuit): trong một hệ thống UART thường được xem như là một mạch ngoại vi để truyền dữ liệu nối tiếp và các hệ thống truy cập và điều khiển cũng như như nhận dữ liệu một cách định kì Vì thế mạch có 2 chức năng gồm tín hiệu thông báo có dữ liệu mới để tránh việc truy xuất dữ liệu bị trùng lập và cung cấp bộ nhớ đệm
3.2.3.2 Hoạt động của bộ nhận UART
Nguyên lý hoạt động của bộ nhận được thể hiện ở lưu đồ thuật toán bên dưới
THIẾT KẾ GIAO THỨC UART
Mô tả thiết kế bộ UART
4.1 Mô hình test bench tổng quát
ĐÁNH GIÁ QUA TEST BENCH
Kết quả
Nhận xét và đánh giá
Nhận xét về kết quả sau khi mô phỏng testbench và so sánh với lý thuyết:
- Kết quả mô phỏng trên testbench cho thấy khối nhận UART đã nhận dữ liệu nối tiếp và chuyển thành dữ liệu ra song song đúng như lý thuyết đã đề cập
Hệ thống đã truyền một dữ liệu 8 bit là số hex 8AH, tương ứng với số nhị phân là
10001010, hình ảnh testbench cho thấy khối nhận UART nhận đúng dữ liệu là
- Về tốc độ nhận: xét giữa khoảng thời gian khi nhận 1 bit từ 383.375us đến 434.575us (như trên ảnh), thời gian nhận 1 bit là (434.575 - 383.375)us = 51.2us, tức trong 1s có thể nhận được 1s/(51.2us) = 19531 bit So sánh với tốc độ baud đã chọn là 19200bps, tốc độ nhận ở khối nhận lại là 19531bps cho thấy có sai số giữa lý thuyết và thực nghiệm Mức sai số là ~1.72% Nguyên nhân của sai số này là do khi thực hiện chia để đếm mod lấy mẫu đã không lấy nguyên vẹn thương số mà chỉ lấy phần nguyên của thương Cụ thể, xung clock hệ thống là 10MHz, baud rate 19200, lấy mẫu 16 lần: (10MHz/(19200*16)) = 32.5520833 nhưng đếm mod chỉ lấy phần nguyên là 32 do đó dẫn đến sai số Thêm vào đó, sai số này càng lớn khi tốc độ baud được chọn càng lớn.