您当前的位置:五五电子网电子知识电子学习基础知识电脑-单片机-自动控制使用ModelSim完成基本的HDL仿真 正文
使用ModelSim完成基本的HDL仿真

使用ModelSim完成基本的HDL仿真

点击数:7467 次   录入时间:03-04 11:55:23   整理:http://www.55dianzi.com   电脑-单片机-自动控制

      这里我们教大家使用ModelSim完成基本的HDL仿真。所应用的仿真代码是ModelSim自带的。安装了ModelSim后,可以在安装目录的examples/tutorials/verilog/basICSimulation下找到counter.v 和tcounter.v。其中counter.v是被验证设计,tcounter.v是Testbench。
    仿真过程如下
1.打开ModelSim,首先建立一个新的Project,选择File->New->Project,

建立一个新的Project

图1
2. 在弹出的Create Project窗口中给Project任意起一个名字,并指定Project的目录(Project LOCation)。我们假设Project Name为TestCounter,创建的Library名为work(所有我们编译后的代码的模块将被放入到work库中)。如下图所示:

并指定Project的目录

 图2
3.点击OK后弹出添加HDL代码到Project的窗口,如下图:

添加HDL代码到Project的窗口

 图3

(

www.55dianzi.com
我们选择Add Existing File,假设$ModelSim是你的ModelSim的跟目录,则添加下面两个文件:
$ModelSim/examples/tutorials/verilog/basICSimulation/counter.v
$ModelSim /examples/tutorials/verilog/basicSimulation/tcounter.v
添加文件的窗口如下图所示

添加文件的窗口

图4
Tcounter.v的源代码如下:

  1. module test_counter;   
  2.  
  3. reg clk, reset;  
  4. wire [7:0] count;   
  5.  
  6. counter dut (count, clk, reset);   
  7.  
  8. initial // CLOCk generator  
  9.   begin  
  10.     clk = 0;  
  11.     forever #10 clk = !clk;  
  12.   end  
  13.     
  14. initial // Test stimulus  
  15.   begin  
  16.     reset = 0;  
  17.     #5 reset = 1;  
  18.     #4 reset = 0;  
  19.   end  
  20.     
  21. initial  
  22.     $monitor($stime,, reset,, clk,,, count);   
  23.       
  24. endmodule     


counter.v的源代码如下:

  1. module counter (count, clk, reset);  
  2. output [7:0] count;  
  3. input clk, reset;   
  4.  
  5. reg [7:0] count;  
  6. parameter tpd_reset_to_count = 3;  
  7. parameter tpd_clk_to_count   = 2;   
  8.  
  9. function [7:0] increment;  
  10. input [7:0] val;  
  11. reg [3:0] i;  
  12. reg carry;  
  13.   begin  
  14.     increment = val;  
  15.     carry = 1'b1;  
  16.     /*   
  17.      * Exit this loop when carry == zero, OR all bits processed   
  18.      */   
  19.     for (i = 4'b0; ((carry == 4'b1) && (i <= 7));  i = i+ 4'b1)  
  20.        begin  
  21.          increment[i] = val[i] ^ carry;  
  22.          carry = val[i] & carry;  
  23.        end  
  24.   end         
  25. endfunction   
  26.  
  27. always @ (posedge clk or posedge reset)  
  28.   if (reset)  
  29.      count = #tpd_reset_to_count 8'h00;  
  30.   else 
  31.      count <= #tpd_clk_to_count increment(count);   
  32.  
  33. /*****************************************************************   
  34. Use the following block to make the design synthesizable.   
  35.  
  36. always @ (posedge clk or posedge reset)  
  37.   if (reset)  
  38.      count = 8'h00;  
  39.   else  
  40.      count <= count + 8'h01;  
  41. ******************************************************************/ 
  42. Endmodule  

(

www.55dianzi.com
我们在WorkSPACe下单击右键选择Compile->Compile All,编译上述两个文件,如下图所示:

编译

 图5
从tcounter.v的源代码为我们看到Testbench的模块名叫test_counter,我们切换WorkSpace到Library,选择work库下的test_counter,单击鼠标右键选择simulate,如下图所示。

切换WorkSpace到Library

 图6
我们在弹出的Objects窗口中单击鼠标右键,选择Add to wave->Signals in Region,如下图所示:

 图7
我们将仿真时间改为 1 us,并单击菜单中的Run按钮,并如下图所示:

图8

(

www.55dianzi.com
我们在wave窗口中选择count,将其改为无符号整形显示。选择count,单击鼠标右键,选择Radix->Unsigned,如下图所示:

改为无符号整形显示

[1] [2]  下一页


本文关键字:暂无联系方式电脑-单片机-自动控制电子学习 - 基础知识 - 电脑-单片机-自动控制