使用verilog进行编程时,经常会遇到需要对连续信号进行延时处理的情况,这里记录一下常用的给信号进行延时打拍的手段。

方案一:使用多个寄存器采用时序逻辑依次赋值,如下:

/****************************************************************\
此方案使用了3倍数据位宽的寄存器,实现了延迟2拍输出数据的效果
\****************************************************************/
module aaa(
    input clk,
    input rst_n,
    input [7:0]data_in,
    output [7:0]data_out
);

reg [7:0]data_delay_1, data_delay_2, data_delay_3;

always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
    data_delay_1 <= 8'h0;
    data_delay_2 <= 8'h0;
    data_delay_3 <= 8'h0;
end
else
begin
    data_delay_1 <= data_in;
    data_delay_2 <= data_delay_1;
    data_delay_3 <= data_delay_2;
end

assign data_out = data_delay_3;

endmodule

方案优点:延时拍数较少时方便阅读,常见于需要延时一两拍的场景下。

方案缺点:延时拍数较多时阅读性变差。

至于资源占用其实在FPGA综合布线时会被自动优化成移位寄存器形式。

方案二:使用移位寄存器

待补充,先鸽了,总而言之就是使用shift_ram巴拉巴拉巴拉...

Last modification:February 16, 2023
觉得有帮助的话,打赏一个呗~