uart_fifo的testbench - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki
不带fifo的uart
- 注意程序中使用defparam来重新定义参数
- 注意我们定义了一个task_gen来处理重复代码,相当于函数。注意task中多行语句需要用begin...end
- 注意我们用了wait语句。这个非常好用。
`timescale 1ns / 1ps
module tb_uart_tx;
reg sys_clk, sys_rst_n;
initial sys_clk=0;
always #10 sys_clk=~sys_clk;
initial begin
sys_rst_n=0;
#1000;
sys_rst_n=1;
end
reg [7:0] xfer_data;
reg xfer_start;
wire xfer_end;
initial begin
xfer_data=8'h00;
xfer_start=0;
wait(sys_rst_n==1);
#1000;
gen_data(8'haa);
wait(xfer_end==1);
gen_data(8'h55);
wait(xfer_end==1);
gen_data(8'h33);
wait(xfer_end==1);
gen_data(8'h21);
end
task gen_data;
input [7:0] wdata;
begin
xfer_data=wdata;
xfer_start=1;
#30;
xfer_start=0;
end
endtask
uart_tx uart_tx_inst
(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.pi_data(xfer_data),
.pi_flag(xfer_start),
.po_ack(xfer_end)
);
defparam uart_tx_inst.UART_BPS= 'd9600;
defparam uart_tx_inst.CLK_FREQ= 'd50_000;
endmodule
带fifo的uart
- 注意我们在程序中使用了wait
- 注意我们用@(posedge clk)来产生时钟沿对齐的信号,这很好
- 注意我们用了while()语句
- 注意我们用了fork...join语句,这可以让后面的这些语句块并行起来。这个非常适合用于initial语句中。在initial语句中,最初是初始化,这是串行的。到了后面,我们希望并行了,就可以用fork...join。
- 注意我们在fork...join语句中用了<=非阻塞赋值
module tb_uart_tx_fifo;
reg sys_clk, sys_rst_n;
initial sys_clk=0;
always #10 sys_clk=~sys_clk;
initial begin
sys_rst_n=0;
#1000;
sys_rst_n=1;
end
reg xfer_start;
wire xfer_end;
reg [7 : 0] din;
wire [7 : 0] dout;
reg wr_en;
reg rd_en;
initial begin
din=8'h00;
wr_en=0;
wait(sys_rst_n==1);
#1000;
while(full==0)
@(posedge sys_clk) begin
#1;
wr_en=1;
din=din+1;
end
wr_en=0;
end
initial begin
rd_en=0;
xfer_start=0;
wait(sys_rst_n==1);
wait(empty==0);
@(posedge sys_clk) begin
rd_en=1;
end
@(posedge sys_clk) begin
rd_en=0;
xfer_start=1;
end
@(posedge sys_clk) begin
xfer_start=0;
end
fork
while(empty==0) begin
@(posedge sys_clk) begin
if(xfer_end)
rd_en<=1;
else
rd_en<=0;
end
end
while(empty==0) begin
@(posedge sys_clk) begin
xfer_start<=rd_en;
end
end
join
end
uart_tx uart_tx_inst
(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.pi_data(dout),
.pi_flag(xfer_start),
.po_ack(xfer_end)
);
defparam uart_tx_inst.UART_BPS= 'd9600;
defparam uart_tx_inst.CLK_FREQ= 'd50_000;
fifo_generator_0 your_instance_name (
.clk(sys_clk), // input wire clk
.rst(~sys_rst_n), // input wire rst
.din(din), // input wire [7 : 0] din
.wr_en(wr_en), // input wire wr_en
.rd_en(rd_en), // input wire rd_en
.dout(dout), // output wire [7 : 0] dout
.full(full), // output wire full
.empty(empty) // output wire empty
);
endmodule