测试文件:testbench
这一个文件适用于测试前面写好的代码能否正确运行。在编写好执行的流水灯代码之后,要使用modelsim进行仿真时,需要编写一个testbench文件。这一个文件适用于测试前面写好的代码能否正确运行。
在正常开发工作中,可能手中没有实物电路板,那么可以采用这一种方法对设计好的FPGA代码进行仿真测试。
这一个tb文件,实质是对我们需要测试的模块进行例化。
代码如下:
//下面定义仿真单位和仿真精度:仿真单位1ns,精度为1ns
`timescale 1ns/1ns
//假如有下列一步:#10,表示延时10个单位,上面是1个单位为1ns,则延时10ns
module flow_led_tb;//该模块没有输入,括号省略
parameter T = 20;//定义周期为20ns,晶振一般为50MHz
//如果在always或者initial里面赋值,则定义成reg
reg sys_clk;
reg sys_rst_n;
//在tb模块里面不会对led寄存器赋值,所以定义成wire信号
wire [3:0] led;
//对复位和数值初始化,能让后面例化的模块可以有初始值。
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#(T+1) //延时1+T个单位时间,然后把复位拉高,结束复位
sys_rst_n = 1'b1;
end
//下面利用always实现50Mhz的时钟
always #(T/2) sys_clk = ~sys_clk;
//先延时10ns,然后时钟翻转,这样就可以产生周期为20ns的时钟
//下面是对被测试模块例化,括号里面输入被例化模块的输入端口
flow_led u0_flow_led (
//表示为被例化模块的sys_clk接口和tb模块的sys_clk连接
.sys_clk (sys_clk ),
//表示为被例化模块的sys_rst_n接口和tb模块的sys_rst_n连接
.sys_rst_n (sys_rst_n),
//表示为被例化模块的led寄存器接口和tb模块的led连接
.led (led )
);
endmodule
这是对编写好的测试和被测试文件进行编译。
选择对文件仿真
仿真结果:开始的21ns为复位时间,然后开始运行。后续每次流水灯状态跳变的间隔都是220ns,每11个T为一次反转周期(原来是200ms反转一次,因为仿真5ms这么短的时间电平信号是不会跳变的,所以后面修该成220ns反转一次)。