說明
本文基於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
注意:
- 單always程序中時鍾周期10ns,結果也正確。同時Timing Analysis下不存在Clock Setup ‘enable’,Timing Analysis Tool也無法激活。
- 單always程序中,{cout,sum} = tempa + tempb + tempc;的阻塞賦值改為非阻塞賦值,結果並無變化。
- 若用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中,只需要很少或根本不需要額外的成本。這是因為每個邏輯單元都包含兩個觸發器,大多數情況下這兩個觸發器或者沒有用到,或者用於存儲布線資源,那么就可利用其來實現流水線結構。若采用流水線后,加法器速度仍不能滿足需要,可采用串並轉換來進一步提高計算的並行度。