FPGA中的浮點四則運算

2021-02-25 FPGA之家

由於定點的四則運算比較簡單,如加減法只要注意符號擴展,小數點對齊等問題即可。在本文中,運用在前一節中描述的自定義浮點格式FPGA中數的表示方法(下),完成浮點四則運算的實現過程

1.自定義浮點格式加(減)法運算

基於FPGA 實現的浮點加法運算包括了一系列對尾數和指數部分的操作:移位、交換、格式化、捨入和格式化等。如下圖所示,自定義浮點流水加法器實現結構主要分為兩部分:基本加法器部分和格式化操作部分。

在圖(a)中的基本加法器,首先比較兩個操作數的指數部分,較大的指數加上1之後,寄存輸出(保證流水輸出)作為加法和的指數部分;另一方面根據指數部分的比較結果,交換尾數的位置,即需要對較小的尾數進行右移對齊;之後尾數部分相加,得到的結果高位截取後輸出作為加法和的尾數部分。由於操作數A 和B 的尾數部分首先需要符號位拓展之後進行才進行下一步操作,而最後的和是直接高位截取輸出的,故導致加法結果比實際值小一倍,這就是前面指數需要加上1輸出的原因。對於(b)中的格式化操作,首先對來自基本加法器的尾數和指數進行預處理,然後計算尾數部分的符號位個數。最後根據計算得到的符號位個數,左移尾數後輸出尾數部分,而指數則減去符號位數作為指數部分輸出。

如果是一次而輸入加法則以這樣的結構即可,但如果涉及多次加法,以流水形式完成,則在結構上可以作更好的優化。如下是四輸入和八輸入加法器的結構:

如上所示的情況,可知,這樣的方法可以減少格式化操作,而格式化操作在整個運算過程中消耗相對比較多的資源,因此這樣的實現結構可以有效的減少硬體資源的消耗。

3. 乘加運算

浮點乘法運算較為簡單,對應的尾數部分進行相乘,指數部分進行相加。尾數相乘部分採用XILINX 乘法器IP即可。需要注意的是,乘法結果輸出的位寬指定,在乘法器IP中,按一般流程下來,乘完之後的結果是保留兩位符號位(假設乘數都是一個符號的情況),即多出一個符號位,按小數乘法分析的話,值的情況是比實際結果小一倍,在截位輸出的時候需要做一定的取捨(是從最高位開始截位輸出,還是次高位開始截位輸出;如果從最高位截位輸出,則結果比實際值小一倍,如果從次高位截位輸出只有一種情況會溢出,即兩個乘數都為-1的情況,這種情況如果從次高位截位輸出則會錯誤,其餘情況都是正確的)。

這裡需要進一步討論的是乘加操作,數位訊號處理中常常會遇到操作,如FIR濾波器。按本文的設計思路乘加運算也可以節省一次格式化運算,設計方法如下:

這樣即可省去乘法器中的格式化過程,將乘法的中間結果直接輸入給加法器,最後再進行格式化輸出。

4. 自定義浮點除法器詳細設計

現有的除法硬體實現算法主要可以分為三類:查表法、數字迭代法和函數迭代法。基於查找表的實現方法實現結構簡單,只需進行簡單的查表操作即可,但是其精度多一位,則查找表大小就要增加一倍,顯然不適合實現高精度除法器;數字迭代法中應用最廣的是SRT算法,這類算法基於減法運算,商的精度隨減法迭代次數而線性增長,故為了得到高精度,資源消耗也是相當嚴重。函數迭代算法中最典型的兩種算法是Newton Raphson和Goldschimidt算法,這兩種算法是採用乘法運算來實現對商的精度的逼近,商的精度隨著迭代次數而呈指數增長,適用於高精度的除法運算。

本質上Goldschimidt和Newton Raphson兩種算法的原理是一致的,Goldschimidt算法的實質就是對牛頓迭代算法的迭代操作進行重新排列,使得Goldschimidt算法中的乘法操作可以並行進行處理,故在利用硬體實現除法時,Goldschimidt算法較Newton Raphson在速度上更具優勢。以下詳細分析一下Goldschmidt算法的原理

函數g(y)在p點的泰勒展開公式如下:

對於除法來說,希望得到如下的等式關係:

即可以得到倒數函數的展開公式,然而,倒數函數無法作泰勒展開,故採用麥克勞林展開公式,採用的函數表達如下:

令 f(x)=1/b,則有x=b-1,由0.5≤b<1,得abs(x)≤0.5 ,故:

上述公式因式分解後可得如下公式:

q值可以實現如下迭代過程,其近似的商可以表示如下:

