verilog计数器实现意外行为

时间:2013-01-21 19:40:09

标签: counter verilog hdl

我在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的组合逻辑,它不应该立即反映吗?

2 个答案:

答案 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;