七、 测试平台设计
本实验主要对LED的输出和输入与复位的关系进行测试仿真,通过仿真,即可验证设计的正确性和合理性。相关testbench的代码如下:
以下是代码片段:
`timescale 1ns/1ns
moduleLED_Driver_tb;
reg Rst_n;
reg [3:0] Sig;
wire [3:0] Led;
LED_Driver
#( /*参数例化*/
.Width (4)
)
LED_Driver_inst(/*端口例化*/
.Rst_n(Rst_n),
.Sig(Sig),/*OFF ON ON OFF*/
.Led(Led)
);
initial begin
Rst_n = 0;
Sig = 4'b1010;
#100;
Rst_n = 1;
#40 Sig = 4'b0001;
#40 Sig = 4'b0010;
#40 Sig = 4'b0011;
#40 Sig = 4'b0100;
#40 Sig = 4'b0101;
#40 Sig = 4'b0110;
#40 Sig = 4'b0111;
#40 Sig = 4'b1000;
#40 Sig = 4'b1001;
#40 Sig = 4'b1010;
#40 Sig = 4'b1011;
#40 Sig = 4'b1100;
#40 Sig = 4'b1101;
#40 Sig = 4'b1110;
#40 Sig = 4'b1111;
#40;
$stop;
end
endmodule
由testbench中可以看出,初始值给Sig赋了一个初始值,系统处于复位状态,100ns后,复位过程结束,系统进入正常工作状态,Sig信号每隔一定时间变化一次。因此,只需要观察Led信号与Sig信号的关系,即可验证设计的正确与否。
八、 仿真分析
由上图仿真结果可知,当复位信号为低电平时,Led输出全部为1,则所有LED熄灭,当复位信号为高电平时,则Led输出与Sig信号一致,证明设计正确无误。对于顶层模块,仿真没有什么太大的实际意义,因此不做仿真。
九、 下板验证
手头暂无开发板,板级验证略。
十、 总结
可能很多初学FPGA,又看过其它一些资料的同学会对小梅哥的这种组织方式感觉不太习惯,认为本来一个代码模块就能搞定的事儿被我硬生生拆成了两个,增加了系统的复杂性。其实,我这里主要是强调了一种建模的思想,我们所做的模块一定要具有灵活性和通用性,当其它设计中需要用到该外设时,只需要关心其内部端口就行了,在顶层例化时只需要将对应信号接到该端口上就能实现功能了,不用再专门为了特定应用再写一次。目前系统简单,可能大家还看不出这种方式的优势,随着以后的设计越来越复杂,大家就能很明显的看到这种设计方式的优势所在了。