其中Ni和Di分別是算法執行i步後得到的分子和分母。當Di趨近1時,Ni就趨近於q了。迭代開始時,令N0=a,D0=b。第一次迭代,時,N1 = R0*N0,其中R0 = 1-x = 2-b。可得到如下:

類似地,下次迭代令R1 = 2-D1 = 1+y^2,則可以得到:

故可以得到Goldschmidt算法的迭代過程,總結如下:

故通過對初始種子進行多次迭代而不斷逼近目標精度。

現有的Glodschimidt算法都是基於標準的IEEE 754雙精度格式,其算法過程可以描述如下圖所示:

上圖中的approx(1/B)步驟需要得到精度不高的近似的倒數,這裡採用直接查找表的形式,這種形式最為簡單,直接查找倒數表得到除數(B)的倒數近似值,然後在使用該值進行上圖所示的函數迭代來得到更高精度的除數倒數逼近值。直接查找表得到的近似值的精度取決於查表的索引長度及其表項長度。故要使初始值的精度增加1位,則查找表的空間就需要翻一倍。對於現階段的FPGA,其存儲資源已經非常多,故在FPGA實現直接查找表,其資源消耗是相對很小的。

IEEE-754標準的浮點數尾數的值範圍為[1,2),在不考慮符號位的情況下,尾數D形如1.d1d2d3…dn。則其倒數範圍(0.5,1]。而自定義的浮點的尾數格式為 .1d1d2d3…dn , 即表示的值的範圍[0.5,1),則其倒數範圍為(1,2]。這樣的區別導致在整個大框架下具體的實現內容情況發生變化。需要對整個算法的每一步驟做好設計。

誠如上述,自定義格式的浮點中,得到的倒數範圍為(1,2],而我們自定義的浮點格式表示的範圍為[0.5,1),故我們須將(1,2]改成(0.5,1] * 2,其中的(0.5,1]由尾數表示,而2則由指數表示。故查找表中的表項表示的值是實際倒數值的1/2。現假設階段後的除數輸入表示為0.1d1d2d3…dn,則輸出的除數倒數值可表示為21 * 0.1b1b2b3…bm,則查表所需的查找表大小為:

而在FPGA中,採用塊RAM進行實現,每個塊RAM大小36k,而本實現中,初始精度的設計需要達到14位左右,這樣,則輸出位寬m表示為13至16都消耗同等資源,而後邊的算法迭代中,設計的乘法器位寬當為有符號數16x52消耗的DSP48乘法模塊的資源為3,是最為折中的方法,故採用m為15,直接查找表中的每一項直接表示為0.1b1b2b3…bm,這樣表的輸出為16位,正好與後邊的乘法器位寬對應上。

4.1 查找表設計

直接查找表方法中,最常用的是常數分段逼近方法,該算法的核心是確定截斷輸入數0.1d1d2d3…dn0和後一位截斷輸入數0.1d1d2d3…dn1,的中點數值,然後計算該值的倒數,最後加上2^(-(m+2)),並對得到的結果進行捨入到0.1b1b2b3…bm,故查找表中的每一項可以表示為:

其中0.1d1d2d3…dn。對於輸出位寬m=k+g,能得到的設計精度如下表格:

假設確定k=13,m=16,故得到的最小精度為13.912。

4.2 迭代過程

對應的函數迭代過程也發生相應地改變,這裡設計時應該考慮每一步驟中的指數變化情況。相應的設計過程如下圖所示:

另外在實現多分子單分母,形如(A+C)/B,為了更省時間和空間資源可以採取如下圖所示的實現策略:

整個算法的流水過程如下:

至此,完成自定義浮點格式的四則運算。

歡迎通信工程師和FPGA工程師關注公眾號

歡迎大家加入全國FPGA微信技術群,這裡有一群熱愛技術的工程師,在這裡可以一起交流討論技術!

用手指按住就可以加入FPGA全國技術群哦

FPGA IP核服務:各類優質IP核服務商,服務到位,有保障!有需求的可以直接聯繫群主!

FPGA技術群平臺自營:Xilinx Altera 鎂光、三星、海力士、ADI TI ST NXP 等品牌的優勢代理分銷商,歡迎大家有需求隨時髮型號清單,我們將在第一時間為您提供最優競爭力的報價!價格低於您原有供應商5%以上!歡迎詢價-直接把需求發給群主!

FPGA技術群官方鳴謝品牌:Xilinx、 intel(Altera)、microsemi(,Actel)、LattIC e,Vantis,Quicklogic,Lucent等

