Led以1秒为周期闪烁

Led初始不亮,灯0.5s亮,0.5秒之后灭,周期为1s

1s周期+20MHZ时钟==25_000_000计数器,25位二进制

module led_flash
(//端口列表
    CLK,
    reset_n,
    led
);
    input CLK;
    input reset_n;
    output reg led;
    //计数器最大值 CNT_MAX   counter_max
    //计数器周期 T_CLK  时钟频率是50MHZ 周期是1/50_000000s=2e-08s 即20ns   MHZ=百万HZ
    //计数器计数时间 T, 计数器最大值CNT_MAX=计数器时间T/计数器周期T_CLK
    //若计数时间是500ms=0.5s ,得计数器最大值是25,000,000 
    //二进制是 ?0001_0111_1101_0111_1000_0100_0000? 则计数器至少25位 
    //可以据此设计寄存器变量 counter
    reg [24:0]counter;
    
    always@(posedge CLK or negedge reset_n)
    //问题来了,这个下降沿之后,是一整个的低电平,不用担心,因为上面有
    //always@做判断,只执行一次
        if(!reset_n)
            counter <=0;
        else if( counter==25_000_000-1)
            counter <=0;
    //因为上面计数器的值是十进制,这边也跟着用十进制,但是要注意加法器是按照
    //二进制来设计的,要注意位宽
        else
            counter <= counter +1'd1;
    always@(posedge CLK or negedge reset_n)
        if(!reset_n)
            led <=1'b0;
        else if(counter == 25_000_000-1)
            led <= !led;
    
endmodule

你可能感兴趣的:(FPGA代码模版,fpga开发)