class="hljs-ln-code"> class="hljs-ln-line">module test(
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">input wire sysclk ,//系统时钟
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">input wire rst_n ,//复位
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">output reg [3:0] led
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">);
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">parameter delay = 50_000_000;//1s内部晶振次数
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">reg [26:0] cnt;//计数器,记录是否达到一秒
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">//1s计时器——按键按下开始计时
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">always @(posedge sysclk)
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line"> if(!rst_n)
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line"> cnt <= 0;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line"> else if(cnt == delay - 1)
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line"> cnt <= 0;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line"> else
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line"> cnt <= cnt + 1;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">//流水灯灯赋值
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="21"> class="hljs-ln-code"> class="hljs-ln-line">always @(posedge sysclk)
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="22"> class="hljs-ln-code"> class="hljs-ln-line"> if(!rst_n)
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="23"> class="hljs-ln-code"> class="hljs-ln-line"> led <= 4'b0001;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="24"> class="hljs-ln-code"> class="hljs-ln-line"> else if(cnt == delay - 1)
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="25"> class="hljs-ln-code"> class="hljs-ln-line"> led <= {led[0],led[3:1]};
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="26"> class="hljs-ln-code"> class="hljs-ln-line"> else
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="27"> class="hljs-ln-code"> class="hljs-ln-line"> led <= led;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="28"> class="hljs-ln-code"> class="hljs-ln-line">
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="29"> class="hljs-ln-code"> class="hljs-ln-line">
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="30"> class="hljs-ln-code"> class="hljs-ln-line">endmodule
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="31"> class="hljs-ln-code"> class="hljs-ln-line">
  • class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">
    仿真代码:

    最顶部的`timescale 1ns / 1ps是时间布颈,1ns是时间单位,1ps是时间精度

    注意:在仿真代码中,时间布颈一定不能写掉,在源文件里面可以不加时间布颈

    步骤:

    1.首先将需要仿真的代码例化进来

    2.根据例化代码的端口去定义参数,输入类型定义为reg,输出类型定义为wire

    3.使用initial关键字来进行初始化,输入类型的都需要进行赋值

    4.生成时钟,有多种方法,根据自身的需求

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">`timescale 1ns / 1ps//时间布颈,1ns是时间单位,1ps是时间精度
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">module text_tb();
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">reg sysclk ;//根据例化模块的端口定义,input类型定义为reg,output类型定义为wire
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">reg rst_n ;
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">wire [3:0] led ;
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">initial begin //initial是初始化的意思,在其内部的代码只能执行一次
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">sysclk = 0;//将时钟初始化为0
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">rst_n = 0;//将复位信号初始化为0
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">#101 //在过了101ns后
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">rst_n = 1; //复位信号拉高,开始工作
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line">
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">end
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">always #10 sysclk = ~sysclk;//常见的时钟生成方法之一,每过10ns翻转一次,这样就是20ns一个周期
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">test test_u(
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line">. sysclk (sysclk) ,//系统时钟
    20. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">. rst_n (rst_n ) ,//复位
    21. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="21"> class="hljs-ln-code"> class="hljs-ln-line">. led (led )
    22. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="22"> class="hljs-ln-code"> class="hljs-ln-line">);
    23. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="23"> class="hljs-ln-code"> class="hljs-ln-line">endmodule
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">


    时钟的生成方法:

    1、关键字:always    是常见的产生时钟的方法之一 --->always #半个时钟周期  时钟翻转
    例:always #10 sysclk=~sysclk;


    2、关键字:forever   第二种时钟生成方式 ---->一直执行
    例:initial  begin
              sysclk =  0;
                 forever begin
                     #10 sysclk=~sysclk;
                   end
             end


    3、关键字:repeat   第三次时钟生成方法 ----->()里头是多少,语句就执行多少次
    例:initial  begin
              sysclk =  0;
                  repeat(10) begin
                     #10 sysclk=~sysclk;
                   end
             end


    仿真使用:

    操作步骤:

    写完仿真代码后,ctrl+s保存一下,然后将自己所写的仿真代码置顶,再点击Run Sinulation

    选择第一个,功能前仿真

    加载完后如下图所示,选中红框里的代码,ctrl+a全选,delete删除

    选中左边框里的文件,将其拉到刚才红框的位置

    如下图所示,两个红框里的信号其实是一样的,如果不需要看这么多信号,也可以选择在左边红框里一个一个拉出所需要观察的信号

    常用的操作步骤如下图所示

    为了方便观测,可以修改进制

    修改信号线颜色,这里需要注意的是最好不要修改成红色和蓝色

    最后流水灯就像下图所示,这里我的时间是修改过后的,不然会跑很长的时间


    常见时序图总结:

    信号线仿出来是z(初始颜色为蓝色):

    1.该信号是wire类型未赋初值,没有对其进行说明;

    2.该信号线悬空,未接入(出现在例化连线时未接通)


    信号线仿出来是x(初始颜色为红色):

    1.仿真出来没有跑起来,不一定是错的,有可能是使用的复位方法不一样(同步复位)

    2.如果跑起来依旧是x,那么就可能是reg变量没有赋值,也可能是信号位宽不够;

    注意事项:在时序分析中,组合逻辑比时序逻辑要提前一个时钟周期


    总结:

    本次的话主要是介绍了Simulation的使用方法,以及一些常见问题的注意事项等。掌握仿真后就可以在不上板的情况下去观测试代码的逻辑功能是否能实现,例如什么UART,IIC等协议也可以通过仿真去进行模拟。有错的地方希望能够帮忙指正,谢谢!

    data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/joker0518/article/details/143424003","extend1":"pc","ab":"new"}">>
    注:本文转载自blog.csdn.net的苦练fpga的文章"https://blog.csdn.net/joker0518/article/details/143424003"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
    复制链接

    评论记录:

    未查询到任何数据!