FPGA流水线设计通过将复杂任务分解为多个并行处理的子阶段,显著提升数据处理吞吐量,是高速接口、信号处理、图像处理等领域的核心技术。
实例1:简单加法器流水线
流水线阶段划分​
将“N位加法”拆分为2级流水线(以8位加法为例):
Stage1:低4位相加(a[3:0] + b[3:0]),输出低4位和与进位(sum_low, carry_low);
Stage2:高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位相加(假设WIDTH=8,拆分为2个4位)
reg [3:0] a_low, b_low;
reg [3:0] sum_low;
reg carry_low;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
sum_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];
end
end

// 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) begin
if (!rst_n) begin
sum_high <= 4’d0;
carry_high <= 1’b0;
sum <= (WIDTH+1)'d0;
end else begin
{carry_high, sum_high} = a[7:4] + b[7:4] + carry_low; // 高4位+进位
sum <= {carry_high, sum_high, sum_low}; // 拼接输出(含进位)
end
end
endmodule`
设计要点​
阶段划分原则:每个阶段组合逻辑延迟≤时钟周期(如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 @(
) begin
for (i=0; i<WIDTH; i=i+1) begin
partial_product[i] = (b[i] ? a << i : 'd0); // 乘数位为1则左移i位
end
end

// Stage2: 部分积累加(加法树,2级流水线)
reg [2WIDTH-1:0] sum_stage1 [0:(WIDTH/2)-1]; // 第一级加法树(两两相加)
reg [2
WIDTH-1:0] sum_stage2; // 第二级加法树(合并结果)
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
sum_stage1 <= '{default:'d0};
sum_stage2 <= 'd0;
end else begin
// 第一级:两两相加(简化,实际用树形结构)
for (i=0; i<WIDTH/2; i=i+1) begin
sum_stage1[i] <= partial_product[2i] + partial_product[2i+1];
end
// 第二级:合并剩余部分积(若WIDTH为奇数)
sum_stage2 <= sum_stage1[0] + (WIDTH%2 ? partial_product[WIDTH-1] : 'd0);
end
end

// Stage3: 输出寄存
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
p <= 'd0;
end else begin
p <= sum_stage2; // 寄存最终结果
end
end

endmodule
设计要点​
加法树优化:部分积累加用“树形加法器”(而非串行累加),减少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) begin
if (!rst_n) begin
for (i=0; i<TAPS; i=i+1) shift_reg[i] <= 'd0;
end else begin
shift_reg[0] <= x_in;
for (i=1; i<TAPS; i=i+1) shift_reg[i] <= shift_reg[i-1]; // 右移
end
end

// Stage2: 第一组乘累加(h0x0+h1x1, h2x2+h3x3)
reg [2*WIDTH-1:0] mac1, mac2;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
mac1 <= 'd0; mac2 <= 'd0;
end else begin
mac1 <= (h[0]*shift_reg[0]) + (h[1]*shift_reg[1]); // 系数h0~h7需定义为parameter
mac2 <= (h[2]*shift_reg[2]) + (h[3]*shift_reg[3]);
end
end

// Stage3: 第二组乘累加(h4x4+h5x5, h6x6+h7x7)
reg [2*WIDTH-1:0] mac3, mac4;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
mac3 <= 'd0; mac4 <= 'd0;
end else begin
mac3 <= (h[4]*shift_reg[4]) + (h[5]*shift_reg[5]);
mac4 <= (h[6]*shift_reg[6]) + (h[7]*shift_reg[7]);
end
end

// Stage4: 结果求和与输出
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
y_out <= 'd0;
end else begin
y_out <= (mac1 + mac2) + (mac3 + mac4); // 合并所有部分和
end
end

// 滤波器系数(示例:低通滤波器系数)
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,无法满足)

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