0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA中浮點(diǎn)四則運(yùn)算的實(shí)現(xiàn)過程

Hack電子 ? 來源:Hack電子 ? 2024-11-16 11:19 ? 次閱讀

由于定點(diǎn)的四則運(yùn)算比較簡(jiǎn)單,如加減法只要注意符號(hào)擴(kuò)展,小數(shù)點(diǎn)對(duì)齊等問題即可。在本文中,運(yùn)用在前一節(jié)中描述的自定義浮點(diǎn)格式FPGA中數(shù)的表示方法(下),完成浮點(diǎn)四則運(yùn)算的實(shí)現(xiàn)過程

1.自定義浮點(diǎn)格式加(減)法運(yùn)算

基于FPGA 實(shí)現(xiàn)的浮點(diǎn)加法運(yùn)算包括了一系列對(duì)尾數(shù)和指數(shù)部分的操作:移位、交換、格式化、舍入和格式化等。如下圖所示,自定義浮點(diǎn)流水加法器實(shí)現(xiàn)結(jié)構(gòu)主要分為兩部分:基本加法器部分和格式化操作部分。

0b3066c6-9cd7-11ef-a511-92fbcf53809c.jpg

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

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

0b34cd2e-9cd7-11ef-a511-92fbcf53809c.jpg

0b391d8e-9cd7-11ef-a511-92fbcf53809c.jpg

如上所示的情況,可知,這樣的方法可以減少格式化操作,而格式化操作在整個(gè)運(yùn)算過程中消耗相對(duì)比較多的資源,因此這樣的實(shí)現(xiàn)結(jié)構(gòu)可以有效的減少硬件資源的消耗。

3. 乘加運(yùn)算

浮點(diǎn)乘法運(yùn)算較為簡(jiǎn)單,對(duì)應(yīng)的尾數(shù)部分進(jìn)行相乘,指數(shù)部分進(jìn)行相加。尾數(shù)相乘部分采用XILINX 乘法器IP即可。需要注意的是,乘法結(jié)果輸出的位寬指定,在乘法器IP中,按一般流程下來,乘完之后的結(jié)果是保留兩位符號(hào)位(假設(shè)乘數(shù)都是一個(gè)符號(hào)的情況),即多出一個(gè)符號(hào)位,按小數(shù)乘法分析的話,值的情況是比實(shí)際結(jié)果小一倍,在截位輸出的時(shí)候需要做一定的取舍(是從最高位開始截位輸出,還是次高位開始截位輸出;如果從最高位截位輸出,則結(jié)果比實(shí)際值小一倍,如果從次高位截位輸出只有一種情況會(huì)溢出,即兩個(gè)乘數(shù)都為-1的情況,這種情況如果從次高位截位輸出則會(huì)錯(cuò)誤,其余情況都是正確的)。

這里需要進(jìn)一步討論的是乘加操作,數(shù)字信號(hào)處理中常常會(huì)遇到操作,如FIR濾波器。按本文的設(shè)計(jì)思路乘加運(yùn)算也可以節(jié)省一次格式化運(yùn)算,設(shè)計(jì)方法如下:

0b404096-9cd7-11ef-a511-92fbcf53809c.jpg

這樣即可省去乘法器中的格式化過程,將乘法的中間結(jié)果直接輸入給加法器,最后再進(jìn)行格式化輸出。

4. 自定義浮點(diǎn)除法器詳細(xì)設(shè)計(jì)

現(xiàn)有的除法硬件實(shí)現(xiàn)算法主要可以分為三類:查表法、數(shù)字迭代法和函數(shù)迭代法?;诓檎冶淼膶?shí)現(xiàn)方法實(shí)現(xiàn)結(jié)構(gòu)簡(jiǎn)單,只需進(jìn)行簡(jiǎn)單的查表操作即可,但是其精度多一位,則查找表大小就要增加一倍,顯然不適合實(shí)現(xiàn)高精度除法器;數(shù)字迭代法中應(yīng)用最廣的是SRT算法,這類算法基于減法運(yùn)算,商的精度隨減法迭代次數(shù)而線性增長(zhǎng),故為了得到高精度,資源消耗也是相當(dāng)嚴(yán)重。函數(shù)迭代算法中最典型的兩種算法是Newton Raphson和Goldschimidt算法,這兩種算法是采用乘法運(yùn)算來實(shí)現(xiàn)對(duì)商的精度的逼近,商的精度隨著迭代次數(shù)而呈指數(shù)增長(zhǎng),適用于高精度的除法運(yùn)算。

