Tải bản đầy đủ (.pdf) (41 trang)

Thiết kế kiểm thử UART bằng Verilog trên Xilinx ISE

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.94 MB, 41 trang )

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HỒ CHÍ MINH
KHOA ĐIỆN- ĐIỆN TỬ



BÁO CÁO CUỐI KÌ
MƠN: 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
MÃ MƠN HỌC: COOA335364
THỰC HIỆN: NHĨM 01
LỚP: THỨ 4 TIẾT 7- 9
GVHD: TS.PHẠM VĂN KHOA

Tp. Hồ Chí Minh, tháng 06 năm 2021
1


DANH SÁCH THÀNH VIÊN THAM GIA THỰC HIỆN ĐỀ TÀI
HỌC KỲ II NĂM HỌC 2020-2021
Nhóm: (Lớp thứ 4 – Tiết 7-9)
STT

HỌ VÀ TÊN SINH VIÊN MÃ SỐ SINH VIÊN

TỈ LỆ %
HỒN THÀNH

1



Trần Thành Luỹ

19119194

100%

2

Đinh Trường Ln

19119192

100%

3

Nguyễn Trọng Tín

19119226

100%

4

Nguyễn Thị Hồng Hiếu

19119177

100%


5

Đồn Huy Tài

19119217

100%

6

Trần Bạch Bảo Tín

19119227

100%

Ghi chú:

- Tỷ lệ % = 100%: Mức độ phần trăm của từng sinh viên tham gia.
- Trưởng nhóm: Đinh Trường Luân
Nhận xét của giáo viên
…………………………………………………………………………………….
…………………………………………………………………………………….

Ngày 12 tháng 06 năm 2021


MỤC LỤC
A. PHẦN MỞ ĐẦU..........................................................................................................1

1. Lý do chọn đề tài:...................................................................................................1
2. Mục đích:................................................................................................................1
3. Phương pháp nghiên cứu:...................................................................................... 1
B. NỘI DUNG.................................................................................................................. 2
1. Lý thuyết về giao thức UART:.............................................................................. 2
1.1 Khái niệm:..................................................................................................... 2
1.2 Sơ đồ giao tiếp và cách thức hoạt động của UART:.................................... 3
1.3 Các thông số cơ bản và khung truyền dữ liệu trong giao tiếp UART:.........4
2. Chức năng và ứng dụng của UART:..................................................................... 6
2.1 Vai trò và chức năng của chuẩn UART:.......................................................6
2.2 Ứng dụng của UART:....................................................................................6
3. Cấu trúc phần cứng UART và thiết kế kiểm thử UART sử dụng ngôn ngữ
Verilog trên phần mềm Xilinx ISE:...........................................................................7
3.1. Khối tạo tốc độ baud (Baud Rate Generator):............................................ 8
3.2 Bộ đệm FIFO (First In, First Out):.............................................................. 9
3.3 Khối phát UART (UART Transmitting subsystem):................................... 13
3.4 Khối nhận UART (UART Receiving subsystem):....................................... 22
C. PHẦN KẾT LUẬN.................................................................................................... 37
TÀI LIỆU THAM KHẢO.............................................................................................. 38


A. PHẦN MỞ ĐẦU
1. Lý do chọn đề tài:
Với sự phát triển mạnh mẽ của công nghệ điện tử đương đại, những vi mạch
bán dẫn có thể lập trình được đáp ứng kích thước nhỏ, cơng suất tiêu thụ thấp, tạo ra
các hệ thống điều khiển tự động ngày càng thơng minh hơn và giải quyết được nhiều
bài tốn phức tạp hơn, trong đó việc ứng dụng FPGA (Field Programmable Gate Array)
là thiết bị lập trình được, và là cơng nghệ đột phá mới nhất hiện nay.
Giao thức truyền thông đóng một vai trị quan trọng trong việc tổ chức giao tiếp
giữa các thiết bị. Nó được thiết kế theo nhiều cách khác nhau dựa trên các yêu cầu của

