[英]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.