3516|0

6423

帖子

16

TA的资源

版主

楼主
 

Modelsim 之 直接仿真 [复制链接]

本帖最后由 白丁 于 2014-5-25 16:35 编辑

(1)创建仿真项目
(2)加载或者新建.v.vt文件
(3)编译.v.vt文件
(4)启动仿真
(5)添加仿真信号
(6)观察波形
第一步:打开modelsim软件
第二步:如果library中有work,直接进行第三步。第一次使用modelsim时要建立工作库(library),将这个库命名为workFile ->new ->library,这时候会弹出如图对话框

选择a new library and a logical mapping to it,library name library physical name 都填上work 点击ok第三步:建立工程,这里我们要建立一个自动转换量程频率计的工程。File -> new -> project,此时会弹出以下对话框
project name中写入工程的名字frequency_meter,点击ok,弹出如下对话框

选择create new file ,如果要仿真的.v代码已经存在那就要选择add existing file。点击create new file 后弹出以下对话框

在file  name中写入文件名frequence_meter(可以和建立的project name一致也可以不一致),Add file as type 选择verilog,点击ok,这时之前的add items to the project没有关闭,点击close将其关闭。第四步:编写主程序,即要进行仿真的代码,如果第三步是add existing file,此步骤可跳过。双击frequence_meter.v文件名出现代码编辑区

将以下代码敲入
  1. module frequency_meter(
  2.                        clk,       //输入时钟
  3.                        clear,     //为整个频率计的异步复位信号
  4.                        cntover,   //超良量程标志
  5.                        cntlow,   //欠量程标志
  6.                        reset,    //用来在量程转换开始时复位计数器
  7.                        std_f_sel  //用来选择标准时基
  8.                        );
  9. input clk;
  10. input clear;
  11. input cntover;
  12. input cntlow;
  13. output reset;
  14. output [1:0] std_f_sel;
  15.   
  16. reg reset;
  17. reg [1:0] std_f_sel;
  18. reg [5:0] present;    //用于保存当前状态的中间变量
  19. reg [5:0] next;       //用于保存次态的中间变量
  20. parameter start_f100k = 6'b000001,
  21.           f100k_cnt = 6'b000010,
  22.           start_f10k = 6'b000100,
  23.           f10k_cnt = 6'b001000,
  24.           start_f1k = 6'b010000,
  25.           f1k_cnt = 6'b100000;
  26. always @(posedge clk or posedge clear)
  27. begin
  28.   if(clear)
  29.     begin
  30.       present <= start_f10k;  //start_10k为起始状态
  31.     end
  32.   else
  33.     begin
  34.       present <= next;
  35.     end     
  36. end
  37. always @(present or cntover or cntlow)
  38. begin
  39.   case(present)
  40.     start_f100k:
  41.     begin
  42.       next <= f100k_cnt;
  43.     end
  44.     f100k_cnt:
  45.     begin
  46.       if(cntlow)
  47.         begin
  48.           next <= start_f10k;
  49.         end
  50.       else
  51.         begin
  52.           next <= f100k_cnt;
  53.         end
  54.     end
  55.     start_f10k:
  56.     begin
  57.       next <= f10k_cnt;
  58.     end
  59.     f10k_cnt:
  60.     begin
  61.       if(cntlow)
  62.         begin
  63.           next <= start_f1k;
  64.         end
  65.       else if(cntover)
  66.         begin
  67.           next <= f100k_cnt;
  68.         end
  69.       else
  70.         begin
  71.           next <= f10k_cnt;
  72.         end
  73.     end
  74.     start_f1k:
  75.     begin
  76.       next <= f1k_cnt;
  77.     end
  78.     f1k_cnt:
  79.     begin
  80.       if(cntover)
  81.         begin
  82.           next <= start_f10k;
  83.         end
  84.       else
  85.         begin
  86.           next <= f1k_cnt;
  87.         end
  88.     end
  89.     default:
  90.     begin
  91.       next <= start_f10k;
  92.     end
  93.   endcase
  94.   
  95. end
  96. /*该进程产生各状态下的输出*/
  97. always @(present)
  98. begin
  99.   case(present)
  100.     start_f100k:
  101.     begin
  102.       reset = 1;
  103.       std_f_sel = 2'b00;
  104.     end
  105.     f100k_cnt:
  106.     begin
  107.       reset = 0;
  108.       std_f_sel = 2'b00;
  109.     end
  110.     start_f10k:
  111.     begin
  112.       reset = 1;
  113.       std_f_sel = 2'b01;
  114.     end
  115.     f10k_cnt:
  116.     begin
  117.       reset = 0;
  118.       std_f_sel = 2'b01;
  119.     end
  120.     start_f1k:
  121.     begin
  122.       reset = 1;
  123.       std_f_sel = 2'b11;
  124.     end
  125.     f1k_cnt:
  126.     begin
  127.       reset = 0;
  128.       std_f_sel = 2'b11;
  129.     end
  130.     default:
  131.     begin
  132.       reset = 1;
  133.       std_f_sel = 2'b01;
  134.     end
  135.   endcase
  136. end
  137.   
  138. endmodule
