首页 文章

如何在Verilog中使LED闪烁?

提问于
浏览
0

我有一块FPGA板,我正试图以60%的30%时序余量进行LED闪烁 .

我将时钟设置为24 MHz

这是我在教程网站上使用的代码

reg [33:0] counter;
reg state;

assign ledg[0] = state;

always @ (posedge clock) begin
    counter <= counter + 1;
    state <= counter[24]; //
end

我对此代码有3个问题:

  • 我不明白为什么用下标[33:0]宣布计数器

  • 我不明白为什么在反击[24]时将状态设置为取消阻止

  • 使用此代码后,我的时间余量关闭,即当我每60秒闪烁一次时,它为0.73,根据要求偏离.03 .

谢谢

2 回答

  • 1

    我不明白为什么用下标[33:0]宣布计数器

    下标[33:0]表示您的计数器有34位 . 这意味着它可以从0到2 ^(34)-1或0到17179869183(十进制)计数 .

    我不明白为什么状态设置为在计数器[24]时取消阻止在使用此代码时,我的时间裕度关闭,即当我每60秒闪烁一次时,它是0.73,这是关闭的 . 03根据要求 .

    state被分配给计数器的第24位 . 这意味着只要计数器的第24位等于1,状态将为“1”并且LED将打开 . 只要计数器的第24位为0,状态将为0,LED将熄灭 .

    请注意,计数器的第24位每2 ^ 24个周期切换一次,或者为16,777,216个周期 . 请记住,您的时钟是24 MHz,这意味着时钟每秒切换24,000,000次 . 因此,如果您的LED状态每隔16,777,216个周期切换一次,这意味着它每秒切换(16,777,216 / 24,000,000)次或每0.699秒切换一次 - 因此它应该非常接近您正在寻找的0.7 .

  • 0

    // 300MHz至1Hz

    模块顶部(输入clk,输入复位,输出led);

    reg [27:0] counter;
    reg led;
    reg clkout;
    
    always @(posedge clk) begin
        if (counter == 0) begin
            counter <= 149999999;
            clkout <= ~clkout;
        end else begin
            counter <= counter - 1;
        end
    end
    
    always @(posedge clkout) begin
            if (reset == 0) begin
                led <= 0;
            end else begin
                led <= ~led;
            end
        end
    

相关问题