数字系统设计练习(六)—— 系统任务的使用

一、实验硬软件环境:

  1. EDA软件:Vivado2019
  2. 实验开发板:Basys3 FPGA套件

二、实验内容:

  实现的电路功能为:当开关开启,led点亮;开关关闭,则led灯关闭,在设计文件和测试文件中,在合适的位置,分别插入$monitor、$display、$stop以及$finish语句,观察simulation的结果。

三、 具体实现

  1. 设计源码
     1 `timescale 1ns / 1ps
     2 //////////////////////////////////////////////////////////////////////////////////
     3 // Company:
     4 // Engineer:
     5 //
     6 // Create Date: 2020/08/17 18:02:59
     7 // Design Name:
     8 // Module Name: led
     9 // Project Name:
    10 // Target Devices:
    11 // Tool Versions:
    12 // Description:
    13 //
    14 // Dependencies:
    15 //
    16 // Revision:
    17 // Revision 0.01 - File Created
    18 // Additional Comments:
    19 //
    20 //////////////////////////////////////////////////////////////////////////////////
    21 
    22 
    23 module led(
    24     input key,
    25     input clk,
    26     output reg led
    27     );
    28 
    29     reg [28:0] count;
    30 
    31     always @(posedge clk)
    32     begin
    33        if(key == 0)
    34            count <= 29'b0;
    35        else
    36            if(count == 20)
    37                count <= 29'b0;
    38            else
    39                count <= count + 1;
    40     end
    41 
    42     always@(posedge clk)
    43     begin
    44         if(key == 0)
    45             led <= 0;
    46         else
    47             if(count == 20)
    48                 begin
    49                     led <= ~led;
    50                     $display("at this moment, count is 20, led is %b, and will be changed to %b.", led, ~led);
    51                 end
    52             else
    53                 led <= led;
    54     end
    55 endmodule
    View Code
  2. 仿真代码
     1 `timescale 1ns / 1ps
     2 //////////////////////////////////////////////////////////////////////////////////
     3 // Company:
     4 // Engineer:
     5 //
     6 // Create Date: 2020/08/17 18:19:52
     7 // Design Name:
     8 // Module Name: led_tb
     9 // Project Name:
    10 // Target Devices:
    11 // Tool Versions:
    12 // Description:
    13 //
    14 // Dependencies:
    15 //
    16 // Revision:
    17 // Revision 0.01 - File Created
    18 // Additional Comments:
    19 //
    20 //////////////////////////////////////////////////////////////////////////////////
    21 
    22 
    23 module led_tb;
    24     reg key;
    25     reg clk;
    26     wire led;
    27 
    28     led uut(.key(key), .clk(clk), .led(led));
    29 
    30     initial
    31     begin
    32         $monitor("count = %d, key = %d, led = %d", uut.count, uut.key, uut.led);
    33 
    34         key = 0;
    35         clk = 0;
    36 
    37         #100 key = 1;
    38 
    39     end
    40 
    41     always #5 clk = ~clk;
    42 endmodule
    View Code
  3. 约束文件
    1 set_property PACKAGE_PIN V17 [get_ports key]
    2 set_property IOSTANDARD LVCMOS33 [get_ports key]
    3 set_property PACKAGE_PIN U17 [get_ports led]
    4 set_property IOSTANDARD LVCMOS33 [get_ports led]
    View Code
  4. 波形图
  5. console工具部分输出:输出设计源码中$display语句内容,同时执行仿真代码中$monitor语句,即使key和led的值没变,只要count的值改变,就打印指定内容。

  6. $display后分别加入$stop和$finish语句,出现现象
    • 插入$stop后,波形图和console

    • 插入$finish后,波形图和console

  7. 总结
    • $display用于输出变量信息,可以帮助调试和验证,但是只有当执行到该语句时才被触发,属于被动输出;
    • $monitor只要参数列表中的某个参数值发生变化,则输出指定内容,且该语句一旦被触发,则一直处于监视状态,属于主动输出。
    • $stop暂停仿真并将仿真器值置于互模式;
    • $finish退出模拟并将控制权交还给系统。
    • 看到有博客提到使用$stop后,使用run命令可继续仿真,而$finish则直接退出,但是尝试了一下,两者都可以使用run继续进行仿真。
原文地址:https://www.cnblogs.com/mantha/p/13521080.html