如何从QuartusII中调用Modelsim进行仿真.docx

上传人:b****7 文档编号:9916915 上传时间:2023-02-07 格式:DOCX 页数:12 大小:789.09KB
下载 相关 举报
如何从QuartusII中调用Modelsim进行仿真.docx_第1页
第1页 / 共12页
如何从QuartusII中调用Modelsim进行仿真.docx_第2页
第2页 / 共12页
如何从QuartusII中调用Modelsim进行仿真.docx_第3页
第3页 / 共12页
如何从QuartusII中调用Modelsim进行仿真.docx_第4页
第4页 / 共12页
如何从QuartusII中调用Modelsim进行仿真.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

如何从QuartusII中调用Modelsim进行仿真.docx

《如何从QuartusII中调用Modelsim进行仿真.docx》由会员分享,可在线阅读,更多相关《如何从QuartusII中调用Modelsim进行仿真.docx(12页珍藏版)》请在冰豆网上搜索。

如何从QuartusII中调用Modelsim进行仿真.docx

如何从QuartusII中调用Modelsim进行仿真

如何从QuartusII中调用Modelsim进行仿真

--穆永强

版本说明:

QuartusII11.0版本;ModelSim-Altera6.6d版本。

一、设置第三方EDA工具

在Tools->Options中设置ModelSim的安装路径,注意要设置到win32文件夹(64位软件对应的就是win64)。

在Assignments->Settings中设置仿真工具为ModelSim。

这样Quartus就能无缝调用ModelSim了。

二、编写Testbench

我们可以通过Quartus自动生成一个Testbench的模板,选择Processing->Start->StartTestBenchTemplateWriter,等待完成后打开刚才生成的Testbench,默认是保存在simulation\modelsim文件夹下的.vt格式文件。

 

打开vt文件后可以看到Quartus已经为我们完成了一些基本工作,包括端口部分的代码和接口变量的声明,我们要做的就是在这个做好的模具里添加我们需要的测试代码。

一个最基本的Testbench包含三个部分,信号定义、模块接口和功能代码。

‘timescale1ns/1ps表示仿真的单位时间为1ns,精度为1ps。

想要进行仿真首先要规定时间单位,而且最好在Testbench里面统一规定时间单位,而不要在工程代码里定义,因为不同的模块如果时间单位不同可能会为仿真带来一些问题,而timescale本身对综合也就是实际电路没有影响。

其实Testbench本身可以看做一个模块或者设备(本例中的模块名为add_vlg_tst),和你自己编写的模块进行通信。

通过Testbench模块向待测模块输出信号作为激励,同时接收从待测模块输出的信号来查看结果。

因此,在待测模块中的reg型信号在Testbench中就变成了wire,待测模块中的wire型信号在Testbench中则对应为reg型。

那么inout怎么办呢,inout型信号也要设成wire,同时要用一个reg型信号作为输出寄存器,同时设置一个三态门,由一个使能信号控制,如:

assign inout_sig=out_en?

out_reg:

1’bz;

处理完接口和声明之后,需要自己设置一些激励信号,激励信号的容就是肯能会输入到待测模块中的波形。

下面我们就来写一个简单的测试程序。

【复位信号】

initial

begin

rst=0;

#100rst=1;

end

initial开头的这个过程在Testbench中只执行一次,#100表示延时了100个时间单位,我们之前已经通过timescale进行了设置,这里延时了100ns。

这就有点类似于C语言了,代码通过延时被顺序执行,rst在0时刻为低电平(也就是逻辑0),100ns后变成高电平,从而形成了一个上电复位。

【时钟】

initial

begin

clk=0;

while

(1)

#10clk=~clk;

end

always模块中的代码会不断重复执行,利用这个特点,每10ns翻转一次clk,只是这样还不行,还要给clk一个初值,就是上面的initial语句。

如此便可以生成一个周期为20ns,频率50MHz的方波信号,作为本例的系统时钟。

【输入信号】

initial

begin

a=1;

b=3;

#200a=2;

b=0;

#200a=3;

b=3;

end

注意这里a=1和b=3是同时发生的,也就是并行的,之后延时200ns,a=2同时b=0,如前面所说,想要实现顺序操作,就需要使用延时,如果两个语句间没有延时,就表示同时执行。

还有一点,这个initial语句块和负责复位的initial语句块也是并行的,并且都是从0时刻开始。

也就是说,0时刻后经过100nsrst_n复位,再经过100ns(从0时刻起),a=2被执行。

至此,测试程序也完成了,让我们开始仿真吧

【输出信号】

initial

begin

$display($time,"clk=%drst=%dled=%d",clk,rst,led);

end

例如:

`timescale1ns/1ns//单位时间为1ns/精度为1ns

moduleLED_FLOW;

regCLOCK_50M;

regRST_n;

wire[9:

0]LED;

ledled_inst

.clk_50M(CLOCK_50M),

.reset_n(RST_n),

.led(LED)

);

initial

begin

CLOCK_50M=0;

while

(1)

#10CLOCK_50M=~CLOCK_50M;

end

initial

begin

RST_n=0;

while

(1)

#10RST_n=1;

end

initial

begin

$display($time,"CLOCK_50M=%dRST_n=%dLED=%d",CLOCK_50M,RST_n,LED);

end

endmodule

三、设置Quartus并调用仿真工具

运行仿真之前,还要设置一下。

在Simulation选项卡中配置仿真选项,可以配置仿真语言、仿真时间的格式以及输出目录。

选中mpiletestbench,点击TestBenches打开TestBenches对话框。

点击New新建一个TestBenchSetting,填入Testbench模块的名称(这里是Collect_VisitFrame.vt),酌情设置仿真运行的时间(这里设为800ns,只是进入ModelSim后仿真自动执行的时间,不设或随意设置也行),并将刚才编写的Testbench添加进来。

一路OK后,然后再进行一次全编译。

四、调用Modelsim软件

选择Tools->RunEDASimulationTools,有两个选项,RTLSimulation是RTL行为级仿真,只验证功能是否正确,与在哪个芯片上运行无关,仿真前至少需要执行一次Analysis&Synthesis;GateLevelSimulation是门级仿真,涉及到具体的芯片,并且仿真前需要编译工程,在门级仿真中ModelSim会将布局布线后的门级延时体现在波形中,在测试一个具体的工程模块时,应当先进行RTL仿真,之后还要进行门级仿真。

五、ModelSim工具的基本操作

运行RTLSimulation进入ModelSim界面。

在这里介绍几个比较重要的部分。

在view菜单中,可以显示和隐藏各种工具窗口。

其中Structure窗口显示了测试模块和待测模块的结构:

点击不同的模块,在Objects窗口中可以查看选中模块中的信号,因为除了端口(port)以外,还有很多部信号默认是不显示波形的,通过将需要的信号拖到Wave窗口中,就能够显示。

工具栏中的

部分是用来控制仿真运行的,左侧红框中的是复位,在文本框里设置要执行的时间,点击右侧红框中的按钮就可以执行了。

其他的请自行摸索或参看Help文件。

如果面对一大堆0101感觉很晕,可以在信号列表里选号,右键选择要显示的数据格式。

而Wave窗口的左下角有几个小按钮,是用来设置游标的,通过添加游标,可以测量相应的时间,也可以在这里配置时间刻度的格式。

在Wave波形图中,使用滚轮和鼠标右键可以很方便的缩放或选择波形区域,下图就是这个工程的波形图,在复位之后,相应结果在时钟上升沿输出。

至此,仿真结束!

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1