常见不匹配的原因
瞬时数据率的差异;
数据顺序的差异;
对比维度 | Pipeline | FIFO | Ping-Pong | 逻辑复制 |
---|---|---|---|---|
结构类型 | 时序分级推进(寄存器链) | 环形队列(缓冲区) | 双缓冲区(轮换使用) | 功能块并行(多路) |
延迟特性 | 每级寄存器引入周期延迟 | 不确定,取决于填充状态 | 相对固定(块切换引入延迟) | 延迟极小(无等待) |
适用场景 | 高频率流水线处理 | 异步数据流、跨时钟域 | 流水块处理(DMA/视频/音频) | 高并行(数据分片并行处理) |
硬件资源 | 中等(寄存器) | 中等(存储器) | 中高(双缓冲区) | 高(大量逻辑单元和存储) |
pipeline反压结构
什么是pipeline?pipeline 就是:
一个阶段接着一个阶段地处理数据;
每个阶段都像一个“工人”或“传送带”;
上一个阶段处理完了,就把数据交给下一个阶段;
如果下一个阶段忙不过来或堵住了,怎么办?
比如:
- 第3阶段速度慢,处理一个数据要10秒
- 但第2阶段每秒能产出一个
- 那第3阶段堆积爆了,怎么办?
我们不能一直送!这时候就需要一种“刹车机制”,告诉前面:
嘿,别再送了,我处理不过来了!
这个“让我先喘口气”的机制,就是反压(backpressure)
常见于下面几种场合:
场景 | 为什么要反压 |
---|---|
多级 pipeline 设计 | 避免数据丢失或堆积爆炸 |
FIFO 缓冲区写入 | FIFO 满了就不能再写(反压前面) |
总线协议(AXI-Stream) | 使用 ready/valid 控制节奏 |
异步模块交互 | 时钟不一样,处理速度不匹配 |
verilog代码示例:
module pipeline_backpressure (input wire clk,input wire rst_n,input wire [7:0] data_in,input wire data_in_valid,output wire data_in_ready,output wire [7:0] data_out,output wire data_out_valid,input wire data_out_ready
);// 内部寄存器保存数据
reg [7:0] data_reg;
reg valid_reg;// 上游是否准备好:下游准备好 -> 接受数据
assign data_in_ready = ~valid_reg || (data_out_ready && valid_reg);// 接收数据条件:valid && ready
wire accept_input = data_in_valid && data_in_ready;always @(posedge clk or negedge rst_n) beginif (!rst_n) begindata_reg <= 8'd0;valid_reg <= 1'b0;end else if (accept_input) begindata_reg <= data_in;valid_reg <= 1'b1;end else if (data_out_ready && valid_reg) begin// 下游已经读取,可以清除 validvalid_reg <= 1'b0;end
end// 输出接口
assign data_out = data_reg;
assign data_out_valid = valid_reg;endmodule