hệ thống và các giao thức này có một quy tắc cụ thể được thống nhất giữa các thiết bị
để việc truyền dữ liệu được thực hiện thành công và điển hình là giao thức UART. Các
hệ thống nhúng, vi điều khiển và máy tính hầu hết 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à thiết bị. Trong số các giao thức truyền thông
hiện có, UART chỉ sử dụng hai dây cho bên truyền và bên nhận. Có thể thấy trong
thực tế giao tiếp UART được sử dụng nhiều trong các ứng dụng để giao tiếp với các
module như: Wifi, Bluetooth, Xbee, module đầu đọc thẻ RFID với Raspberry Pi,
Arduino hoặc vi điều khiển khác. Đây cũng là chuẩn giao tiếp thông dụng và phổ biến
trong cơng nghiệp từ trước đến nay. Chính bởi những lý do trên và để hiểu thêm về
giao tiếp giữa các thiết bị số mà chúng em đã quyết định chọn và nghiên cứu về UART
cũng như thực hiện thiết kế kiểm thử 1 IC UART sử dụng ngôn ngữ mơ tả phần cứng
verilog.
2. Mục đích:


Hiểu thế nào là UART.



Nắm vững được 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.

3. Phương pháp nghiên cứu:



Nghiên cứu tài liệu.



Phân tích và tổng hợp lý thuyết.



Tra cứu trên Internet.



So sánh giữa lý thuyết và thực tiễn.
1


B. NỘI DUNG
1. Lý thuyết về giao thức UART:
1.1 Khái niệm:
UART (Universal Asynchronous Receiver Transmitter) gọi là bộ thu, phát dữ
liệu không đồng bộ nối tiếp. Truyền, nhận dữ liệu theo chuẩn UART có thể thực hiện
theo phương thức song công, hay bán song công. Bộ truyền UART làm nhiệm vụ phát
từng bit trong byte dữ liệu một cách tuần tự. Bộ thu UART chịu trách nhiệm lắp ghép
các bit này lại thành các byte hoàn chỉnh. Mỗi UART gồm có hai thanh ghi dịch, được
dùng làm thành phần cơ bản trong việc chuyển giữa nối tiếp sang song song và ngược
lại, nghĩa là bộ phát có nhiệm vụ chuyển đổi 1 byte dữ liệu từ song song sang nối tiếp
và thêm vào các bit start, stop để tạo thành khung truyền (frame). Dữ liệu truyền đi
được điều khiển bằng một xung clock gọi là tốc độ baud, ở bộ thu sẽ lấy mẫu các tín

hiệu, tập hợp lại và khơi phục tín hiệu gốc. Cơ chế lấy mẫu tín hiệu : một bộ thông tin
được chia thành 16 điểm lấy mẫu, điểm lấy mẫu tín hiệu là điểm giữa của bit thông
tin.
Truyền thông nối tiếp và song song:
- Truyền dữ liệu nối tiếp là truyền lần lượt từng bit trong byte dữ liệu, mỗi lần
gửi mất 1 xung clock.
- Trong giao tiếp dữ liệu nối tiếp, dữ liệu có thể được truyền qua một cáp hoặc
một đường dây ở dạng bit-bit và nó chỉ cần hai cáp. Truyền thơng dữ liệu nối tiếp
không đắt khi chúng ta so sánh với giao tiếp song song. Nó địi hỏi rất ít mạch cũng
như dây. Vì vậy, giao tiếp này rất hữu ích trong các mạch ghép so với giao tiếp song
song.
- Trong giao tiếp dữ liệu song song, dữ liệu có thể được truyền qua nhiều cáp
cùng một lúc. Truyền dữ liệu song song tốn kém nhưng rất nhanh, vì nó địi hỏi phần
cứng và cáp bổ sung. Các ví dụ tốt nhất cho giao tiếp này là máy in cũ, PCI, RAM, v.v.

