Quartus II 自带Simulaiton 与 Modelsim Simulaiton功能仿真
0赞Quartus II 自带Simulaiton 与
Modelsim Simulaiton功能仿真
目录
一、两者优缺点
1) Quartus II 自带的Simulation比较适合初学者使用,纯粹的GUI,用鼠标设置即可进行仿真,非常简洁明明了。但是相对于比较大的工程,比较复杂的项目,纯粹的手工,死板的设置,或许在设计者面前便是束手无策了,这个时候,无奈之下,《移情别恋,开始Modelsim》。
2) 相对于Quartus II 自带的Simulation而言,Modelsim Simulation虽然也能简单的进行GUI设置激励,但是更强大的在于testbench测试语言,来对逻辑设计进行仿真测试。对于强大的项目,往往是测试占去了大部分时间,如若还用Quartus II自带的Simulation,设计者必然脑残。复杂的同时意味着强大,Modelsim Simulation更适合项目的开发,能熟练运用Modelsim必然对fpga开发项目带来事半功倍的效益。
二、彼此仿真步骤
1. Quartus II 自带Simulation
1) 新建wave_test工程
2) 编辑代码如下
/*-------------------------------------------------------------------------
This confidential and proprietary software may be only used as authorized
by a licensing agreement from CrazyBingo.
(C) COPYRIGHT 2012 CrazyBingo. ALL RIGHTS RESERVED
Filename : led_matrix_display.v
Author : CrazyBingo
Data : 2012-01-18
Version : 0.1
Description : This file has the module of led_matrix_display top.
Modification History :
Data By Version Change Description
===========================================================================
12/01/18 CrazyBingo 0.1 Original
--------------------------------------------------------------------------*/
`timescale 1ns / 1ns
module wave_test
(
//golobal clock
input clk,
input rst_n,
//divide clock
output clk_out,
//adder signals
input [7:0] din1,
input [7:0] din2,
output reg [7:0] dout,
//self add data
output reg [3:0] addout
);
//-------------------------------------
//divide clock
reg [1:0] cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 2'b0;
else
cnt <= cnt + 1'b1;
end
assign clk_out = cnt[1];
//-------------------------------------
//add din1 with din2 to dout
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
dout <= 8'd0;
else
dout <= din1 + din2;
end
//-------------------------------------
//self add addout
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
addout <= 4'd0;
else
addout <= addout + 1'b1;
end
endmodule
3) 编译修改调试,RTL如下所示
4) 新建wave文件,输入激励,如下所示
5) Simulation,完成,输出仿真结果如下所示
a) 四分频clk_out
b) 加法器dout
c) 自增addout
2. Modelsim Simulation功能仿真
1) 同上
2) 在wave_test代码最前面添加`timescale 1ns / 1ns 即仿真单位为1ns,仿真精度为1ns
注:若多个文件,,每个文件都得加·timescale 1ns/1ns
3) 同上
4) 打开Modelsim,新建wave_test_presynth工程,如下所示
a) src(最后一个)为Quartus II中verilog设计源文件保存目录
b) simulation为modelsim工程保存目录
c) presynth为modelsim功能仿真文件保存目录
i. src为testbench 文件保存目录
ii. work为工程文件保存目录
d) postsynth为综合后的功能仿真(后续仿真设计备用,只进行功能仿真没必要此)
e) postlayout为布局布线后的时序仿真(后续仿真设计备用,只进行功能仿真没必要此)
5) Add File wave_test_tb.v的testbench文件,图与代码如下所示
(添加`timescale 1ns / 1ns 即仿真单位为1ns,仿真精度为1ns同上)
`timescale 1ns / 1ns
module wave_test_tb;
//-------------------------------
//golobal clock
reg clk;
reg rst_n;
//divide clock
wire clk_out;
//adder signals
reg [7:0] din1;
reg [7:0] din2;
wire [7:0] dout;
//self add data
wire [3:0] addout;
//-------------------------------
wave_test U_wave_test
(
//golobal clock
.clk (clk),
.rst_n (rst_n),
//divide clock
.clk_out (clk_out),
//adder signals
.din1 (din1),
.din2 (din2),
.dout (dout),
//self add data
.addout (addout)
);
//-------------------------------
//初始化
initial
begin
clk = 1'b0;
rst_n = 1'b0;
#20 rst_n = 1'b1;
end
always
#10 clk = !clk; //20ns,50MHz
//-------------------------------
//输入加法器激励
initial
begin
#20 din1 = 8'h11; din2 = 8'h22;
#100 din1 = 8'h33; din2 = 8'h44;
#500 din1 = 8'h55; din2 = 8'h66;
End
endmodule
当然也可以在Quartus中新建此文件到目录下,或者Modelsim中新建,如下所示
6) Add Exitiing Files,添加Quartus src文件如下
7) Compile All差错修正,若有错误双击error便会跳出错误提示
8) Simulation-Start Simulation,选择work中的wave_test_tb文件为design Units,OK,如下所示(添加design units也可以预编译库文件,下篇中讲述;或者直接在library-work中右键单击warm_test_tb,选择simulation,或者直接双击即可)
此时已经对wave_test_tb.v于wave_test进行Loading,VSIM 2>表示等待命令
9) Modelsim必须做完Simulation才能把所有档案link起来,因此(8)之后添加激励如下所示。打开View-Wave,然后在View-Objects中wave_test_tb的objects添加需要的输入到Wave中,此处与Quartus II无异。如下图所示:
10) 在Transcript窗口VISIM 2>后面输入 run 1000ns(表示运行1000ns),如此如下所示
11) 点击Wave窗口右上角的Dock/Undock,更方便查看wave,如下图所示
修改显示的进制格式与Quartus II无异。
12) 复位仿真与结束仿真(也可在Transcript用tcl脚本实现)
其他按钮功能如下:
13) 如要修改:结束仿真--修改代码--编译--run即可
14) 再试试,不行就再试试,试着试着,就行了。