Báo cáo cuối kỳ thiết kế hệ thống và vi mạch tích hợp đề tài hệ thống truyền thông nối tiếp bất đồng bộ uart

39 6 0
Báo cáo cuối kỳ thiết kế hệ thống và vi mạch tích hợp đề tài  hệ thống truyền thông nối  tiếp bất đồng bộ uart

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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 1

BỘ 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 3

Ghi 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 4

CHƯƠ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 5

3.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 6

1

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 7

2 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 8

3

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 9

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

Truyền nối tiếp hay song

Trang 10

5

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 16

11

(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 17

12

- 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 18

13

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 19

14

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 20

15

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 21

16 CHƯƠNG 4: ĐÁNH GIÁ QUA TEST BENCH 4.1 Mô hình test bench tổng quát

Trang 22

17 4.2.Kết quả

Trang 23

18 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 24

19

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

Ngày đăng: 14/04/2024, 21:29

Tài liệu cùng người dùng

Tài liệu liên quan