当前位置: 代码迷 >> 综合 >> Zedboard:仿真
  详细解决方案

Zedboard:仿真

热度:88   发布时间:2023-11-22 18:42:41.0

转载原文

上个试验中,我们创建了简单的工程编程了FPGA并且通过现实的开关测试了代码。这样的测试在实验一这样的简单的工程是足够了,但实际的工程中都是比较复杂的,这使手动的测试很难满足工程需求,这就需要仿真来验证工程。

这里举一个最简单的仿真。

Test Bench

仿真所设计的工程需要人为控制输入以验证输出的正确性。理想的的测试是创建输入激励信号并且验证输出的正确性。实际工程中,当测试进行过程中,需要打印出系统信息。如果测试失败需打印错误信息,不论测试通过还是失败都应打印出系统信息。

在Project Manager窗口中点击Add Source。创建仿真文件,命名为bench.v点击Finish。在新弹出的窗口中编辑命名bench。不用给出任何端口(ports)。点击OK。

Test Bench Contents

test bench的编写不需要任何输入输出端口。所有的仿真行为都发生在这个test bench中。另外就是test bench文件顶端的timescale。


`timescale 1ns/1ns

其中分子是告诉仿真器,延时单位是纳秒;分母是告诉仿真器需要多少的时间精度。通常可以设置精度和分子相同。

声明信号,FPGA的输出需要在test bench中的连接为wire型。FPGA的输入信号可以是wire或者是reg型。首先声明时钟输入。

reg clk = 1;

接着创建100MHz时钟信号:

always #5 clk = ~clk;

由于timesacle的声明,这里 5的单位就是纳秒,5ns CLK信号翻转一次。即CLK周期为10ns,频率为100MHz。

例化FPGA设计

声明开关输入信号为reg型,输出LED信号为reg。

reg [7:0] switch;
wire [7:0] led;

Verilog 的一个重要特点是一个module可以例化其他的module。

top top (.clk(clk),.switch(switch),.led(led));

开关输入信号

通常较好的方法是使用一些随机类型。Verilog有内部函数为$random。这里设置每个时钟下的开关输入为随机值:

always @(posedge clk) switch = $random;

仿真结束语句

如上语句表示仿真将会永远执行下去。所以添加代码使仿真在运行一段时间后结束。内部函数$finish将会使仿真执行完成。这里使用initial等待固定时间后调用$finish函数如下:

initial #10000 $finish;

上述代码只是等待一段时间就终止仿真。不可避免的会多余或者少于时钟周期。因此,这里选择Verilog中repeat模块,实际上是时钟计数。这里设置仿真时间为1000个周期。

initialbeginrepeat (1000) @(posedge clk);$finish;end

运行仿真

在Flow Navigator窗口下点击Run Simulation。选择Run Behavioral Simulation。出现仿真波形窗口,类似于逻辑分析仪。

`timescale 1ns/1ns
module bench;reg clk = 1;always #5 clk = ~clk;reg [7:0] switch;wire [7:0] led;top top(.clk(clk), .switch(switch), .led(led));always @(posedge clk) switch = $random;initialbeginrepeat (1000) @(posedge clk);$finish;end
endmodule

这里写图片描述