写在前面的话
学过MCU设计的朋友都知道,系统调试是多么的重要。而对于FPGA设计来说,仿真确实最重要的。
一个完整的项目,必须有完整的仿真平台。
有朋友说,按键仿真模型没法搞。 我只能说,你并不了解硬件及处理按键的工作原理,如果你知道。按键仿真模型很容就可以做

开始学习VERIlOG HDL的朋友是不是很乏味,因为不知道课文中的代码是否正常工作,实际工作会是怎么样子的。
今天给大家讲解的是一个Modelsim仿真的DEMO

这里开始吧
设计中包含3个文件:
1.工程设计文件(可综合执行成硬件电路文件):demo_test.v
2.仿真平台文件(不可综合执行成硬件电路文件):testbench_demo_test.sv  (这里的文件后缀可以是.v)
3.Modelsim执行脚本文件:run.do

demo_test.v

 /********************************/
// Filename : demo_test.v
// Editor : Camp
// Version : 0.01
// Date : 2012.11.26
/********************************/
`timescale 1ns/1ps
`define UD #
module demo_test(
input clk, // 默认是wire型
input reset, input [:] ain,bin, output reg [:] cout, // 定义为reg型 output [:] tout
); wire [:] a_xor_b; assign a_xor_b = ain & bin; always @(posedge clk)
if(reset==)
cout <= `UD 'b0000;
else
cout <= `UD a_xor_b; assign tout = ;
endmodule

testbench_demo_test.sv

 /********************************/
