Verilog:如何将输入信号延迟一个时钟周期?

时间:2016-10-14 07:01:52

标签: verilog clock system-verilog xilinx-ise

我想将输入信号延迟一个完整的时钟周期。
我有下面的代码,它基本上试图改变时钟位置的信号。
然而,测试台显示它并不总是延迟1个循环。
在某些情况下,它会在输入信号改变的同时发生变化。

有没有办法解决这类问题?

std::vector

这是波形: enter image description here 例如,波形显示当输入信号在时钟边沿变为1010时,输出也同时变化。实际上,delayed_signal实际上没有延迟到下一个周期!

3 个答案:

答案 0 :(得分:2)

问题是Verilog race condition

因此,在original_signal的上升沿发生的同时更改clk时,original_signal会根据clk在更新前获取新值,结果是你没有得到理想的延迟。

使用非阻止分配(<=),而不是阻止=块中的分配(always)。

同样使用clk来控制刺激数据的变化,repeat (5) @(posedge clk);为@ e19293001指出,以便为顺序设计提供强大的测试平台。

详细了解上述搜索中的问题,以及此Nonblocking Assignments in Verilog Synthesis

答案 1 :(得分:2)

此问题与您的问题Why is my D Flip Flop not waiting for the positive edge of the clock?

非常相似

您可能希望尝试此约定以避免竞争条件:

@(posedge clk);

尽量避免使用阻止分配将输入信号设置到RTL代码。使用非阻塞分配,而不是@Morten Zilmer建议的那样。

你的测试台应该看起来像这样:

module delay_one_cycle(
  input clk,
  input[3:0] original_signal,
  output reg[3:0] delayed_signal
);

  always @(posedge clk) begin
    delayed_signal <= original_signal;
  end


endmodule

module delay_one_cycle_tb();
  reg clk;
  reg[3:0] original_signal;  
  wire[3:0] delayed_signal;

  delay_one_cycle doc_inst (clk, original_signal, delayed_signal);  

  // Initial setup
  initial begin  

    original_signal     <= 4'd9;
    repeat (5) @(posedge clk);
    original_signal  <= 4'd10;
    repeat (5) @(posedge clk);
    original_signal  <= 4'd11;
    repeat (4) @(posedge clk);
    original_signal  <= 4'd12;
    repeat (3) @(posedge clk);
    original_signal  <= 4'd13;

    // finish the simulation
   repeat (5) @(posedge clk);
   $finish;
  end  

  initial begin
    clk                 = 0;
    forever begin
       #1 clk = !clk;
    end
  end 
endmodule

希望有所帮助。

答案 2 :(得分:0)

这可能是因为在您更改输入数据的那一刻,输出值就会更改,但是例如,根据您的测试台,将值更改为4'd11是在时钟的疏忽下发生的。因此,直到时钟摆正之前,才输入原始模块中的始终块。