2


- UART truyền dữ liệu khơng đồng bộ, có nghĩa là khơng có tín hiệu đồng hồ
để đồ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 đồng hồ, 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.
1.2 Sơ đồ giao tiếp và cách thức hoạt động của UART:
Hai đường dây mà mỗi thiết bị UART sử dụng để truyền dữ liệu đó là:
- Transmitter (chân Tx)
- Receiver (chân Rx)

Sơ đồ giao tiếp giữa 2 UART và cách thức hoạt động giữa chúng:
- Chân Tx (truyền) của một chip kết nối trực tiếp với chân Rx (nhận) của chip kia

và ngược lại. Thơng thường, q trình truyền sẽ diễn ra ở 3.3V hoặc 5V.
- UART sẽ truyền dữ liệu nhận được từ một bus dữ liệu (Data Bus). Bus dữ liệu
được sử dụng để gửi dữ liệu đến UART bởi một thiết bị khác như CPU, bộ nhớ hoặc
vi điều khiển. Dữ liệu được chuyển từ bus dữ liệu đến UART truyền ở dạng song song.
3


- Khi gửi trên chân Tx, UART đầu tiên sẽ dịch thông tin song song này thành
nối tiếp và truyền đến thiết bị nhận.
- UART thứ hai nhận dữ liệu này trên chân Rx của nó và biến đổi nó trở lại
thành song song để giao tiếp với thiết bị điều khiển của

nó.
1.3 Các thơng số cơ bản và khung truyền dữ liệu trong giao tiếp UART:
Các thông số cơ bản 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.
- Frame (khung truyền): Khung truyền quy định về mỗi lần truyền bao nhiêu bit.
- Start bit: Là bit đầu tiên được truyền trong 1 Frame. Báo hiệu cho thiết bị
nhận có một gói dữ liệu sắp đc truyền đến. Đây là bit bắt buộc.
- Data: Dữ liệu cần truyền. Bit có trọng số nhỏ nhất LSB được truyền trước sau
đó đến bit MSB.
- Parity bit: Kiểm tra dữ liệu truyền có đúng khơng. 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.
- Stop bit: Là 1 hoặc các bit báo cho thiết bị rằng các bit đã được gửi xong. Stop
bit có thể là 1; 1,5 hoặc 2. (là bit bắt buộc như Start bit)


4


Khung truyền dữ liệu UART
Trong khung truyền ta thấy được gồm có:
- Idle frame: Đường truyền UART ở mức “1”, để xác nhận hiện tại đường
truyền dữ liệu trống, không có frame nào đang được truyền đi.
- Break frame: Đường truyền UART ở mức “0”, để xác nhận hiện tại trên
đường truyền đang truyền dữ liệu, có frame đang được truyền đi.
- 2 tùy chọn frame truyền data gồm 9 bit và 8 bit:
+ Data frame gồm 9 bit: ban đầu sẽ xuất hiện 1 start bit là bit ở mức thấp để
báo hiệu cho thiết bị nhận có một gói dữ liệu sắp đc truyền đến. Sau đó sẽ có 1 data
frame truyền tới thì data ở đây có 9 bit có thể data của mình có 8 bit và thêm parity bit
thì data frame gồm 9 bit. Sau khi truyền xong data frame sẽ có stop bit là bit ở mức
cao để báo cho thiết bị rằng các bit đã gửi xong và tiếp tục là một data frame mới được
truyền tới với trình tự truyền như trên.
+ Data frame gồm 8 bit: ban đầu sẽ xuất hiện 1 start bit là bit ở mức thấp để
báo hiệu cho thiết bị nhận có một gói dữ liệu sắp đc truyền đến. Sau đó sẽ có 1 data
frame truyền tới. Sau khi truyền xong data frame sẽ có stop bit là bit ở mức cao để báo
cho thiết bị rằng các bit đã gửi xong và tiếp tục là một data frame mới được truyền tới
với trình tự truyền như trên.