本質(zhì)上Goldschimidt和Newton Raphson兩種算法的原理是一致的,Goldschimidt算法的實(shí)質(zhì)就是對(duì)牛頓迭代算法的迭代操作進(jìn)行重新排列,使得Goldschimidt算法中的乘法操作可以并行進(jìn)行處理,故在利用硬件實(shí)現(xiàn)除法時(shí),Goldschimidt算法較Newton Raphson在速度上更具優(yōu)勢(shì)。以下詳細(xì)分析一下Goldschmidt算法的原理

函數(shù)g(y)在p點(diǎn)的泰勒展開公式如下:

0b4b3f82-9cd7-11ef-a511-92fbcf53809c.jpg

對(duì)于除法來說,希望得到如下的等式關(guān)系:

0b4fdc36-9cd7-11ef-a511-92fbcf53809c.jpg

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

0b5fe202-9cd7-11ef-a511-92fbcf53809c.jpg

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

0b63793a-9cd7-11ef-a511-92fbcf53809c.jpg

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

0b67262a-9cd7-11ef-a511-92fbcf53809c.jpg

q值可以實(shí)現(xiàn)如下迭代過程,其近似的商可以表示如下:

0b6afb1a-9cd7-11ef-a511-92fbcf53809c.jpg

其中Ni和Di分別是算法執(zhí)行i步后得到的分子和分母。當(dāng)Di趨近1時(shí),Ni就趨近于q了。迭代開始時(shí),令N0=a,D0=b。第一次迭代,時(shí),N1=R0*N0,其中R0= 1-x = 2-b??傻玫饺缦?

0b6eaf6c-9cd7-11ef-a511-92fbcf53809c.jpg

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

0b804e02-9cd7-11ef-a511-92fbcf53809c.jpg

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

0b960a62-9cd7-11ef-a511-92fbcf53809c.jpg

故通過對(duì)初始種子進(jìn)行多次迭代而不斷逼近目標(biāo)精度。

現(xiàn)有的Glodschimidt算法都是基于標(biāo)準(zhǔn)的IEEE 754雙精度格式,其算法過程可以描述如下圖所示:

0b99cb7a-9cd7-11ef-a511-92fbcf53809c.jpg

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

IEEE-754標(biāo)準(zhǔn)的浮點(diǎn)數(shù)尾數(shù)的值范圍為[1,2),在不考慮符號(hào)位的情況下,尾數(shù)D形如1.d1d2d3…dn。則其倒數(shù)范圍(0.5,1]。而自定義的浮點(diǎn)的尾數(shù)格式為 .1d1d2d3…dn, 即表示的值的范圍[0.5,1),則其倒數(shù)范圍為(1,2]。這樣的區(qū)別導(dǎo)致在整個(gè)大框架下具體的實(shí)現(xiàn)內(nèi)容情況發(fā)生變化。需要對(duì)整個(gè)算法的每一步驟做好設(shè)計(jì)。

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

0bad1a4a-9cd7-11ef-a511-92fbcf53809c.jpg

而在FPGA中,采用塊RAM進(jìn)行實(shí)現(xiàn),每個(gè)塊RAM大小36k,而本實(shí)現(xiàn)中,初始精度的設(shè)計(jì)需要達(dá)到14位左右,這樣,則輸出位寬m表示為13至16都消耗同等資源,而后邊的算法迭代中,設(shè)計(jì)的乘法器位寬當(dāng)為有符號(hào)數(shù)16x52消耗的DSP48乘法模塊的資源為3,是最為折中的方法,故采用m為15,直接查找表中的每一項(xiàng)直接表示為0.1b1b2b3…bm,這樣表的輸出為16位,正好與后邊的乘法器位寬對(duì)應(yīng)上。

4.1 查找表設(shè)計(jì)

直接查找表方法中,最常用的是常數(shù)分段逼近方法,該算法的核心是確定截?cái)噍斎霐?shù)0.1d1d2d3…dn0和后一位截?cái)噍斎霐?shù)0.1d1d2d3…dn1,的中點(diǎn)數(shù)值,然后計(jì)算該值的倒數(shù),最后加上2^(-(m+2)),并對(duì)得到的結(jié)果進(jìn)行舍入到0.1b1b2b3…bm,故查找表中的每一項(xiàng)可以表示為:

0bb49bda-9cd7-11ef-a511-92fbcf53809c.jpg

其中0.1d1d2d3…dn。對(duì)于輸出位寬m=k+g,能得到的設(shè)計(jì)精度如下表格:

0bbd1c60-9cd7-11ef-a511-92fbcf53809c.jpg

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

4.2 迭代過程

對(duì)應(yīng)的函數(shù)迭代過程也發(fā)生相應(yīng)地改變,這里設(shè)計(jì)時(shí)應(yīng)該考慮每一步驟中的指數(shù)變化情況。相應(yīng)的設(shè)計(jì)過程如下圖所示:

