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 个系统时钟周期文章来源:https://www.toymoban.com/news/detail-730978.html
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位文章来源地址https://www.toymoban.com/news/detail-730978.html
到了这里,关于FPGA小技巧之testbench 生成串行和并行数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!