5


2. Chức năng và ứng dụng của UART:
2.1 Vai trò và chức năng của chuẩn UART:
Chức năng chính của UART là truyền dữ liệu nối tiếp. Trong UART, giao tiếp
giữa hai thiết bị có thể được thực hiện theo hai cách là giao tiếp dữ liệu nối tiếp và

giao tiếp dữ liệu song song.
Có nghĩa rằng 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.
Từ chức năng trên nó đã góp phần làm nền vai trị vơ cùng quan trọng như các
hệ thống nhúng, vi điều khiển và máy tính hầu hết 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à thiết bị. Trong số các giao thức truyền thơng
hiện có, UART chỉ sử dụng hai dây cho bên truyền và bên nhận.
2.2 Ứng dụng của UART:
UART thường được sử dụng trong các bộ vi điều khiển cho các u cầu chính
xác và chúng cũng có sẵn trong các thiết bị liên lạc khác nhau như giao tiếp không dây,
thiết bị GPS, mô-đun Bluetooth và nhiều ứng dụng khác.
Các tiêu chuẩn truyền thông như RS422 & TIA được sử dụng trong UART
ngoại trừ RS232. Thông thường, UART là một IC riêng được sử dụng trong giao tiếp
nối tiếp UART.
UART khơng có cấp điện áp, vì vậy bạn có thể có nó ở mức 3,3 V hoặc 5 V,
tùy theo bộ vi điều khiển của bạn sử dụng (Các bộ vi điều khiển muốn giao tiếp qua
UART phải đồng ý về tốc độ truyền, tốc độ bit, vì chúng chỉ có các bit bắt đầu rơi
xuống để đồng bộ hóa).
Đối với liên lạc đường dài (Khơng phải hàng trăm mét), UART 5 V khơng đáng
tin cậy lắm, đó là lý do tại sao nó được chuyển đổi thành điện áp cao hơn, thường là
+12 V cho "0" và -12 V cho " 1 ". RS-232 chỉ định cấp điện áp Lưu ý rằng một số mức
điện áp này là âm và chúng cũng có thể đạt tới ± 15V. Độ xoay điện áp lớn hơn giúp
RS-232 có khả năng chống nhiễu tốt hơn (dù chỉ ở một mức độ nào đó). Một UART vi
điều khiển khơng thể tự tạo ra các mức điện áp như vậy. Điều này được thực hiện với

6



sự trợ giúp của một thành phần bổ sung: Trình điều khiển dịng RS-232. Một ví dụ
kinh điển về trình điều khiển dịng RS-232 là MAX 232.
Khơng có giao thức truyền thơng nào là hồn hảo, nhưng UART thực hiện khá
tốt những gì chúng làm. Dưới đây là một số ưu và nhược điểm để giúp bạn quyết định
xem có phù với sử dụng của chúng ta.
* Ưu điểm:


Chỉ sử dụng hai dây để truyền dữ liệu



Khơng cần tín hiệu đồng hồ



Có một bit chẵn lẻ để cho phép kiểm tra lỗi



Cấu trúc của gói dữ liệu có thể được thay đổi miễn là cả hai bên được thiết
lập cho nó



Phương pháp truyền đơn giản, giá thành thấp

* Nhược điểm:



Kích thước của khung dữ liệu được giới hạn tối đa là 9 bit



Khơng phù hợp với các hệ thống địi hỏi nhiều thiết bị chủ và tớ



Tốc độ truyền của mỗi UART phải nằm trong khoảng 10%

3. Cấu trúc phần cứng UART và thiết kế kiểm thử UART sử dụng ngôn ngữ
Verilog trên phần mềm Xilinx ISE:

Sơ đồ khối UART

7


