这个代码为什么实现不了流水灯`timescale 1ns / 1ps module led( input clk, input reset, output reg[7:0]led ); reg [25:0] cnt; parameter TIME = 26'd50_000_000; always @(posedge clk) begin if (reset) begin cnt <= 26'd0; end else if (cnt == TIME - 1'b1) begin cnt <=26'd0; end else begin cnt <= cnt + 1'd1; end end always @(posedge clk) begin if (reset) begin led <= 8'b0000_0001; end else if (cnt == TIME - 1'b1) begin led <= {led[0],led[7:1]}; end else begin led <= led; end end endmodule
时间: 2024-02-01 20:02:37 浏览: 105
half_clk.rar_clK1个时钟_clk时钟信号
这个代码实现不了流水灯的原因是因为在第二个 always 块中,每次时钟上升沿都会执行一个赋值操作,但是当计数器 cnt 未达到 TIME - 1 时,赋值操作为 `led <= led;`,这相当于把 `led` 的值赋值给本身,因此对 `led` 的值没有任何改变,也就无法实现流水灯的效果。
为了实现流水灯的效果,可以把第二个 always 块改成如下形式:
```
always @(posedge clk) begin
if (reset) begin
led <= 8'b0000_0001;
end
else if (cnt == TIME - 1'b1) begin
led <= {led[6:0], 1'b0};
end
else begin
led <= {led[6:0], led[7]};
end
end
```
这里使用了一个类似于之前提到的循环移位的方法,将 `led` 的最低位赋值给 `led` 的最高位,其他位向左移动一位,实现了流水灯的效果。
阅读全文