FPGA流水线设计通过将复杂任务分解为多个并行处理的子阶段显著提升数据处理吞吐量是高速接口、信号处理、图像处理等领域的核心技术。实例1简单加法器流水线流水线阶段划分将“N位加法”拆分为2级流水线以8位加法为例Stage1低4位相加a[3:0] b[3:0]输出低4位和与进位sum_low, carry_lowStage2高4位相加a[7:4] b[7:4] carry_low输出高4位和与最终进位sum_high, carry_out输出拼接{carry_out, sum_high, sum_low}若需进位。module adder_pipeline #(parameter WIDTH 8,parameter STAGES 2 // 流水线级数2级)(input clk, rst_n,input [WIDTH-1:0] a, b,output reg [WIDTH:0] sum // 含进位输出);// Stage1: 低4位相加假设WIDTH8拆分为2个4位reg [3:0] a_low, b_low;reg [3:0] sum_low;reg carry_low;always (posedge clk or negedge rst_n) beginif (!rst_n) beginsum_low 4’d0;carry_low 1’b0;end else begin{carry_low, sum_low} a[3:0] b[3:0]; // 低4位相加产生进位a_low a[3:0]; // 寄存中间变量可选视时序而定b_low b[3:0];endend// Stage2: 高4位相加含Stage1进位reg [3:0] a_high, b_high;reg [3:0] sum_high;reg carry_high;always (posedge clk or negedge rst_n) beginif (!rst_n) beginsum_high 4’d0;carry_high 1’b0;sum (WIDTH1)d0;end else begin{carry_high, sum_high} a[7:4] b[7:4] carry_low; // 高4位进位sum {carry_high, sum_high, sum_low}; // 拼接输出含进位endendendmodule设计要点阶段划分原则每个阶段组合逻辑延迟≤时钟周期如100MHz时钟下单阶段延迟≤10ns寄存器插入每个阶段输出用寄存器打拍隔离前后级逻辑吞吐量流水线填满后每个时钟周期输出1个结果未流水线时8位加法延迟≈2个门延迟无法在10ns内完成。乘法器流水线数字信号处理基础流水线阶段划分以8×8无符号乘法为例拆分为3级流水线 Booth算法简化版Stage1部分积生成按乘数位展开如a×b a×(b0 2b1 4b2 …)Stage2部分积累加用加法树合并部分积Stage3结果输出寄存最终结果。module mult_pipeline #(parameter WIDTH 8)(input clk, rst_n,input [WIDTH-1:0] a, b,output reg [2*WIDTH-1:0] p // 乘积输出);// Stage1: 部分积生成按b的每一位展开reg [2WIDTH-1:0] partial_product [0:WIDTH-1]; // 存储部分积integer i;always () beginfor (i0; iWIDTH; ii1) beginpartial_product[i] (b[i] ? a i : d0); // 乘数位为1则左移i位endend// Stage2: 部分积累加加法树2级流水线reg [2WIDTH-1:0] sum_stage1 [0:(WIDTH/2)-1]; // 第一级加法树两两相加reg [2WIDTH-1:0] sum_stage2; // 第二级加法树合并结果always (posedge clk or negedge rst_n) beginif (!rst_n) beginsum_stage1 {default:d0};sum_stage2 d0;end else begin// 第一级两两相加简化实际用树形结构for (i0; iWIDTH/2; ii1) beginsum_stage1[i] partial_product[2i] partial_product[2i1];end// 第二级合并剩余部分积若WIDTH为奇数sum_stage2 sum_stage1[0] (WIDTH%2 ? partial_product[WIDTH-1] : d0);endend// Stage3: 输出寄存always (posedge clk or negedge rst_n) beginif (!rst_n) beginp d0;end else beginp sum_stage2; // 寄存最终结果endendendmodule设计要点加法树优化部分积累加用“树形加法器”而非串行累加减少Stage2延迟时序平衡各级延迟尽量接近如Stage1用组合逻辑生成部分积Stage2用两级加法树Stage3寄存应用场景FIR滤波器中乘法器流水线可使采样率提升至100MHz未流水线时8×8乘法延迟≈20ns无法满足FIR滤波器流水线数字信号处理进阶以8阶FIR滤波器抽头系数h[0]~h[7]为例拆分为4级流水线Stage1输入数据移位寄存存储最近8个样本x[n]~x[n-7]Stage2乘累加MAC第一部分计算h[0]x[n] h[1]x[n-1]h[2]x[n-2] h[3]x[n-3]Stage3乘累加第二部分计算h[4]x[n-4] h[5]x[n-5]h[6]x[n-6] h[7]x[n-7]Stage4结果求和与输出将Stage2/3结果相加寄存输出module fir_pipeline #(parameter TAPS 8, // 8阶滤波器parameter WIDTH 16 // 数据位宽)(input clk, rst_n,input [WIDTH-1:0] x_in, // 输入数据output reg [2*WIDTH-1:0] y_out // 滤波输出);// Stage1: 输入移位寄存器存储8个历史样本reg [WIDTH-1:0] shift_reg [0:TAPS-1]; // x[n]~x[n-7]integer i;always (posedge clk or negedge rst_n) beginif (!rst_n) beginfor (i0; iTAPS; ii1) shift_reg[i] d0;end else beginshift_reg[0] x_in;for (i1; iTAPS; ii1) shift_reg[i] shift_reg[i-1]; // 右移endend// Stage2: 第一组乘累加h0x0h1x1, h2x2h3x3reg [2*WIDTH-1:0] mac1, mac2;always (posedge clk or negedge rst_n) beginif (!rst_n) beginmac1 d0; mac2 d0;end else beginmac1 (h[0]*shift_reg[0]) (h[1]*shift_reg[1]); // 系数h0~h7需定义为parametermac2 (h[2]*shift_reg[2]) (h[3]*shift_reg[3]);endend// Stage3: 第二组乘累加h4x4h5x5, h6x6h7x7reg [2*WIDTH-1:0] mac3, mac4;always (posedge clk or negedge rst_n) beginif (!rst_n) beginmac3 d0; mac4 d0;end else beginmac3 (h[4]*shift_reg[4]) (h[5]*shift_reg[5]);mac4 (h[6]*shift_reg[6]) (h[7]*shift_reg[7]);endend// Stage4: 结果求和与输出always (posedge clk or negedge rst_n) beginif (!rst_n) beginy_out d0;end else beginy_out (mac1 mac2) (mac3 mac4); // 合并所有部分和endend// 滤波器系数示例低通滤波器系数parameter [WIDTH-1:0] h [0:TAPS-1] {16’d1, 16’d2, 16’d4, 16’d8, 16’d8, 16’d4, 16’d2, 16’d1};endmodule设计要点系数对称性优化若FIR系数对称如h[i]h[TAPS-1-i]可减少50%乘法器数量如8阶变4个乘法器流水线深度与吞吐量每增加1级流水线吞吐量提升1倍但latency增加级数×时钟周期应用场景音频处理中8阶FIR流水线可实现48kHz采样率下的实时滤波未流水线时8次乘法7次加法延迟≈50ns无法满足
fpga之基础知识复习---流水线
FPGA流水线设计通过将复杂任务分解为多个并行处理的子阶段显著提升数据处理吞吐量是高速接口、信号处理、图像处理等领域的核心技术。实例1简单加法器流水线流水线阶段划分将“N位加法”拆分为2级流水线以8位加法为例Stage1低4位相加a[3:0] b[3:0]输出低4位和与进位sum_low, carry_lowStage2高4位相加a[7:4] b[7:4] carry_low输出高4位和与最终进位sum_high, carry_out输出拼接{carry_out, sum_high, sum_low}若需进位。module adder_pipeline #(parameter WIDTH 8,parameter STAGES 2 // 流水线级数2级)(input clk, rst_n,input [WIDTH-1:0] a, b,output reg [WIDTH:0] sum // 含进位输出);// Stage1: 低4位相加假设WIDTH8拆分为2个4位reg [3:0] a_low, b_low;reg [3:0] sum_low;reg carry_low;always (posedge clk or negedge rst_n) beginif (!rst_n) beginsum_low 4’d0;carry_low 1’b0;end else begin{carry_low, sum_low} a[3:0] b[3:0]; // 低4位相加产生进位a_low a[3:0]; // 寄存中间变量可选视时序而定b_low b[3:0];endend// Stage2: 高4位相加含Stage1进位reg [3:0] a_high, b_high;reg [3:0] sum_high;reg carry_high;always (posedge clk or negedge rst_n) beginif (!rst_n) beginsum_high 4’d0;carry_high 1’b0;sum (WIDTH1)d0;end else begin{carry_high, sum_high} a[7:4] b[7:4] carry_low; // 高4位进位sum {carry_high, sum_high, sum_low}; // 拼接输出含进位endendendmodule设计要点阶段划分原则每个阶段组合逻辑延迟≤时钟周期如100MHz时钟下单阶段延迟≤10ns寄存器插入每个阶段输出用寄存器打拍隔离前后级逻辑吞吐量流水线填满后每个时钟周期输出1个结果未流水线时8位加法延迟≈2个门延迟无法在10ns内完成。乘法器流水线数字信号处理基础流水线阶段划分以8×8无符号乘法为例拆分为3级流水线 Booth算法简化版Stage1部分积生成按乘数位展开如a×b a×(b0 2b1 4b2 …)Stage2部分积累加用加法树合并部分积Stage3结果输出寄存最终结果。module mult_pipeline #(parameter WIDTH 8)(input clk, rst_n,input [WIDTH-1:0] a, b,output reg [2*WIDTH-1:0] p // 乘积输出);// Stage1: 部分积生成按b的每一位展开reg [2WIDTH-1:0] partial_product [0:WIDTH-1]; // 存储部分积integer i;always () beginfor (i0; iWIDTH; ii1) beginpartial_product[i] (b[i] ? a i : d0); // 乘数位为1则左移i位endend// Stage2: 部分积累加加法树2级流水线reg [2WIDTH-1:0] sum_stage1 [0:(WIDTH/2)-1]; // 第一级加法树两两相加reg [2WIDTH-1:0] sum_stage2; // 第二级加法树合并结果always (posedge clk or negedge rst_n) beginif (!rst_n) beginsum_stage1 {default:d0};sum_stage2 d0;end else begin// 第一级两两相加简化实际用树形结构for (i0; iWIDTH/2; ii1) beginsum_stage1[i] partial_product[2i] partial_product[2i1];end// 第二级合并剩余部分积若WIDTH为奇数sum_stage2 sum_stage1[0] (WIDTH%2 ? partial_product[WIDTH-1] : d0);endend// Stage3: 输出寄存always (posedge clk or negedge rst_n) beginif (!rst_n) beginp d0;end else beginp sum_stage2; // 寄存最终结果endendendmodule设计要点加法树优化部分积累加用“树形加法器”而非串行累加减少Stage2延迟时序平衡各级延迟尽量接近如Stage1用组合逻辑生成部分积Stage2用两级加法树Stage3寄存应用场景FIR滤波器中乘法器流水线可使采样率提升至100MHz未流水线时8×8乘法延迟≈20ns无法满足FIR滤波器流水线数字信号处理进阶以8阶FIR滤波器抽头系数h[0]~h[7]为例拆分为4级流水线Stage1输入数据移位寄存存储最近8个样本x[n]~x[n-7]Stage2乘累加MAC第一部分计算h[0]x[n] h[1]x[n-1]h[2]x[n-2] h[3]x[n-3]Stage3乘累加第二部分计算h[4]x[n-4] h[5]x[n-5]h[6]x[n-6] h[7]x[n-7]Stage4结果求和与输出将Stage2/3结果相加寄存输出module fir_pipeline #(parameter TAPS 8, // 8阶滤波器parameter WIDTH 16 // 数据位宽)(input clk, rst_n,input [WIDTH-1:0] x_in, // 输入数据output reg [2*WIDTH-1:0] y_out // 滤波输出);// Stage1: 输入移位寄存器存储8个历史样本reg [WIDTH-1:0] shift_reg [0:TAPS-1]; // x[n]~x[n-7]integer i;always (posedge clk or negedge rst_n) beginif (!rst_n) beginfor (i0; iTAPS; ii1) shift_reg[i] d0;end else beginshift_reg[0] x_in;for (i1; iTAPS; ii1) shift_reg[i] shift_reg[i-1]; // 右移endend// Stage2: 第一组乘累加h0x0h1x1, h2x2h3x3reg [2*WIDTH-1:0] mac1, mac2;always (posedge clk or negedge rst_n) beginif (!rst_n) beginmac1 d0; mac2 d0;end else beginmac1 (h[0]*shift_reg[0]) (h[1]*shift_reg[1]); // 系数h0~h7需定义为parametermac2 (h[2]*shift_reg[2]) (h[3]*shift_reg[3]);endend// Stage3: 第二组乘累加h4x4h5x5, h6x6h7x7reg [2*WIDTH-1:0] mac3, mac4;always (posedge clk or negedge rst_n) beginif (!rst_n) beginmac3 d0; mac4 d0;end else beginmac3 (h[4]*shift_reg[4]) (h[5]*shift_reg[5]);mac4 (h[6]*shift_reg[6]) (h[7]*shift_reg[7]);endend// Stage4: 结果求和与输出always (posedge clk or negedge rst_n) beginif (!rst_n) beginy_out d0;end else beginy_out (mac1 mac2) (mac3 mac4); // 合并所有部分和endend// 滤波器系数示例低通滤波器系数parameter [WIDTH-1:0] h [0:TAPS-1] {16’d1, 16’d2, 16’d4, 16’d8, 16’d8, 16’d4, 16’d2, 16’d1};endmodule设计要点系数对称性优化若FIR系数对称如h[i]h[TAPS-1-i]可减少50%乘法器数量如8阶变4个乘法器流水线深度与吞吐量每增加1级流水线吞吐量提升1倍但latency增加级数×时钟周期应用场景音频处理中8阶FIR流水线可实现48kHz采样率下的实时滤波未流水线时8次乘法7次加法延迟≈50ns无法满足