如何在Verilog中使LED闪烁?

时间:2014-04-27 07:30:26

标签: verilog

我有一块FPGA板,我试图以30%的时间间隔60秒进行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个问题:

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

  2. 我不明白为什么在反击[24]

  3. 时将州设置为取消阻止
  4. 使用此代码时,我的时间余量关闭,即当我每60秒闪烁一次时,它为0.73,根据要求偏离.03。

  5. 由于

2 个答案:

答案 0 :(得分:1)

  

我不明白为什么用下标[33:0]

宣布计数器

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

  

我不明白为什么国家在反击[24]时会被取消阻止   使用此代码后,我的时间余量关闭,即当我计时时   每60秒闪烁一次,为0.73,相差0.03   根据要求。

状态被分配给计数器的第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。

答案 1 :(得分: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