社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 精华区
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
搜索
查看: 1946|回复: 0

[讨论] Modelsim 之 直接仿真

[复制链接]

6321

TA的帖子

17

TA的资源

版主

Rank: 6Rank: 6

发表于 2014-5-25 16:35:11 | 显示全部楼层 |阅读模式
本帖最后由 白丁 于 2014-5-25 16:35 编辑

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

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

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

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

将以下代码敲入
  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
图片7.png

双击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后面的?变成了对号, 图片8.png
下方的transcript栏出现以下信息表示编译成功 图片9.png


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

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

按住ctrl滚动鼠标滑轮就可以缩放波形 图片13.png

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

此帖出自Espier专区论坛

评分

1

查看全部评分

training

回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-9-24 07:29 , Processed in 0.201732 second(s), 21 queries , Redis On.

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