Verilog LED 闪烁,无语法错误。为什么它不闪烁

Verilog LED Blinking no syntax errors. why it is not blinking

我编写了闪烁 8 个原始 LED 的程序,代码没有任何错误并且已正确加载。但是闪烁的 LED 并没有正常发生。

我检查了 pin planner,它是正确的,我使用的时钟是 50MHz。我用的是DE10 lite板。

module LED_blink(clk,led);
    input clk;
    output reg[7:0] led;
    reg[31:0] count = 0;
    always @(posedge clk)
      begin
        count <= count + 1;
        led <= (count<50000000) ? 8'b11111111 : 0;
        count <= (count<50000000) ? count : 0;      
      end
endmodule

没有错误消息,但它没有按照我假设的方式工作。

问题不是语法上的问题,而是您的代码中存在一些其他问题。

首先是你的使用方式nonblocking assignments (<=)。在您的代码中,所有分配只会在时钟周期结束时进行评估。因此,always 块的第一行 (count<=count+1) 不会 影响 always 块的最后一行 (count<=(count<50000000)?count:0)。此外,只会评估最后一行。

第二个问题是您没有 count 的重置状态。该值从未明确设置为 0,因此您无法知道它的状态。

如果你解决了这些问题,你的逻辑就会出现第三个问题。您描述如果 count 小于 50000000,您的变量 led 应该是 8'b11111111。但是,一旦计数器超过此值,您就将其重置为 0。换句话说,您的计数器 总是 小于 50000000,并且 led 永远不会设置为 0

我写下了一个小修复:

  module LED_blink(clk,led);
      input clk;
      output reg[7:0] led;

      reg[31:0]count=0;

      always @(posedge clk or negedge rst_n)
      begin
          if (~rst_n) begin
              count <= 32'b0;
              led   <= 8'b0;
          end
          else begin
              count <= (count < 100000000) ? count + 1   : 0;
              led   <= (count < 50000000)  ? 8'b11111111 : 0;    
          end 
      end
  endmodule

或者,您可以在 always 块中写入:

count <= (count  < 50000000) ? count + 1 : 0;
led   <= (count == 50000000) ? ~led      : led;  

您应该养成在 FPGA 上 运行 之前使用测试平台模拟您的代码的习惯。但在这种情况下,即使是简单的 Rubber Duck Debugging 也会显示错误。 当您执行 count<=(count<50000000)?count:0; 时,您会覆盖之前的 count<=count+1;,因此计数永远不会增加。

这可以通过将 2 行更改为以下内容轻松解决:

count<=(count<50000000)?count+1:0;

第二个问题是led只会在一个时钟周期内为0(当count等于50000000时),实际上你不会看到任何闪烁。 这可以通过将行更改为以下内容轻松解决:

led<=(count<25000000)?8'b11111111:0;