常見不匹配的原因
瞬時數據率的差異;
數據順序的差異;
對比維度 | 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