繁体   English   中英

在verilog中延迟具有N个时钟周期的32位信号

[英]Delay a 32-bit signal with N clock cycle in verilog

我正在尝试使用移位寄存器来延迟 32 位信号。 我的逻辑是单个触发器将信号延迟 1 个时钟,所以我使用移位寄存器,因为它是触发器的组合,有人可以指导我这段代码有什么问题。

module delay_n_cycles (
  input wire [31:0] data_in,
  input wire clk,
  output reg [31:0] data_out,
  parameter N = 5
);

reg [31:0] shift_reg;

always @(posedge clk) begin
  shift_reg <= {shift_reg[30:0], data_in};
  if (N == 0) begin
    data_out <= shift_reg[31];
 end else begin
    data_out <= shift_reg[N-1];
  end
end

endmodule

首先,您的代码在语法上是错误的。 无法以您提供的方式声明parameter

你的移位寄存器只有 32 位宽。 通常,要以这种方式延迟多位数据,您需要在寄存器中保留 N 个数据副本,在一端移位并在另一端读取。 我想以下内容应该有所帮助:

module delay_n_cycles #(parameter N = 5)(
  input wire [31:0] data_in,
  input wire clk,
  output reg [31:0] data_out
);

  reg [N-1:0][31:0] shift_reg;

always @(posedge clk) begin
  shift_reg <= (shift_reg << 32) | data_in;
  data_out <= shift_reg[N-1];
end
endmodule

此代码将与系统 verilog 一起使用,因为它使用了打包的多维数组。

您需要在打包版本中将 reg 移动 32(数据宽度)。

这是一个测试平台的例子:

module tb();
  bit clk;
  int clkCount;
  initial 
    forever begin 
      #5 clk = ~clk;
      clkCount++;
    end
  
  logic [31:0] data_in, data_out;
  
  initial begin
    $monitor("%0t (%0d) [%h]: %0d --> %0d", $time, clkCount, ds.shift_reg[4], data_in, ds.data_out);
    
    for(int i = 0; i < 20; i++) begin
      #10 data_in = i;
    end
    $finish;
  end
  
  delay_n_cycles ds(data_in, clk, data_out);
endmodule

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM