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