复制代码
第五步:编写测试代码,即testbench基本testbench结构如下module name_tb//通常testbench没有输入与输出端口信号或变量定义声明产生激励波形例化设计模块监控和比较输出响应endmodule  在frequence_meter.v下方空白处右键,选择add to project -> new file出现如下对话框,在file name处写入frequency_meter_tbadd file as type 选择verilog

双击frequency_meter_tb.v文件名打开代码编辑区,将以下代码敲入
  1. `timescale 1ns/1ns
  2. module frequency_meter_tb;
  3.   reg clk;
  4.   reg clear;
  5.   reg cntover;
  6.   reg cntlow;
  7.   wire reset;
  8.   wire [1:0] std_f_sel;
  9.   
  10.   parameter DELAY = 100;
  11.   always #100 clk = ~clk;    //产生时钟
  12.   frequency_meter test(
  13.                         .clk(clk),
  14.                         .clear(clear),
  15.                         .cntover(cntover),
  16.                         .cntlow(cntlow),
  17.                         .reset(reset),
  18.                         .std_f_sel(std_f_sel)
  19.                         );
  20.   initial
  21.   begin
  22.     clear = 1;clk = 0;
  23.     #DELAY clear = 0; cntover = 1;cntlow = 0;
  24.     #DELAY cntover = 0; cntlow = 0;
  25.     #DELAY cntover = 0; cntlow = 1;
  26.     #DELAY cntover = 0; cntlow = 1;
  27.     #DELAY cntover = 1; cntlow = 0;
  28.     #DELAY cntover = 0; cntlow = 0;   
  29.   end
  30. endmodule
复制代码

第六步:编译代码在frequency_meter.v的文件上右键,选择compile all,也可以选择compile selected ,一个是全部编译一个是只将选中的编译。编译成功后,frequency_meter.v frequency_meter_tb.v后面的?变成了对号,
下方的transcript栏出现以下信息表示编译成功


第七步:在library的窗口下方有libraryproject的窗口切换,点击library,再点击work前的+号,将其展开会看到两个文件frequency_meter.v frequency_meter_tb.v,只选择frequency_meter_tb.vtestbench右键选择simulate

之后会出现simobjects窗口
选中要显示的信号,这里我们选择所有信号,ctrl+A,右键Add ->To Wave -> Selected Signals,这时波形窗口出现修改如下工具栏的时间内为700ns,这个是运行的时间,即仿真要跑多长时间,点击如图工具栏的Run,即时间框的右边第一个

按住ctrl滚动鼠标滑轮就可以缩放波形

第七步:停止仿真当modelsim在仿真的时候,修改程序编译等都是无效的,这时需要停止仿真,菜单栏simulate-> end simulation 或者在transcript中输入 quit -sim

此帖出自FPGA/CPLD论坛

赞赏

1

查看全部赞赏

点赞 关注
个人签名training
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表