verilog中参数化的循环延迟次数?

时间:2013-08-09 18:35:37

标签: verilog

我必须在管道中延迟一些控制信号,这是由管道中的级数设计的。这显然非常直接 - 只需在输入信号和输出信号之间放置N个触发器。我想知道是否有一种参数化N的方法。如果我改变了管道中的阶段数量,我必须返回并添加/删除触发器,这有点烦人。我想过只是编写一个脚本来读取某个地方的定义并生成模块,但这似乎有些过分。 genvar循环是正确的方式去这里?

2 个答案:

答案 0 :(得分:8)

您可以使用参数化移位寄存器来执行此操作。类似的东西:

module shift
(
  input clk,
  input data_in,
  output data_out
);

parameter DEPTH = 3;
reg [DEPTH-1:0] holding_register;

always @ (posedge clk) begin
  holding_register <= {holding_register[DEPTH-2:0], data_in};
end

assign data_out = holding_register[DEPTH-1];

endmodule

另一种选择是使用generate语句创建基本相同的效果。

答案 1 :(得分:2)

以下是如何使用生成块和DFF模块创建参数化移位寄存器。甚至也可以使用DEPTH = 0和DEPTH = 1

module shift
(
  input clk,
  input reset,
  input data_in,
  output data_out
);

parameter DEPTH = 3;
wire [DEPTH:0] connect_wire;

assign data_out = connect_wire[DEPTH];
assign connect_wire[0] = data_in;

genvar i;
generate
   for (i=1; i <= DEPTH; i=i+1) begin
      dff DFF(clk, reset,
        connect_wire[i-1], connect_wire[i]);
   end
endgenerate

endmodule

使用EDA Playground测试完成工作代码:http://www.edaplayground.com/s/4/50