Modelsim软件的使用教程

这篇具有很好参考价值的文章主要介绍了Modelsim软件的使用教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.FPGA设计流程

2.modelsim的使用介绍

3.手动仿真

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

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


1.FPGA设计流程

modelsim使用教程,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使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

  • 建立TestBench仿真文件

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

在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

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

modelsim使用教程,fpga开发,学习

编译文件。

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

  • 配置仿真环境

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

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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中取消勾选(取消优化,否则无法观察波形),其他标签保持默认即可。如下图所示。

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

分析运行结果:

①按键1按下:

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

②按键2按下:

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

③按键3按下:

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

④按键4按下:

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

⑤无按键按下:

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

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

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

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

再根据下图操作。

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

  • 编写TestBeach文件

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

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

可看到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
  • 配置仿真环境

根据下图操作。

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

modelsim使用教程,fpga开发,学习

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

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

根据红框操作,

modelsim使用教程,fpga开发,学习

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

modelsim使用教程,fpga开发,学习

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结束。文章来源地址https://www.toymoban.com/news/detail-785846.html

    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软件的使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA学习笔记(五)Testbench(测试平台)文件编写进行Modelsim仿真

    一、FPGA学习笔记(一)入门背景、软件及时钟约束 二、FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三、FPGA学习笔记(三) 流水灯入门FPGA设计流程 四、FPGA学习笔记(四)通过数码管学习顶层模块和例化的编写 五、FPGA学习笔记(五)Testbench(测试平台)文件编写进行

    2024年02月07日
    浏览(54)
  • FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块

    VGA显示 目标:实现屏幕红、橙、黄、绿、青、蓝、紫、黑、白、灰条形显示 1. 模块框图与波形图 vga_colorbar是实现目标功能的总体模块框图,为了实现对应的输出,我们使用三个具体功能模块实现功能。 (1) clk_gen——使用pll锁相环实现时钟分频 (2)vga_ctrl——图像控制与输出模

    2024年02月04日
    浏览(42)
  • 北邮22级信通院数电:Verilog-FPGA(2)modelsim北邮信通专属下载、破解教程

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 1.下载  2.解压打开 3.modelsim初安装 4.crack 1.打开crack文件夹 2.选择c

    2024年02月08日
    浏览(63)
  • Modelsim仿真使用教程

    最近写了个设计《基于VHDL/Verilog的汉明码编译码器设计》 之前用QuartusII+modelsim联合仿真,没有出现任何问题,后面在别的电脑上也安装了两个软件,结果QuartusII中无法正常的启动modelsim软件,没有找到很好的解决办法,干脆直接使用modelsim仿真。 激励文件的作用:仿真无疑就

    2024年02月02日
    浏览(42)
  • 【FPGA】双线性差值实现图像缩放,使用modelsim和matlab仿真验真

    双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。 双线性插值作为数值分析中的一种插值算法,广泛应用在信号处理,数字图像和视频处理等方面。 网上理论知识一大把,反

    2024年02月12日
    浏览(45)
  • Quartus使用步骤及联合Modelsim仿真教程

    #使用记录# 对于Quartus的安装步骤这里不再进行讲解,modelsim的安装步骤后续文章会进行讲解,这里也就不过多说明。言归正传,现在来开始我们的使用教程: 1、首先点击打开Quartus软件,博主这里使用的是22版本的,其他版本的步骤也基本一样。 2、我们可以看到如下界面,点

    2024年02月05日
    浏览(51)
  • 【安路FPGA】联合modelsim仿真

    第一在modelsim安装目录下新建一个文件夹Anlogic用来存放TD库文件: 打开modelsim仿真软件,feil→change Directory,选择刚才新建文件目录,在新建一个Library库如图所示: TD库文件al与common是必须要添加的两个库,我的芯片是ph1系列所以添加ph1 在去到这个路径会发现多了三个文件夹,在

    2024年02月08日
    浏览(49)
  • RISCV学习笔记6.5(软件篇)--ubuntu18.04虚拟机安装modelsim se 10.2c

    最近一段时间在学习tinyriscv,需要检查代码的语法是否有误,所以就有了在ubuntu虚拟机安装modelsim的想法。 1、团队处理器系列(一):软件安装与配置 2、Win11安装ise14.7(最终解决方案)——Ubuntu18.04安装ISE与modelsim 3、Ubuntu下命令行加速、终端加速、命令行代理的方法/proxychai

    2024年02月09日
    浏览(63)
  • Modelsim软件仿真出错:Modelsim is exiting with code 7.

     以下为使用modelsim软件进行波形仿真时出现的错误。 Modelsim is exiting with code 7. Check the transcript file for more information on the fatal error.This dialog will automatically dose in 10 seconds.                             Mentor公司的ModelSim是优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业

    2024年02月12日
    浏览(32)
  • FPGA设计——verilog实现乒乓操作并modelsim仿真

    乒乓操作是FPGA设计中常用的一种技巧,它通过数据流控制实现按节拍相互配合的切换,来提高数据处理效率,达到无缝缓冲和处理的效果。本文针对乒乓操作进行学习总结。 完整工程 一、原理图如下 : 1、二选一控制器来对缓冲模块1和2进行选择。 2、数据缓冲模块一般就是

    2023年04月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包