0bc10f46-9cd7-11ef-a511-92fbcf53809c.jpg

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

0bc6442a-9cd7-11ef-a511-92fbcf53809c.jpg

整個(gè)算法的流水過程如下:

0bcf795a-9cd7-11ef-a511-92fbcf53809c.jpg

至此,完成自定義浮點(diǎn)格式的四則運(yùn)算。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21736

    瀏覽量

    603317
  • 運(yùn)算
    +關(guān)注

    關(guān)注

    0

    文章

    130

    瀏覽量

    25789

原文標(biāo)題:FPGA中的浮點(diǎn)四則運(yùn)算

文章出處:【微信號(hào):Hack電子,微信公眾號(hào):Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    霧盈FPGA筆記之(二十五)六位數(shù)四則運(yùn)算計(jì)算器(1)整體結(jié)構(gòu)及設(shè)計(jì)思路

    篇文章開始,陸續(xù)的,我會(huì)將計(jì)算器設(shè)計(jì)的各個(gè)模塊分篇寫出來。今天的這篇文章先談一下整體結(jié)構(gòu)和設(shè)計(jì)思路。二、功能實(shí)現(xiàn):1.六位十進(jìn)制數(shù)的加減乘除四則運(yùn)算。2.按鍵輸入操作數(shù)時(shí),數(shù)碼管移位顯示。3.數(shù)碼管顯示消零
    發(fā)表于 08-29 11:37

    霧盈FPGA筆記之(三十)六位四則運(yùn)算計(jì)算器(6)小算法實(shí)現(xiàn)BCD轉(zhuǎn)二進(jìn)制

    本帖最后由 霧_盈 于 2016-8-30 09:37 編輯 六位四則運(yùn)算計(jì)算器(6)小算法實(shí)現(xiàn)BCD轉(zhuǎn)二進(jìn)制霧盈2016-8-27 一、寫在前面這一篇文章講BCD碼轉(zhuǎn)二進(jìn)制,這個(gè)模塊是為了將
    發(fā)表于 08-29 12:01

    霧盈FPGA筆記之(三十二)六位四則運(yùn)算計(jì)算器(8)算法實(shí)現(xiàn)加減乘除

    六位四則運(yùn)算計(jì)算器(8)算法實(shí)現(xiàn)加減乘除霧盈 2016-8-31 一、寫在前面今天來講計(jì)算模塊,這個(gè)模塊在我的計(jì)算器設(shè)計(jì)里不是核心項(xiàng)目,只是個(gè)計(jì)算功能。一般情況下,童鞋寫加減乘除運(yùn)算都使
    發(fā)表于 09-01 09:03

    利用simulink設(shè)計(jì)四則運(yùn)算仿真模型

    整體思路利用simulink設(shè)計(jì)四則運(yùn)算仿真模型,借助simulink的代碼生成工具生成c語言代碼。同時(shí)介紹STM32擴(kuò)展工具的安裝,使用。所需工具M(jìn)ATLAB 2018bSTM32硬件支持工具下載連接:(用于配置STM32資源)
    發(fā)表于 08-17 09:33

    如何利用simulink去設(shè)計(jì)一種四則運(yùn)算仿真模型

    STM32擴(kuò)展工具怎樣去安裝并使用呢?如何利用simulink去設(shè)計(jì)一種四則運(yùn)算仿真模型?
    發(fā)表于 11-19 06:28

    如何去實(shí)現(xiàn)基于單片機(jī)的四則運(yùn)算計(jì)算器設(shè)計(jì)

    基于單片機(jī)四則運(yùn)算計(jì)算器設(shè)計(jì)設(shè)計(jì)要求硬件設(shè)計(jì)設(shè)計(jì)要求使用keil c軟件基于單片機(jī)系統(tǒng)設(shè)計(jì)一個(gè)“簡(jiǎn)單的計(jì)算器”。要求設(shè)計(jì)的模擬計(jì)算器必須從按鈕輸入0~9組成一個(gè)數(shù),再從按鈕輸入加、減、乘和除運(yùn)算
    發(fā)表于 11-19 08:04

    計(jì)算機(jī)的運(yùn)算方法

    6.1  無符號(hào)數(shù)和有符號(hào)數(shù)6.2  數(shù)的定點(diǎn)表示和浮點(diǎn)表示6.3  定點(diǎn)運(yùn)算6.4  浮點(diǎn)四則運(yùn)算6.5  算術(shù)邏輯單元
    發(fā)表于 04-11 09:33 ?0次下載

    四則運(yùn)算_實(shí)驗(yàn)10

    利用單片機(jī)AT89C51芯片實(shí)現(xiàn)4*4矩陣鍵盤掃描輸入的四則運(yùn)算
    發(fā)表于 01-12 16:50 ?4次下載

    Labview之四則運(yùn)算

    Labview之四則運(yùn)算,很好的Labview資料,快來下載學(xué)習(xí)吧。
    發(fā)表于 04-19 10:56 ?0次下載

    基于FPGA的計(jì)算器設(shè)計(jì)(源碼)

    這是一個(gè)基于FPGA設(shè)計(jì)的四則運(yùn)算簡(jiǎn)易計(jì)算器??梢?b class='flag-5'>實(shí)現(xiàn)定點(diǎn)小數(shù)運(yùn)算和負(fù)數(shù)運(yùn)算。
    發(fā)表于 08-23 16:23 ?31次下載

    使用51單片機(jī)設(shè)計(jì)一個(gè)四則運(yùn)算帶括號(hào)的計(jì)算器設(shè)計(jì)報(bào)告免費(fèi)下載

    在51單片機(jī)上編寫燒錄十進(jìn)制四則運(yùn)算計(jì)算機(jī)程序,使之具有計(jì)算、糾錯(cuò)、顯示、括號(hào)運(yùn)算(甚至浮點(diǎn)數(shù)運(yùn)算)的功能。根據(jù)實(shí)習(xí)設(shè)計(jì)要求,經(jīng)過分析可得整個(gè)實(shí)驗(yàn)可以分為兩個(gè)部分,軟件和硬件,要明白硬
    發(fā)表于 08-13 17:32 ?5次下載
    使用51單片機(jī)設(shè)計(jì)一個(gè)<b class='flag-5'>四則運(yùn)算</b>帶括號(hào)的計(jì)算器設(shè)計(jì)報(bào)告免費(fèi)下載

    使用51單片機(jī)實(shí)現(xiàn)簡(jiǎn)易四則運(yùn)算計(jì)算器的資料和程序免費(fèi)下載

    這是嵌入式課程的一個(gè)小作業(yè),用C51單片機(jī),實(shí)現(xiàn)了0-255內(nèi)的簡(jiǎn)易四則運(yùn)算,暫不支持負(fù)數(shù)、溢出等特殊情況的處理。 【關(guān)鍵點(diǎn)】 1、計(jì)算器用R5、R6、R7三位顯示,段碼為0,全暗,段碼為
    發(fā)表于 07-12 17:39 ?11次下載
    使用51單片機(jī)<b class='flag-5'>實(shí)現(xiàn)</b>簡(jiǎn)易<b class='flag-5'>四則運(yùn)算</b>計(jì)算器的資料和程序免費(fèi)下載

    三菱FX系列PLC浮點(diǎn)數(shù)運(yùn)算指令說明

    三菱FX系列PLC浮點(diǎn)數(shù)運(yùn)算指令包括浮點(diǎn)數(shù)的比較、四則運(yùn)算、開方運(yùn)算和三角函數(shù)等功能,它們分布在指令編號(hào)為FNC110 - FNC119、F
    發(fā)表于 09-04 17:31 ?4.7w次閱讀
    三菱FX系列PLC<b class='flag-5'>浮點(diǎn)</b>數(shù)<b class='flag-5'>運(yùn)算</b>指令說明

    基于單片機(jī)四則運(yùn)算計(jì)算器設(shè)計(jì)+proteus仿真

    基于單片機(jī)四則運(yùn)算計(jì)算器設(shè)計(jì)設(shè)計(jì)要求硬件設(shè)計(jì)設(shè)計(jì)要求使用keil c軟件基于單片機(jī)系統(tǒng)設(shè)計(jì)一個(gè)“簡(jiǎn)單的計(jì)算器”。要求設(shè)計(jì)的模擬計(jì)算器必須從按鈕輸入0~9組成一個(gè)數(shù),再從按鈕輸入加、減、乘和除運(yùn)算
    發(fā)表于 11-12 17:06 ?8次下載
    基于單片機(jī)<b class='flag-5'>四則運(yùn)算</b>計(jì)算器設(shè)計(jì)+proteus仿真

    FPGA浮點(diǎn)四則運(yùn)算是什么

    由于定點(diǎn)的四則運(yùn)算比較簡(jiǎn)單,如加減法只要注意符號(hào)擴(kuò)展,小數(shù)點(diǎn)對(duì)齊等問題即可。在本文中,運(yùn)用在前一節(jié)描述的自定義浮點(diǎn)格式FPGA數(shù)的表示方
    的頭像 發(fā)表于 11-16 12:51 ?265次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>中</b>的<b class='flag-5'>浮點(diǎn)</b><b class='flag-5'>四則運(yùn)算</b>是什么