采用流水線技術實現8位加法器


 

說明

     本文基於FPGA和CPLD器件,采用非流水線和流水線技術實現8位加法器,並對比其Quartus II仿真結果和波形時序。

     器件選擇:

     Stratix:EP1S40F1020C5(FPGA)

     MAX7000S:EPM7064SLC44-5(CPLD)

 

實驗一  FPGA實現8位加法器

     程序清單:

 1 /*******************8位加法器(非流水線)***********************/
 2 module adder_nonpipe(cout, sum, ina, inb, cin, enable);
 3 
 4 output cout;
 5 output [7:0] sum;
 6 input [7:0] ina, inb;
 7 input cin, enable;
 8 
 9 reg cout;
10 reg [7:0] sum;
11 reg [7:0] tempa, tempb;
12 reg tempc;
13 
14 always @(posedge enable)
15 begin
16     tempa = ina;
17     tempb = inb;
18     tempc = cin;
19 end
20 
21 always @(posedge enable)
22 begin
23     {cout,sum} = tempa + tempb + tempc;
24 end
25 
26 endmodule

     Compilation編譯報告如圖1所示:

 

圖1  8位加法器(非流水線/FPGA)編譯結果

     RTL Viewer 提供設計的邏輯門級原理圖和層次結構列表,列出整個設計網表的實例、基本單元、引腳和網絡。可過濾顯示在視圖上的信息,瀏覽設計視圖的不同頁面來檢查設計並確定應當作的更改。實驗一的RTL原理圖如圖2所示:

圖2  8位加法器(非流水線/FPGA)RTL Viewer

     Technology Map Viewer 提供設計的底層或基元級特定技術原理表征。它包括一個原理視圖,以及一個層次列表,列出整個設計網表的實例、基本單元、引腳和網絡。實驗一的Techology Map Viewer結果如圖3所示:

圖3  8位加法器(非流水線/FPGA)Techology Map Viewer

     Simulation仿真波形如圖4所示:

圖4  8位加法器(非流水線/FPGA)仿真圖

 

 

實驗二  FPGA實現8位加法器(采用2級流水線)

     程序清單:

 1 /*******************8位2級流水加法器*************************/
 2 module adder_pipeline(cout, sum, ina, inb, cin, enable);
 3 
 4 output cout;
 5 output [7:0] sum;
 6 input [7:0] ina, inb;
 7 input cin, enable;
 8 
 9 reg cout;
10 reg [7:0] sum;
11 
12 reg [3:0] tempa, tempb, firsts;
13 reg firstc;
14 always @(posedge enable)
15 begin
16     {firstc,firsts} = ina[3:0] + inb[3:0] + cin;
17     tempa = ina[7:4];        //高4位輸入寄存,使其與sum低4位在下級流水線同步輸入。
tempb = inb[7:4];
//否則sum的高4位,與低四位分兩個時鍾周期輸出 18 end 19 20 always @(posedge enable) 21 begin 22 {cout,sum[7:4]} = tempa + tempb + firstc; 23 sum[3:0] = firsts; //不能合並為{cout, sum} = {tempa + tempb + firstc, firsts}; 位寬不匹配 24 end 25 26 endmodule

     另一個可用版本主體代碼如下:

 1 reg [4:0] tempa,tempb;
 2 reg [3:0] firsts;
 3 reg firstc;
 4 
 5 always @(posedge enable) begin     //低4 位相加; 
 6       { firstc, firsts} = {ina[3], ina[3:0]} + {inb[3], inb[3:0]} + cin ; 
 7       tempa = {ina[7], ina[7:4]};  //似乎應該高位補零即{1’b0, ina[7:4]};才對
 8       tempb = {inb[7], inb[7:4]};
 9 end 
10 
11 always @(posedge enable) begin     //高4 位相加,並連成8位 
12       {cout, sum} = {tempa + tempb + firstc, firsts} ;  
13 end

     注:設ina為Mbit,inb為Nbit,則{cout, sum}=a+b為M+N+1位,其中cout占1位,sum為M+N位。

     編譯后Total Logic Element為24個。

     RTL原理圖如圖5所示:

圖5  8位加法器(2級流水線/FPGA)RTL Viewer

     Techology Map Viewer結果如圖6所示:

圖6  8位加法器(2級流水線/FPGA)Techology Map Viewer

     Simulation仿真波形如圖7所示:

圖7  8位加法器(2級流水線/FPGA)仿真圖

 

 

