曾 鑫,熊 波,于德海,邢永強
(1.海軍某工程建設指揮部,北京 100036;2.海軍航空工程學院,山東 煙臺 264001;3.92514 部隊,山東 煙臺 264001)
除法是數值計算和數據分析中最常用的運算之一,許多高級運算如平方根、指數、三角函數等都與其有關[1]。當前的EDA 工具能對“+”、“-”及部分“* ”運算符進行綜合,但是并不能綜合“/”運算,而且,在FPGA 中,提供的乘除法設計向導或提供LPM 宏函數對除法運算而言,能處理的除數必須是2 的冪,因此無法實現除數為任意數的除法。所以,本文旨在設計一種能被綜合而且除數能是任意整數的除法器。
VHDL 并非是針對硬件設計而開發的語言,只是被用來設計硬件。VHDL 是在美國國防部的指導下,出于采購電子設備的需要,為了不涉及商業機密和知識產權問題,同時以保證采購廠商即使破產,也能由其他廠商迅速生產出代用品而開發的。它僅僅用來描述供應商的集成電路芯片的行為,以便讓其他廠商按照VHDL 文檔的描述,設計出行為與其相同的芯片,因此,制訂語言標準時,并沒有考慮這些代碼如何用硬件來實現[2]。所以,VHDL 語法標準的代碼是對硬件行為的一種描述,但不能直接對應成電路的設計信息。行為描述可以基于不同的層次,如系統級,算法級,寄存器傳輸級(RTL)、門級等等。目前大部分EDA 軟件只能綜合RTL 或更低層次的行為描述。
對除法而言,要想實現兩個變量相除的運算,如寫下代碼“ans=x/y”,幾乎任何EDA 軟件都不能將其綜合成硬件。經典的除法計算方式是,每次比較余數和除數的大小,確定商,每做一次減法,保持余數不動,低位由被除數低位補進,再減去右移后的除數;對于補碼除法運算,先將除數和被除數取模,然后按照原碼的計算方法求出商和余數,再根據符號對計算結果進行修正[3]。比較被除數數(余數)與除數的大小需要比較器,求余需要減法器,商數和余數的中間結果必須有寄存器存儲,下一次比較之前對余數移位需移位器,時序控制需要狀態機等等,因而上述代碼的運算不可能在一個時鐘周期里完成。部分FPGA 的配套EDA 軟件提供除法的運算模塊,也只能支持直接調用,而且對除數要求必須是2的冪,不支持把形如“ans =x/y”的語句綜合成除法模塊,因此編寫由VHDL 設計的、對任意數值均能適用的、可綜合的除法器對FPGA 數據處理十分必要。
除法器算法主要有兩種:迭代法與循環法[4-5]。迭代法所提供的商的最低位不準確。循環算法是以減法運算為基礎的算法,需要多個循環周期。該算法的實現比較簡單,所需的硬件資源較少,非常利于芯片的設計。通常情況下,高精度的除法運算在FPGA 實現中往往要消耗大量邏輯資源。Oberman 和Flynn 的研究[6-7]表明循環算法可以取得較好的時延和資源消耗,而且在計算時延要求較低的應用中,以加長處理時間來降低FPGA 內部資源消耗的運算方法具有一定的應用價值。
減法運算是除法運算的基礎,除法運算可以由減法運算來實現[7]。在筆算除法時,習慣是從高位以除數的位數為單元進行比較,直到當前比較位的被除數減去除數的整數倍后得到的余數小于除數時,確定當前位的商,再移入右邊一位,再做重復比較運算[8]。在FPGA 中,可用VHDL 通過減法運算來實現兩個任意整數的除法運算。設計的除法器計算方法并不像筆算那樣,從高位以除數位數為單元逐一進行比較,其原理是先將被除數與除數作減法運算,將被減后的被除數再次與除數作減法運算,每進行一次減法運算,計數器計數加一,直至被除數被減后的余數小于除數(被除數和除數在作減法運算時作為被減數和減數)。這時計數器的值就是商的整數部分,對商的整數部分的每一位數值的確定通過判斷計數器計數值的大小,比如計數值大于10 000時,對計數值作減10 000處理,直到計數值大小小于10 000,這個減法操作的次數,就是萬位上的數值,同理得到千位、百位、十位、個位上的數值。之后計算商的小數部分,首先將余數乘10再與除數作減法運算,操作過程和整數部分的減法相同,直至余數小于除數,計數值得到小數的十分位,再對余數乘10作同樣的運算,得到百分位數值,一直這樣按相同的運算步驟做下去。如果需要保留小數點后n 位,則需作n +1 次相同的小數部分運算步驟,判斷第n+1 位小數的值,用以進行四舍五入運算,再對之前的n 位小數位和商的整數位進行修正。
除法器設計采用VHDL 有限狀態機來實現,設計的除法器的兩個操作數在(0,40002]之間(根據應用需要而定的),運算精度要求保留小數點后兩位。設計流程如圖1 所示。

圖1 除法器軟件設計流程
對設計的除法器,在Quartus II 平臺上進行了時序和功能仿真,并與采用浮點運算算法編寫的除法器[9]進行了比較,在處理兩操作數大小相當的運算時,本文設計的除法器運算速度與浮點運算算法相當,但占用系統資源遠遠小于浮點運算算法,這對某些占用資源多,模塊劃分細的大型系統設計而言,在FPGA 內部資源優化設計上,尤為重要。除法器的仿真結果如圖2 與圖3 所示。

圖2 與圖3 的區別主要在算法的時延不同,由圖中時間條可以看出,當兩操作數相差較大時(圖2),計算結果時延較大,約為132.5 μs,而當兩操作數相差較小時(圖3),計算結果時延小,約為153 ns,圖中clk 信號的周期和占空比相同。所以設計的除法器對操作數相當的情況下,運算速度快。運算結果經四舍五入處理后,精確到小數點后兩位。
本文以VHDL 編寫了能在FPGA 中可綜合成硬件的除法器代碼,由于設計的除法器應用場合是求出前后兩次采集數據的比值,而且兩數據大小相當,由仿真結果可知,設計在時延上能很好的滿足要求,同時,綜合后消耗FPGA 的資源相對較低。筆者在進行高精度測試儀設計過程中使用了該模塊,測試結果準確,運算速度較快。
[1]陳玉丹,齊京禮,陳建泗.基于VHDL 的8 位除法器的實現[J].微計算機信息,2006,22(12):277-278.
[2]姜立東.VHDL 語言程序設計及應用[M].北京:北京郵電大學出版社,2007.
[3]陳國軍,萬明康,王大鳴等.乘除法和開方運算的FPGA串行實現[J].微計算機信息,2008,24(5):167-168.
[4]劉志剛,汪旭東,鄭關東.基于SPT 算法的單精度浮點除法器[J].電子設計應用,2008,33(7):59-62.
[5]岳偉甲,劉昌錦.一種基于FPGA 的32 位快速加法器設計[J].四川兵工學報,2011,32(7):78-81.
[6]Oberman S F,Flynn M J.Division algorithm and implementations.IEEE transactions on computers,1997,46(8):833-854.
[7]Oberman S F.Design issuses in high performance floating point arithmetic units.PHD thesis,stanford university,Electrical & electronic department,1997,1.
[8]朱衛華,鄭留平.可任意設定計算精度的整數除法器的VHDL 設計[J]. 國外電子測量技術,2008,27(2):16-18.
[9]許秋華,劉偉.基于FPGA 的浮點運算單元的設計方法[J].大眾科技,2009,10:17-19.