原理详解

D触发器

        CK是时钟,Q是输出。

        我理解的D触发器就是当CK出现上升沿时,D触发器就会读取输入的值进行存储或者输出。

计数器

        add是加法器,当每次CK到达上升沿则+1。

Verilog实现

        低电平有效的复位信号。

        因为CNT_MAX=T/Tclk,接着查看技术手册

有源晶振33.333333MHz ,那么周期就是30ns=Tclk(系统周期)

T=500ms要实现500ms的LED灯闪烁

500*1000*1000/30ns=16,666,666.666666

T=600ms要实现600ms的LED灯闪烁

600*1000*1000/30ns=20_000_000

看二进制定义位宽reg [24:0]counter;

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

仿真代码:

`timescale 1ns / 1ns


module led_twinkle_tb(    );
    reg Clk;
    reg Reset_n;
    wire Led;
 
led_twinkle led_twinkle_inst0(
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led)
    );
    
    initial Clk=1;
    always #15 Clk=~Clk;
    
    initial begin
        Reset_n=0;
        #301;
        Reset_n=1;
        #2000_000_000;
        $stop;
    
    end
      
endmodule



板块验证

按键按下做复位信号

接着根据上图配置IO口生成比特流就可以看到LED灯闪烁了

在这里实际闪烁不是500ms,问题应该是我前面把33.333333MHz当作频率了,实际应该用50MHz。

Logo

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

更多推荐