實驗三  CPLD實現8位加法器

     程序清單(單always):

 1 /*******************8位加法器(非流水線)***********************/
 2 module adder_nonpipe(cout, sum, ina, inb, cin, enable);
 3 
 4 output cout;
 5 output [7:0] sum;
 6 input [7:0] ina, inb;
 7 input cin, enable;
 8 
 9 reg cout;
10 reg [7:0] sum;
11 
12 always @(posedge enable)
13 begin
14     {cout,sum} = ina + inb + cin;
15 end
16 
17 endmodule

     將Device替換為CPLD器件。在Project Navigator->Hierarchy窗口器件處右鍵->Device,即可打開器件選擇框,選擇所需的器件確定即可。此處選擇"MAX7000S:EPM7064SLC44-5"。

     Compilation編譯報告如圖8所示:

 

圖8  8位加法器(非流水線/CPLD)編譯結果

     Simulation仿真波形如圖9所示:

圖9  8位加法器(非流水線/CPLD)仿真圖-1

     接着考慮雙always形式的加法器(程序同實驗一,僅器件不同):

     Compile編譯后,Total Macrocell為42個。

     仍采用周期為10ns的時鍾enable,仿真結果如圖10所示:

圖10  8位加法器(非流水線/CPLD)仿真圖-2

     顯然sum值不正確。

     展開Compilation Report下面的Timing Analyzer,多了一項Clock Setup ‘enable’。從右側報告窗口可觀察到最長(最差時序)路徑需要13.5ns,對應fmax為74.07MHz,也就是最高工作頻率。

圖11  8位加法器(非流水線/CPLD)時序分析結果

     將時鍾周期改為13.5ns,重新運行仿真,結果如圖12所示:

圖12  8位加法器(非流水線/CPLD)仿真圖-3

     注意:

  1. 單always程序中時鍾周期10ns,結果也正確。同時Timing Analysis下不存在Clock Setup ‘enable’,Timing Analysis Tool也無法激活。
  2. 單always程序中,{cout,sum} = tempa + tempb + tempc;的阻塞賦值改為非阻塞賦值,結果並無變化。
  3. 若用FPGA器件實現單always程序,則波形完全正確,如圖13所示:

圖13  8位加法器(非流水線/CPLD)仿真圖-4

          這也符合通常習慣,即一個時鍾沿周期采樣,下一個時鍾沿輸出。

 

 

實驗四  CPLD實現8位加法器(采用2級流水線)

     程序同實驗二,器件選擇同實驗三。

     編譯后Total Macrocell為32個。

     在Timing Analyzer詳細報告窗口可觀察到那些影響周期惡化的最差時序路徑,根據這些信息可找出關鍵路徑並進行時序分析。圖14顯示Clock Period為9.700ns,Frequency為103.09MHz。

圖14  8位加法器(非流水線/CPLD)時序分析結果

     觀察第一條路徑的時序報告,如圖15所示:

 

圖15  8位加法器(2級流水線/CPLD)時序報告(局部)

     時鍾周期為10ns時,仿真波形如圖16所示:

圖16  8位加法器(2級流水線/CPLD)仿真圖

     該波形與實驗三單always程序波形最主要的差別在於,sum=01001010之后一個周期的值是否正確。

     當時鍾周期取10ns時,仿真波形與實驗三雙always程序波形相同,但最高工作頻率卻由74.07 MHz提高到103.09MHz。可見最高工作頻率(系統工作速度)不能單純由仿真波形判斷。

 

 

總結

     1. FPGA中1個邏輯單元(Logic Element )相當於CPLD中0.78個宏單元(MacroCell).

     2. Quartus II中FPGA器件編譯速度比CPLD慢得多。

     3. Stratix的最高工作頻率大於MAX7000S的的最高工作頻率。如實驗一二中Timing Analysis Tool均顯示Frequency為Restricted to 422.12 MHz(這時不易比較采用流水線和非流水線的最高頻率)。

     4. 比較實驗一(非流水線)和實驗二(流水線)的RTL原理圖及工藝映射圖,可清楚地看到,流水線技術的本質是在組合邏輯之間插入寄存器,暫存前面的運算結果或輸入數據,並在下一個時鍾到來時將寄存值作為后一級運算的輸入。將流水線規則應用於FPGA中,只需要很少或根本不需要額外的成本。這是因為每個邏輯單元都包含兩個觸發器,大多數情況下這兩個觸發器或者沒有用到,或者用於存儲布線資源,那么就可利用其來實現流水線結構。若采用流水線后,加法器速度仍不能滿足需要,可采用串並轉換來進一步提高計算的並行度。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM