ModelSim的使用详解

news/2024/12/23 3:53:22/

一、建立ModelSim工程

1、打开ModelSim软件

打开ModelSim软件,如下图所示:

在这里插入图片描述

2、建立工程

在modelsim中建立project,选择File->New->Project,如下图所示:

在这里插入图片描述
弹出如下界面:
在这里插入图片描述

在“ Project Name”栏中填写工程名,这里的命名方式,我们建议大家最好根据仿真的文件来进行命名,时间久了,当我们记不得这个仿真工程是用来仿真什么的时候,我们看到这个工程名,就能够知道它是用来做什么的了。这里我们把工程命名为“ runled_tb”,也就是在流水灯模块名“ runled”后面添加“ _tb”。“ Project Location”是工程路径,可以根据需要把工程保存到不同的位置。因为前一步骤更改目录的时候已经做了选择,所以这里保持默认即可。下面这两部分是用来设置仿真库名称和路径的,这里我们使用默认即可。设置好工程名、工程位置,我们点击【 OK】按钮,弹出如下图所示界面:

在这里插入图片描述
我们可以从该图的选择窗口中看出,它共有四种操作: Create New File(创建新文件)、Add Existing File(添加已有文件)、 Create Simulation(创建仿真)和 Create New Folder(创建新文件夹)。这里我们先选择“ Add Existing File”(添加已有文件),如下图所示:
在这里插入图片描述
此时可以看到,两个文件“ flow_led.v”和“ flow_led_tb.v” 添加至我们的ModelSim仿真工程中,如下图所示。
在这里插入图片描述

二、编译仿真文件

编译的方式有两种: Compile Selected(编译所选)和Compile All(编译全部)。编译所选功能需要先选中一个或几个文件,执行该命令可以完成对选中文件的编译;编译全部功能不需要选中文件,该命令是按编译顺序对工程中的所有文件进行编译。我们可以在菜单栏【 Compile】中找到这两个命令,也可以在快捷工具栏或者在工作区中的右键弹出的菜单中找到这两个命令。下面我们单击Compile All(编译全部),如下图所示。

在这里插入图片描述
编译完成后,结果如下图所示:

在这里插入图片描述
文件编译后“ Status”列可能会有三个不同状态。除了上图的用“√”表示的通过状态外,还有两个在设计中不希望出现的状态:编译错误(显示红色的“×”)和包含警告的编译通过(对号的后面会出现一个黄色的三角符号)。编译错误即Modelsim无法完成文件的编译工作。通常这种情况是因为被编译文件中包含明显的语法错误, Modelsim会识别出这些语法错误并提示使用者,使用者可根据Modelsim的提示信息进行修改。编译结果中包含警告信息是一种比较特殊的状态,表示被编译的文件没有明显的语法错误,但是可能包含一些影响最终输出结果的因素。这种状态在实际使用中较少出现,这类信息一般在功能仿真的时候不会带来明显的影响,不过可能会在后续的综合和时序仿真中造成无法估计的错误,所以出现这种状态时推荐读者也要根据警告信息修改代码,确保后续使用的安全性。

三、配置仿真环境

编译完成后,接下来我们就开始配置仿真环境,我们在ModelSim菜单栏中找到【 Simulate】
→【 Start Simulation…】菜单并点击,弹出如下右图所示页面。

在这里插入图片描述
从配置仿真功能页面中我们可以看出,该页面中包含6个标签,分别是: Design、 VHDL、Verilog、 Libraries、 SDF和Others。对于这6个标签,我们用的最多的是Design、 Libraries和SDF这三个标签了,下面我们就来简单的介绍一下这3个标签,其余的标签我们一般用不到,这里我们就不再进行介绍了。