3.1. Khối tạo tốc độ baud (Baud Rate Generator):
3.1.1. Sơ lược về bộ tạo tốc độ baud (Baud Rate Generator):
Bộ tạo tốc độ baud (Baud Rate Generator) tạo ra tín hiệu lấy mẫu có tần số
bằng đúng 16 lần tốc độ baud được chỉ định của UART. Để tránh làm giao các xung
đồng hồ và vi phạm nguyên tắc thiết kế đồng bộ, tín hiệu lấy mẫu phải hoạt động như
một chân enable thay vì xung đồng hồ đối với bộ thu UART.
Các tốc độ baud tiêu chuẩn của UART bao gồm 50, 75, 110, 300, 600, 1.200,
2.400, 4.800, 9.600, 14.400, 19.200, 38.400, 57.600, 115.200, 128.000 và 230.400,
460.800.
Lấy ví dụ đối với tốc độ baud là 19.200, tốc độ lấy mẫu phải là 307.200 (tức là
19.200*16). Với tốc độ xung Clock hệ thống là 10 MHz, bộ tạo tốc độ baud cần một
bộ đếm MOD-32 (10MHz/307.200).

Thông thường, xung Clock hệ thống có tần số rất cao, thay vì dùng một loạt các
bộ chia lớn để có được tốc độ truyền mong muốn, sẽ rẻ hơn nếu có một bộ chia lớn
duy nhất theo sau bởi một bộ chia nhỏ. Cách này sẽ hoạt động vì tần số UART tiêu
chuẩn là ước số của 2.
Ví dụ, cho tốc độ xung Clock hệ thống là 2.457.600, 2 ngõ ra mong muốn đạt
được là 9.600 baud hoặc 19.200 baud. Theo lẽ thông thường, ta cần 1 bộ đếm MOD128 cho ngõ ra 19.200 baud và 1 bộ đếm MOD-256 cho ngõ ra 9.600 baud. Thay vào
đó, ta có thể dùng 1 bộ đếm MOD-128 (tạo ngõ ra 19.200 baud) theo sau đó là 1 đếm
MOD-2 để lấy ngõ ra 9.600 baud.
3.1.2 Mô phỏng trên phần mềm Xilinx ISE:
module Baud_rate
#(parameter N = 6, //internal clock 10MHz, baud rate 19200, sampling 16x
M = 32 //dem mod 10MHz/(19200*16) = 32)
(
input wire clk, reset,
output wire tick
);
reg [N-1:0] q;
always @(posedge clk, posedge reset)
8


if (reset)
q <= 0;
else
q <= q + 1;
assign tick = (q == (M - 1)) ? 1'b1 : 1'b0;
Endmodule
3.2 Bộ đệm FIFO (First In, First Out):
3.2.1 Sơ lược về bộ đệm FIFO:
Bộ đệm FIFO Trong tính tốn và trong lý thuyết hệ thống, là một phương pháp

để tổ chức thao tác cấu trúc dữ liệu. Trong đó mục nhập cũ nhất (đầu tiên), hoặc 'đầu'
của hàng xếp, được xử lý đầu tiên. Quá trình xử lý như vậy tương tự như phục vụ mọi
người trong khu vực hàng đợi trên cơ sở ai đến trước được phục vụ trước, theo cùng
một trình tự mà họ đã đến cho tới đi của hàng đợi.
Bộ đệm FIFO thường được sử dụng trong các mạch điện tử để đệm và điều
khiển luồng giữa phần cứng và phần mềm. Ở dạng phần cứng, FIFO chủ yếu bao gồm
một tập hợp các con trỏ đọc và ghi, logic lưu trữ và điều khiển. Bộ nhớ có thể là bộ
nhớ truy cập ngẫu nhiên tĩnh (SRAM), flip-flops, chốt hoặc bất kỳ hình thức lưu trữ
phù hợp nào khác. Đối với các FIFO có kích thước khơng nhỏ, SRAM hai cổng
thường được sử dụng, trong đó một cổng dành riêng để ghi và cổng còn lại để đọc.
Có nhiều cách để tạo một bộ đệm FIFO, tuy nhiên cách được sử dụng trong bài
tập mô phỏng này là bộ FIFO vòng (array-base buffer). Như tên gọi của nó (arraybase), 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ữ

