第一 什么是流水線
流水線設(shè)計(jì)就是將組合邏輯系統(tǒng)地分割,并在各個(gè)部分(分級(jí))之間插入寄存器,并暫存中間數(shù)據(jù)的方法。目的是將一個(gè)大操作分解成若干的小操作,每一步小操作的時(shí)間較小,所以能提高頻率,各小操作能并行執(zhí)行,所以能提高數(shù)據(jù)吞吐率(提高處理速度)。
第二 什么時(shí)候用流水線設(shè)計(jì)
使用流水線一般是時(shí)序比較緊張,對(duì)電路工作頻率較高的時(shí)候。典型情況如下:
1)功能模塊之間的流水線,用乒乓 buffer 來交互數(shù)據(jù)。代價(jià)是增加了 memory 的數(shù)量,但是和獲得的巨大性能提升相比,可以忽略不計(jì)。
2) I/O 瓶頸,比如某個(gè)運(yùn)算需要輸入 8 個(gè)數(shù)據(jù),而 memroy 只能同時(shí)提供 2 個(gè)數(shù)據(jù),如果通過適當(dāng)劃分運(yùn)算步驟,使用流水線反而會(huì)減少面積。
3)片內(nèi) sram 的讀操作,因?yàn)?sram 的讀操作本身就是兩極流水線,除非下一步操作依賴讀結(jié)果,否則使用流水線是自然而然的事情。
4)組合邏輯太長(zhǎng),比如(a+b)*c,那么在加法和乘法之間插入寄存器是比較穩(wěn)妥的做法。
第三 使用流水線的優(yōu)缺點(diǎn)
1)優(yōu)點(diǎn):流水線縮短了在一個(gè)時(shí)鐘周期內(nèi)給的那個(gè)信號(hào)必須通過的通路長(zhǎng)度,增加了數(shù)據(jù)吞吐量,從而可以提高時(shí)鐘頻率,但也導(dǎo)致了數(shù)據(jù)的延時(shí)。舉例如下:例如:一個(gè) 2 級(jí)組合邏輯,假定每級(jí)延遲相同為 Tpd,
1.無流水線的總延遲就是 2Tpd,可以在一個(gè)時(shí)鐘周期完成,但是時(shí)鐘周期受限制在 2Tpd;
2.流水線:
每一級(jí)加入寄存器(延遲為 Tco)后,單級(jí)的延遲為 Tpd+Tco,每級(jí)消耗一個(gè)時(shí)鐘周期,流水線需要 2 個(gè)時(shí)鐘周期來獲得第一個(gè)計(jì)算結(jié)果,稱 為首次延遲,它要 2*( Tpd+Tco),但是執(zhí)行重復(fù)操作時(shí),只要一個(gè)時(shí)鐘周期來獲得最后的計(jì)算結(jié)果,稱為吞吐延遲( Tpd+Tco)。可見只要 Tco 小于 Tpd,流水線就可以提高速度。 特別需要說明的是,流水線并不減小單次操作的時(shí)間,減小的是整個(gè)數(shù)據(jù)的操作時(shí)間,請(qǐng)大家認(rèn)真體會(huì)。
2) 缺點(diǎn):功耗增加,面積增加,硬件復(fù)雜度增加,特別對(duì)于復(fù)雜邏輯如 cpu 的流水線而言,流水越深,發(fā)生需要 hold 流水線或 reset 流水線的情況時(shí),時(shí)間損失越大。 所以使用流水線并非有利無害,大家需權(quán)衡考慮。
第四 一個(gè) 8bit 流水線加法器的小例子
非流水線:
module add8(
a,
b,
c);
input [7:0] a;
input [7:0] b;
output [8:0] c;
assign c[8:0] = {1'd0, a} + {1'd0, b};
endmodule
采用兩級(jí)流水線:第一級(jí)低 4bit,第二級(jí)高 4bit,所以第一個(gè)輸出需要 2 個(gè)時(shí)鐘周期有效,后面的數(shù)據(jù)都是 1 個(gè)周期
之后有效。
module adder8_2(
clk,
cin,
cina,
cinb,
sum,
cout);
input clk;
input cin;
input [7:0] cina;
input [7:0] cinb;
output [7:0] sum;
output cout;
reg cout;
reg cout1; //插入的寄存器
reg [3 :0 ] sum1 ; //插入的寄存器
reg [7 :0 ] sum;
reg [3:0] cina_reg;
reg [3:0] cinb_reg;//插入的寄存器
always @(posedge clk) //第一級(jí)流水
begin
{cout1 , sum1} <= cina[3:0] + cinb [3:0] + cin ;
end
always @(posedge clk)
begin
cina_reg <= cina[7:4];
cinb_reg <= cinb[7:4];
end
always @(posedge clk) //第二級(jí)流水
begin
{cout ,sum[7:0]} <= {{1'b0,cina_reg[3:0]} + {1'b0,cinb_reg[3:0]} + cout1 ,sum1[3:0]} ;
end
endmodule
這里講到的流水線,主要是一種硬件設(shè)計(jì)的算法,如第一條中表述的流水線設(shè)計(jì)就是將組合邏輯系統(tǒng)地分割,并在各個(gè)部分(分級(jí))之間插入寄存器,并暫存中間數(shù)據(jù)的方法。
針對(duì)處理器中的流水線結(jié)構(gòu)。比如,比如 5—6 個(gè)不同功能的電路單元組成一條指令處理流水線,然后將一條指令分成 5—6 步后再由這些電路單元分別執(zhí)行,這樣就能實(shí)現(xiàn)在一個(gè) CPU 時(shí)鐘周期完成一條指令,因此提高 CPU 的運(yùn)算速度。 一般的 CPU 中,每條整數(shù)流水線都分為四級(jí)流水, 即指令預(yù)取、 譯碼、 執(zhí)行、 寫回結(jié)果,openrisc采用的是 5 級(jí)整數(shù)流水線。
當(dāng)然它們的核心思想都是利用并行執(zhí)行提高效率。
總結(jié)一下,流水線就是插入寄存器,以面積換取速度。
原文標(biāo)題:FPGA學(xué)習(xí)-流水線設(shè)計(jì)Pipeline Design
文章出處:【微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
FPGA
+關(guān)注
關(guān)注
1620文章
21510瀏覽量
598879 -
流水線
+關(guān)注
關(guān)注
0文章
112瀏覽量
25464
原文標(biāo)題:FPGA學(xué)習(xí)-流水線設(shè)計(jì)Pipeline Design
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論