首先看一下Design标签,该标签内居中的部分是Modelsim中当前包含的全部库,可展开看到库中包含的设计单元,这些库和单元是为仿真服务的,使用者可以选择需要进行仿真的设计单元开始仿真, 此时被选中的仿真单元的名字就会出现在下方的Design Unit( s)位置。Modelsim支持同时对多个文件进行仿真,可以使用Ctrl和Shift键来选择多个文件,被选中的全部文件名都会出现在Design Unit( s)区域。在Design Unit( s)区域的右侧Resolution选项,这里可以选择仿真的时间精度。在Modelsim进行仿真的时候,有一个最小的时间单位,这个单位是使用者可以指定的,如最小单位是1ns,仿真器在工作的时候按1ns为单位进行仿真,对小于1ns发生的信号变化不予考虑或不予显示。因而这个最小时间单位也就是仿真的时间精度。这个选项一般都是设置在默认状态,这时Modelsim依照仿真设计文件中指定的最小时间刻度来进行仿真,如果设计文件中没有指定,则按1ns来进行仿真。最下方的区域是Optimization区域,可以在仿真开始的时候使能优化。接下来我们来看一下Libraries标签,如下图所示。
在这里插入图片描述
在这里插入图片描述

在该标签中,我们可以设置搜索库。 Search Libraries和Search Libraries First的功能基本一致,唯一不同的是Search Libraries First中指定的库会在指定的用户库之前被搜索。现在我们来看一下SDF标签,如下图所示。

SDF是Standard Delay Format(标准延迟格式)的缩写,内部包含了各种延迟信息,也是用于时序仿真的重要文件。 SDF Files区域用来添加SDF文件,可以选择Add按钮进行加,选择Modify按钮进行修改,选择Delete按钮删除添加的文件。

在这里插入图片描述
SDF Options区域设置SDF文件的warning和error信息。第一个“ Disable SDF warning”是禁用SDF警告,第二个“ Reduce SDF errors to warnings”是把所有的SDF错误信息变成警告信息。区域Multi-Source delay中可以控制多个目标对同一端口的驱动,如果有多个控制信号同时控制同一个端口或互连,且每个信号的延迟值不同,可以使用此选项统一延迟。下拉列表中可供选择的有三个选项: latest、 min和max。 latest选项选择最后的延迟作为统一值, max选项选择所有信号中延迟最大的值作为统一值, min选项选择所有信号中延迟最小的值作为统一值。

至此,这三个标签我们就介绍完了,接下来我们在Design标签页面中选择work库中的flow_led_tb模块,在Optimization一栏中取消勾选(注意一定要取消优化的勾选,否则无法观察信号波形),然后点击【 OK】就可以开始进行功能仿真了,其余标签页面中的配置我们使用默认就可以了,如下图所示。

在这里插入图片描述
点击【 OK】后弹出下图所示界面

在这里插入图片描述
鼠标右键单击“u0_flow_led” ,选择“Add Wave” 选项,如下图所示:

在这里插入图片描述
弹出下图所示界面,可以看到信号已经添加到窗口中。

在这里插入图片描述
在这里插入图片描述
运行后的结果如下图所示:
在这里插入图片描述
在这里插入图片描述
前面的几个放大镜模样的工具是放大、缩小和全局显示功能,鼠标放到图标上会显示出它们的快捷键,后边的黄色图标是用来在波形图上添加用来标志的黄色竖线,紧跟着的是将添加的黄色竖线对齐到信号的下降沿和上升沿。利用上述工具出来, 可以看到在仿真结果中当计时器counter计到10时, led[0]由高电平变低电平, led[1]由低电平变成高电平,且counter清零,形成了最初流水态,与预设的功能相同。

四、仿真程序源码

1、tun_led.v