9


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.
Một FIFO có thể được nghĩ đến như là một đường hầm một chiều mà xe ô tô có
thể đi qua. Ở cuối đường hầm là một trạm thu phí. Khi cánh cổng mở ra, chiếc xe có
thể rời khỏi đường hầm. Nếu cánh cổng đó khơng mở ra và nhiều ô tô tiếp tục đi vào
đường hầm, cuối cùng đường hầm sẽ đầy xe. Điều này được gọi là tràn FIFO. Độ sâu
của FIFO có thể được coi là chiều dài của đường hầm. FIFO dài hơn thì càng có nhiều
dữ liệu có thể đi vào trước khi tràn. FIFO cũng có chiều rộng, đại diện cho chiều rộng
của dữ liệu (về số bit) đi vào FIFO.
- Độ 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.
Nhà thiết kế không bao giờ nên ghi dữ liệu để cho FIFO tràn. Do đó ln kiểm
tra cờ full của FIFO để đảm bảo có chỗ trống cho khung dữ liệu khác, nếu không sẽ
mất dữ liệu cũ. Nhà thiết kế cũng không bao giờ nên đọc từ một FIFO trống. Có thể
nhắc lại hai qui tắc cực ký quan trọng của FIFO là:
- Không bao giờ ghi vào một FIFO đầy (overflow);
- Không bao giờ đọc từ một FIFO trống (underflow).
Trạng thái EMPTY tương ứng khi con trỏ đọc Rptr trỏ tới cùng một vị trí với
con trỏ viết Wptr. Khi FIFO được reset, nó được thiết lập tới trạng thái này với con trỏ
Rptr và Wptr cùng trỏ tới ô nhớ địa chỉ 0.
Trạng thái FULL xảy ra khi giá trị Wptr + 1 = Rptr. Mặc dù trong

trường

hợp này mảng nhớ vẫn cịn một ơ nhớ (có địa chỉ tương ứng với giá trị của Wptr) chưa
được ghi dữ liệu, nhưng chúng ta không thể lưu dữ liệu tới nó. Điều này bởi vì sau khi

ghi dữ liệu tới ô nhớ này, giá trị của Wptr được tăng lên một 1 đơn vị và cùng trỏ tới
một ô nhớ với Rptr, và chúng ta không phân biệt được đây là trạng thái EMPTY hay
FULL.

10


Để tránh việc lãng phí một phần từ nhớ của FIFO khi ở trạng thái FULL, ta có
thể thêm vào một biến đếm (Data_Cnt) số ô nhớ của FIFO đang được sử dụng. Giá trị
của Data_Cnt được tăng 1 đơn vị sau mỗi thao tác viết tới FIFO, và được giảm đi một
đơn vị sau mỗi thao tác đọc dữ liệu từ FIFO. Trạng thái EMPTY và FULL sẽ được
quyết định dựa vào giá trị của Data_Cnt.
- Nếu Data_Cnt=0. FIFO ở trạng thái EMPTY.
- Nếu Data_Cnt=1, FIFO ở trạng thái FULL.
Về cơ bản, FIFO bên phát và FIFO bên thu là giống nhau, khác biệt duy nhất đó
là FIFO bên phát là FIFO thường đọc nên quan tâm cờ FULL nhiều hơn, trong khi đó
FIFO bên thu là FIFO thường ghi nên quan tâm đến cờ EMPTY hơn.
3.2.2 Mô phỏng trên phần mềm Xilinx ISE:

Lưu đồ giải thuật
Mã mô tả:
11


