在本节学习中,如果要实现下面设计,你会怎么做呢 

        (计数器最大值怎么计算在前面的教学有。)

        你会去写四个模块实现四种不同的LED上闪烁吗? 可行但是有些麻烦

        下面就用最小代码量来解决吧

        注意例化越多,消耗的FPGA的资源越多

Verilog代码

首先导入之前的LED灯闪烁代码


module led_twinkle(
    Clk,
    Reset_n,
    Led
    );
    
    input Clk;
    input Reset_n;
    output reg Led;
    
    reg [24:0]counter;
    
    parameter   MCNT=25000000-1;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter<=0;
    else if (counter==MCNT)//25000000-1
        counter<=0;
    else
        counter<=counter+1'd1;
        
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
    Led<=1'b0;
    else if(counter==MCNT)
        Led<=!Led;
     
endmodule

重点来了,就是我们例化4个模块


module led_twinkle_4(

        Clk,
        Reset_n,
        Led
        );
     
            input Clk;
            input Reset_n;
            output [3:0]Led;


led_twinkle led_twinkle_inst0(
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led[0])
    );
//led_twinkle_inst1使用#(.)方法,在上节学习有说    
 led_twinkle 
 #(
    .MCNT(12499999)
 )
 led_twinkle_inst1(
        .Clk(Clk),
        .Reset_n(Reset_n),
        .Led(Led[1])
        );
//led_twinkle_inst2和3使用defparam方法,在上节学习有说      
led_twinkle led_twinkle_inst2(
            .Clk(Clk),
            .Reset_n(Reset_n),
            .Led(Led[2])
            );
            defparam led_twinkle_inst2.MCNT=6249999;
led_twinkle led_twinkle_inst3(
                .Clk(Clk),
                .Reset_n(Reset_n),
                .Led(Led[3])
                );            
            defparam led_twinkle_inst3.MCNT=2500000-1;
            

endmodule

仿真代码

`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/03/19 15:09:16
// Design Name: 
// Module Name: led_twinkle_4_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module led_twinkle_4_tb();
    reg Clk;
    reg Reset_n;
    wire [3:0]Led;
 
led_twinkle_4 led_twinkle_4_inst0(
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led)
    );
    
    initial Clk=1;
    always #10 Clk=~Clk;
    
    initial begin
        Reset_n=0;
        #201;
        Reset_n=1;
        #2000_000_000;
 
        $stop;
    end
      
endmodule
 
 

仿真结果

板子验证

又到了阅读板子手册的时间了

首先是Clk

幸好我的板子够4个LED灯哈哈哈

再来个按键做Reset,一般我用KEY1

IO配置如下图所示

然后烧到比特流

哇塞不错不错一遍过

使用参数化设计实现模块的重用(同时点亮4个不同频率的LED)

写在最后——额外的快速仿真

说到这里,前面我们仿真是用了不少时间的,有没有可以缩短仿真时间的简单方式呢

有的兄弟有的


module led_twinkle_4(

        Clk,
        Reset_n,
        Led
        );
     
            input Clk;
            input Reset_n;
            output [3:0]Led;

parameter MCNT0=25000000-1;
parameter MCNT1=12500000-1;
parameter MCNT2=62500000-1;
parameter MCNT3=2500000-1;


led_twinkle led_twinkle_inst0(
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led[0])
    );
defparam led_twinkle_inst0.MCNT=MCNT0;

//led_twinkle_inst1使用#(.)方法,在上节学习有说    
 led_twinkle 
 #(
    .MCNT(MCNT1)
 )
 led_twinkle_inst1(
        .Clk(Clk),
        .Reset_n(Reset_n),
        .Led(Led[1])
        );
//led_twinkle_inst2和3使用defparam方法,在上节学习有说      
led_twinkle led_twinkle_inst2(
            .Clk(Clk),
            .Reset_n(Reset_n),
            .Led(Led[2])
            );
            defparam led_twinkle_inst2.MCNT=MCNT2;
led_twinkle led_twinkle_inst3(
                .Clk(Clk),
                .Reset_n(Reset_n),
                .Led(Led[3])
                );            
            defparam led_twinkle_inst3.MCNT=MCNT3;
            

endmodule

关于defparam 的用法前面的学习有详细讲解

接下来只要在tb文件中加入4句,拿其中一个LED灯举例,把25000000-1改为25000-1

defparam led_twinkle_4_inst0.MCNT0=25000-1;

把4个LED灯的数量级都改一下跑仿真就快了

收工

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