找回密码
 注册
关于网站域名变更的通知
查看: 570|回复: 1
打印 上一主题 下一主题

Modelsim 之 直接仿真 

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-28 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
Modelsim 之 直接仿真
3 C! i( `/ B% c; O

2 [( J  [8 {# N1 x, g3 m  S2 F
(1)创建仿真项目
(2)加载或者新建.v.vt文件
(3)编译.v.vt文件
(4)启动仿真
(5)添加仿真信号
(6)观察波形

' X) {4 g/ M# a
第一步:打开modelsim软件
第二步:如果library中有work,直接进行第三步。第一次使用modelsim时要建立工作库(library),将这个库命名为workFile ->new ->library,这时候会弹出如图对话框

7 u" e0 _) l. A  Z4 b% M
选择a new library and a logical mapping to it,library name library physical name 都填上work 点击ok第三步:建立工程,这里我们要建立一个自动转换量程频率计的工程。File -> new -> project,此时会弹出以下对话框
project name中写入工程的名字frequency_meter,点击ok,弹出如下对话框
% M5 F8 G! f: m! G
; ~; N+ a/ |) {0 ]( ^$ V
选择create new file ,如果要仿真的.v代码已经存在那就要选择add existing file。点击create new file 后弹出以下对话框
7 y. x! u+ f) g9 ^6 H- [" I
在file  name中写入文件名frequence_meter(可以和建立的project name一致也可以不一致),Add file as type 选择verilog,点击ok,这时之前的add items to the project没有关闭,点击close将其关闭。第四步:编写主程序,即要进行仿真的代码,如果第三步是add existing file,此步骤可跳过。双击frequence_meter.v文件名出现代码编辑区
$ n7 M6 z& ~3 l( J* c) w7 G* Q
将以下代码敲入
  • 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+ R/ W. y% v4 {+ ]' [* m0 {, f7 T& M

# a5 H, G' N7 a  k1 Z3 X) y
$ \' m9 {7 t, v1 m
第五步:编写测试代码,即testbench基本testbench结构如下module name_tb//通常testbench没有输入与输出端口信号或变量定义声明产生激励波形例化设计模块监控和比较输出响应endmodule  在frequence_meter.v下方空白处右键,选择add to project -> new file出现如下对话框,在file name处写入frequency_meter_tbadd file as type 选择verilog
7 w1 K+ `) s/ \+ C: z( @1 l

; ~) @, L! U' @% j$ V
双击frequency_meter_tb.v文件名打开代码编辑区,将以下代码敲入) U) b: F" g0 x
  • `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
    , ~% y; P& R" ]& T" [7 N" q( a# |

6 w$ F2 j& T1 G) O

$ C! Z# S. l; O% q* ^: g1 X( N
) N! @, @8 e  I3 ?! O
第六步:编译代码在frequency_meter.v的文件上右键,选择compile all,也可以选择compile selected ,一个是全部编译一个是只将选中的编译。编译成功后,frequency_meter.v frequency_meter_tb.v后面的?变成了对号,
下方的transcript栏出现以下信息表示编译成功

+ E( o( P. _, h; X, Z& D, L9 y# Y) e; ]# T" X7 s, m' E' i/ H
第七步:在library的窗口下方有libraryproject的窗口切换,点击library,再点击work前的+号,将其展开会看到两个文件frequency_meter.v frequency_meter_tb.v,只选择frequency_meter_tb.vtestbench右键选择simulate
$ N) u* j: T- F; G2 P3 X

$ D* S" H. w9 h1 g& ]! V! R  q
之后会出现simobjects窗口
选中要显示的信号,这里我们选择所有信号,ctrl+A,右键Add ->To Wave -> Selected Signals,这时波形窗口出现修改如下工具栏的时间内为700ns,这个是运行的时间,即仿真要跑多长时间,点击如图工具栏的Run,即时间框的右边第一个
1 Y; [. H+ I! L! s

# R+ K$ f0 r8 o1 h# N
按住ctrl滚动鼠标滑轮就可以缩放波形
  _* L7 d4 k1 j$ g2 ]0 E
第七步:停止仿真当modelsim在仿真的时候,修改程序编译等都是无效的,这时需要停止仿真,菜单栏simulate-> end simulation 或者在transcript中输入 quit -sim
# ]; P7 f2 x4 ?" |. s+ z/ I' L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-1 02:29 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表