精华内容
下载资源
问答
  • modelsim使用教程
    千次阅读
    2020-06-08 22:53:19

    我的博客:QuartusII Modelsim使用教程 – Infinite’s Blog

     

    QuartusII中Modelsim是一个很好的仿真软件,相较于VWF,它的仿真时间更长、显示更具体、界面更友好,另外Modelsim还可以结合TestBench来进行仿真,省去了自己设置信号的过程。本文将从以下几个方面来介绍Modelsim的使用:

    • 1、Modelsim联合TestBench进行仿真;
    • 2、Modelsim仿真的几个小窍门;
    • 3、Modelsim软件的bug

    1、Modelsim联合TestBench进行仿真

    我一开始的时候对TestBench很不习惯,因为一搜TestBench就有各样的语法,让人头大,但后来在我写了一两个之后,我就不禁发出感叹“我是**”,TestBench免去了我打开modelsim之后,手动配置输入信号、时钟等,大大提高了我的仿真效率。

    在Verilog代码写好编译好之后,可以通过Processing->Start->Start Test Bench Template Writer来自动生成一个TestBench模板。我们可以看到他是长这个样子的

    // Copyright (C) 2017  Intel Corporation. All rights reserved.
    // Your use of Intel Corporation's design tools, logic functions 
    // and other software and tools, and its AMPP partner logic 
    // functions, and any output files from any of the foregoing 
    // (including device programming or simulation files), and any 
    // associated documentation or information are expressly subject 
    // to the terms and conditions of the Intel Program License 
    // Subscription Agreement, the Intel Quartus Prime License Agreement,
    // the Intel FPGA IP License Agreement, or other applicable license
    // agreement, including, without limitation, that your use is for
    // the sole purpose of programming logic devices manufactured by
    // Intel and sold by Intel or its authorized distributors.  Please
    // refer to the applicable agreement for further details.
    
    // *****************************************************************************
    // This file contains a Verilog test bench template that is freely editable to  
    // suit user's needs .Comments are provided in each section to help the user    
    // fill out necessary details.                                                  
    // *****************************************************************************
    // Generated on "05/17/2020 21:30:07"
                                                                                    
    // Verilog Test Bench template for design : AES_encryp
    // 
    // Simulation tool : ModelSim-Altera (Verilog)
    // 
    
    `timescale 1 ps/ 1 ps
    module AES_encryp_vlg_tst();
    // constants                                           
    // general purpose registers
    reg eachvec;
    // test vector input registers
    reg clk;
    reg [127:0] iKey;
    reg [127:0] iPlaintext;
    reg rst_n;
    // wires                                               
    wire [127:0]  oCiphertext;
    
    // assign statements (if any)                          
    AES_encryp i1 (
    // port map - connection between master ports and signals/registers   
    	.clk(clk),
    	.iKey(iKey),
    	.iPlaintext(iPlaintext),
    	.oCiphertext(oCiphertext),
    	.rst_n(rst_n)
    );
    initial                                                
    begin                                                  
    // code that executes only once                        
    // insert code here --> begin                          
                                                           
    // --> end                                             
    $display("Running testbench");                       
    end                                                    
    always                                                 
    // optional sensitivity list                           
    // @(event1 or event2 or .... eventn)                  
    begin                                                  
    // code executes for every event on sensitivity list   
    // insert code here --> begin                          
                                                           
    @eachvec;                                              
    // --> end                                             
    end                                                    
    endmodule

    在这里特别提一下最后一个@eachvec 这一串代码,虽然具体不知道这段代码的作用,但如果加上这段代码,那么在进行Modelsim仿真的时候,仿真时间会特别短,clk也无法振动起来,因此再写需要clk的TestBench时建议将@eachvec这一段去了。

    那么接下来编写TestBench就变得十分容易,你可以在initial中加入你要初始化的变量,例如rst_n,初始输入的数据等等,除此之外还可以通过#延时,来增加新的输入。然后在always中进行clk的实现,下面是加入初始化变量和时钟的部分TestBench代码。

    initial                                                
    begin                                                  
    // code that executes only once                        
    // insert code here --> begin                          
    begin                                                  
    	#0 	clk = 0;
    		rst_n = 0;
    	#5	rst_n = 1;
    		iKey = 128'h31_32_33_34_35_36_37_38_39_30_31_32_33_34_35_36;
    		iPlaintext = 128'h30_39_38_37_36_35_34_33_32_31_36_35_34_33_32_31;
    	#1000	rst_n = 0;
            #5      rst_n = 1;
    		iKey = 128'h30_39_38_37_36_35_34_33_32_31_36_35_34_33_32_31;
    		iPlaintext = 128'h31_32_33_34_35_36_37_38_39_30_31_32_33_34_35_36;
    // --> end                                             
    $display("Running testbench");                       
    end                                                    
    always                                                 
    // optional sensitivity list                           
    // @(event1 or event2 or .... eventn)                  
    begin                                                  
    // code executes for every event on sensitivity list   
    // insert code here --> begin                          
        #10 clk = ~clk;                                                                                              
    // --> end                                             
    end                                                    
    endmodule

    在写了一两个TestBench之后,也可以去了解一下repeat等的函数,来进一步提高编写TestBench的能力。

    以下是配置Modelsim启用TestBench。

    点击菜单栏的Assignments->setting->EDA Tool Settings->Simulation如下图所示

    之后就一直Ok,然后就可以打开Modelsim进行仿真了。

    2、Modelsim仿真的几个小窍门

    1、在使用Modelsim时,我们常常会发现代码的问题然后去修改,那么修改了代码之后如何重新Modelsim仿真呢

    如上图所示,只要在Modelsim中的Library->work->修改代码的文件->Recompile即可重新编译,不需要再每次重启Modelsim。

    在之后如何重新运行Modelsim

    如图所示,Simulate->Restart 选择OK即可,在之后run即可

    值得一提的是,run不仅可以通过Simulate->run 还可以在如下图中直接输入run 100来运行仿真

    2、如何在Modelsim中加入别的变量?

    如上图所示,我们可以在sim中选择相应的模块,其中的assign是你在头文件中定义的变量。

    另外再加入变量后,需要Restart Modelsim仿真,这样才可以看到数据一开始的变化过程,当然如果不进行Restart,也可以看到你加入变量之后的时间段的结果。

    3、Modelsim的软件Bug

    Modelsim因为版本问题,可能会有一些的坑,我这里记录一个我最近遇到的坑,之后又新的坑会再继续更新。

    1、关于Modelsim无法找到mif文件的问题

    在我使用的Quartus17.1的自带的Modelsim中,当我使用ROM IP核的时候,我通过Mif文件写入,但通过modelsim仿真却发现,mif文件并没有能够被modelsim读出来,我也搜索了许多的解决方案,例如,将mif文件放在simulation文件夹下,或者说将mif文件放在工程文件下,但最后都不好使。最后我找到了解决方案:将mif文件的路径改成绝对路径,如下图所示。(PS:这个可能看脸,我同学的同样版本的quartus和modelsim他就可以读出来......)

    具体就先更新这么多,日后在实践中又遇到新的问题再回来更新哈。

    更多相关内容
  • modelsim使用教程

    2018-08-02 17:48:10
    modelsim使用教程modelsim使用教程modelsim使用教程modelsim使用教程
  • 这个是Modelsim详细使用教程,希望对各位有帮助
  • Modelsim使用教程

    2017-10-23 17:46:49
    主要为ModelSim仿真工具的使用方法,从开始创建工程到后期对相应testbench的仿真介绍,非常基础使用。分享仅供学习交流。
  • ModelSim使用教程

    2015-07-06 22:06:26
    modelsim使用教程,比较详细,包括了基本操作教程和一些常见问题的解决方法等
  • 2、Modelsim使用教程

    2022-07-13 23:14:59
    modelsim编程使用教程,步解,超详细

    1、双击软件Modelsim-64 10.4打开

    2、点击左上角File-->new-->Library..

    3、点击之后出现Create a New Libra 

    4、在Library Name之中输入自己想要的名字建议英文,因为本混子取得英文,没试过中文,然后点击OK

    5、在你的Library页面可以找到自己刚才创建的Library

     6、点击左上角File-->New-->Project.. 

    7、点击之后出现Create Project

    8、在Project Name中输入自己想要起的名字,建议英文,在Project Location后面的Browse..选择想要保存的地方,在Default Library Name下输入自己想要保存在哪个Library下,然后点击OK

     9、点击之后会变为这个样子,点击Create New File

     10、点击之后,会出现下面情况,在File Name 中输入自己想起的名字,建议英文,中文本混子没试过,点击Add file as type下面的黑色三角,选择verilog

     11、输好之后,点击OK

     12、屏幕变为这个样子,点击正中间Add items to the Projict的×,关闭Add items to the Projict。

     13、双击你所创建的.v文件,本混子创建的就是hz.v文件。

     14、弹出编程框,接下来就可以进行编程使用了

     

    展开全文
  • modelsim使用教程.pdf

    2013-08-16 18:02:24
    modelsim的基础使用教程。包含了大部分基本功能。
  • Modelsim 使用教程

    2010-06-11 09:40:59
    Modelsim 使用教程 使用Modelsim进行仿真功能仿真,门级仿真,时序仿真
  • ModelSim 使用教程

    2011-04-23 11:17:47
    中文版的ModelSim使用教程,适合初次使用ModelsIM的人参考
  • modelsim 使用教程

    2009-08-25 17:16:49
    FPGA第三方软件modelsim安装、使用教程,希望能对你的学习有帮助
  • 关于modelsim的入门级教程,其中有若干简单的VHDL仿真。
  • modelsim使用教程中文版,非常详细,对于初学者有很大的帮助。
  • modelsim详细使用教程(一看就会)
  • ISE新建VHDL工程

    1.创建新工程:lab(实际功能是,两个与模块的结果再进行或)

    新建工程:

     工程命名:

     选择器件型号和语言类型:

     然后点击next和finish,工程创立完成

    2.编写程序:

    右击工程,创建新的文件:

     我这里选择的是VHDL module ,如果你是Verilog,也可以选择,然后输入文件名字:

    然后可以输入这个模块的输入输出端口:

    点击next和finish后,完成创建,因为我关联了notepad++,会自动跳转到编辑器界面:

     然后编写程序即可:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    
    entity MY_AND2 is
        Port ( A : in  STD_LOGIC;
               B : in  STD_LOGIC;
               C : out  STD_LOGIC);
    end MY_AND2;
    
    architecture Behavioral of MY_AND2 is
    
    begin
        C  <= A  and  B;
    
    end Behavioral;
    

    同理,我们编写MY_OR2程序:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    
    
    entity MY_OR2 is
        Port ( A : in  STD_LOGIC;
               B : in  STD_LOGIC;
               C : out  STD_LOGIC);
    end MY_OR2;
    
    architecture Behavioral of MY_OR2 is
    
    begin
    
        C <= A or B;
    end Behavioral;
    

     然后我们编写顶层文件:

     

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    
    
    
    entity AND_OR is
        Port ( IN1 : in  STD_LOGIC;
               IN2 : in  STD_LOGIC;
               IN3 : in  STD_LOGIC;
               IN4 : in  STD_LOGIC;
               Z : out  STD_LOGIC);
    end AND_OR;
    
    architecture Behavioral of AND_OR is
    
    component MY_AND2
        port(
            A : in std_logic;
            B:in std_logic;
            C :out std_logic
        );
    end component;
    
    component MY_OR2
        port(
            A : in std_logic;
            B:in std_logic;
            C :out std_logic
        );
    end component;
    signal sig1,sig2:std_logic;
    begin
        U0:MY_AND2 port map(A  => IN1,B => IN2,C=>sig1);
        U1:MY_AND2 port map(A  => IN3,B => IN4,C=>sig2);
        U2:MY_OR2 port map(A  => sig1,B => sig2,C=>Z);
    
    end Behavioral;

    3.语法检查: 

     

     4.查看电路图:

    双击 view rtl schmemaic即可:

     

     5.行为级仿真:

    创建tb测试文件:

     选择顶层文件:

     进行tb文件编写:

    然后双击simulate behavioral model就可以进行仿真了:

    LIBRARY ieee;
    USE ieee.std_logic_1164.ALL;
     
     
    ENTITY tb_AND_OR IS
    END tb_AND_OR;
     
    ARCHITECTURE behavior OF tb_AND_OR IS 
     
        -- Component Declaration for the Unit Under Test (UUT)
     
        COMPONENT AND_OR
        PORT(
             IN1 : IN  std_logic;
             IN2 : IN  std_logic;
             IN3 : IN  std_logic;
             IN4 : IN  std_logic;
             Z : OUT  std_logic
            );
        END COMPONENT;
        
    
       --Inputs
       signal IN1 : std_logic:='0';
       signal IN2 : std_logic:='0';
       signal IN3 : std_logic :='0';
       signal IN4 : std_logic :='0';
    
     	--Outputs
       signal Z : std_logic;
     
    BEGIN
     
    	-- Instantiate the Unit Under Test (UUT)
       uut: AND_OR PORT MAP (
              IN1 => IN1,
              IN2 => IN2,
              IN3 => IN3,
              IN4 => IN4,
              Z => Z
            );
    
     
      
        TB:process
        begin
            IN1 <= '1';IN2<='0';
            IN3 <= '0';IN4<='1';
            wait for 50 ns;	
            IN1 <= '0';IN2<='0';
            IN3 <= '1';IN4<='1';
            wait for 50 ns;	
             IN1 <= '1';IN2<='0';
            IN3 <= '0';IN4<='1';
            
            wait;
        end process;
    
      
    
    END;
    

     得出仿真波形图:

     6.生成网表文件

     双击implement design:

     然后就可以看到占用的资源的总体报告:

     7.布局布线后仿真:

    如果没有出现仿真器,就点击一下tb文件

     我们可以看到后仿真后 时序依旧满足要求:

     

    展开全文
  • Modelsim软件的基本使用教程

    目录

    1.FPGA设计流程

    2.modelsim的使用介绍

    3.手动仿真

    4.自动仿真(联合仿真)

    5.testbench(激励)文件的编写


    1.FPGA设计流程

     可看到上图中有两个仿真,分别是RTL仿真和时序仿真。

    • RTL仿真:可称为综合前仿真、前仿真或功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟。在编写完代码后可进行对代码的仿真,检测其是否符合功能要求,仿真的对象为Verilog HDL代码,可以比较直接的观察波形的变化。

    • 时序仿真:也称为后仿真,可以真实的反应逻辑的时延和功能,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定的时序条件虾满足设计构想的过程,是否存在时序违规。

     注意:在对于时序要求不严格的小规模设计,一般只进行功能仿真。本文介绍的就是功能仿真。

    2.modelsim的使用介绍

    modelsim的使用主要分为以下两种情况:

    •  直接使用modelsim软件进行仿真,即手动仿真;

    • 通过其他的EDA工具如Quartus II调用modelsim软件进行仿真,即自动仿真或联合仿真

    这两种情况都遵循以下5个步骤:

      ① 新建工程;

      ② 编写Verilog文件和Testbench仿真文件;

      ③编译工程;

      ④启动仿真器并加载设计顶层

      ⑤执行仿真。

    执行仿真后,modelsim软件会根据设计文件和仿真文件生成波形,从而通过观察波形来判断设计的代码功能是否正确。

    功能仿真需要的文件:

    • 设计HDL源代码:可使用VHDL或Verilog语言

    • 测试鼓励代码(TestBench):根据设计要求输入/输出的激励程序。

    • 仿真模型/库:根据设计内调用的器件供应商提供的模块而定。如:FIFO等。

    3.手动仿真

    • 建立Modelsim工程并添加仿真文件

      首先在工程文件的“sim”文件夹下创建新的文件夹“tb”。

    • 启动modelsim软件,选择File->Change Directory。

     选择目录路径为刚才新建的tb文件夹。

     建立工程,选择File->New->Project。

    弹出如下新的窗口,“Project Name”栏中填上工程名,最好根据仿真文件来进行命名

    接着弹出如下新的窗口,共有四种操作:Create New File(创建新文件)、Add Existing File(添加已有文件)、Create Simulation(创建仿真)和 Create New Folder(创建新文件夹)。先选择“Add Existing File”(添加已有文件)。

    接着弹出如下新的窗口,点击“Browse”选择工程文件夹下的rtl/key_led.v文件,其他报纸默认设置,最后点击“OK”按钮。

    • 建立TestBench仿真文件

    选择“Create New File”(创建新文件),弹出如下新的窗口。

    关闭”Add item to the Project“对话框。可看到仿真工程中多了”key_led.v“和”flow_led_tb.v“文件。

    双击”key_led_tb.v“文件,弹出如下窗口:

    在key_led.v文件中编写源文件代码。

    module key_led(
        input               sys_clk  ,    //50Mhz系统时钟
        input               sys_rst_n,    //系统复位,低有效
        input        [3:0]  key,          //按键输入信号
        output  reg  [3:0]  led           //LED输出信号
        );
    ​
    //reg define     
    reg  [23:0] cnt;
    reg  [1:0]  led_control;
    ​
    //用于计数200ns的计数器
    always @ (posedge sys_clk or negedge sys_rst_n) begin
        if(!sys_rst_n)
            cnt<=24'd0;
        else if(cnt<24'd10)
            cnt<=cnt+1;
        else
            cnt<=0;
    end 
    ​
    //用于led灯状态的选择
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if (!sys_rst_n)
            led_control <= 2'b00;
        else if(cnt == 24'd10) 
            led_control <= led_control + 1'b1;
        else
            led_control <= led_control;
    end
    ​
    //识别按键,切换显示模式
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(!sys_rst_n) begin
              led<=4'b 0000;
        end
        else if(key[0]== 0)  //按键1按下时,从右向左的流水灯效果
            case (led_control)
                2'b00   : led<=4'b1000;
                2'b01   : led<=4'b0100;
                2'b10   : led<=4'b0010;
                2'b11   : led<=4'b0001;
                default  : led<=4'b0000;
            endcase
        else if (key[1]==0)  //按键2按下时,从左向右的流水灯效果
            case (led_control)
                2'b00   : led<=4'b0001;
                2'b01   : led<=4'b0010;
                2'b10   : led<=4'b0100;
                2'b11   : led<=4'b1000;
                default  : led<=4'b0000;
            endcase
        else if (key[2]==0)  //按键3按下时,LED闪烁
            case (led_control)
                2'b00   : led<=4'b1111;
                2'b01   : led<=4'b0000;
                2'b10   : led<=4'b1111;
                2'b11   : led<=4'b0000;
                default  : led<=4'b0000;
            endcase
        else if (key[3]==0)  //按键4按下时,LED全亮
            led=4'b1111;
        else
            led<=4'b0000;    //无按键按下时,LED熄灭     
    end
    ​
    endmodule 
    在key_led_tb.v文件中编写TestBench仿真代码,在第5小节会着重讲解testbench文件的编写:
    
    
    `timescale 1ns/1ns
    ​
    module key_led_tb();
    ​
    parameter T = 20;
    ​
    reg sys_clk;
    reg sys_rst_n;
    ​
    reg [3:0] key;
    ​
    wire [3:0] led;
    ​
    initial begin
           key               <= 4'b1111;
           sys_clk           <= 1'b0;
           sys_rst_n         <= 1'b0;
    #(T+1) sys_rst_n         <= 1'b1;
    #100_000_000 key[0]      <= 0;
    #200_000_000 key[0]      <= 1;
                 key[1]      <= 0;
    #300_000_000 key[1]      <= 1;
                 key[2]      <= 0;
    #400_000_000 key[2]      <= 1;
                 key[3]      <= 0;
    #500_000_000 key[3]      <= 1;
    end
    ​
    always #(T/2) sys_clk = ~sys_clk;
    ​
    key_led   u_key_led(
          .sys_clk(sys_clk),       
          .sys_rst_n(sys_rst_n),     
          .key(key),                  
          .led(led)          
          );
        
    ​
    endmodule

    编写完成后点击保存按钮。

    编译文件。

    编译成功后会出现如下画面:

    编译状态有三种,编译成功(显示“√”),编译错误(“显示“x”),包含警告的编译通过(显示黄色的三角符号)。

    • 配置仿真环境

    编译完成后开始配置仿真环境,在modelsim菜单栏中找到【Simulate】->【Start Simulation】菜单并点击,弹出如下窗口:

    Design:包含Modelsim的全部库,展开可看到库中的设计单元,使用者根据需要进行仿真的设计单元开始仿真,被选中的方阵单元会出现在Design Unit(s)位置;支持同时对多文件进行仿真,可使用Ctrl和Shift选择多个文件。Resolution选项可选择仿真的时间精度。

    Libraries:设置搜索库,Search Libraries和Search Libraries First的功能基本一致,不同之处在于后者会在指定的用户库之前被搜索。

    SDF:Standard Delay Format(标准延迟格式)的缩写,内部包含了各种延迟信息,也是用于时序仿真的重要文件。SDF Files区域用来添加文件,Add-添加,Modify-修改,Delete-删除。SDF Options区域设置SDF文件的warning和error信息,“Disable SDF warnings”是禁用SDF警告,“Reduce SDF error to warnings”是把所有的SDF错误信息编程警告信息。Multi-Source delay区域可控制多个目标对同一端口的驱动,当多个控制信号同时控制同一端口或互联,且每个信号的延迟值不同,可使用此选项统一延迟。

    在这个窗口,我们选择work库中的key_led_tb模块,并在Optimization中取消勾选(取消优化,否则无法观察波形),其他标签保持默认即可。如下图所示。

    点击【OK】,弹出如下界面:

    右键单击“u_key_led”,选择“Add_Wave”选项,如下图所示:

    接着会弹出如下界面,可看到信号被添加进窗口中。

    设置仿真时间为1ms,然后点击右边的运行按钮。如下图所示。

    分析运行结果:

    ①按键1按下:

    ②按键2按下:

    ③按键3按下:

    ④按键4按下:

    ⑤无按键按下:

    有代码和仿真波形可看出,功能可以实现。

    4.自动仿真(联合仿真)

    打开Quartus II工程,操作如下图:

    选择完成后会出现如下界面,根据红框操作,其中Modelsin这一栏需要设置Modelsin的安装路径下的可执行文件的路径,点击【OK】。

    再根据下图操作。

    操作结束后会弹出如下界面,在根据红框操作;

    • 编写TestBeach文件

    Quartus II会自动生成TestBench模板,方便编写仿真文件,根据下图操作可得到:

    操作结束在工程里生成key_led.vt文件并显示该模块的存放路径。沿着该路径找到此文件,并用记事本或Quartus II软件打开并修改。

    可看到key_led.vt文件内的内容:

    `timescale 1 ps/ 1 ps
    module key_led_vlg_tst();
    // constants                                           
    // general purpose registers
    reg eachvec;
    // test vector input registers
    reg [3:0] key;
    reg sys_clk;
    reg sys_rst_n;
    // wires                                               
    wire [3:0]  led;
    ​
    // assign statements (if any)                          
    key_led i1 (
    // port map - connection between master ports and signals/registers   
        .key(key),
        .led(led),
        .sys_clk(sys_clk),
        .sys_rst_n(sys_rst_n)
    );
    initial                                                
    begin                                                  
    // code that executes only once                        
    // insert code here --> begin                          
                                                           
    // --> end                                             
    $display("Running testbench");                       
    end                                                    
    always                                                 
    // optional sensitivity list                           
    // @(event1 or event2 or .... eventn)                  
    begin                                                  
    // code executes for every event on sensitivity list   
    // insert code here --> begin                          
                                                           
    @eachvec;                                              
    // --> end                                             
    end                                                    
    endmodule

    修改后的仿真代码: 

    `timescale 1 ns/ 1 ns
    module key_led_tb();
    // constants                                           
    // general purpose registers
    reg eachvec;
    // test vector input registers
    reg [3:0] key;
    reg sys_clk;
    reg sys_rst_n;
    // wires                                               
    wire [3:0]  led;
    ​
    initial                                                
    begin                                                  
               key         = 4'b1111;
               sys_clk     = 1'b0;
               sys_rst_n   = 1'b0;
    #20        sys_rst_n   = 1'b1;
    #1000      key[0]      = 0;
    #1000      key[0]      = 1;
               key[1]      = 0;
    #1000      key[1]      = 1;
               key[2]      = 0;
    #1000      key[2]      = 1;
               key[3]      = 0;
    #1000      key[3]      = 1; 
    #1000      $stop;       //结束仿真             
    end                                                    
    always #10 sys_clk = ~sys_clk; 
                          
    key_led i1 (
     
        .key(key),
        .led(led),
        .sys_clk(sys_clk),
        .sys_rst_n(sys_rst_n)
    );
                                                                                            
    endmodule
    • 配置仿真环境

    根据下图操作。

    得到下面窗口,一直根据红框操作。

    最后点击【OK】,仿真文件添加完成。

    • 运行RTL仿真(功能仿真)

    根据红框操作,

    会自动打开modelsim软件进行仿真,但不需要任何操作,它会自动完成仿真,并给出我们所需要的波形。

    5.testbench(激励)文件的编写

    在项目开发过程中,Modelsim的手动仿真比较常用,需要手动编写testbench文件。编写testbench文件的主要目的是为了使用硬件描述语言(Verilog HDL或VHDL)设计的电路进行仿真验证,测试设计电路的功能、部分性能是否与预期的目标相符。

    基本的testbench结构如下:

    `timescale 仿真单位/仿真精度
    module test_bench();
    //通常testbench没有输入与输出端口
    信号或变量定义声明
    使用initial或always语句产生激励波形
    例化设计模块
    endmodule
    • 声明仿真的单位和精度

      激励文件的开头要声明仿真的单位和仿真的精度,声明的关键字为`timescale,如下所示:

      //`timescale 仿真单位/仿真精度
      `timescale 1ns/1ns  //注意不需要以分号结尾

      当代码中出现延时语句时,需要降低延迟精度时可改变仿真的精度。如下所示:

      `timescale 1ns/1ps
      #10.001 rst_n = 0;//延时10.001ns后,rst_n拉低
    • 定义模块名

      定义模块名的关键字为module,代码如下:

      module key_led_tb();

      模块名的命名方式一般在被测模块名后面加上“_tb”,或者在被测模块明前面加上“ tb _ ”,表示为哪个模块提供激励测试文件,通常激励文件不需要定义输入和输出端口。

    • 信号或变量定义

      常用的有parameter、reg和wire这三个关键字,代码如下:

      //parameter define
      parameter T = 20; //常量定义
      ​
      //reg define 
      reg sys_clk;  //reg类型定义,被使用在initial语句或always语句中
      reg sys_rst_n; 
      reg [3:0] key;
      ​
      //wire define 
      wire [3:0] led; //wire类型定义,被使用在assign语句或用于连接被例化模块的信号中
    • 使用initial或always语句产生激励波形

      产生激励时钟的代码如下:

      //10ns sys_clk信号翻转一次,即sys_clk的时钟周期为20ns,占空比为50%。
      always #10 sys_clk = ~sys_clk; 
      
      always begin
          #6 sys_clk = 0;
          #4 sys_clk = 1;//占空比为40%
      end
    • 需要注意的是,sys_clk需要在initial语句中进行初始化。

      initial                                                
      begin                                                  
                 sys_clk      = 1'b0;  //时钟初始值
                 sys_rst_n    = 1'b0;  //复位初始值
      #20        sys_rst_n    = 1'b1;  //在第21ns的时候复位信号拉高                
      end
    • 例化设计模块

      例化的设计模块是指被测模块,例化被测模块的目的是把被测模块和激励模块实例化起来,并把被测模块的端口与激励模块的端口进行相应的连接,是的激励可以输入到被测模块。如果被测模块是由多个模块组成,激励模块中只需要例化多个模块的顶层模块。代码如下:

      key_led i1 (
       
          .key        (key)       ,
          .led        (led)       ,
          .sys_clk    (sys_clk)   ,
          .sys_rst_n  (sys_rst_n)
      );

      左侧带“.”的信号为key_led模块定义的端口信号,右侧括号内的信号是激励模块中定义的信号,其信号名可以和被测模块中的信号名一致,也可以不一致,前者的好处是便于理解激励模块和被测模块信号之间的对应关系。最后要以endmodule结束。

      module key_led(
          input               sys_clk  ,    //50Mhz系统时钟
          input               sys_rst_n,    //系统复位,低有效
          input        [3:0]  key,          //按键输入信号
          output  reg  [3:0]  led           //LED输出信号
          );
      ​
      //reg define     
      reg  [23:0] cnt;
      reg  [1:0]  led_control;
      ​
      //用于计数200ns的计数器
      always @ (posedge sys_clk or negedge sys_rst_n) begin
          if(!sys_rst_n)
              cnt<=24'd0;
          else if(cnt<24'd10)
              cnt<=cnt+1;
          else
              cnt<=0;
      end 
      ​
      //用于led灯状态的选择
      always @(posedge sys_clk or negedge sys_rst_n) begin
          if (!sys_rst_n)
              led_control <= 2'b00;
          else if(cnt == 24'd10) 
              led_control <= led_control + 1'b1;
          else
              led_control <= led_control;
      end
      ​
      //识别按键,切换显示模式
      always @(posedge sys_clk or negedge sys_rst_n) begin
          if(!sys_rst_n) begin
                led<=4'b 0000;
          end
          else if(key[0]== 0)  //按键1按下时,从右向左的流水灯效果
              case (led_control)
                  2'b00   : led<=4'b1000;
                  2'b01   : led<=4'b0100;
                  2'b10   : led<=4'b0010;
                  2'b11   : led<=4'b0001;
                  default  : led<=4'b0000;
              endcase
          else if (key[1]==0)  //按键2按下时,从左向右的流水灯效果
              case (led_control)
                  2'b00   : led<=4'b0001;
                  2'b01   : led<=4'b0010;
                  2'b10   : led<=4'b0100;
                  2'b11   : led<=4'b1000;
                  default  : led<=4'b0000;
              endcase
          else if (key[2]==0)  //按键3按下时,LED闪烁
              case (led_control)
                  2'b00   : led<=4'b1111;
                  2'b01   : led<=4'b0000;
                  2'b10   : led<=4'b1111;
                  2'b11   : led<=4'b0000;
                  default  : led<=4'b0000;
              endcase
          else if (key[3]==0)  //按键4按下时,LED全亮
              led=4'b1111;
          else
              led<=4'b0000;    //无按键按下时,LED熄灭     
      end
      ​
      endmodule 

    展开全文
  • 简单介绍modelsim使用和常用快捷键,主要是手动仿真和联合仿真。
  • modelsim详细使用教程(一看就会).pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,795
精华内容 718
关键字:

modelsim使用教程