FPGA中数据延迟方案汇总

一.非阻塞赋值延时打拍

always @ (posedge clk) begin
     d1 <= d;
     d2 <= d1;
     .......
     dout <= dn;
end

         本质上就是对数据进行多级寄存器缓存,延迟时间以clk的一个周期为单位,消耗的就是寄存器。比较适合延迟固定周期以及延迟周期比较短的情况。

        缺点:延迟时间不方便控制,不适合延迟时间比较长的情况。

二、移位寄存器延时

reg     [data_width*delay_width-1:00]            
data_r=0;
always @ (posedge clk)
begin

    data_r <= {data_r[data_width*(delay_width-1)-1:0],data_in};
end


 assign data_out=data_r[camera_trig_delay_time];

        这种方法利用的是移位寄存器的方法,用的是SLICEM资源。SLICEM可以在不使用触发器的条件下配置为32位移位寄存器(注意:只能左移)。这样,每个LUT可以将串行数据延迟1到32个时钟周期。移位输入D(LUT DI1脚)和移位输出Q31(LUT MC31脚)可以进行级联,以形成更大的移位寄存器,达到更大的延迟效果。这种方法延迟的时间可配置性也比较高。

   缺点:占用的资源比较多。尤其当延迟的数量级较大时,拼接的位移寄器是有个数限制的,如下图则是当延迟时间设置比较久的时候vivado报错的截图。

三、计数器实现任意周期延时

        这种资源消耗率较低,延迟周期也比较灵活。

parameter delay_per = 8'h4;//延时周期数
reg flag;
reg [7:0] delay_count;
 
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        flag <= 0;
        end
    else if(in1)begin
        flag <= 1;
        end
    else if(delay_count == delay_per)begin
        flag <= 0;
        end
end
 
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        delay_count <= 0;
        out1 <= 0;
        end
    else if(delay_count == delay_per && flag == 1'b1)begin
        delay_count <= 0;
        out1 <= 1;
        end
    else if(flag == 1'b1)begin
        delay_count <= delay_count + 1'b1;
        out1 <= 0;
        end
    else begin
        delay_count <= 0;
        out1 <= 0;
    end
end

  这种实现方式比较多,这里摘录了网上的代码。这种方法下,延迟的时间必须小于信号的间隔。因为如果延迟时间大于了信号间隔,就会丢掉信号。

缺点:.延迟时间必须小于信号间隔。       

四、大容量存储

        对于比较大时间的延迟,可以用RAM或者fifo或者DDR这种存储介质进行缓存延迟

     

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值