高級FPGA設(shè)計(jì)筆記——Chapter 2 架構(gòu)面積

本章討論關(guān)于數(shù)字設(shè)計(jì)中的“面積”問題,并提出若干在FPGA設(shè)計(jì)中優(yōu)化面積的方法曹鸠。
我們將通過選擇不同拓?fù)浣Y(jié)構(gòu)來減少面積消耗,這與我們熟知的通過綜合、布線工具的約束來優(yōu)化電路面積不同散怖,約束方式是針對不同器件特性來降低邏輯門與模塊的數(shù)量,而拓?fù)浣Y(jié)構(gòu)是在更高層面上來解決這個(gè)問題肄渗,適用于所有器件镇眷。
優(yōu)化面積通常是最大限度地重用邏輯資源,這會以犧牲數(shù)據(jù)吞吐量為代價(jià)翎嫡。
本章將具體針對下列問題進(jìn)行討論:
1)收起流水線以在不同計(jì)算階段重用邏輯資源偏灿。
2)在無現(xiàn)有的遞歸、循環(huán)等算法時(shí)钝的,通過控制邏輯來實(shí)現(xiàn)邏輯復(fù)用。
3)在不同功能操作之間共享邏輯資源铆遭。
4)復(fù)位對面積優(yōu)化的影響:

  • 缺少reset功能的影響硝桩;
  • 缺少set功能的影響;
  • 缺少異步reset功能的影響枚荣;
  • RAM reset的影響碗脊;
  • 使用set/reset對邏輯資源進(jìn)行優(yōu)化。

2.1 收起流水線

顧名思義橄妆,本小節(jié)與上一章的流水線操作正相反衙伶,通過復(fù)用流水線中的重復(fù)邏輯,實(shí)現(xiàn)面積的降低害碾。
定點(diǎn)數(shù)乘法是常見的可以寫為流水線的設(shè)計(jì)模塊矢劲,我們可以通過添加移位和加法器來“收起”它,乘法器被優(yōu)化為受B位數(shù)控制的A的移位累加算法慌随。
優(yōu)化前代碼:

module mult8(
output [7:0] product, 
input [7:0] A,
input [7:0] B,
input clk); 
reg [15:0] prod16;
    assign product = prod16[15:8];
    always @(posedge clk)
      prod16 <= A * B;
endmodule

優(yōu)化后代碼:

module mult8(
output done, 
output reg [7:0] product,
input [7:0] A,
input [7:0] B,
input clk,
input start);
    reg [4:0] multcounter; // counter for number of shift/adds
    reg [7:0] shiftB; // shift register for B
    reg [7:0] shiftA; // shift register for A
    wire adden; // enable addition
    assign adden = shiftB[7] & !done;
    assign done = multcounter[3];
    always @(posedge clk) begin
    // increment multiply counter for shift/add ops 
    if(start) multcounter <= 0;
    else if(!done) multcounter <= multcounter + 1;
      // shift register for B
      if(start) shiftB <= B;
      else shiftB[7:0] <= {shiftB[6:0], 1’b0};
      // shift register for A
      if(start) shiftA <= A;
      else shiftA[7:0] <= {shiftA[7], shiftA[7:1]};
      // calculate multiplication
      if(start)      product <= 0;
      else if(adden) product <= product + shiftA;
    end
endmodule

2.2 基于控制信號的邏輯復(fù)用

當(dāng)共享邏輯明顯大于所需的控制邏輯時(shí)芬沉,可以通過添加控制邏輯的方式實(shí)現(xiàn)共享邏輯復(fù)用。

多數(shù)情況下阁猜,邏輯的復(fù)用并不想2.1節(jié)那么簡單丸逸,需要創(chuàng)建一些控制邏輯,比如狀態(tài)機(jī)剃袍,來更好的實(shí)現(xiàn)黄刚。以低通FIR濾波器的實(shí)現(xiàn)為例。


低通FIR濾波器公式

實(shí)現(xiàn)代碼:

module lowpassfir(
    output reg [7:0] filtout,
    output reg done,
    input clk,
    input [7:0] datain, // X[0]
    input datavalid, // X[0] is valid
    input [7:0] coeffA, coeffB; coeffC); // coeffs for low pass filter

// define input/output samples
reg [7:0] X0, X1, X2;
reg multdonedelay;
reg multstart; // signal to multiplier to begin computation
reg [7:0] multdat;
reg [7:0] multcoeff; // the registers that are multiplied together
reg [2:0] state; // holds state for sequencing through mults
reg [7:0] accum; // accumulates multiplier products
reg clearaccum; // sets accum to zero 
reg [7:0] accumsum;
wire multdone; // multiplier has completed 
wire [7:0] multout; // multiplier product

// shift-add multiplier for sample-coeff mults 
mult8?8 mult8?8(.clk(clk), 
      .dat1(multdat),
      .dat2(multcoeff), 
      .start(multstart),
      .done(multdone), 
      .multout(multout));

