資源復(fù)用策略:利用Time-Multiplexing在小容量FPGA上實(shí)現(xiàn)大算法
掃描二維碼
隨時(shí)隨地手機(jī)看文章
在FPGA設(shè)計(jì)中,資源不足是工程師常面臨的“緊箍咒”。當(dāng)復(fù)雜的數(shù)字信號(hào)處理(DSP)算法或神經(jīng)網(wǎng)絡(luò)模型所需的邏輯單元(LUT)和DSP Slice遠(yuǎn)超芯片容量時(shí),直接映射往往行不通。此時(shí),Time-Multiplexing(時(shí)分復(fù)用)成為突破物理限制的“銀彈”。它通過(guò)分時(shí)共享硬件資源,以時(shí)間換空間,讓小容量FPGA也能跑通大算法。
核心原理:分時(shí)切片
時(shí)分復(fù)用的本質(zhì)是將算法在時(shí)間軸上“切片”。假設(shè)一個(gè)巨大的卷積計(jì)算需要100個(gè)乘法器,而FPGA僅有10個(gè)。通過(guò)引入遠(yuǎn)高于數(shù)據(jù)速率的高速時(shí)鐘(例如系統(tǒng)時(shí)鐘的10倍),我們可以讓這10個(gè)乘法器在10個(gè)時(shí)鐘周期內(nèi)輪流處理不同的數(shù)據(jù)段。從宏觀上看,就像是100個(gè)乘法器在同時(shí)工作。
實(shí)現(xiàn)的關(guān)鍵在于數(shù)據(jù)流的調(diào)度與狀態(tài)機(jī)的精準(zhǔn)控制。數(shù)據(jù)需先存入緩存(FIFO或RAM),然后由狀態(tài)機(jī)(FSM)指揮,在特定的時(shí)間窗口將數(shù)據(jù)送入處理單元,并將結(jié)果暫存,在輸出端重組。
Verilog實(shí)現(xiàn):狀態(tài)機(jī)驅(qū)動(dòng)的復(fù)用邏輯
以下代碼展示了一個(gè)基于狀態(tài)機(jī)的時(shí)分復(fù)用加法器陣列框架。通過(guò)state寄存器控制不同數(shù)據(jù)段的計(jì)算,同一組加法器在不同周期處理不同輸入。
verilog
module time_multiplexing_alu (
input clk,
input rst_n,
input [7:0] data_in_a [0:3], // 4組輸入數(shù)據(jù)
input [7:0] data_in_b [0:3],
output reg [8:0] result_out [0:3]
);
// 狀態(tài)定義:4個(gè)狀態(tài)對(duì)應(yīng)4組數(shù)據(jù)的計(jì)算
parameter IDLE = 2'b00;
parameter COMP0 = 2'b01;
parameter COMP1 = 2'b10;
parameter COMP2 = 2'b11;
parameter DONE = 2'b00; // 復(fù)用IDLE編碼
reg [1:0] state;
reg [7:0] a_reg, b_reg;
reg [1:0] index; // 當(dāng)前處理的索引
// 核心:時(shí)分復(fù)用的ALU
wire [8:0] sum_result;
assign sum_result = a_reg + b_reg; // 僅使用一套加法器資源
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= IDLE;
index <= 0;
end else begin
case (state)
IDLE: begin
if (start) begin
state <= COMP0;
index <= 0;
end
end
COMP0, COMP1, COMP2: begin
// 1. 鎖存當(dāng)前索引的數(shù)據(jù)
a_reg <= data_in_a[index];
b_reg <= data_in_b[index];
// 2. 等待一個(gè)周期讓組合邏輯(加法器)穩(wěn)定
// 實(shí)際工程中可能需要更多拍數(shù)
result_out[index] <= sum_result;
// 3. 切換到下一個(gè)索引
index <= index + 1;
if (index == 3)
state <= DONE;
else
state <= state + 1;
end
DONE: begin
// 通知外部數(shù)據(jù)有效
done_o <= 1;
state <= IDLE;
end
endcase
end
end
endmodule
工程挑戰(zhàn)與規(guī)避
實(shí)施時(shí)分復(fù)用并非毫無(wú)代價(jià),bi須警惕以下陷阱:
時(shí)序壓力:由于要在更短的時(shí)間內(nèi)完成多路計(jì)算,系統(tǒng)時(shí)鐘頻率通常需要大幅提升。這對(duì)時(shí)鐘樹(shù)設(shè)計(jì)和建立時(shí)間(Setup Time)提出了嚴(yán)苛要求。若時(shí)鐘頻率無(wú)法提升,geng優(yōu)的策略是增加并行度(如從4路復(fù)用改為2路),犧牲部分面積換取頻率。
控制邏輯復(fù)雜度:狀態(tài)機(jī)容易陷入“意大利面條”式的混亂。建議將數(shù)據(jù)通路(Datapath)與控制通路(Control Path)嚴(yán)格分離,使用獨(dú)立的FSM管理復(fù)用流程。
功耗與毛刺:高頻時(shí)鐘下,寄存器頻繁翻轉(zhuǎn)會(huì)導(dǎo)致動(dòng)態(tài)功耗激增??赏ㄟ^(guò)門(mén)控時(shí)鐘(Clock Gating)技術(shù),在無(wú)數(shù)據(jù)處理時(shí)關(guān)閉部分寄存器的時(shí)鐘,降低無(wú)效功耗。
結(jié)語(yǔ)
時(shí)分復(fù)用是FPGA設(shè)計(jì)中以巧破力的經(jīng)典策略。它要求工程師不僅關(guān)注算法本身,更要深入理解硬件資源的時(shí)間維度特性。在資源受限的邊緣計(jì)算或低成本項(xiàng)目中,熟練掌握這一技巧,是將復(fù)雜算法落地的bi經(jīng)之路,也是衡量工程師架構(gòu)設(shè)計(jì)能力的zhong極標(biāo)尺。





