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

标签 verilog clock system-verilog xilinx-ise

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

有什么办法可以解决这种问题吗?

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  
    clk                 = 0;

    original_signal     = 4'd9;
    #5 original_signal  = 4'd10;
    #5 original_signal  = 4'd11;    
    #4 original_signal  = 4'd12;
    #3 original_signal  = 4'd13;

    // finish the simulation
    #5 $finish;
  end  

  // clock
  always begin
    #1 clk = !clk;
  end
endmodule

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

最佳答案

这个问题和你的问题很相似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

希望对您有所帮助。

关于Verilog:如何将输入信号延迟一个时钟周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40036903/

相关文章:

algorithm - 快速、小面积、低延迟的部分排序算法

syntax-error - ModelSim Verilog编译器错误

Verilog: `always` 和 `always @*` 之间的差异

verilog - 如何在verilog中同时检测两个时钟(彼此异步)的posege?

java - 如何将 java.sql.Timestamp 格式化为 (hh :mm AM/PM)

linux - Linux 内核中的硬件时钟信号实现

javascript - 如何只刷新 JavaScript 代码的一部分而不是整个页面?

system-verilog - 原语的 SystemVerilog 断言

system-verilog - 使用系统 Verilog 生成随机枚举

system-verilog - 向 UVM 工厂注册虚拟类