always @(posedge clk) begin
      multdonedelay <= multdone;
      // accumulates sample-coeff products
      accumsum <= accum + multout[7:0];
      // clearing and loading accumulator 
      if(clearaccum) accum <= 0;
      else if(multdonedelay) accum <= accumsum;
      // do not process state machine if multiply is not done
      case(state)
         0: begin
         // idle state
         if(datavalid) begin
              // if a new sample has arrived
              // shift samples
              X0 <= datain;
              X1 <= X0;
              X2     <= X1;
              multdat  <= datain;
              multcoeff <= coeffA;
              multstart <= 1;
              clearaccum <= 1; // clear accum
              state   <= 1;
          end
          else begin
              multstart <= 0;
              clearaccum <= 0;
              done    <= 0;
         end
     end
    1: begin
          if(multdonedelay) begin
               // A*X[0] is done, load B*X[1]
               multdat  <= X1;
               multcoeff <= coeffB;
               multstart <= 1;
               state   <= 2;
          end
          else begin
               multstart <= 0;
               clearaccum <= 0;
               done    <= 0;
          end
    end
    2: begin
          if(multdonedelay) begin
               // B*X[1] is done, load C*X[2]
               multdat  <= X2;
               multcoeff <= coeffC;
               multstart <= 1;
               state   <= 3;
         end
         else begin
               multstart <= 0;
               clearaccum <= 0;
               done    <= 0;
        end
    end
    3: begin
         if(multdonedelay) begin
              // C*X[2] is done, load output
              filtout  <= accumsum;
              done    <= 1;
              state   <= 0;
         end
         else begin
              multstart <= 0;
              clearaccum <= 0;
              done    <= 0;
         end
     end
  default
      state   <= 0;
endcase
end
endmodule

2.3 邏輯共享

對于以面積為主要要求的緊湊型設(shè)計(jì)民效,應(yīng)在不同模塊中搜索相似的邏輯憔维,這些邏輯可以被帶到全局層面被多個(gè)模塊共享涛救。
下圖中模塊A和B是兩個(gè)完全獨(dú)立的邏輯。A是一個(gè)計(jì)數(shù)分頻器埋同,8-bit計(jì)數(shù)器自動計(jì)數(shù)和歸零州叠;B是一個(gè)PWM生成器,11-bit計(jì)數(shù)器在固定值歸零凶赁。通過邏輯共享咧栗,可以有效節(jié)省面積。
優(yōu)化前:


完全獨(dú)立的兩個(gè)模塊

優(yōu)化后:


計(jì)數(shù)器共享

2.4 復(fù)位對面積的影響

不恰當(dāng)?shù)膹?fù)位方式可能造成大量額外的邏輯資源浪費(fèi)虱肄,不利于面積優(yōu)化致板。

2.4.1 reset對資源的影響

FPGA內(nèi)部有許多特定的built-in資源,例如移位寄存器咏窿,可以有效節(jié)省LUT與FF的使用斟或,但是在非必要的reset使用情況下,綜合工具就會放棄使用built-in資源集嵌,造成資源浪費(fèi)萝挤。如下兩種設(shè)計(jì)會導(dǎo)致完全不同的結(jié)果:


移位寄存器的不同設(shè)計(jì)

生成的電路區(qū)別如下:


兩種設(shè)計(jì)方式生成的不同電路

2.4.2 set對資源的影響

與移位寄存器不同,大多數(shù)FPGA的內(nèi)置DSP資源包含reset功能根欧,但如何非要使用set怜珍,則會在輸出端的產(chǎn)生多余邏輯。


不恰當(dāng)?shù)膕et

2.4.3 異步reset對資源的影響

許多新出的高性能FPGA內(nèi)置資源還有同步reset功能凤粗,如DSP酥泛,但如果非要使用異步reset,也會浪費(fèi)大量邏輯資源嫌拣。

2.4.4 reset RAM

去復(fù)位RAM通常是一種糟糕的設(shè)計(jì)柔袁,尤其是使用異步復(fù)位。

通常情況下异逐,我們希望使用BRAM資源來完成FPGA內(nèi)部存儲功能捶索,節(jié)省FF資源,但不恰當(dāng)?shù)膹?fù)位(異步復(fù)位)會適得其反应役。


復(fù)位方式對RAM的影響

2.4.5 利用FF的set/reset因腳來優(yōu)化設(shè)計(jì)

可以發(fā)現(xiàn)情组,F(xiàn)F的set可以完成外部或門功能;reset則與外部的與門功能等效箩祥。如下圖所示:


set等價(jià)于或門

reset等價(jià)于與門

利用這個(gè)原理可以使一些看似復(fù)雜的邏輯變得意外簡單:


你以為需要你個(gè)邏輯門院崇?

就是這么簡單
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袍祖,隨后出現(xiàn)的幾起案子底瓣,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捐凭,死亡現(xiàn)場離奇詭異拨扶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茁肠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門患民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人垦梆,你說我怎么就攤上這事匹颤。” “怎么了托猩?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵印蓖,是天一觀的道長。 經(jīng)常有香客問我京腥,道長赦肃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任公浪,我火速辦了婚禮他宛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欠气。我一直安慰自己堕汞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布晃琳。 她就那樣靜靜地躺著,像睡著了一般琐鲁。 火紅的嫁衣襯著肌膚如雪卫旱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天围段,我揣著相機(jī)與錄音顾翼,去河邊找鬼。 笑死奈泪,一個(gè)胖子當(dāng)著我的面吹牛适贸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涝桅,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼拜姿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冯遂?” 一聲冷哼從身側(cè)響起蕊肥,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛤肌,沒想到半個(gè)月后壁却,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體批狱,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年展东,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赔硫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盐肃,死狀恐怖爪膊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恼蓬,我是刑警寧澤惊完,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站处硬,受9級特大地震影響小槐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荷辕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一凿跳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疮方,春花似錦控嗜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惫谤,卻和暖如春壁顶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溜歪。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工若专, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝴猪。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓调衰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親自阱。 傳聞我的和親對象是個(gè)殘疾皇子嚎莉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容