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;
我编写了闪烁 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;