FPGA小技巧之testbench 生成串行和并行数据

1 testbench 生成并行数据

// 模拟发送8次数据,分别0~7
initial begin
        #200
        rx_bit(8'd0);           // 任务的调用,任务名+括号中要传递进任务的参数       0 0000 0000 1 
        rx_bit(8'd1);                                                        //  0 0000 0001 1 -> 0 1000 0000 1        
        rx_bit(8'd2);                                                        //  0 0000 0010 1 -> 0 0100 0000 1      
        rx_bit(8'd3);                                                        //  0 0000 0011 1 -> 0 1100 0000 1
        rx_bit(8'd4); 
        rx_bit(8'd5); 
        rx_bit(8'd6); 
        rx_bit(8'd7); 
end

// 定义一个名为 rx bit的任务,每次发送的数据有10位
// data的值分别为0~7 由j的值传递进来
// 任务以task开头,后面紧跟着的是任务名,调用时使用
task rx_bit(
    // 传递到任务中的参数,调用任务的时候从外部传进来一个8位的值
    input [7:0] data
);
    integer i;   // 定义一个常量
    // 用for循环产生一帧数据,for括号中最后执行的内容只能写 i=i+1
    // 不可以写成C语言那种  i=i++ 的形式
    for (i=0; i<10; i=i+1) begin
        case(i)
            0: rx <= 1'b0;
            1: rx <= data[0];
            2: rx <= data[1];
            3: rx <= data[2];
            4: rx <= data[3];
            5: rx <= data[4];
            6: rx <= data[5];                
            7: rx <= data[6];
            8: rx <= data[7]; 
            9: rx <= 1'b1;
        endcase
        #(5208*20);         // 每发送1bit 数据延时5208个时钟周期

    end
endtask

这个5208 如何计算的,因为我们是9600波特率,所以发送1bit的时间为1/9600 秒,如果采用50MHz(周期为20ns)的系统时钟来计数,需要计数的个数为 (1/9600)s / 20ns = 5208 个系统时钟周期

2 testbench 生成串行数据

initial begin
    i_en <= 1'b0;
    i_data <= 8'b0;
    
    #2000
    // 发送数据0
    i_en <= 1'b1;
    i_data <= 8'd0;
    #25
    i_en <= 1'b0;
    // 每发送1bit数据需要5208个时钟周期,一帧数据为10bit
    // 所以需要数据延时 (5208*20*10)后再产生下一个数据
    #(347.2*25*11);
    // 发送数据1
    i_en <= 1'b1;
    i_data <= 8'd1;
    #25
    i_en <= 1'b0;
    #(347.2*25*11);
        // 发送数据2
    i_en <= 1'b1;
    i_data <= 8'd2;
    
    #25
    i_en <= 1'b0;
    #(347.2*25*11);
        // 发送数据3
    i_en <= 1'b1;
    i_data <= 8'd3;
    
    #25
    i_en <= 1'b0;
    #(347.2*25*11);

    // 发送数据4
    i_en <= 1'b1;
    i_data <= 8'd4;
    
    #25
    i_en <= 1'b0;
    #(347.2*25*11);

        // 发送数据5
    i_en <= 1'b1;
    i_data <= 8'd5;
    
    #25
    i_en <= 1'b0;
    #(347.2*25*11);

            // 发送数据6
    i_en <= 1'b1;
    i_data <= 8'd6;
    
    #25
    i_en <= 1'b0;
    #(347.2*25*11);

end

347.2 是根据115200 波特率算出来的,25是 40M的时钟,11 表示11位

猜你喜欢

转载自blog.csdn.net/qq_30093417/article/details/129363438