EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Modelsim 之 直接仿真
% c( q* ]3 v( h) I; t9 w/ e: j. b5 E
3 i% t# [( l P6 X- R(1)创建仿真项目 (2)加载或者新建.v与.vt文件 (3)编译.v和.vt文件 (4)启动仿真 (5)添加仿真信号 (6)观察波形
( c* o. ~8 x6 G8 ~/ y8 I+ Z% J第一步:打开modelsim软件 第二步:如果library中有work,直接进行第三步。第一次使用modelsim时要建立工作库(library),将这个库命名为work。File ->new ->library,这时候会弹出如图对话框
) u. L' v Y% f& [5 F/ n. a, p选择a new library and a logical mapping to it,library name 和library physical name 都填上work 点击ok第三步:建立工程,这里我们要建立一个自动转换量程频率计的工程。 File -> new -> project,此时会弹出以下对话框![]() 在 project name中写入工程的名字frequency_meter,点击ok,弹出如下对话框9 s- F6 T5 U; B, z; w+ ~, w* ~
![]() ! E7 B( `( z6 i6 o1 E! A6 C
选择create new file ,如果要仿真的.v代码已经存在那就要选择add existing file。点击create new file 后弹出以下对话框![]() Q- C. u$ ^" N9 _! P% W' P
在file name 中写入文件名frequence_meter(可以和建立的project name一致也可以不一致),Add file as type 选择verilog,点击ok,这时之前的add items to the project没有关闭,点击close将其关闭。第四步:编写主程序,即要进行仿真的代码,如果第三步是 add existing file,此步骤可跳过。双击frequence_meter.v文件名出现代码编辑区![]() ![]()
# T4 m* b( ^6 j- g+ d将以下代码敲入 - module frequency_meter(
- clk, //输入时钟
- clear, //为整个频率计的异步复位信号
- cntover, //超良量程标志
- cntlow, //欠量程标志
- reset, //用来在量程转换开始时复位计数器
- std_f_sel //用来选择标准时基
- );
- input clk;
- input clear;
- input cntover;
- input cntlow;
- output reset;
- output [1:0] std_f_sel;
- reg reset;
- reg [1:0] std_f_sel;
- reg [5:0] present; //用于保存当前状态的中间变量
- reg [5:0] next; //用于保存次态的中间变量
- parameter start_f100k = 6'b000001,
- f100k_cnt = 6'b000010,
- start_f10k = 6'b000100,
- f10k_cnt = 6'b001000,
- start_f1k = 6'b010000,
- f1k_cnt = 6'b100000;
- always @(posedge clk or posedge clear)
- begin
- if(clear)
- begin
- present <= start_f10k; //start_10k为起始状态
- end
- else
- begin
- present <= next;
- end
- end
- always @(present or cntover or cntlow)
- begin
- case(present)
- start_f100k:
- begin
- next <= f100k_cnt;
- end
- f100k_cnt:
- begin
- if(cntlow)
- begin
- next <= start_f10k;
- end
- else
- begin
- next <= f100k_cnt;
- end
- end
- start_f10k:
- begin
- next <= f10k_cnt;
- end
- f10k_cnt:
- begin
- if(cntlow)
- begin
- next <= start_f1k;
- end
- else if(cntover)
- begin
- next <= f100k_cnt;
- end
- else
- begin
- next <= f10k_cnt;
- end
- end
- start_f1k:
- begin
- next <= f1k_cnt;
- end
- f1k_cnt:
- begin
- if(cntover)
- begin
- next <= start_f10k;
- end
- else
- begin
- next <= f1k_cnt;
- end
- end
- default:
- begin
- next <= start_f10k;
- end
- endcase
- end
- /*该进程产生各状态下的输出*/
- always @(present)
- begin
- case(present)
- start_f100k:
- begin
- reset = 1;
- std_f_sel = 2'b00;
- end
- f100k_cnt:
- begin
- reset = 0;
- std_f_sel = 2'b00;
- end
- start_f10k:
- begin
- reset = 1;
- std_f_sel = 2'b01;
- end
- f10k_cnt:
- begin
- reset = 0;
- std_f_sel = 2'b01;
- end
- start_f1k:
- begin
- reset = 1;
- std_f_sel = 2'b11;
- end
- f1k_cnt:
- begin
- reset = 0;
- std_f_sel = 2'b11;
- end
- default:
- begin
- reset = 1;
- std_f_sel = 2'b01;
- end
- endcase
- end
- endmodule& Y1 L. q c) [# Z7 A+ t2 e( G6 `
* a6 C4 G0 k% z6 ]0 M0 C* h( X! I( H0 y2 X
第五步:编写测试代码,即 testbench,基本 testbench结构如下module name_tb// 通常testbench没有输入与输出端口信号或变量定义声明产生激励波形例化设计模块监控和比较输出响应endmodule 在 frequence_meter.v下方空白处右键,选择add to project -> new file出现如下对话框,在 file name处写入frequency_meter_tb,add file as type 选择verilog
( P0 D4 j' R3 r5 C& K) @![]()
# T% x' X+ z7 |7 W" F双击 frequency_meter_tb.v文件名打开代码编辑区,将以下代码敲入
U+ ]. I' B9 I. G9 G7 p3 L/ Q- `timescale 1ns/1ns
- module frequency_meter_tb;
- reg clk;
- reg clear;
- reg cntover;
- reg cntlow;
- wire reset;
- wire [1:0] std_f_sel;
- parameter DELAY = 100;
- always #100 clk = ~clk; //产生时钟
- frequency_meter test(
- .clk(clk),
- .clear(clear),
- .cntover(cntover),
- .cntlow(cntlow),
- .reset(reset),
- .std_f_sel(std_f_sel)
- );
- initial
- begin
- clear = 1;clk = 0;
- #DELAY clear = 0; cntover = 1;cntlow = 0;
- #DELAY cntover = 0; cntlow = 0;
- #DELAY cntover = 0; cntlow = 1;
- #DELAY cntover = 0; cntlow = 1;
- #DELAY cntover = 1; cntlow = 0;
- #DELAY cntover = 0; cntlow = 0;
- end
- endmodule
. R2 w1 E4 b) u0 T. k7 q . H* x9 w0 P( v
9 m) A+ n8 D H0 [
) [+ i6 B2 @$ F2 b5 L
第六步:编译代码在 frequency_meter.v的文件上右键,选择compile all,也可以选择compile selected ,一个是全部编译一个是只将选中的编译。编译成功后,frequency_meter.v 和frequency_meter_tb.v后面的?变成了对号, ![]() 下方的transcript 栏出现以下信息表示编译成功 ![]() 8 A6 s2 a; F8 N" W; r
1 v# ^' d4 S1 y& C9 S& b( u1 z第七步:在library 的窗口下方有library和project的窗口切换,点击library,再点击work前的+号,将其展开会看到两个文件frequency_meter.v 和frequency_meter_tb.v,只选择frequency_meter_tb.v即testbench右键选择simulate ) X9 A: A7 D: N) P/ H! w
5 r$ i2 L3 `) |* n. [5 c之后会出现sim 和objects窗口 ![]() 选中要显示的信号,这里我们选择所有信号,ctrl+A ,右键Add ->To Wave -> Selected Signals,这时波形窗口出现修改如下工具栏的时间内为 700ns,这个是运行的时间,即仿真要跑多长时间,点击如图工具栏的Run,即时间框的右边第一个8 V8 |7 X* u8 e: q+ b3 s' ~6 k
![]()
: M6 v4 \: N9 E& `5 H k4 L4 T7 \! K按住ctrl 滚动鼠标滑轮就可以缩放波形![]()
m/ b4 N; Z/ _7 N& B( I J$ s第七步:停止仿真当modelsim在仿真的时候,修改程序编译等都是无效的,这时需要停止仿真,菜单栏simulate-> end simulation 或者在transcript中输入 quit -sim
+ O( N8 k. Q+ N |