Modelsim手动仿真实例

目录

1. 软件链接

2. 为什么要使用Modelsim

3. Modelsim仿真工程由几部分组成?

4. 上手实例

4.1. 新建文件夹

4.2. 指定目录

4.3. 新建工程

4.4. 新建设计文件(Design Files)

4.5. 新建测试平台文件(Testbench Files)

4.6. 更改文件的默认打开方式

4.7. 编写设计文件     

4.8. 编写测试平台文件

4.9. 编译仿真文件

4.10. 配置仿真环境

4.11. 开始仿真


1. 软件链接

链接:https://pan.baidu.com/s/12EX1wT0NshjRE4aa6_e83w 
提取码:lny1

2. 为什么要使用Modelsim

验证设计逻辑:在将设计下载到FPGA之前,需要确保逻辑设计是正确的。ModelSim等仿              真软件可以模拟FPGA硬件的行为,允许设计者在实际硬件实现之前检查和验证HDL(硬件            描述语言)代码的功能正确性。

调试方便: 在FPGA开发过程中,调试是一个复杂且耗时的过程。使用ModelSim可以在仿真环境中进行调试,通过波形查看和分析信号的变化,更容易找到问题所在,而不必依赖于物理硬件的限制。

节省成本: 如果直接在硬件上进行调试,可能会因为设计错误而损坏硬件,特别是在高频率操作或电源管理不当的情况下。在仿真环境中验证设计可以避免这种风险,从而节省成本。

加速开发过程: 仿真可以并行于硬件的准备和生产过程,这样可以在硬件还未准备好的时候就开始软件的开发和测试,加快整体的开发流程。

支持复杂测试场景: 在ModelSim等仿真工具中,可以构造复杂的测试场景来验证设计在各种条件下的表现,这些场景在实际硬件上可能难以实现或者需要大量的时间和资源来构建。

性能分析: 通过仿真可以对设计的性能进行预测和分析,如时序分析、功耗估计等,帮助设计者优化设计。

支持自动化测试: ModelSim等仿真工具通常支持自动化测试脚本,可以大量减少手动测试的工作量,提高测试的覆盖率和效率。

支持多级别仿真: ModelSim支持从单个模块到整个系统的不同级别的仿真,设计者可以逐步扩展测试范围,逐步验证整个设计。

总结来说,ModelSim仿真工具在FPGA开发中的使用,主要是为了提高设计的可靠性、调试的效率和降低开发的风险和成本。通过在软件层面上对设计进行充分的验证和测试,可以确保将设计下载到硬件上时能够正常工作,从而提高整个项目的成功率。

3. Modelsim仿真工程由几部分组成?

在使用ModelSim进行硬件设计仿真时,通常会涉及两类主要的文件:设计文件(Design Files)和测试平台文件(Testbench Files)。

设计文件(Design Files): 这些文件包含了硬件设计的实际代码,通常是用硬件描述语言(HDL)如VHDL或Verilog编写的。设计文件定义了电路的结构和行为,包括模块、寄存器、逻辑门等。在设计文件中,描述硬件应该如何响应不同的输入信号。

测试平台文件(Testbench Files): 测试平台文件是用于验证设计文件是否正确的环境。它们也是用HDL编写的,但与设计文件不同,测试平台不会在最终的硬件产品中实现。测试平台的目的是生成一系列测试信号(输入给设计文件),并观察输出是否符合预期。测试平台通常包含模拟输入信号的代码,可能还包括用于检查输出并报告测试结果的断言和检查点。

在ModelSim中进行仿真时,通常会先编译设计文件和测试平台文件,然后在仿真环境中加载测试平台,最后运行仿真以观察并验证设计的行为。通过这种方式,可以在实际制造硬件之前,检测并修复设计中的错误。

4. 上手实例

4.1. 新建文件夹

指定一个路径新建一个文件夹,用来存放将要仿真的文件。这里我在桌面新建了一个名为led_test的文件夹,并建立hal_source和sim_source两个子文件;

4.2. 指定目录

在编译和仿真过程中,ModelSim需要找到源代码文件和其他相关文件。如果没有正确设置工作目录,ModelSim可能找不到这些文件,导致编译或仿真失败。

4.3. 新建工程

4.4. 新建设计文件(Design Files)

上面章节点击完OK后会弹出如下界面,选择Creat new file,并保存在led_test/hdl_source文件夹下。

4.5. 新建测试平台文件(Testbench Files)

4.6. 更改文件的默认打开方式

完成4.4和4.5后,软件界面会出现如下两个文件。

通常情况下,在此界面双击会默认使用笔记本工具打开。为了良好的编辑体验,这里更改为notepadd。下面介绍默认打开软件的设置方式。(前提:已安装notepad)

4.7. 编写设计文件     

在modelsim界面双击打开led.v文件并插入以下代码

