1

我在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 会在计数时冻结。它并没有完全为零。Assert rst,你可以看到一些非零的随机模式,除非我 release ,否则它们不会改变rst

我的问题是:当if(rst) begin块执行时,counter设置为 0。由于 LED 被分配为组合逻辑counter,它不应该立即反映吗?

4

2 回答 2

4

由于您进行了同步复位,因此复位值在复位断言后的下一个时钟沿之前不会生效。

当您断言重置时,这是否也会停止时钟?这似乎是最可能的原因,否则您的代码看起来是正确的(Greg 指出的语法错误除外)。

于 2013-01-21T20:16:16.277 回答
1

看起来 clk 是拼写错误,它是同步重置,而不是异步。

试试这个 :

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;
于 2013-01-22T10:23:55.237 回答