异步FIFO的低水线判定

最近做一个模块,需要用异步FIFO把链路层发来的局部不定时突发数据重建成连续稳定输出的视频流。
输出要达到连续稳定的话,开始输出之前,需要在FIFO里攒够一定数量的数据,即FIFO的低水线,用于防止underflow。对应的还有高水线,即数据不能多于高水线,否则来不及输出就overflow了。
从某个角度看,FIFO的的低水线给整个数据通道带来了一个latency。这个latency对于周期性的视频流来说,其最初的判定条件对于后续的数据传输有可能是不匹配的。除非能做到实时调整低水线。但是对于输出时序是固定的场景来说,不太可能有机会去做预测和实时调整。但好在FIFO前后的数据速率在大尺度上是保持一致的。因此只要在数据通道上再引入一个绝对的latency,就基本可以在一定范围内解决低水线判定对于后续传输不适应的问题。
一句话总结,就是给初次判定加点margin,让后续略有变化的数据传输能够满足这个判定。
### 异步FIFO设计中的水线概念及其实现 #### 什么是异步FIFO水线? 在异步FIFO的设计中,水线(Watermark)是一个重要的参数,用于指示当前FIFO存储数据量的状态。通常分为高水线(High Watermark, HWM)和水线(Low Watermark, LWM),分别表示FIFO接近满或接近空的状态阈值[^1]。 当FIFO内的数据量达到设定的高水线时,会触发相应的中断或其他控制信号,通知控制器减慢写入速度或者停止写入操作,防止发生溢出。同样,当数据量降至水线以下时,则可能提示加速读取过程以避免下溢现象的发生[^2]。 #### 如何设置合适的水线值? 合理的水线配置对于优化系统性能至关重要。一般来说, - 高水线于实际的最大容量,留有一定余地以便处理突发情况; - 而水线则需高于最小可接受水平之上,确保有足够的有效数据可供连续读取而不致于因频繁切换而导致效率降[^3]。 具体数值的选择取决于应用环境的具体需求以及上下游设备之间的协调能力等因素综合考虑决定。 #### Verilog代码示例:简单异步FIFO水线功能 下面给出一段基于Verilog HDL描述语言编写的一个简化版支持高两档不同级别报警机制下的异步先入先出缓冲区(FIFO)逻辑框架: ```verilog module async_fifo_with_watermarks( input wire clk_wr, input wire rst_n, // Write Interface input wire wr_en, input wire [DATA_WIDTH-1:0] din, output reg full_flag, output reg high_wm_reached, input wire rd_clk, input wire rd_en, output reg empty_flag, output reg low_wm_reached, output reg [ADDR_BITS-1:0] dout); parameter DATA_WIDTH = 8; parameter ADDR_BITS = 4; reg [ADDR_BITS:0] write_ptr_reg = {ADDR_BITS{1'b0}}; reg [ADDR_BITS:0] read_ptr_reg = {ADDR_BITS{1'b0}}; always @(posedge clk_wr or negedge rst_n) begin : proc_write_pointers_and_flags if(!rst_n)begin write_ptr_reg <= 'd0 ; end else if(wr_en && !full_flag )begin write_ptr_reg<=write_ptr_reg+1'd1 ; end end assign full_flag=(write_ptr_reg-read_ptr_reg)==(2**ADDR_BITS)-1; // High watermark logic (example at half capacity) wire almost_full= ((write_ptr_reg - read_ptr_reg)>((2**(ADDR_BITS))-HWM_THRESHOLD)); always@(posedge clk_wr)begin high_wm_reached<=almost_full&&!high_wm_reached;// Rising edge detection only once per cycle crossing threshold. end always @(posedge rd_clk or negedge rst_n) begin : proc_read_pointers_and_flags if(!rst_n)begin read_ptr_reg<='d0; end else if(rd_en&& !empty_flag )begin read_ptr_reg<=read_ptr_reg+'d1; end end assign empty_flag=(write_ptr_reg==read_ptr_reg); // Low watermark logic (example when less than quarter filled) wire almost_empty=((write_ptr_reg - read_ptr_reg)<LMW_THRESHOLD); always@(posedge rd_clk)begin low_wm_reached<=almost_empty&&!low_wm_reached;// Falling edge detected just one time after dropping below limit again. end // Data path omitted for brevity... endmodule ``` 上述例子展示了如何通过比较指针差值来判断是否达到了预设的水线条件,并据此更新相应标志位的变化状态[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值