如何用modelsim仿真 schematics

如何用Modelsim进行后仿真
首先区分下门级仿真和时序仿真的区别。
门级仿真:也就是传说中的后仿真,是使用综合软件综合后生成的门级网表(.vo文件)、不加入延时文件进行的仿真。
时序仿真:在门级仿真的基础上加入时延文件“.sdf”文件的仿真就是时延仿真。
每当QuartusII完成一次编译,都会自动在当前Project目录下生成一个simulation目录,在该目录下会有一个Modelsim的文件夹(后面会讲怎么设置产生这个文件夹),文件夹里有仿真所需的.vo文件和.sdf文件。
这些文件还可以通过QuartusII-菜单-Processing-start-start EDA Netlists
Writer来产生以上文件。
ISE的后仿真直接调用Modelsim,但是Quartus不能,所以需要进行一些处理。
1、进入菜单Assignments--EDA Tool Setting--Simulation,
选择Modelsim或者Modelsim-Altera。
(Modelsim-Altera应该是专为Altera芯片出的,可在Altera官网上下载,但后仿时还会遇到额外问题,反而不方便,后面会提到。)
设置完成以后就会在工程目录下看到一个文件夹Simulation,里面有个文件夹Modelsim或Modelsim-Altera。里面有.vo文件,就是Quartus代码的布局布线信息。
2、添加库。
由于后仿真涉及到具体芯片,所以Modelsim的工程需要相应的芯片库文件。库文件在“C:\altera\70\quartus\eda\sim_lib”路径下。将需要的库文件复制到步骤1的目录。
如果使用的是cycloneii的器件,需要添加的是cycloneii_atoms.v这个文件。
如果设计中含有Altera公司提供的IP core,则还需要编译库220model和altera_mf。
3、编写testbench
可以保存在步骤1的目录
4、用Modelsim仿真。
这里有2种方法,分别是新建库和新建工程。
方法一:新建库--Library
关闭Modelsim当前所有工程。
在 wokspace 的library
面板的空白处单击右键,选择“new”--“library”,起名字,譬如work_test,一般默认是work,然后ok。
菜单栏:compile--compile,library选work_test,查找定义在步骤1的目录,全选能看到的所有文件,点击compile(注意该文件夹必须在全英文路径下)。
这时会在library面板下,work_test下多出了下拉框,找到testbench那个module名,右击-simulate。
接下来就可以按照modelsim的正常使用方法观察波形了。
注意:如果使用的软件是Modelsim-Altera,编译时会出错。具体是在加载库时,提示:
Fatal: SDF files require Altera primitive library
FATAL ERROR while loading design
出现这样的错误原因是我们使用的器件如为CYCLONE
II的,那我们在选库的时候一定是在QUARTUS中的EDA目录中加载的cycloneii_atoms.v这个文件。然后我们编译了这个文件,这样就会出现上面的错误。
解决方式是到QUARTUS目录下如C:\altera\72\modelsim_ae\altera\verilog\cycloneii中去拷贝已经为modelsim编译好的库,拷贝到步骤1文件夹中的work_test文件夹中,这样就可以正常加载了。
具体是什么原因我也不知道。
方法二:新建工程
1,新建Modelsim工程,加入网表文件并编译。
2,编写testbench。
3,编译库文件。新建library,一般一个库文件对应一个library。不必将不必复制库文件,点击主窗口的library-compile--library选新建的名称,查找范围中选要编译的库文件,Default
Options中的use 1993 Language
Syntax打勾,点击compile即可。编译成功后主窗口的额library中对应的名称中会出现下拉框
4,仿真设置
菜单-simulate-simulate-选中testbench实体名-library-add-相应的库文件
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-SDF-add-相应的.sdf文件-apply to region--斜杠“/”加被仿真模块在激励程序中的名字。
5,add to wave
参考文献:王旭东,潘广帧.matlab及其在fpga中的应用.国防工业出版社.3
环境:Quartus II 9.0 Web Edition
Modelsim-Altera 6.4a(Quartus II 9.0)Stater Edition
Matlab R2007b
<font COLOR="#09-04-23 21:39
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。【图文】Modelsim_SE的使用方法 简单易懂_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Modelsim_SE的使用方法 简单易懂
&&Modelsim_SE的使用方法
大小:644.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢下面将这一过程重新展示一遍,在&艾米电子&blog中采用的是ModelSim-Altera 6.5e (Quartus II 10.0) Starter Edition,在参考作者原来的基础上,我采用的平台是QuartusII11.1 +Questasim 10.0c(同为Mentor公司出品,Modelsim的增强版)
所以文章的模式同原来的文章采用同一个描述方式:
1 设计流程
使用Questasim 仿真的基本流程为
2 开始仿真工程建立
2.1 首先打开Questasim
图2.1 Questasim界面
打开后的界面如下图所示
图2.2 Questasim界面
1-选择择File&New&Preject创建一个新工程。打开的Create Project对话框窗口,可以指定工程的名称、路径和缺省库名称。一般情况下,设定Default Library Name为work。指定的名称用于创建一个位于工程文件夹内的工作库子文件夹。该对话框如图2.2所示,此外还允许通过选择.ini文件来映射库设置,或者将其直接拷贝至工程中。
图2.4建立工程project : ssram
在这里我们选择新建一个文件夹,project name 叫ssram,不使用default的project locaion文件夹,而是用自己的一文件夹ssram,不使用default
library 采用自己新建的一个库ssram2,点击OK,关闭对话框。
图2.4 安排project所在的文件夹
2 关闭上一对话框后,会弹出新的一个Add items to the project 对话框:
图2.5 新添加文件对话框
在这一对话框里,我们看到在Add Items to the Project对话框中,包括以下选项:
Create New File&&使用源文件编辑器创建一个新的Verilog、VHDL、TCL或文本文件
Add Existing File&&添加一个已存在的文件
Create Simulation&&创建指定源文件和仿真选项的仿真配置
Create New Folder&&创建一个新的组织文件夹
1.单击Create New File,打开如下图所示的对话框:
图2.6 创建工程文件夹
2. 输入文件名称ssram_tst,在Add file as type(文件类型)中选择Verilog
3. 单击OK,关闭本对话框。新的工程文件将会在工程窗口显示。单击Close,以关闭Add Items to the Project。
单击选中project栏中ssram_tst文件,右键选择属性properities,可以看到文件所在位置正是我们新建的文件夹的位置。
图2.7 文件properities
4. 双击打开ssram_tst文件,(注意:若是Verilog文件已经关联了其他的文本编辑器,则双击后在关联的文本编辑器中打开)。
右侧,便是代码输入窗口。在这一窗口中输入的是testbench代码,用于module的测试。
在ssram_tst.v中输入下面的测试代码:
`timescale 1 ns/ 1 ps
module SRAM_vlg_tst();
// constants
// general purpose registers
reg [15:0] treg_SRAM_DATA;
reg clk50M;
reg rst_n;
wire [17:0]
SRAM_ADDR;
wire SRAM_CE_n;
wire [15:0]
SRAM_DATA;
wire SRAM_LB_n;
wire SRAM_OE_n;
wire SRAM_UB_n;
wire SRAM_WE_n;
wire led_R;
// assign statements (if any)
assign SRAM_DATA = treg_SRAM_DATA;
// port map - connection between master ports and signals/registers
//在例化的时候最好不用i1作为例化名,这样Modelsim可能不认识,起一个另外的名字最好
.SRAM_ADDR(SRAM_ADDR),
.SRAM_CE_n(SRAM_CE_n),
.SRAM_DATA(SRAM_DATA),
.SRAM_LB_n(SRAM_LB_n),
.SRAM_OE_n(SRAM_OE_n),
.SRAM_UB_n(SRAM_UB_n),
.SRAM_WE_n(SRAM_WE_n),
.clk50M(clk50M),
.led_R(led_R),
.rst_n(rst_n)
rst_n = 1'b1;
rst_n &= 1'b0;
#5000 rst_n &= 1'b1;
initial begin
clk50M =1'b0;
#10 clk50M &= ~clk50M;
录入完代码后,单击Save。出现下面的状态。
图2.9 输入testbench代码
在sava后,右侧的代码区关键词变成了红色//在例化的时候最好不用i1作为例化名,这样Modelsim可能不认识,起一个另外的名字最好。
其是本质和模块的调用是一致的,就是用tesrbench的代码去调用例化在testbench中的待测试Module。
声明好自己的testbench,reg和wire变量,然后再例化好待测试module,再编写测试代码,这样就可以了
5. 选择File&New&Source&Verilog,创建新的Verilog文件,如图2.10所示。
图2.10 建立新的source 文件,这便是要被测试的module代码。
6. 录入下面的代码,录入画面如图2.11 所示。
module SRAM(//host side take the chip as two side:one close to host,the other to the divice
//SRAM signals
SRAM_CE_n,
//Chip slect Input&&
SRAM_OE_n,
//Output Enable Input
SRAM_WE_n,
//Write Enable Input
SRAM_ADDR,
//address input
SRAM_DATA,
//data inout
SRAM_LB_n,
//Lower-byte Control (I/O0-I/O7)
SRAM_UB_n,
//Upper-byte Control (I/O8-I/O15)
//divice side
[15:0] SRAM_DATA;//data inout
output[17:0] SRAM_ADDR;//address
output SRAM_CE_n;//Chip Enable
output SRAM_WE_n;//Write Enable
output SRAM_OE_n;//Output Enable
output SRAM_LB_n;//Lower-byte Control (I/O0-I/O7)
output SRAM_UB_n;//Upper-byte Control (I/O8-I/O15)
output led_R;
//&&&O&&&A&ETH;&&C&&C&&ETH;&A&&A
wire write_req,read_
//------------------------------------------------------------
//&&&&&O&&&&N&O&E&delay 1.28s
//&N&O&E&&frac14;&AE&E&&AE&
always @ (posedge clk50M or negedge rst_n)
if(!rst_n) delay &= 26'd0;
else delay &= delay+1;
//&sup2;&&&I&frac14;&AE&E&&&&O&U&AE&U&O&frac14;&I&1.28s
//--------------------------1.28s&I&&O&U&AE&U----------------------------
assign write_req = (delay == 26'd9999);//&I&E&frac34;&&sup1;&0.2ms&N&O&E&&&&&frac14;&&&ETH;&&E&&frac34;&Y
assign read_req = (delay == 26'd19999);//&ETH;&&E&&frac34;&Y0.2ms&&&&frac14;&&&&A&sup3;&&E&&frac34;&Y&&&frac14;&0.4ms&E&&&A&sup3;&
assign RAM_CE_n = 1'b0;
//Chip Enable
assign SRAM_OE_n = 1'b0;
//output enable
assign SRAM_LB_n = 1'b0;
//Lower-byte Control
assign SRAM_UB_n = 1'b0;
//Upper-byte Control
//---------------------------------------------------
//&&&O&3&&&frac14;&A&&&AE&
reg [15:0] wr_
//&ETH;&&E&&E&&frac34;&Y&&A&O&
reg [15:0] rd_
//&&A&sup3;&&E&&frac34;&Y&&A&O&
reg [17:0] da_
//&&&&&AE&&&O&O&&&A&O&
reg led_r;
always @(posedge clk50M or negedge rst_n)
if (!rst_n) wr_data &= 16'd0;
else if (delay[9:0] == 10'd1023) wr_data &= wr_data+1'b1;
//&E&&frac34;&Y&&O&&&frac14;&O1
//&A&&O&U&AE&U0.6ms(29999&&&E&&O&O)&frac34;&I&&&&&&&&20.48us&&1024&&&E&&O&O&&&&&O&&&&O&frac14;&E&C26bit&&frac14;&E&C1&sup2;&A&E&C&I&1.28s
//&O&U&&E&frac34;&I&I&&&&O&U&A&1.28s&sup3;&E&A&E&O&&&&N&&&&&&A&&&26&I&&&frac14;&&&sup3;&E&A&E1&E&&&&sup2;&A&&&E&frac14;&I&A&&I&&A&ETH;&
always @(posedge clk50M or negedge rst_n)
if (!rst_n) da_adrs &= 1'b0;
else if(delay[9:0] == 10'd1023) da_adrs &= da_adrs+1'b1;
//&&O&O&&&O&&&frac14;&O1
//&O&U&O&&A&&&E&frac12;&I&ETH;&&E&&&I&&A&sup3;&&&A&E&&frac34;&Y&E&C&&&O&&O&A
always @(posedge clk50M or negedge rst_n)
if (!rst_n) led_r &= 1'b0;
else if (wr_data == da_adrs) led_r &= 1'b1;
else led_r &= 1'b0;
assign led_R =led_r;
/////////////////////////////////////////////////////////////////////
`define delay_160ns (cnt == 3'd7)
reg [2:0] state_now,state_
parameter IDLE = 3'b000,
WR0 = 3'b001,
WR1 = 3'b010,
RD0 = 3'b011,
RD1 = 3'b100;
//------------------------------------------------------------
//&&&I&&&&I&&sup3;&E&&A&ETH;&&&&I&&&&&
always @ (posedge clk50M or negedge rst_n)
if(!rst_n) cnt &= 3'd0;
else if(state_now == IDLE) cnt &= 3'd0;
else cnt &= cnt+1'b1;
always @(posedge clk50M or negedge rst_n)
if (!rst_n) state_now &= IDLE;
else state_now &= state_
always @(state_now or write_req or read_req or cnt)
case (state_now)
IDLE: if (write_req) state_next &= WR0;
//&frac12;&&E&&ETH;&&&&I&
else if (read_req) state_next &= RD0;
//&frac12;&&E&&&A&&&I&
else state_next &= IDLE;
WR0: if (`delay_160ns)
state_next &= WR1;
//&N&O&E&&&E&&160ns
else state_next &= WR0;
WR1: state_next &= IDLE;
//&ETH;&&frac12;&&E&,&&&&Oidle
if(`delay_160ns)
state_next &= RD1;
state_next &= RD0;
state_next &= IDLE;
//&&A&frac12;&&E&,&&&&Oidle
state_next &= IDLE;
//-------------------------------------------------------------------
SRAM_ADDR = da_//SRAM&&O&O&&I&&A&&frac12;&O
//-------------------------------------------------------------------
reg datbus_
//&E&&frac34;&Y&&U&I&&&O&O&AE&ETH;&A&&A,&&A&E&&frac34;&Y&E&C&O&&frac12;&O&&A&frac34;&I&&E&O&O&A&E
always @(posedge clk50M or negedge rst_n)
if (!rst_n) rd_data &= 16'd0;
else if (state_now == RD1)
rd_data &= SRAM_DATA;
//&O&E&&A&sup3;&&frac14;&A&&&AE&rd_data&frac14;&C&A&frac14;&&A&sup3;&&E&&frac34;&Y&&U&I&SRAM_DATA&&A&E&&frac34;&Y
always @(posedge clk50M or negedge rst_n)
if (!rst_n) datbus_ctrl &= 1'b0;
case (state_now)
IDLE: if (write_req) datbus_ctrl &= 1'b1;
else if (read_req) datbus_ctrl &= 1'b0;
else datbus_ctrl &= 1'b0;
//&O&&&&frac12;&inout&&E&&U&O&A&&&&&I&
datbus_ctrl &= 1'b1;
//&I&&E&&frac34;&Y&&U&I&&ETH;&&E&&frac34;&Y
default: datbus_ctrl &= 1'b0;
//&E&&sup1;&&E&Cwrite&O&&O&A&E&&frac34;&Y&&U&I&&&&&&I&&&E&&write
// write&O&ETH;&ETH;&,&frac12;&&I&&E&&frac34;&Y&&U&I&SRAM_DATA&ETH;&&E&wr&frac14;&A&&&AE&wr_data&&A&O&
SRAM_DATA = (datbus_ctrl)? wr_data : 16'
SRAM_WE_n = ~(datbus_ctrl);
录入后,save。弹出一对话框,取名ssram,然后browse到我们原来所新建的文件夹里,如下图
图2.11 保存module 代码
8. 选择Project&Add to Project&Existing File,如图2.12所示。
图2.12 找到自己新添加的source 代码
9. 单击Browse,选择ssram.v,如图2.13 所示。
10. 单击打开,在Add file to the project窗口,单击OK
2.3 编译文件
在Project标签下的Status列的问号,表示文件尚未编译进工程,或者在最后编译前,源文件有所改动。欲编译文件,选择Compile&Compile ALL,或者右击Project标签,选择Compile&Compile All。
1. 倘若此处没有错误,编译成功的消息,就会在Transcript窗口如图2.15所示。
图2.15 transcript在下面!!!
# reading modelsim.ini
# reading D:\questasim_10.0c\win32/../modelsim.ini
# Loading project ssram
# Compile of ssram_tst.v was successful.
# Compile of ssram.v was successful.
# 2 compiles, 0 failed with no errors.
&编译成功!
3 仿真工程
3.1 开始仿真
1. 单击Library图标,选择ssram2,单击+以展开选项,然后选择SRAM_vlg_tst。单击右键,选择simulate编译(或者进行双击),如图3.1所示。
2. 单击Simulate,到达图3.2所示画面。
图3.2 仿真窗口
4. 在图3.2中,单击SRAM_vlg_tst,单击右键,然后选择Add&To Wave&All Items in region,然后单击左键。出现图3.3所示画面。
图3.3 Add to wave 出现波形图显示区
3.2 仿真设置
1.& 完成上述最后一步后,波形窗口出现。
2. 在Run Length列输入仿真时间长度为1000ms,如图3.5所示。
图 3.5 Run length 的设置
3. 单击Run按钮进行仿真,如图所示。
等待若干秒后,出现波形图如图3.6。
图3.6 &仿真波形图
5. 连续单击Zoom IN/Out图标,可查看仿真的完整波形。
通过放大/缩小波形,可以观察到ssram的地址值在保持变化,即ssram的时序效果。若将其移植到Quartus II中,适当配置后,经过综合、时序分析、引脚分配、配置及下载等,即可实现ssram读取比较正误的效果。
至此,仿真的所有进程完毕,感谢艾米电子!
&关于Modelsim独立仿真
&关于Debussy 5.3v9 + Modelsim SE 6.5联合仿真的
阅读(...) 评论()Modelsim 仿真步骤总结_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Modelsim 仿真步骤总结
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:3&分页:Jephen发信人: Jephen (Jephen), 信区: FPGATech
标&&题: 如何使用modelsim独立仿真VIVADO2014.4生成的IP
发信站: 水木社区 (Wed Jan 28 14:33:51 2015), 站内 && 刚刚使用vivado还不太熟悉。&& 安装了vivado2014.4,使用vivado生成了一个FIFO。在vivado中编译仿真库后发现不像之前一样有Xilinxcorelib这个库了。也就没有IP对应的仿真库了。那我怎么使用modelsim独立仿真IP,也就是不在vivado中调用modelsim?&& 谢谢!
-- && ※ 来源:·水木社区 ·[FROM: 122.200.72.*]
快艇发信人: ManShip (快艇), 信区: FPGATech
标&&题: Re: 如何使用modelsim独立仿真VIVADO2014.4生成的IP
发信站: 水木社区 (Wed Jan 28 16:50:46 2015), 站内 && 建议还是在vivado里调用modelsim比较省事,
在外边编译vivado的库文件很麻烦, 跟AE反反复复搞了好久才搞定.
【 在 Jephen (Jephen) 的大作中提到: 】
: 刚刚使用vivado还不太熟悉。&&
: 安装了vivado2014.4,使用vivado生成了一个FIFO。在vivado中编译仿真库后发现不像之前一样有Xilinxcorelib这个库了。也就没有IP对应的仿真库了。那我怎么使用modelsim独立仿真IP,也就是不在vivado中调用modelsim?&&
: ...................
&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 61.50.136.*]
Jephen发信人: Jephen (Jephen), 信区: FPGATech
标&&题: Re: 如何使用modelsim独立仿真VIVADO2014.4生成的IP
发信站: 水木社区 (Wed Jan 28 16:54:23 2015), 站内 && 恩,我在vivado里面设置了使用modelsim仿真。生成了一个脚本。
照着脚本自己写了一个,可以独立仿真了,相当于单独编译一下用到的ip的库,映射到modelsim。
每次生成IP都得重新编译库,太麻烦了。
不明白vivado为啥搞成这样,像之前ISE一样把所有用到的库编译一次,映射到modelsim,IP什么的都可以随便仿真,多方便。
【 在 ManShip 的大作中提到: 】
: 建议还是在vivado里调用modelsim比较省事,
: 在外边编译vivado的库文件很麻烦, 跟AE反反复复搞了好久才搞定.
&& -- && ※ 来源:·水木社区 ·[FROM: 122.200.72.*]
文章数:3&分页:}

我要回帖

更多关于 modelsim如何使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信