// Target Devices: XC7Z020-CLG400
// Tool versions: VIVADO2017.4
// Description: water led
// Revision: V1.1
// Additional Comments:
//1) _i PIN input
//2) _o PIN output
//3) _n PIN active low
//4) _dg debug signal
//5) _r reg delay
//6) _s state machine
//
module run_led(
input          sys_clk  ,  //系统时钟
input          sys_rst_n,  //系统复位,低电平有效output  [1:0]  led         //LED灯
);
//reg define
reg  [25:0]  cnt ;//*****************************************************
//**                    main code
//*****************************************************//对计数器的值进行判断,以输出LED的状态
//assign led = (cnt < 26'd2500_0000) ? 2'b01 : 2'b10 ;
assign led = (cnt < 26'd5)         ? 2'b01 : 2'b10 ;  //仅用于仿真//计数器在0~5000_000之间进行计数
always @ (posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)cnt <= 26'd0;
//    else if(cnt < 26'd5000_0000)else if(cnt < 26'd10)  //仅用于仿真cnt <= cnt + 1'b1;elsecnt <= 26'd0;
end
endmodule

2、tb_led_twinkle.vt

`timescale 1ns / 1psmodule tb_led_twinkle();//输入
reg           sys_clk;
reg           sys_rst_n;//输出
wire  [1:0]   led;//信号初始化
initial beginsys_clk = 1'b0;sys_rst_n = 1'b0;#200sys_rst_n = 1'b1;
end//生成时钟
always #10 sys_clk = ~sys_clk;//例化待测设计
run_led  u_run_led(.sys_clk         (sys_clk),.sys_rst_n       (sys_rst_n),.led             (led));endmodule

五、打开已建立过的工程

File -> Open

在弹出的窗口中,文件类型选.mpf

然后路径指到工程所在文件夹,选择建立的.mpf文件即可

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/382618.html

相关文章

【实验技术笔记】利用重组载体做基因过表达(pCDH载体)

文章目录 1. 构建基因过表达载体1.1 设计 PCR 引物1.2 PCR 扩增目的基因1.3 酶切载体和 PCR 产物1.4 电泳并回收酶切产物1.5 连接1.6 转化1.7 挑选阳性克隆并鉴定 2. 转染3. 检测过表达效果附表&#xff1a;常用酶切位点保护碱基 为什么要做基因表达操作&#xff1f; 探寻影响细…

python:并发编程(二)

前言 本文将和大家一起探讨python的并发编程&#xff0c;涉及到python的并发编程模块&#xff0c;先简单介绍这些模块。后续文章&#xff0c;我们再进行详细使用。你至少应该分别掌握多进程、多线程、多协程的并发模块的一个&#xff0c;也可以分别掌握他们中的多个。模块就像…

MySQL数据库概念、管理以及SQL语句的基本命令操作

MySQL数据库概念、管理以及SQL语句的基本命令操作 一、数据库概念1、数据库的组成&#xff1a;数据、表、数据库2、数据库类型3、数据库的管理系统&#xff08;DBMS)4、数据库系统&#xff08;DBS&#xff09; 二、数据库系统发展史三、当今主流数据库四、关系型数据库五、MySQ…

局部聚集系数

最近在打一个图数据库算法的比赛&#xff0c;分到了计算局部聚集系数这道题&#xff0c;要求速度快&#xff0c;空间复杂度可以不首要考虑。这对我是一个全新的知识&#xff0c;用此博客记录我的学习历程。 搜了一圈视频教程&#xff0c;b站没有这块的知识&#xff0c;只有yout…

创建autotool项目

GNU Autotools是linux系统一套自动化编译工具&#xff0c;生成的项目可移植&#xff0c;通过configure && make即可生成目标程序。GNU Autotools组件有&#xff1a;autoscan, aclocal, autoconf, automake,autoheader等。 不用管这些工具的原理&#xff0c;只要知道他们…

Binder对象的流转(系统服务的调用过程、AIDL的使用过程)

零、Binder的传递 Android系统中&#xff0c;存在大量的 IPC 交互&#xff0c;同时也使用了大量的 Binder&#xff0c;那么Binder是怎么在各进程中进行对象的传递&#xff1f; 一、调用系统服务时&#xff0c;Binder的传递 回忆一下&#xff0c;Android系统的启动流程&#x…

仿神庙逃亡

跑酷游戏仿神庙逃亡 链接&#xff1a;https://pan.baidu.com/s/12Pj8KQl1eWKWDbWO3OxtZQ 提取码&#xff1a;283a

安卓手机软键盘弹起的问题

现如今很多API对于安卓系统&#xff0c;iOS系统有些会兼容&#xff0c;有些不兼容。就拿软键盘弹起的问题来说吧&#xff0c;如果一个系统上面有一个输入框&#xff0c;底部有个按钮(前提按钮用了position:fixed)&#xff0c;当我用安卓手机点击输入框的时候&#xff0c;底部的…