module FIFO
#(parameter w=8,s=4)
(empty,full,rd,wr,rs,wd,r);
input wire [w-1:0]wd;
input rd,wr,rs;
output reg empty,full;

output reg[w-1:0]r;
reg [w-1:0] mem [4**s-1:0];
reg[s-1:0] wpt;
reg[s-1:0] rpt;
always @ (posedge rd, posedge rs,posedge wr)
begin
if(rs)
begin
empty<=1;
full<=0;
wpt<=0;
rpt<=0;
end
else if (rd)
begin
if(rpt==wpt)
empty<=1;
if (~empty)
begin
r<=mem[rpt];
rpt<=rpt+1'b1;
full<=0;
end
12


end
else if(wr)
begin
if (wpt+1==rpt)

full<=1;
if (~full)
begin
mem[wpt]<=wd;
wpt<= wpt+1'b1;
empty<=0;
end
end
end
Endmodule
3.3 Khối phát UART (UART Transmitting subsystem):
3.3.1 Sơ lược:
Khối phát là một 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.
- 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.

13


Sơ đồ khối khối phát UART (UART Transmitting subsystem)
3.3.2 Giải thích hoạt động:

A. Bộ phát:
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 phần 3.1.
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át
sẽ 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 sẽ lên 1 thơng báo hồ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

14


tiếp tục cấp tín hiệu enable đồng thời phát tín hiệu Start lên 1 báo hiệu quá trình
chuyển đổi và gửi frame tiếp theo.
B. Mạch giao diện (Interface circuit):
Mạch giao diện bao gồm bộ điều khiển Controller và 1 bộ đếm FIFO. Nguyên

lý hoạt động của 2 thành phần phối hợp với nhau chặt chẽ. Bộ điều khiển bao gồm các
tín hiệu đầu vào là xung clock, tín hiệu fsh từ khối phát thông báo khi kết thúc việc
truyền 1 frame và cờ empty từ FIFO thơng báo tình trạng trống bộ đệm. Tín hiệu đầu
ra của bộ bao gồm tín hiệu enable là ngõ vào cho phép, ngõ này được nối với khối
Controler, khối Controller sẽ kiểm tra tình trạng dữ liệu của FIFO (trống hay không)
và dựa vào đó để cấp tín hiệu enable cho khối phát hoạt động, str là tín hiệu Start để
báo bắt đầu frame truyền mới và ngõ ra rd báo hiệu việc đọc tới FIFO.
- Khi FIFO trống thì tín hiệu enable sẽ là 0 không cho phép khối phát hoạt động
và ngược lại. Tín hiệu start str sẽ ln được ở 0 khi trong suốt quá trình khối phát đang
phát dữ liệu hoặc bộ đệm FIFO trống. Sau khi bộ đệm FIFO từ trống chuyển sang có
dữ liệu tín hiệu str sẽ lên 1 và thông báo bộ phát bắt đầu nhận, chuyển đổi tín hiệu và
truyền. Bên cạnh đó, sau mỗi kết thúc truyền 1 frame, khối phát sẽ tạo tín hiệu fsh tác
động làm str và rd đồng thời bật lên 1, phát tín hiệu yêu cầu đọc dữ liệu đang chờ từ
FIFO vào thanh ghi của bộ phát và tiến hành chu kỳ phát dữ liệu. Các hoạt động trên
tiếp tục diễn ra lặp lại và phối hợp với bộ phát tạo thành bộ phát (UART- Transmitter)
hoàn chỉnh.

15