// Filename : testbench_demo_test.v
// Editor : Camp
// Version : 0.01
// Date : 2012.11.26
/********************************/
`timescale 1ns/1ps
module testbench_demo_test;
reg clk,reset;
reg [:] ain,bin;
wire [:] cout;
initial begin
clk = ;
forever # clk = ~clk;
end
task init_task; //复位初始化任务
begin
reset = ;
ain = 'h0;bin = 4'h1;
repeat() @(posedge clk); // 延迟2个时钟周期
# reset = ;
repeat() @(posedge clk);
# reset = ;
repeat() @(posedge clk);
end
endtask
initial begin // 主控流程
init_task; // 复位初始化调用
//以上复位完成,以下添加你的代码 //添加代码结束
$stop; //停止仿真
end
demo_test u_test(
.clk(clk),
.reset(reset),
.ain(ain),
.bin(bin),
.cout(cout),
.tout(tout));
endmodule

run.do

 #######################################
## Filename : run.do
## Editor : Camp
## Version : 0.01
## Date : 2012.11.26
#######################################
vlib work
vmap work work vlog -reportprogress -work work ./*.v
vlog -reportprogress -work work ./*.sv vsim -novopt work.testbench_demo_test add wave sim:/testbench_demo_test/*
add wave sim:/testbench_demo_test/u_test/* run -all

启动仿真平台
     A. 把三个文件放置到同一个目录下,该目录的路径必须是纯英文或有短下划线(关于这点自己注意),
     B. 启动Modelsim;
     C. 制定Modelsim的直接目录, File -> Change Directory. 指定到A指向的目录。
     D.在Transcript框中输入:do run.do    <回车>
     E.等待波形结果.

在熟悉"启动仿真平台"后,
     F.开始分析代码, 这个自己把握 。 接下来G1或者G2
     G1.分析脚本文件run.do.   查看"启动仿真平台"A指向目录产生的文件或文件夹,简单了解脚本实现方式.
     G2.在代码相应位置输入课文中的一些例子。再次启动仿真平台
     H.进入高级设计阶段。

常见问题
  一个必须要提醒的问题:
       经常听到有人问这么一个问题,而且有时还碰到一些工作一年的朋友也问: 为什么我的信号一直是高阻状态?
         对于仿真而言,所有信号如何没有赋值,软件认为该信号就为高阻状态,比如以下代码
           initial beign
                    forever #10 clk = ~clk;
           end
         设计者意图很明显: 生成一个周期为20个刻度的时钟。
         但仿真结果让人无法接受. 高阻出现了。
         为什么?
         当然是因为clk没有初始值。 高阻取反得到什么,没人知道,软件当然没有那么厉害。 当然就输出高阻了。
         以上的例子可以代表很多仿真中出现的问题,包括设计文件。

对于IPcore如何仿真
        很多刚刚学习仿真的朋友,不知道如何仿真IPcore,所以无奈只能在Quartus II中(或者ISE中)调用Modelsim的方法,其实这个都不是问题。
        当然第一步要生成IPcore的Verilog文件,第二步把该文件加入到仿真中,且添加相应的库文件,一般运行Modelsim仿真时如果缺少某个库文件,仿真错         误中就会提示。只要到QuartusII(或者ISE)安装目录中寻找相关的库文件,复制到用户常用的库文件夹中,且编译到仿真平台中即可, 每次碰到的缺           少的库文件,复制该用户库文件夹中,下次使用直接编译,累加起来的一些库文件也就熟悉了.   久而久之,直接摆脱综合工具的束缚。

仿真中ROM初始化文件没起作用
         这个问题是一个目录问题,只要把初始化文件复制到仿真直接目录下即可("启动仿真平台"A指向目录)

待续....

对初学者的建议
      如果QUARTUSII(或者ISE)中综合有错误提示,给网友提问请把第一个错误列出来.一个一个搞定 (因为很多时候第一个错误就会引发后面的错误)

待续....

另外补充知识:按键输入
       对于按键输入的解剖,对于所有FPGA输入都可以作为一个参考
       按键的信号输入图4

图4

图为按键按下的信号示意图,当然毛刺产生不只是那几个尖峰。
       通过老前辈大量的程序证明,毛刺产生段,不会某个值不会保持20ms。(这里不纠结了)
       该信号经过FPGA引脚进入FPGA内部,如下图5,输入的触发器的时钟为采样时钟。

                          图5

从输入按键信号到最后的采样值,
        其中采样值中的x代表的是未知,当然只有0或者1两种可能。为什么呢? 因为在采样时,由于是毛刺,触发器的建立时间或者保持时间没有满足。当然也就无法判断触发器的输出端(Q端)是什么值,但,结果不是1就是0.  因为数字电路中没有其它出现。 
       前部分已经说明(毛刺产生段,不会某个值不会保持20ms),所以设计时,只要保证我的采样值保持一个状态(1或者0),超过时间T。就认为输入是该状态。关于T,可能是20ms,也可能是20.01ms,或者19.5ms,不用太精确。看用的逻辑多少,找个合适的设计。比如计数2^20次方 * 20ns (其中采样频率为50MHz) = 20.97..  ms  也可以满足要求。问题不大。

推算出仿真平台。 对于仿真模型。 仿真模型输出不可能如同按键一样是模拟电路,输出肯定是如同图5中的采样值。 输入到工程系统作为激励即可。

Modelsim的demo入门教程的更多相关文章

  1. 《zw版·Halcon入门教程与内置demo》

    <zw版·Halcon入门教程与内置demo> halcon系统的中文教程很不好找,而且大部分是v10以前的版本. 例如,QQ群: 247994767(Delphi与halcon), 共享 ...

  2. 无废话WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  3. 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]

    无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...

  4. 无废话ExtJs 入门教程七[登陆窗体Demo:Login]

    无废话ExtJs 入门教程七[登陆窗体Demo:Login] extjs技术交流,欢迎加群(201926085) 在这节我们通过前几节讲的内容做一个登陆页面,把前几节讲的内容贯穿一下. 1.代码如下: ...

  5. 【转】WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  6. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  7. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  8. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  9. Objective-C 30分钟入门教程

    Objective-C 30分钟入门教程 我第一次看OC觉得这个语言的语法有些怪异,为什么充满了@符号,[]符号,函数调用没有()这个,但是面向对象的高级语言也不外乎类,接口,多态,封装,继承等概念. ...

随机推荐

  1. 【Hibernate 6】常用的hql语句以及N+1问题

    HQL:Hibernate Query Language,是Hibernate框架中的查询语言,十分接近于SQL语言!以下介绍一些常用的Hql语句: 一.测试类 Classes类: <span ...

  2. 线程中CreateEvent和SetEvent及WaitForSingleObject的用法

    首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态 ...

  3. SVN与TortoiseSVN实战:从入门到精通

    SVN,版本控制程序,是支撑项目开发的基础工具. 在团队开发中,不管是程序员还是美工.测试等人员,都会用到SVN,通常会把SVN视为源代码管理工具,但对于SVN更准确的理解是: “帮助参与项目人员的管 ...

  4. VS2013 试用版到期 解决办法

    摘自:http://jingyan.baidu.com/article/fec7a1e5100b481190b4e7d9.html 输入密钥:BWG7X-J98B3-W34RT-33B3R-JVYW9

  5. Android IOS WebRTC 音视频开发总结(六一)-- 大数据解密国内实时通讯行业开发现状

    本文主要介绍国内实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 这几年移动互联网发展势头很猛,与 ...

  6. 彻底解决_OBJC_CLASS_$_某文件名", referenced from:问题转

    最近在使用静态库时,总是出现这个问题.下面总结一下我得解决方法: 1. .m文件没有导入   在Build Phases里的Compile Sources 中添加报错的文件 2. .framework ...

  7. MIPS平台移植apache 2.2.7

    参考文章: http://wenku.baidu.com/view/94e08a20a5e9856a561260e2.html http://httpd.apache.org/docs/2.4/ins ...

  8. Mysql迁移工具在生产环境下的使用

    在产品迭代开发发布过程中,由于业务需求的增加,数据库难免会有结构调整等操作. 在每个版本发布过程中怎么控制每个版本server端程序与数据库版本保持一致,以及数 据库升级.回滚等操作. 本博文宅鸟将向 ...

  9. jQuery中$(function() {});问题详解

    $(function() {});是$(document).ready(function(){ })的简写,最早接触的时候也说$(document).ready(function(){ })这个函数是 ...

  10. 软件工程 speedsnail 冲刺5

    2015-5-9 完成任务:学习了黑马android教学视频10\11\12集,填写游戏人的姓名功能为明天的记分板准备: 遇到问题: 问题1 Suspicious method call; shoul ...