Professional Documents
Culture Documents
123doc Bao Cao Do An Chuyen Nganh Thiet Ke Bo Truyen Nhan Uartva Bit Nap Tren Kit Fpga
123doc Bao Cao Do An Chuyen Nganh Thiet Ke Bo Truyen Nhan Uartva Bit Nap Tren Kit Fpga
123doc Bao Cao Do An Chuyen Nganh Thiet Ke Bo Truyen Nhan Uartva Bit Nap Tren Kit Fpga
ĐỀ TÀI:
Đà Nẵng, 2014
.............................................................................................................................................
.............................................................................................................................................
.............................................................................................................................................
.............................................................................................................................................
LỜI MỞ ĐẦU
Ngày nay, trong các hệ thống truyền dữ liệu có hai cách đưa tín hiệu lên đường
truyền: nối tiếp và song song. Cách truyền song song thường được truyền trên một
khoảng cách ngắn, ví dụ giữa các thiết bị trong cùng một phòng như từ máy tính sang
máy in. Cách truyền nối tiếp thường được thực hiện khi khoảng cách truyền khá xa.
Ngoài ra, trong cách truyền nối tiếp, dựa vào cách thực hiện sự đồng bộ giữa nơi
phát và thu ta có hai chế độ hoạt động: đồng bộvà bất đồng bộ. Trong chế độ bất đồng
bộ, xung đồng hồ được tạo ra một cách riêng rẻ ở máy phát và máy thu dựavào tần số
danh định tương ứng với vận tốc truyền (bit rate hoặc baud rate). Trong chế độ đồng
bộ, nơi phát có thể gửi xung đồng hồ tới nơi thu theo một kênh truyền song song với
kênh truyền dữ liệu hoặc nơi thu tự tạo ra xung đồng hồ bằng cách tách tín hiệu thời
gian từ dòng dữ liệu.
Trong đồ án này, tôi xin được trình bày về chuẩn truyền thông nối tiếp không
đồng bộ UART (Universal Asynchronous Receiver Transmitter). Vì truyền thông nối
tiếp có các ưu điểm sau:
- Khoảng cách truyền xa hơn truyền song song.
- Sốdây kết nối ít.
- Có thể truyền không dây dùng hồng ngoại.
- Có thể ghép nối với vi điều khiển hay PLC (Programmable Logic Device).
- Cho phép nối mạng.
- Có thể tháo lắp trong lúc máy tính đang làm việc.
MỤC LỤC
Truyền nối tiếp (serial transmission) các thông tin số hay bit thông qua một dây
đơn (single wire) hay một vật liệu trung gian nào đó thì tiết kiệm chi phí hơn nhiều so
với truyền song song dùng nhiều dây cùng một lúc. Truyền dữ liệu dùng UART có thể
thực hiện theo phương thức song công (full duplex) tức là việc gửi và nhận thực hiện
cùng một lúc, hay bán song công (half duplex), tức là các thiết bị thay phiên nhau phát
và nhận.
Bộ truyền UART 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.
Trong một vài kiểu UART, một bộ nhớ đệm nhỏ kiểu FIFO (First In First Out)
được đặt giữa thanh ghi dịch của bộ thu và bộ xử lý, việc làm này cho phép bộ xử lý có
nhiều thời gian hơn để thao tác trên dữ liệu nhằm hạn chế việc mất dữ liệu trong trường
hợp tốc độ xử lý của bộ xử lý chậm hơn quá trình nhận dữ liệu.
Bình thường, baud rate dùng để đo số bit thực sự được gửi trên kênh truyền chứ
không phải là lượng dữ liệu thực sự được gửi từ máy này sang máy khác.Việc tính
baud rate còn gồm cả những start bit, stop bit hay bit kiểm tra chẵn lẻ được tạo ra bởi
UART gửi nhưng bị loại bỏ bởi UART thu. Điều này có nghĩa rằng những từ dữ liệu có
độ dài 7 bit phải cần đến ít nhất 9 bit hoặc 10 bit (nếu có bit kiểm tra chẵn lẻ) để truyền
. Do đó, một modem có khả năng phát 300 bit trên giây từ nơi này sang nơi khác thì có
thể truyền 30 khung dữ liệu 7 bit nếu có dùng bit kiểm tra chẵn lẻ, 1 stop bit và 1 start
bit. Như vậy, số bit dữ liệu thực sự trong một giây của modem là 210 bit, số bit được
chèn thêm là 90 bit.
Thiết kế một bộ truyền bất đồng bộ theo chuẩn UART thử nghiệm trên KIT FPGA. Cụ
thể, thiết kế bộ truyền nối tiếp theo chuẩn UART (Universal Asynchronous Receiver
Transmitter) có các đặc điểm như sau: Cấu hình được tốc độ BAUD (tốc độ truyền dữ
liệu) theo công thức :
Trong đó: fbaud là tốc độ BAUD cần cấu hình, BRG là thanh ghi thiết lập tốc
độ baud có độ rộng 8 bit, fosc là tần số xung clock trong mạch.
Khung dữ liệu gồm: 1 start bit, 8 bit dữ liệu, 1 stop bit 8 bit dữ liệu cần truyền
có giá trị từ H00 đến HFF sẽ được chuyển đổi dạng mã ASCII trước khi truyền đi. Ví
dụ: Dữ liệu cần truyền là: H85 sẽ được đổi thành H38 (là mã ASCII của số 8) và
H35(là mã ASCII của số 5). Sau đó hai giá trị H38 và H35 sẽ được truyền đi qua
đường truyền nối tiếp.
2.1 Những yêu cầu của thiết kế :
- Tốc độ baud được chọn cố định trước khi tổng hợp thông qua biến BRG.
- Khung dữ liệu gồm 1 bit start, 8 bit dữ liệu, 1 bit stop.
- Truyền nhận song công (Dữ liệu được truyền đồng thời theo 2 hướng).
đã được tính ở khối BAUD RATE. Khối này có thêm bộ đệm FIFO 8 tầng để lưu tạm
dữ liệu và tránh mất mát dữ liệu.
Khối tạo tốc độ truyền (BAUD RATE): Dựa vào thông số tốc độ truyền được
cấu hình, khối này sẽ tính toán và tạo xung nhịp truyền dữ liệu khi phát và lấy mẫu dữ
liệu khi nhận.
Khối điều khiển và hiển thị (CONTROL DISPLAY): tiếp nhận tín hiệu điều
khiển tx_in để tạo ra tín hiệu cho phép khối truyền dữ liệu của UART hoạt động. Đồng
thời nhận các giá trị dữ liệu từ khối nhận dữ liệu của UART để giải mã LED 7 đoạn và
hiển thị kết quả.
Bốn khối trên sẽ được kết nối với nhau thành một thiết kế hoàn chỉnh ở file
core_uart.
Bộ cộng để tăng giá trị bộ đếm lên, bộ MUX để chọn các ngõ vào khác nhau
phụ thuộc vào giá trị của 2 tín hiệu set_tx_count và shift_en như hình vẽ, Flip Flop là
DFF để tạo thanh ghi lưu giá trị đếm. Bộ so sánh bằng để quyết định giá trị của tín hiệu
set_tx_count.
Bộ đếm để tạo tín hiệu tx_count[3:0], cứ khi nào dịch được 1 bit trong thanh ghi
tsr[9:0] thì giá trị bộ đếm tăng lên 1 .Khi tx_count = “1001” thì dữ liệu đã được truyền
xong.
Khối gồm các cổng logic: cổng AND4 để tạo tín hiệu shift_en cho phép dịch,
các bộ so sánh để tạo các tín hiệu tương ứng, bộ MUX để chọn các tín hiệu ngõ vào
dựa vào 2 tín hiệu shift_en và load_data, các DFF để tạo các thanh ghi tsr[9:0] vào tín
hiệu uart_tx.
Khối tạo thanh ghi dịch tsr 10 bit {gồm 1 bit start, 8 bit data_in, 1 bit stop) , khi
có xung brg_tx_clken và đủ các điều kiện như mô tả ở máy trạng thái thì dữ liệu trong
thanh ghi sẽ được dịch đến ngõ ra nối tiếp uart_tx của tín hiệu truyền cho tới khi truyền
hết 8 bit data_in.
Mạch gồm các bộ so sánh bằng để tạo các tín hiệu tương ứng trên hình vẽ, các
cổng OR2, AND2 để tạo tín hiệu inc_samp_count, bộ MUX để chọn các ngõ vào dựa
vào 2 tín hiệu inc_samp_count và clr_samp_count, thanh ghi DFF để tạo tín hiệu
samp_count[3:0].
Giá trị bộ đếm samp_count[3:0] sẽ tăng lên 1 khi các điều kiện của bộ MUX
được thỏa mãn.
Mạch đếm số bit nhận được:
Mạch gồm các bộ so sánh bằng để tạo các tín hiệu tương ứng trên hình vẽ, cỏng
AND3 để tạo tín hiệu inc_rx_count, bộ MUX để chọn các ngõ vào dựa vào 2 tín hiệu
inc_rx_count và set_comp, thanh ghi DFF để tạo tín hiệu rx_bitcount[3:0].
Khi nhận được 1 bit thì rx_bitcount[3:0] sẽ tăng lên 1. Khi đã nhận đủ 10 bit của
thanh ghi dịch tsr[9:0] thì bộ đếm sẽ được reset nhờ tín hiệu clr_rx_count.
Mạch gồm bộ MUX để chọn các ngõ vào dựa vào tín hiệu inc_rx_count, thanh
ghi DFF để tạo tín hiệu rsr[7:0]
Tạo thanh ghi dịch 8 bit rsr[7:0] để nhận 8 bit data_in từ thanh ghi dịch tsr[9:0]
bên khối truyền.Khi có tín hiệu cho phép dịch inc_rx_count thì dữ liệu trong thanh ghi
sẽ được dịch qua phải 1 bit để đưa vào FIFO nhận.
Việc nhấn và giữ một nút (KEY) sẽ tạo ra mức logic 1 kéo dài trong nhiều xung
clock hê thống.
Nếu ta đưa trực tiếp tín hiệu fifo_rd vào để xét điều kiện đọc FIFO thì sẽ
không chính xác và không kiểm soát được số lần đọc. Để một lần nhấn nút
tương ứng với một byte dữ liệu được đọc đi thì ta phải tạo ra tín hiệu cho phép
chỉ tích cực trong đúng một chu kỳ của xung clock hệ thống. Mạch trên đây sẽ
thực hiện điều đó.
Dạng sóng mô phỏng :
Sau 2 chu kì của tín hiệu fifo_rd thì phát hiện được cạnh của fifo_rd_enable.
FIFO 8 tầng nhận dữ liệu:
Khi FIFO chưa Full,dữ liệu từ thanh ghi rsr[7:0] sẽ được ghi vào FIFO nhờ con
trỏ cho phép ghi wptr[3:0] và tín hiệu fifo_we.
Dữ liệu đọc ra thanh ghi rc_data[7:0] chính là dữ liệu nhận được để hiển thị trên
LED 7 đoạn. Con trỏ cho phép đọc rptr[3:0] sẽ cho phép đọc dữ liệu ra từ FIFO.
Mạch tạo ra con trỏ dữ liệu wptr[3:0] và rptr[3:0] :
Khi có tín hiệu fifo_we =1 thì bộ đếm sẽ hoạt động và con trỏ wptr[3:0] sẽ tăng
lên 1.Khi có tín hiệu fifo_re =1 thì bộ đếm sẽ hoạt động và con trỏ rptr[3:0] sẽ tăng lên
1.
Mạch tạo các cờ báo trạng thái của FIFO:
Mạch gồm các cổng XOR2, AND2, bộ so sánh bằng để tạo các tín hiệu tương
ứng như hình vẽ.
Khi con trỏ wptr[2:0] = rptr[2:0] và bit có trọng số cao nhất wptr[3] khác rptr[3]
thì tín hiệu fifo_full = 1 ,cờ này báo hiệu FIFO đầy, không thể ghi thêm dữ liệu vào
FIFO.
Khi con trỏ wptr[2:0] = rptr[2:0] và bit có trọng số cao nhất wptr[3] giống
rptr[3] thì tín hiệu fifo_empty = 1 ,cờ này báo hiệu FIFO chưa đầy, có thể ghi thêm dữ
liệu vào FIFO.
Tốc độ baud được chọn gán trước khi tổng hợp thông qua biến BRG theo công
thức sau:
Mạch gồm bộ cộng để tăng giá trị đếm lên 1, cổng AND2, các bộ MUX để chọn
các giá trị ngõ vào khác nhau, bộ so sánh bằng, thanh ghi DFF để tạo tín hiệu
tx_count[15:0].
Khi có tín hiệu uart_en = 1, thì BRG sẽ được nạp vào ,bộ đếm sẽ bắt đầu đếm từ
0 cho tới khi tx_counter[15:0] = {16x(BRG + 1) -1} thì brg_tx_clken = 1.
Mạch gồm bộ cộng để tăng giá trị đếm lên 1, cổng AND2, các bộ MUX để chọn
các giá trị ngõ vào khác nhau, bộ so sánh bằng, thanh ghi DFF để tạo tín hiệu
rx_count[11:0].
Khi có tín hiệu uart_en = 1, thì BRG sẽ được nạp vào ,bộ đếm sẽ bắt đầu đếm từ
0 cho tới khi rx_counter[11:0] = BRG thì brg_rx_clken = 1.
Chức năng: giải mã 4 bit của rc_data thành 7 bit để hiện thị trên LED 7 đoạn
Việc nhấn và giữ một nút (KEY) sẽ tạo ra mức logic 1 kéo dài trong
nhiều xung clock hê thống.
Nếu ta đưa trực tiếp tín hiệu tx_in vào để xét điều kiện truyền thì sẽ
không chính xác và không kiểm soát được số lần truyền. Để một lần nhấn nút
tương ứng với một khung dữ liệu được truyền đi thì ta phải tạo ra tín hiệu cho
phép chỉ tích cực trong đúng một chu kỳ của xung clock hệ thống. Mạch trên
đây sẽ thực hiện điều đó.
Dạng sóng mô phỏng :
Sau 2 chu kì của tín hiệu tx_in thì phát hiện được cạnh của tx_enable.
• Test khối Control Dislay: quan sát dạng sóng các tín hiệu vào (rc_data_hex) /ra (hex)
của bộ giải mã Led 7 đoạn xem bộ giải mã đã hoạt động đúng chưa.
• Test khối Baud Rate: ta cấu hình 1 tốc độ baud cho uart truyền nhận bằng cách gán
cho BRG 1 giá trị.ví dụ BRG = 5,sau đó ta quan sát dạng sóng xem xung
truyền(brg_tx_clken) và nhận (brg_rx_clken) có đúng với tốc độ baud mình cấu hình
không.
• Test khối Transmitter: ta thử truyền dữ liệu với các trường hợp data_in khác nhau
,việc truyền dữ liệu sẽ được cho phép bởi tín hiệu tx_in.Ta sẽ bật(tắt) tín hiệu tx_in ở
các thời điểm khác nhau.Ta sẽ quan sát dạng sóng xem thanh ghi Shift_data(tsr) đã
dịch đúng với dữ liệu muốn truyền đi hay chưa.
• Test khối Receiver: việc ghi vào FIFO sẽ được thực hiện khi FIFO chưa full và có tín
hiệu cho phép ghi fifo_we. Kiểm tra xem thanh ghi nhận dữ liệu dịch(rsr) từ khối
Transmitter có dữ liệu hay chưa.Việc đọc ra từ FIFO sẽ được cho phép bởi tín hiệu
fifo_rd và khi FIFO không empty(có dữ liệu) .vì vậy ta sẽ bật (tắt) tín hiệu fifo_rd,rồi
quan sát dạng sóng xem rc_data có nhận được đúng dữ liệu truyền đi không.
Dữ liệu trên hex1,hex0 để hiển thị lần lượt byte cao và byte thấp của dữ liệu
nhận được rc_data,tín hiệu rc_data_hex1 = 1111(byte cao của rc_data) giải mã thành
hex1=0001110 ,tín hiệu rc_data_hex0(byte thấp của rc_data) giải mã thành
hex0=100000 .kết quả nhận được đúng với mạch giải mã Led 7 đoạn.
Vậy mạch giải mã Led 7 đoạn hoạt động đúng theo thiết kế .
Ta thấy khi tx_in=1 thì thanh ghi dữ liệu bắt đầu dịch (data_in = 11110000)
Thanh ghi dịch tsr có 10 bit(1 bit start=0,8 bit data_in,1 bit stop=1), dữ liệu dịch như
sau: 1111100000->1111110000->1111111000->1111111100->1111111110-
>1111111111.
Vậy thanh ghi dịch hoạt động đúng với thiết kế.Bộ truyền dữ liệu thông hoạt
động của thanh ghi dịch như vậy là đúng với thiết kế của bộ Transmitter.
Ta thấy dữ liệu đầu vào FIFO(rsr) và dữ liệu ra của FIFO(rc_data) bằng nhau
rsr=rc_data = 1111000 .dữ liệu này chính là dữ liệu data_in được thanh ghi dịch tsr
truyền đi.tín hiệu fifo_empty bật xuống 0 để báo hiệu FIFO đã nhận được dữ liệu.
Vậy FIFO ghi và đọc dữ liệu đúng với thiết kế.Khối Receiver nhận dữ liệu qua
FIFO đúng với thiết kế .
Kết luận:
SVTH: ĐỖ TIẾN THÀNH – LỚP 09DT2 Trang 28
Đồ án chuyên ngành
Dạng sóng mô phỏng đúng chức năng các khối của UART thiết kế.
Vậy thiết kế đúng với yêu cầu truyền- nhận bất đồng bộ dữ liệu 8 bit với tốc độ
baud cấu hình được.
Kit DE1 của hãng Altera là kit FPGA có đầy đủ các phần: Chip FPGA Cyclone
II, bộ nhớ SDRAM 8 Mbyte,SRAM 512 kbyte, bộ cấu hình gồm các 10 switch và 4
key, các cổng giao tiếp I/O, các led báo hiệu. Kit này dùng để nạp các thiết kế viết bằng
ngôn ngữ verilog hoặc VHDL lên để Demo kết quả.
Byte data hiển thị trên phần mềm Terminal khi truyền nhận :
Uart_tx:
Trạng thái ban đầu FIFO trống ,led báo Empty sáng:
Khi PC gửi đủ 8 byte data thì FIFO đầy ,Led báo Full sáng:
Read từng byte của FIFO,hiển thị dữ liệu trên Led 7 đoạn(mã Hex 0X61 tương ứng mã
ASCII của kí tự a)
Khi read byte cuối cùng thì led empty sáng:
1. Thuận lợi
Áp dụng được những kiến thức đang học về thiết kế vi mạch số vào thực tiễn.
Thiết kế đã nạp chạy được trên kit DE1 thành công,từ đó đã gúp tôi nắm được quy
trình thiết kế mạch số trên FPGA. Kit đã có sẵn nên giảm bớt chi phí mua linh kiện lắp
rắp mạch.
2. Khó khăn
Trong quá trình làm đồ án, tôi đã gặp phải khó khăn về việc nạp chạy thử trên
kit vì bước đầu làm quen với việc thiết kế mạch trên FPGA.
Không có kit DE1 nên việc thử tại nhà rất bất tiện.
PHỤ LỤC
Code Verilog HDL mô tả thiết kế
Dùng phần mềm Modelsim của Altera để viết code Verilog mô tả chi tiết từng khối.
reg uart_rx_sync_2;
wire tx_en;
// detection edge
wire fifo_rd_enable;
reg fifo_rd_sync;
reg fifo_rd_sync_2;
reg [3:0] rx_bitcount;
reg [3:0] samp_count;
reg [7:0] rsr;
reg [3:0] wptr;
reg [3:0] rptr;
reg [7:0] fifo_stage [7:0];
parameter IDLE = 2'b00;
parameter CHECK_START_BIT =2'b01;
parameter RECEIVE_DATA =2'b10;
reg [1:0] state;
reg [1:0] next_state;
assign set_comp = (rx_bitcount[3:0] == 4'b1001)?1'b1:1'b0;
assign fsm_receive = (state == RECEIVE_DATA)?1'b1:1'b0;
assign fsm_start_bit = (state == CHECK_START_BIT)?1'b1:1'b0;
assign clr_rx_count = set_comp;//(state == IDLE)?1'b1:1'b0;
assign sample_point = (samp_count[3:0] == 4'b0111)?1'b1:1'b0;
assign inc_rx_count = fsm_receive & brg_rx_clken & sample_point;
//assign rx_shift_en = set_comp & brg_rx_clken;
assign inc_samp_count = brg_rx_clken & (fsm_start_bit | fsm_receive);
assign clr_samp_count = clr_rx_count;
//assign receive_end = (rx_bitcount[3:0] == 4'b1010)?1'b1:1'b0;
assign fifo_we = uart_en & set_comp & (~fifo_full);
assign fifo_re = uart_en & fifo_rd_enable & (~fifo_empty);
assign fbit_comb = wptr[3] ^ rptr[3];
assign fbit_equal = (wptr[2:0] == rptr[2:0])?1'b1:1'b0;
assign fifo_full = fbit_comb & fbit_equal;
assign fifo_empty =( ~fbit_comb) & fbit_equal;
// detection edge
always @ (posedge clk or negedge reset_n) begin
if(~reset_n) begin
fifo_rd_sync <= 1'b1;
fifo_rd_sync_2 <= 1'b1;
end
else begin
fifo_rd_sync <= fifo_rd;
fifo_rd_sync_2 <= fifo_rd_sync;
end
SVTH: ĐỖ TIẾN THÀNH – LỚP 09DT2 Trang 37
Đồ án chuyên ngành
end
assign fifo_rd_enable = fifo_rd_sync_2 & (~fifo_rd_sync);
wire set_rx_counter;
assign set_tx_counter = uart_en & brg_tx_clken;
assign set_rx_counter = uart_en & brg_rx_clken;
always @ (posedge clk or negedge reset_n) begin
if(~reset_n) tx_counter <= 16'd0;
else if(set_tx_counter) tx_counter <= 16'd0;
else if(~set_tx_counter) tx_counter <= tx_counter + 16'd1;
end
assign brg_tx_clken = (tx_counter == ((BRG+1'b1)*5'd16)-1'b1)? 1'b1: 1'b0;
always @ (posedge clk or negedge reset_n) begin
if(~reset_n) rx_counter <= 12'd0;
else if(set_rx_counter) rx_counter <= 12'd0;
else if(~set_rx_counter) rx_counter <= rx_counter + 12'd1;
end
assign brg_rx_clken = (rx_counter == BRG)?1'b1:1'b0;
endmodule
// End of automatics
input uart_rx; // To receiver of receiver.v
/*AUTOOUTPUT*/
// Beginning of automatic outputs (from unused autoinst outputs)
output fifo_empty; // From receiver of receiver.v
output fifo_full; // From receiver of receiver.v
output [6:0] hex0; // From control_display of control_display.v
output [6:0] hex1; // From control_display of control_display.v
output uart_tx; // From transmitter of transmitter.v
// End of automatics
/*AUTOWIRE*/
// Beginning of automatic wires (for undeclared instantiated-module outputs)
wire brg_rx_clken; // From baud_rate of baud_rate.v
wire brg_tx_clken; // From baud_rate of baud_rate.v
wire [7:0] rc_data; // From receiver of receiver.v
wire tx_enable; // From control_display of control_display.v
// End of automatics
SVTH: ĐỖ TIẾN THÀNH – LỚP 09DT2 Trang 42
Đồ án chuyên ngành
control_display control_display(/*AUTOINST*/
// Outputs
.tx_enable(tx_enable),
.hex0 (hex0[6:0]),
.hex1 (hex1[6:0]),
// Inputs
.clk (clk),
.reset_n(reset_n),
.uart_en(uart_en),
.tx_in (tx_in),
.rc_data(rc_data[7:0]));
baud_rate baud_rate(/*AUTOINST*/
// Outputs
.brg_tx_clken (brg_tx_clken),
.brg_rx_clken (brg_rx_clken),
// Inputs
.clk (clk),
.reset_n (reset_n),
.uart_en (uart_en));
transmitter transmitter(/*AUTOINST*/
// Outputs
.uart_tx (uart_tx),
// Inputs
.clk (clk),
.reset_n (reset_n),
.uart_en (uart_en),
.tx_enable (tx_enable),
.brg_tx_clken (brg_tx_clken),
.data_in (data_in[7:0]));
receiver receiver(/*AUTOINST*/
// Outputs
.rc_data (rc_data[7:0]),
.fifo_full (fifo_full),
.fifo_empty (fifo_empty),
// Inputs
.clk (clk),
.reset_n (reset_n),
.uart_en (uart_en),
.brg_rx_clken (brg_rx_clken),
.uart_rx (uart_rx),
.fifo_rd (fifo_rd));
endmodule
.uart_tx (uart_tx),
// Inputs
.clk (clk),
.data_in (data_in[7:0]),
.fifo_rd (fifo_rd),
.reset_n (reset_n),
.tx_in (tx_in),
.uart_en (uart_en),
.uart_rx (uart_tx));
//KHOI TAO GIA TRI BAN DAU
initial
begin
clk = 1'b0;
reset_n = 1'b0;
fifo_rd = 1'b1;
tx_in = 1'b0;
uart_en = 1'b1;
// uart_rx = 1'b1;
data_in = 8'd0;
end
// 9. Generating Test Vectors
initial
begin
main;
end
task main;
fork
clock_gen;
reset_gen;
tx_gen;
fifo_gen;
shift_gen;
debug_output;
endsimulation;
join
endtask
task clock_gen;
begin
forever #`DELAY clk = !clk;
end
endtask
SVTH: ĐỖ TIẾN THÀNH – LỚP 09DT2 Trang 45
Đồ án chuyên ngành
task reset_gen;
begin
#1 reset_n = 1'b1;
end
endtask
task tx_gen;
begin
#200 tx_in = 1'b1;
//#300 tx_in = 1'b1;
//#450 tx_in = 1'b0;
//#200 tx_in = 1'b1;
//#550 tx_in = 1'b0;
// #300 tx_in = 1'b1;
end
endtask
task fifo_gen;
begin
#100 fifo_rd = 1'b0;
#300 fifo_rd = 1'b1;
#450 fifo_rd = 1'b0;
#600 fifo_rd = 1'b1;
#300 fifo_rd = 1'b0;
#500 fifo_rd = 1'b1;
end
endtask
task shift_gen;
begin
data_in = 8'b01010101;
#(`DELAY*10) data_in = 8'b00001111;
#(`DELAY*10) data_in = 8'b11110000;
#(`DELAY*20) data_in = 8'b00111100;
#(`DELAY*30) data_in = 8'b10001111;
#(`DELAY*50) data_in = 8'b01110000;
end
endtask