Lưu đồ giải thuật khối phát (UART Transmitter)
3.3.3 Mô phỏng trên phần mềm Xillinx ISE:
UART_TRANSMITTER_SUBSYSTEM:
Interface (first cycle setup):
`timescale 1ns / 1ps
module Controller(fsh,empty,str,rd,enb,clk);
input wire clk,fsh,empty;
output reg str,rd,enb;
reg c;
always @*

begin
16


case(empty)
1'b0:
begin
enb=1;
if(c)
begin
rd=1;
str=1;
c=0;
end
else
begin
rd=0;
str=0;
end
if(fsh)
begin
rd=1;
str=1;
end
end
1'b1:
begin
c=1;
enb=0;
end

endcase
end
endmodule
Transmitter:
17


`timescale 1ns / 1ps
module Transmitter
#(parameter dbit=8, stop=1) //so bit data & bit stop
(tx,data,str,fsh,clk,enable);
input [dbit-1:0] data;
input clk,enable,str;
output reg tx,fsh;
reg [8:0] c;
reg [dbit-1:0] d;
always @(posedge clk)
if(enable)
case (str) //enable: tin hieu cho phep cap tu FIFO
1'b1:

//khoi tao va truyen bit start

begin
d<=data;
c<=9'b111111110;

//bien dem databit & stop bit

tx<=0;

fsh<=0;

//tin hieu bao hoan thanh phat 1 frame data

end
1'b0:

//truyen data

begin
if (c[8]) //data tu fifo duoc truyen noi tiep qua ngo ra tx
begin
tx<= d[0];
d<=d>>1;
c<=c<<1;
end
else

//chen them bit stop

begin
tx<=1;
if(tx)
18


fsh<=1;//tin hieu fsh len 1 thong bao hoan thanh viec
truyen toi fifo, fifo tao tin hieu enable va xuat frame du lieu tiep theo
end
end

endcase
endmodule
Complete UART_TRANSMITTER_SUBSYSTEM:
`timescale 1ns / 1ps
module Transmitter_subsystem(tx,clk,wd,wr,full,rs,EMPTY,fsh,str,rd);
input wire clk,wr,rs;
input wire [7:0] wd;
output wire full,tx,EMPTY,fsh,str,rd;
wire [7:0] net;
wire d;
FIFO B1(.wd(wd),.wr(wr),.full(full),.empty(EMPTY),.rd(rd),.r(net),.rs(rs));
Controller B2(.fsh(fsh),.enb(d),.str(str),.rd(rd),.empty(EMPTY),.clk(clk));
Transmitter B3(.tx(tx),.clk(clk),.str(str),.enable(d),.fsh(fsh),.data(net));
endmodule
Testbench và mô phỏng:
`timescale 1ns / 1ps
module sub_tb;
// Inputs
reg clk;
reg [7:0] wd;
reg wr;
reg rs;
// Outputs
19


wire tx;
wire full;
wire EMPTY;
wire fsh;

wire str;
wire rd;
// Instantiate the Unit Under Test (UUT)
Transmitter_subsystem uut (
.tx(tx),
.clk(clk),
.wd(wd),
.wr(wr),
.full(full),
.rs(rs),
.EMPTY(EMPTY),
.fsh(fsh),
.str(str),
.rd(rd)
);
initial begin
// Initialize Inputs
clk = 0;
wd = 0;
wr = 0;
rs = 0;
// Wait 100 ns for global reset to finish
#100;

20


// Add stimulus here
end
initial begin

forever #5 clk=~clk;
end
initial begin
#2 rs=1;
#5 rs=0;
#7 wr=1;
wd=8'b01001110;
#5
wr=0;
#10
wr=1;
wd=8'b01110110;
#5
wr=0;
#10
wr=1;
wd=8'b10110110;
#5 wr=0;
end
endmodule
Kết quả mô phỏng: -----------------------------------------------------------------------

21


Hoạt động phát 1 frame dữ liệu của UART.
3.4 Khối nhận UART (UART Receiving subsystem):
3.4.1 Sơ lược:
Khối nhận 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 nhận UART (UART Receiving

subsystem) hình bên dưới, tương tự khối phát cũng bao gồm 3 thành phần chính:
- 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. Có 3 phương pháp thường được dùng:
- Cờ FF (Flag FF)
22


×