Đang tải... (xem toàn văn)
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
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HCM KHOA ĐÀO TẠO CHẤT LƯỢNG CAO Phan Minh Quân 21161353 Phan Thị Lan Hương 21161322 Mã lớp: ICSD336764_22_2_07CLC Lớp thứ 4 tiết 123
Tp Hồ Chí Minh, tháng 5 năm 2023
Trang 3Ghi chú:
- Tỷ lệ %=100%: Mức độ phần trăm của từng thành viên tham gia - Trưởng nhóm: Lâm Đức Quan
Trang 4CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 3
2.1 Giới thiệu về chuẩn giao tiếp UART 3
2.1.1 Khái niệm về UART 3
2.1.2 Thông số cơ bản và khung truyền dữ liệu 4
2.1.3 Chức năng và ứng dụng của UART 6
2.1.3.1 Chức năng 6
2.1.3.2 Ứng dụng của UART trong truyền dữ liệu 6
2.2 Đặc điểm và nguyên lý hoạt động 8
2.2.1 Đặc điểm 8
2.2.2 Nguyên lý hoạt động của UART 8
CHƯƠNG 3: THIẾT KẾ GIAO THỨC UART 9
3.1 Sơ đồ khối thiết kế UART 9
3.2 Mô tả thiết kế bộ UART 9
Trang 53.3.4 Khối phát UART 13
3.3.4.1 Sơ lược 13
3.3.4.2 Hoạt động của bộ truyền UART 14
CHƯƠNG 4: ĐÁNH GIÁ QUA TEST BENCH 16
4.1 Mô hình test bench tổng quát 16
Trang 61
CHƯƠNG 1: TỔNG QUAN 1.1 Đặ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
1.2 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 Thực hiện thiết kế các khối của UART sử dụng ngôn ngữ Verilog 1.3 Nội dung nghiên cứu
Tìm hiểu vai trò, chức năng, và nguyên tắc hoạt động của từng khối UART Thiết kế kiểm thử 1 IC UART sử dụng ngôn ngữ mô tả phần cứng Verilog 1.4 Bố cục
Chương 1: Tổng quan Chương 2: Cơ sở lý thuyết
Trang 72 Chương 3: Thiết kế giao thức UART Chương 4: Đánh giá qua testbench 1.5.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
Trang 83
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 2.1 Giới thiệu về chuẩn giao tiếp UART
2.1.1 Khái niệm về 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 độ
Trang 94
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
Truyền nối tiếp hay song
Trang 105
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:
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)
Trang 1611
(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
3.2.3 Khối nhận UART 3.2.3.1 Sơ lược
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)
Trang 1712
- 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 Bộ nhận thực chất là một máy trạng thái Mealy với đầu ra của máy phụ thuộc vào trạng thái hiện tại và đầu vào Các đầu vào của bộ nhận (UART Receiver) gồm tín hiệu xung clock, reset, tín hiệu s_tick, và đường tín hiệu truyền rx Ngõ ra bộ nhận bao gồm dữ liệu ra song song và tín hiệu rx_done_tick
Tín hiệu s_tick là tín hiệu enable lấy mẫu từ ngõ ra bộ tao tốc độ truyền (Baud rate generator) với tần số tín hiệu phát bằng 16 lần tốc độ baud truyền dùng để cung cấp cho bộ nhận tốc độ lấy mẫu và nó đã được giải thích rõ ở mục Bộ tạo tốc độ Baud
Mạch hoạt động ở 4 trạng thái : (Idle), (Start), (Data) và (Stop):
- Trạng thái Idle: khi bộ nhận vừa nhận tín hiệu reset hoặc không có dữ liệu truyền tới, bộ nhận sẽ hoạt động ở trạng thái nhàn rỗi Sau khi nhận được tín hiệu 0 tức là bit 0 start ở đầu mỗi frame dữ liệu, bộ nhận sẽ chuyển đến trạng thái Start
- Trạng thái bắt đầu Start: khi hoạt động ở trạng thái start bộ nhận sẽ lấy mẫu 8 lần trong nửa chu kì xung của bit start để đảm bảo không phải tín hiệu nhiễu
Trang 1813
Nếu sau nửa chu kì xung tín hiệu vẫn là 0 thì bộ nhận sẽ chuyển đến trạng thái kế tiếp là dữ liệu (data) còn nếu không thì sẽ quay lại trạng thái nhàn rỗi (Idle)
- Trạng thái dữ liệu Data: Khi bộ nhận được chuyển đến hoạt động ở trạng thái Data, bộ nhận sẽ lấy mẫu 16 lần trong toàn thời gian nhận 1 bit dữ liệu để đảm bảo tính chính xác của tín hiệu nhận được Sau khi lấy mẫu đủ 16 lần và đảm bảo tín hiệu là ổn định thì bit dữ liệu sẽ được dịch vào thanh ghi Các bit dữ liệu được phát lần lượt từ bit LSB đến MSB của data và tín hiệu đi đến bộ nhận cũng đến lần lượt theo thứ tự từ LSB đến MSB Sau khi nhận biết đã thu được đầy thanh ghi dữ liệu tức là thu đủ dữ liệu, bộ thu sẽ chuyển đến trạng thái dừng (stop) - Trạng thái dừng (Stop): Khi hoạt động ở trạng thái dừng, bộ nhận sẽ lấy mẫu 1 bit stop cuối frame và sẽ quay lại trạng thái Idle khi kết thúc lấy mẫu vùng có độ rộng 1 xung clock Đồng thời cờ rx_done_tick cũng lưu giá trị 1 Dữ liệu vừa nhận được sẽ được ghi vào bộ đệm FIFO.
3.3.4 Khối phát UART 3.3.4.1 Sơ lược
Khối phát UART
Khối phát là khối còn lại trong 2 khối quan trọng nhất cấu thành UART (khối nhận và khối phát) Theo sơ đồ khối hệ thống con khối phát UART (UART Transmitting subsystem) hình bên dưới, khối bao gồm 3 thành phần chính:
Bộ phát (UART- Transmitter): mạch đóng gói và phát dữ liệ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
Trang 1914
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ộ phát (UART- Transmitter) là bộ phận chính của khối thực hiện việc nhận dữ liệu song song từ hệ thống thông qua bộ đệm FIFO, sau đó chuyển dữ liệu từ song song thành nối tiếp và thêm các bit parity kiểm tra lỗi cũng như đóng gói truyền thành một frame hoàn chỉnh và truyền nối tiếp trên đường dây
3.3.4.2 Hoạt động của bộ truyền UART
Nguyên lý hoạt động của bộ phát được thể hiện ở lưu đồ thuật toán bên dưới Bộ phát có thể được miêu tả dưới dạng máy trạng thái hoặc theo dạng hành vi với các chức năng tương tự Các đầu vào của bộ phát (UART Transmisstor) gồm tín hiệu xung clock, tín hiệu s_tick, các tín hiệu enable và thông báo trạng thái trống bộ đệm FIFO và đường tín hiệu truyền đi Ngõ ra bộ nhận bao gồm dữ liệu ra nối tiếp tx và tín hiệu tx_done_tick thông báo kết thúc truyền 1 frame
Tín hiệu s_tick được lấy từ Baud rate generator với tốc độ bằng tốc độ baud để
điều khiển tốc độ truyền dữ liệu và nguyên lí hoạt động đã được giải thích rõ ở mục Bộ tạo tốc độ Baud
Ban đầu khi FIFO trống cờ Enable sẽ tắt và chờ đến khi bộ đệm FIFO nhận được dữ liệu được gửi từ máy tính Sau khi bộ đệm không còn trống, cờ Enable bật lên 1, nếu tín hiệu Start cho phép mạch hoạt động cũng là 1 thì mạch sẽ vào trạng thái start và thanh ghi dữ liệu của bộ phát sẽ nạp dữ liệu từ bộ đệm FIFO vào, đồng thời tạo tín hiệu 0 trên đường truyền tương đương bit 0 start báo hiệu đầu frame truyền, cờ fsh tức tx_done_tick là thông báo kết thúc truyền xong 1 frame được gán 0 Sau đó dựa vào điều khiển của bộ Controller, tín hiệu start sau đó được đưa về 0 và bộ phát bắt đầu trạng thái phát Trong trường hợp bỏ đi bit parity không bắt buộc, bộ phát sẽ lần lượt gửi đi từng bit dữ liệu nối tiếp trong thanh ghi dữ liệu Đến khi hết dữ liệu thì bộ phátsẽ phát đi một bit 1 cuối tương đương với tín hiệu stop trong frame truyền Sau đó 1 chu kì xung clock thì cờ fsh
Trang 2015
sẽ lên 1 thông báo hoàn tất việc truyền dữ liệu Quá trình truyền 1 frame kết thúc và nếu còn dữ liệu trong bộ FIFO thì bộ điều khiển Controller
Trang 2116 CHƯƠNG 4: ĐÁNH GIÁ QUA TEST BENCH 4.1 Mô hình test bench tổng quát
Trang 2217 4.2.Kết quả
Trang 2318 4.3 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à 10001010
- 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.
Trang 2419
CHƯƠNG 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 5.1 Kết luận
Chúng em đã hoàn thiện quá trình thiết kế các module của UART theo các bước lên specification, phân tích yêu cầu, lên sơ đồ khối, lập sơ đồ chuyển trạng thái, sơ đồ thuật toán, lập trình verilog và kiểm thử Các kết quả mô phỏng thu được đã đáp ứng được yêu cầu đặt ra trước khi thiết kế
5.2 Hướng phát triển
Tuy thiết kế đã đáp ứng được yêu cầu ban đầu đặt ra nhưng để tối ưu hơn ta có thể thiết kế lõi UART có thêm 1 số tính năng:
Cấu hình tốc độ Baud và Data truyền trên cùng 1 thanh ghi
Thiết kế thanh ghi dịch để có thể truyền thêm bit Parity kiểm tra chẵn lẻ Thiết kế thêm 1 số tín hiệu báo việc truyền/nhận đang diễn ra
Thiết kế thêm một số chuẩn giao tiếp giữa UART với MCU và các thiết bị ngoại vi khác