(3)计数器&时序逻辑

设计思路:

 设计代码:

RTL:

module led_flash(
    clk,rst_n,led
    );
    input clk,rst_n;
    output reg led=0;
    parameter max=24999999;  //(计数的最大值)
    reg [24:0] cnt=0;
    always@(posedge clk or negedge rst_n)
        if(!rst_n)
            cnt <= 0;
        else if (cnt == max)
            cnt <= 0;
        else
            cnt <= cnt+1;
    //灯的闪烁
    always@(posedge clk or negedge rst_n)
        if(!rst_n)
            led <= 0;
        else if (cnt == max)
            led <= ~led;
        else
            led <= led;     
endmodule

tb:

`timescale 1ns / 1ps

module led_flash_tb();
    
    reg clk,rst_n;
    wire led;
    
    led_flash u_led_flash(
        .clk(clk),
        .rst_n(rst_n),
        .led(led)
    );
    
    initial 
        clk = 1;
        always #10 clk = ~clk;  //每10ns翻转一次,因此clk周期为20ns
    initial begin
        rst_n = 0;
        #200;
        rst_n = 1;
        #3000000000;
        $stop;
    end
    
endmodule

仿真波形:

 

   在上面我设置的是3s结束,但是仿真时间太长了,也就没有继续,看到led翻转就暂停了。

  在波形的边缘处右键,选择Mark,可以打一个标记,点一下标记底下就会出现刻度尺。

  可以看到,led的半个周期为500ms,满足我们的设计要求。

电路结构图:

 上班验证:

  

   这里发现什么都看不到,点一下上面这个group按钮就好了

   上板后发现led以1s频率闪烁,如果按住按钮0的话led将不闪烁(复位),本实验设计得到成功验证。

  

 

posted @ 2024-04-02 13:16  xuxuxu69  阅读(25)  评论(0编辑  收藏  举报