Modelsim的demo入门教程

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

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

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

demo_test.v

 1 /********************************/
 2 //     Filename    :    demo_test.v
 3 //     Editor        :    Camp
 4 //     Version    :    0.01
 5 //     Date        :    2012.11.26
 6 /********************************/
 7 `timescale 1ns/1ps
 8 `define UD #1
 9 module demo_test(
10     input    clk,        // 默认是wire型
11     input    reset,
12     
13     input    [3:0]    ain,bin,
14     
15     output    reg [3:0]    cout,    // 定义为reg型
16     
17     output    [15:0]    tout
18 );
19 
20 wire [3:0]    a_xor_b;
21 
22 assign a_xor_b = ain & bin;
23 
24 always @(posedge clk)
25     if(reset==1)
26         cout <= `UD 4'b0000;
27     else
28         cout <= `UD a_xor_b;
29 
30 assign tout = 0;
31 endmodule

testbench_demo_test.sv

 1 /********************************/
 2 //        Filename    :    testbench_demo_test.v
 3 //     Editor        :    Camp
 4 //     Version    :    0.01
 5 //        Date        :    2012.11.26
 6 /********************************/
 7 `timescale 1ns/1ps
 8 module testbench_demo_test;
 9 reg clk,reset;
10 reg [3:0] ain,bin;
11 wire [3:0] cout;
12 initial begin
13     clk = 0;
14     forever #10 clk = ~clk;
15 end
16 task init_task;    //复位初始化任务
17 begin
18     reset = 0;    
19     ain = 4'h0;bin = 4'h1;
20     repeat(2) @(posedge clk);    // 延迟2个时钟周期
21     #1 reset = 1;
22     repeat(1) @(posedge clk);
23     #1 reset = 0;
24     repeat(1) @(posedge clk);
25 end
26 endtask
27 initial begin        // 主控流程
28     init_task; // 复位初始化调用
29     //以上复位完成,以下添加你的代码
30     
31     //添加代码结束    
32     $stop;    //停止仿真
33 end
34 demo_test u_test(
35     .clk(clk),
36     .reset(reset),
37     .ain(ain),
38     .bin(bin),
39     .cout(cout),
40     .tout(tout));
41 endmodule 

run.do

 1 #######################################
 2 ##        Filename    :    run.do
 3 ##        Editor        :    Camp
 4 ##        Version    :    0.01
 5 ##        Date        :    2012.11.26
 6 #######################################
 7 vlib work
 8 vmap work work
 9 
10 vlog -reportprogress 300 -work work ./*.v
11 vlog -reportprogress 300 -work work ./*.sv
12 
13 vsim -novopt work.testbench_demo_test 
14 
15 add wave sim:/testbench_demo_test/*
16 add wave sim:/testbench_demo_test/u_test/*
17 
18 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中的采样值。 输入到工程系统作为激励即可。

 

 

 

转载于:https://www.cnblogs.com/CampHDL/p/3443535.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值