相關焦點

  • 三菱PLC浮點運算應用指令
    浮點運算應用指令能實現浮點數的轉換、比較、四則運算、開方運算、三角函數等功能,浮點運算應用指令大都為32位指令。一、二進位浮點比較與區間比較指令本文引用地址:http://www.eepw.com.cn/article/201612/331348.htm二進位浮點比較ECMP指令比較源操作數S1與源操作數S2內的32位二進位浮點數,根據大小一致比較結果,對應輸出驅動目的操作數D指定軟元件開始的連續3個位軟元件的狀態,二、二進位浮點數與十進位浮點數轉換指令二進位浮點數轉換為十進位浮點數
  • 三菱PLC浮點運算指令
    二進位浮點數比較指令ECMP(FNC110) DECMP(P)指令的使用如圖1所示,將兩個源操作數進行比較,比較結果反映在目標操作數中。如果操作數為常數則自動轉換成二進位浮點值處理。該指令源操作數可取K、H和D,目標操作數可用Y、M和S。為32位運算指令,佔17個程序步。
  • 基於複數浮點運算的協方差矩陣的FPGA實現
    本文以空間譜估計作為研究背景,研究了複數據運算和浮點運算的特點,提出了一種適用於任何陣列流型、任意陣元的基於複數浮點運算的協方差矩陣的FPGA實現方案。在本設計中,考慮到系統的數據動態範圍和運算精度,選擇浮點計算。由於運算數據是直接從接收機I,Q兩路通道的A/D變換器的輸出獲得,為定點數,因此必須要有一個將A/D採樣的定點數據轉換為浮點數的過程。設計中將16位定點數轉換為IEEE 754標準的單精度格式。32位單精度格式如圖2所示,最高位為符號位,其後8位為指數e(用移碼表示,基數f=2,偏移量為127),餘下的23位為尾數m。
  • 小學數學中的四則混合運算
    四則混合運算又叫脫式計算或遞等式計算,一般分三步或三步以上來書寫,不能直接在算式後面直接寫出計算結果。四則混合運算是數學考試中的必考題。它包括整數、小數、分數、百分數的四則混合運算,是小學數學的基礎,同時也是一個重點難點。
  • 單精度浮點加法器的FPGA實現
    >浮點的存儲格式,設計出一種適合在FPGA上實現單精度浮點加法運算的算法處理流程,依據此算法處理流程劃分的各個處理模塊便於流水設計的實現。所以這裡所介紹的單精度浮點加法器具有很強的運算處理能力。關鍵詞:IEEE 754;單精度浮點;加法運算;FPGA本文引用地址:http://www.eepw.com.cn/article/192020.htm 圖像處理通常採用軟體或者數位訊號處理器(DSP)實現。
  • 高效的C編程之: 浮點運算
    大多數的ARM處理器硬體上並不支持浮點運算。但ARM上提供了以下幾個選項來實現浮點運算。本文引用地址:http://www.eepw.com.cn/article/257015.htm·浮點累加協處理器FPA(Floating-PointAccelerator):ARM上提供了一組協處理器指令專門實現浮點運算。
  • 定點DSP C55X實現浮點相關運算
    同時,定點DSP結構下的浮點運算有很強的可行性,因為C語言和彙編語言分別具有可移植性強和運算效率高的特點,因此在定點DSP中結合C語言和彙編語言的混合編程技術將大大提高編程的靈活度,以及運算速度。  大多數DSP的開發工具只是在C語言的基礎上支持標準的浮點運算,而定點DSP硬體一般都是面向定點的運算,不支持標準的浮點運算,缺乏硬體的支持極大地限制了浮點的應用,因而標準的浮點運算在實際定點DSP應用中並不多見。C5509是一款16位定點DSP。在本文中,對C5509輸入FTSK信號,用C語言和彙編語言混合編程的方式對輸入浮點型的FTSK信號進行相關運算,並輸出浮點運算結果。
  • 基於FPGA的高速流水線浮點乘法器設計與實現
    同時由於基於IEEE754 標準的浮點運算具 有動態範圍大,可實現高精度,運算規律較定點運算更為簡捷等特點,浮點運算單元的設計 研究已獲得廣泛的重視。  2.2 浮點乘法器的硬體系統結構  本設計用於專用浮點FFT 處理器,因此對運算速度有較高要求。
  • c語言數據運算超範圍要注意
    例如:unsigned long int X; double AD;AD=AD/50.0;X=AD*5000.0000/1023.00;最好先局部計算一下,X=AD*100/1023.00;1.浮點類型的不能做「模」運算。 例如:float a=1234.56; a=a%10; 這是錯誤的。
  • Day13 奇葩的浮點運算
    實際上這並不是 py 一門語言的問題,在編程中,只要浮點數是遵循 IEEE 標準的,就存在這個問題。註:下面這段話是在湊字數,可以直接跳過,你知道有這麼個標準就行了。在計算機系統的發展過程中,曾經提出過多種方法表示實數,但是到為止使用最廣泛的是浮點表示法。相對於定點數而言,浮點數利用指數使小數點的位置可以根據需要而上下浮動,從而可以靈活地表達更大範圍的實數。浮點數表示法利用科學計數法來表達實數。
  • 3G系統中AGC的FPGA設計實現
    因此,基於這種方法,fpga在5ms的周期中遍取6 400個碼片,每64個碼片做積分,依次向前滾動計算,同時做除法運算,最後即可計算出SYNC_DL在一幀6 400個碼片中的位置和能量,以此控制VGA的電壓和後續的計算。不過這種方法只有在信號質量很好,信號強度比較大的時候才計算準確。
  • 小學四則運算不過關,七年級有理數四則運算咋辦?暑假練起來吧
    近期一些小升初家長反應,孩子在預習七上數學有理數四則運算時,錯誤率很高。針對這個情況,老師幫同學們梳理一下小學四則運算內容,有理數的運算是在小學四則運算基礎上,新加入了負數、乘方和絕對值的運算,其方法有很多類似之處。四則運算的概念和運算順序1.加法、減法、乘法和除法統稱四則運算。
  • 經典小學四則運算練習題(值得收藏)
    小學數學四則混合運算,是小學數學的重點內容,可以通過四則混合運算,來檢驗學生的數學運算能力,同樣也是難點內容,難就難在學生對四則混合運算的法則掌握不夠熟練。四則運算的法則是:先乘除後加減,有括號的要先算小括號裡的內容。
  • 迷你世界四則運算地圖 迷你世界電路運算迷你號存檔
    導 讀 今天小編就帶來了迷你世界四則運算地圖的詳細介紹,迷你世界四則運算是一個比較有趣的電路地圖,可以讓玩家在地圖中有很好的算數發揮
  • Python學習第114課——numpy中ndarray的四則運算
    這節我們學習numpy中數組的一些基本的四則運算。●numpy中數組的加法運算我們首先生成x和y兩個float類型的數組,然後把它們進行相加。補充:除了可以把兩個數組直接相加,也可以調用numpy中的add()函數對兩個數組進行相加:我們看到調用numpy的add()函數結果跟計算x+y的結果是一樣的。舉一反三,numpy中數組的加、減、乘、除、開方運算,方法都是一樣的。
  • 四則混合運算(小學數學)學習經驗分享
    一.四則混合運算在一個算式中,含有加、減、乘、除四種運算中的兩種或兩種以上的運算,稱為四則混合運算。例子: 6+9×5 , 38 - 36÷4二.三級運算加法和減法 → 第一級運算乘法和除法 → 第二級運算乘方和開方 → 第三級運算三.同級運算
  • 比拼浮點運算速度 超算排行榜是這樣「算」出來的
    6月17日,新一期全球超算500強榜單出爐,入選500強的所有超算浮點運算速度都突破每秒千萬億次,中國超算也在前四佔有兩席位置。普通計算機用指令運算速度衡量計算性能,而超算通常用浮點運算速度來衡量其性能。那麼,什麼是浮點運算速度,超算榜單為什麼會選擇浮點運算速度來進行比較?
  • 小學奧數專題訓練,四則運算的巧算
    四則運算的巧算【知識點歸納】1.運用運算定律.2.商不變的性質:兩個數相除,被除數和除數同時擴大(或縮小相同的倍數)商不變。利用這個性質也可以進行一些簡便計算.點評:此題主要考查的是乘法結合律和乘法分配律再整數計算中的運算。
  • Javascript每日一學-Javascript中關於浮點數運算的坑
    Javascript中的數字都是雙精度的浮點數。Javascript中的整數並不是一個獨立的數據類型,而是浮點數的一個子集。浮點數的坑我們直接看下面的一個例子。浮點數的精度問題並不是Javascript所獨有的,例如在Java中,我們運行以下代碼,同樣會輸出和Javascript中一樣的結果。Java中的雙精度運算那造成這個問題的原因是什麼呢?
  • 《四則運算》整理複習,這些知識點要掌握牢固
    《四則運算》是部編版四年級數學下冊第一單元的內容,隨著網課的進行,這單元的內容差不多該結束了,本節內容,小隴老師分享的是《四則運算》單元整理與複習,幫助同學們牢固掌握這單元的知識。四則運算其實就是我們常說的「加」「減」「乘」「除」運算,通過對這單元的學習,同學們要能夠理解四則運算的意義,掌握四則運算的運算順序,要學會利用四則遠算解決簡單的實際問題。這些知識點同學們需牢固掌握1、首先需要掌握的是什麼是四則運算?