我在verilog中制作了一个计数器并用硬件实现了它。但我无法解释行为代码是:
module clock_test(clk_in,led,rst);
input wire clk_in;
input wire rst;
output wire [7:0] led;
reg [23:0] counter = 24'b0;
assign led = counter[23:16];
always @(posedge clk_int) begin
if(rst) begin
counter <= 0;
end
else begin
counter <= counter +1;
end
end
endmodule // clock_test
在硬件中,当我点击rst
时,LED会在计数点冻结。它不会变得完全为零。断言rst
,你可以看到除零之外的一些随机模式,除非我发布rst
,否则不会改变。
我的问题是:当if(rst) begin
块执行时,counter
被设置为0.由于leds被指定为来自counter
的组合逻辑,它不应该立即反映吗?
答案 0 :(得分:4)
由于你有一个同步复位,复位值在复位后的下一个时钟边沿才会生效。
当断言复位时,这也会停止时钟吗?这似乎是最可能的原因,否则你的代码看起来是正确的(除了Greg指出的语法错误)。
答案 1 :(得分:1)
看起来clk是typod,它是同步重置,而不是异步。
试试这个:
module clock_test(
input clk_in,
input rst,
output [7:0] led
);
reg [23:0] counter;
assign led = counter[23:16];
always @(posedge clk_in or posedge rst) begin
if(rst) begin
counter <= 0;
end
else begin
counter <= counter +1;
end
end
endmodule // clock_test
注意:您正在使用高电平有效复位(1表示复位)。如果您实际上使用低电平有效(0应用重置),则需要更改以下内容:
always @(posedge clk_in or negedge rst) begin
if(~rst) begin
counter <= 0;