module flow_led(
    input               sys_clk  ,  //系统时钟
    input               sys_rst_n,  //系统复位,低电平有效
     
    output  reg  [3:0]  led         //4个LED灯
    );

//reg define
reg [23:0] counter;

//*****************************************************                                                                                                                                                                                                          
//计数器对系统时钟计数,计时0.2秒
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        counter <= 24'd0;
    else if (counter < 24'd10)
        counter <= counter + 1'b1;
    else
        counter <= 24'd0;
end

//通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        led <= 4'b0001;
    else if(counter == 24'd10) 
        led[3:0] <= {led[2:0],led[3]};
    else
        led <= led;
end

endmodule 

4.8. 编写测试平台文件

在modelsim界面双击打开led_tb.v文件并插入以下代码

`timescale  1ns/1ns                // 定义仿真时间单位1ns和仿真时间精度为1ns

module  flow_led_tb;               // 测试模块

//parameter  define

parameter  T = 20;                 // 时钟周期为20ns

//reg define

reg  sys_clk;                      // 时钟信号

reg  sys_rst_n;                    // 复位信号

//wire define

wire  [3:0]  led;

//*****************************************************

//**                    main code

//*****************************************************

//给输入信号初始值

initial begin

    sys_clk            = 1'b0;

    sys_rst_n          = 1'b0;     // 复位

    #(T+1)  sys_rst_n  = 1'b1;     // 在第21ns的时候复位信号信号拉高

end

//50Mhz的时钟,周期则为1/50Mhz=20ns,所以每10ns,电平取反一次

always #(T/2) sys_clk = ~sys_clk;

//例化led模块

flow_led  u0_flow_led (

    .sys_clk     (sys_clk  ),

    .sys_rst_n   (sys_rst_n),

    .led         (led      )

);

endmodule

4.9. 编译仿真文件

开始编译

编译完成

4.10. 配置仿真环境

4.11. 开始仿真

上一个章节配置完成后会出现以下仿真界面

按照下图操作添加要观察的信号

添加完,信号出现在可观察窗口。设置采样时间

开始仿真,输出可视化信号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业数据被新型.rmallox勒索病毒加密,应该如何还原?

.rmallox勒索病毒为什么难以解密&#xff1f; .rmallox勒索病毒难以解密的主要原因在于其采用了高强度的加密算法&#xff0c;并且这些算法被有效地实施在了病毒程序中。具体来说&#xff0c;.rmallox勒索病毒使用了RSA和AES这两种非常成熟的加密算法。RSA是一种非对称加密算法…

08、Lua 函数

Lua 函数 Lua 函数Lua函数主要有两种用途函数定义解析&#xff1a;optional_function_scopefunction_nameargument1, argument2, argument3..., argumentnfunction_bodyresult_params_comma_separated 范例 : 定义一个函数 max()Lua 中函数可以作为参数传递给函数多返回值Lua函…

Laravel 数据库:判断数据表是否存在

检测某个表是否存在&#xff1a; if (Schema::hasTable(table_name)) { // } 在某个表不存在的情况下再执行创建操作&#xff1a; if ( ! Schema::hasTable(table_name)) { // 创建数据库表的代码 } 如果你想安全的 drop 掉一个数据表&#xff0c;使用以下&#xf…

蓝桥杯刷题记录之蓝桥王国

只是记录 这题用迪杰斯特拉来就行&#xff0c;我写的是堆优化版本 import java.util.*;public class Main{static Scanner s new Scanner(System.in);static int n,m,startPoint1;static List<Edge>[] table;//邻接表,因为是稀疏图static long[] dist;static boolean[] …

Day25 代码随想录(1刷) 回溯

39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复…

3D汽车模型线上三维互动展示提供视觉盛宴

VR全景虚拟看车软件正在引领汽车展览行业迈向一个全新的时代&#xff0c;它不仅颠覆了传统展览的局限&#xff0c;还为参展者提供了前所未有的高效、便捷和互动体验。借助于尖端的vr虚拟现实技术、逼真的web3d开发、先进的云计算能力以及强大的大数据处理&#xff0c;这一在线展…

瑞吉外卖实战学习--6、通过try和catch进行异常处理

try和catch进行异常处理 效果图前言1、公共拦截器进行异常处理1.1、创建公共报错处理的方法1.2、@ControllerAdvice中设置要拦截的类1.3、@ExceptionHandler中写处理的异常类2、完善错误拦截器2.1、效果效果图 前言 当用户名重复数据库会报错,此时就需要捕获异常操作 1、公共…

Spring: 在SpringBoot项目中解决前端跨域问题

这里写目录标题 一、什么是跨域问题二、浏览器的同源策略三、SpringBoot项目中解决跨域问题的5种方式&#xff1a;使用CORS1、自定 web filter 实现跨域(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、 CorsFilter(全局跨域)4、使用CrossOrigin注解 (局部跨域) 一、什么是跨域…

社交网络的未来:Facebook如何塑造数字社交的下一章

引言 社交网络已成为我们生活中不可或缺的一部分&#xff0c;而Facebook作为其领军者&#xff0c;一直在塑造着数字社交的未来。本文将深入探讨Facebook在未来如何塑造数字社交的下一章&#xff0c;并对社交网络的发展趋势进行展望和分析。 1. 引领虚拟社交的潮流 Facebook将…

Lombok之@SneakyThrows

1前言&#xff1a; 这里记录一个SneakyThrows的用法&#xff0c;关于他的用法&#xff0c;在官网上可以知道的很清楚 官网介绍&#xff1a;http://projectlombok.org/features/SneakyThrows.html 2代码示例 个人理解&#xff1a;在代码中&#xff0c;使用 try&#xff0c;cat…

C++vector和C语言数组的区别

vector 是 C 标准模板库&#xff08;STL&#xff09;中的一个类模板&#xff0c;它提供了一个动态数组的功能&#xff0c;能够根据需要自动增长或缩小。而 C 语言数组则是 C 语言提供的一种固定大小的序列容器。下面是 vector 和 C 语言数组之间的一些主要区别&#xff1a; 动…

VRP and related algorithms for logistics distribution综述的笔记

选了些自己感兴趣的。 车辆路径问题(VRP)是当今物流公司面临的最关键挑战之一。自1959年丹齐格和兰姆泽(1959年)介绍了卡车调度问题以来,研究人员一直在研究车辆路由和交付调度。它被认为是车辆路径问题(VRP)的范例,并且涉及从中央仓库到地理分散的客户的货物配送。 自…

Polars学习-常用函数代码

下载包 导入包 数据读写 import polars as pl from datetime import datetimedf pl.DataFrame({"integer": [1, 2, 3],"date": [datetime(2022, 1, 1),datetime(2022, 1, 2),datetime(2022, 1, 3),],"float": [4.0, 5.0, 6.0],} ) print(df) …

小白从0学习ctf(web安全)

文章目录 前言一、baby lfi&#xff08;bugku-CTF&#xff09;1、简介2、解题思路1、解题前置知识点2、漏洞利用 二、baby lfi 2&#xff08;bugku-CTF&#xff09;1.解题思路1、漏洞利用 三、lfi&#xff08;bugku CTF&#xff09;1、解题思路1、漏洞利用 总结 前言 此文章是…

uniapp保留两位小数,整数后面加.00

直接把方法粘贴进去就能用 <text class"bold">总收入&#xffe5;{{formater(priceNumer)}}</text>export default {data() {priceNumer: 199.999, // 总收入},methods: {// 保留两位小数formater(data) {if(!data) return 0.00data parseFloat(data).…

SpringBoot -- 整合SpringMVC

SpringBoot已经替我们整合了许多框架并进行了默认的配置&#xff0c;我们只需要在依赖中导入spring-boot-starter-web&#xff0c;就可以直接使用SpringMVC以及web场景下的已经整合好的功能。但SpringBoot的默认配置可能无法满足我们所有的需求&#xff0c;那么我们怎么进行自定…

Java复习第十二天学习笔记(JDBC),附有道云笔记链接

【有道云笔记】十二 3.28 JDBC https://note.youdao.com/s/HsgmqRMw 一、JDBC简介 面向接口编程 在JDBC里面Java这个公司只是提供了一套接口Connection、Statement、ResultSet&#xff0c;每个数据库厂商实现了这套接口&#xff0c;例如MySql公司实现了&#xff1a;MySql驱动…

Unity SqlServer

今天说点废话 这段代码是在Unity中实现的一个简单的数据库连接示例&#xff0c;主要用于演示如何在Unity中使用C#连接到SQL Server数据库并执行基本的SQL查询操作。 导入所需命名空间&#xff1a; 1using UnityEngine; 2using System.Data.SqlClient; UnityEngine是Unity引擎提…

初识 51

keil的使用: 具体细节请移步我上一篇博客:创建第一个51文件-CSDN博客 hex -- 汇编语言实现的文件 -- 直接与单片机对接的文件 单片机 -- 一个集成电脑芯片 单片机开发版 -- 基于单片机的集成电路 stc 89 c52RC / RD 系列单片机 命名规则: 89 -- 版本号&#xff1f; C --…

Dockerfile常用指令以及使用案例

Dockerfile常用指令以及使用案例 1、ADD复制文件 ADD 指令用于复制文件&#xff0c;格式为&#xff1a;* ADD <src>...<dest>* ADD ["<src>",..."<dest>"]从 src 目录复制文件到容器的 dest。其中 src 可以是Dockerfile 所在目录…