FPGA(現(xiàn)場可編程門陣列)技術(shù)的理論研究和實(shí)際應(yīng)用正越來越受到人們的重視。FPGA 技術(shù)常常使一些原來比較難解決的技術(shù)瓶頸得以輕松實(shí)現(xiàn),從而使產(chǎn)品的開發(fā)周期大為縮短,性能價(jià)格比大幅提高。運(yùn)算器作為計(jì)算機(jī)的加工處理部件,是CPU(中央處理器)的重要組成部分。作為典型的PC機(jī)一般都至少具有一個(gè)定點(diǎn)運(yùn)算器。在586 之前的機(jī)型中,由于當(dāng)時(shí)硬件條件和工藝的限制,浮點(diǎn)運(yùn)算器一般以協(xié)處理器的形式出現(xiàn)。進(jìn)入20 世紀(jì)90 年代后,隨著工藝水平的提高,一個(gè)芯片上集成度不斷提高,如今浮點(diǎn)運(yùn)算所要求的一些硬件已可以集成到CPU 中,因此,作為浮點(diǎn)運(yùn)算器的代表的協(xié)處理器也逐漸被集成度很高的CPU 中的一部分所代替。
浮點(diǎn)運(yùn)算
定點(diǎn)運(yùn)算器主要是用于實(shí)現(xiàn)對定點(diǎn)整數(shù)和定點(diǎn)小數(shù)的算術(shù)運(yùn)算、對邏輯數(shù)據(jù)的邏輯運(yùn)算以及對主存的地址計(jì)算等。
浮點(diǎn)數(shù)比定點(diǎn)數(shù)的表述范圍寬,有效精度高,更適合于科學(xué)計(jì)算與工程計(jì)算。浮點(diǎn)運(yùn)算可分為兩類:非規(guī)格化和規(guī)格化浮點(diǎn)運(yùn)算。非規(guī)格化浮點(diǎn)運(yùn)算,不要求操作數(shù)是規(guī)格化數(shù),對運(yùn)算結(jié)果也不要求規(guī)格化處理。而規(guī)格化浮點(diǎn)運(yùn)算只能對規(guī)格化的浮點(diǎn)數(shù)進(jìn)行操作,并且要求對運(yùn)算結(jié)果加以規(guī)格化處理。由于規(guī)格化浮點(diǎn)數(shù)具有惟一的表示形式,而且在計(jì)算機(jī)中尾數(shù)能獲得最大的有效數(shù)字,所以在一般的計(jì)算機(jī)中一般選用規(guī)格化浮點(diǎn)運(yùn)算。
浮點(diǎn)加、減運(yùn)算
浮點(diǎn)加減法運(yùn)算規(guī)則
設(shè)有兩個(gè)浮點(diǎn)數(shù)x 和y,分別為
其中Ex 和Ey 分別為數(shù)x 和y 的階碼,Mx 和My 分別是數(shù)x 和y 的尾數(shù)。
兩浮點(diǎn)數(shù)進(jìn)行加減的運(yùn)算規(guī)則是
浮點(diǎn)加減法運(yùn)算步驟
完成兩個(gè)浮點(diǎn)數(shù)加法或減法運(yùn)算,需要以下幾個(gè)步驟完成。
(1) 對階:兩浮點(diǎn)數(shù)進(jìn)行加減,必須使它們的階碼相等,這個(gè)過程稱為對階。對階的第1 步是求階差:
對階的規(guī)則是小階向大階看齊,即使階碼小的尾數(shù)向右移位,每右移一位階碼加1,直至兩數(shù)的階碼相等( E=0)為
止。右移的位數(shù)等于階差| E|。當(dāng)然尾數(shù)右移也會(huì)發(fā)生數(shù)碼丟失,但這時(shí)丟失的僅僅是尾數(shù)的低位部分,誤差較小,而且
可以通過舍入方法來控制誤差。
(2)求和或求差:按定點(diǎn)加減的規(guī)則求兩尾數(shù)的和或差。這個(gè)過程中所使用運(yùn)算邏輯單元與定點(diǎn)運(yùn)算邏輯單元類似。
(3)規(guī)格化:求和之后得到的數(shù)可能不是規(guī)格化的數(shù),為了增加有效數(shù)字的位數(shù),提高運(yùn)算精度,必須將求和的結(jié)果規(guī)
格化。
當(dāng)尾數(shù)用二進(jìn)制表示時(shí),浮點(diǎn)規(guī)格化的定義是尾數(shù)M 應(yīng)滿足:
(4)溢出判斷:在進(jìn)行運(yùn)算時(shí),可能出現(xiàn)階碼溢出的情況。當(dāng)階碼超出上限時(shí),稱為階碼上溢,它表示浮點(diǎn)數(shù)的絕對值超出表述范圍。當(dāng)階碼小于下限時(shí),稱為階碼下溢,它表示浮點(diǎn)數(shù)的絕對值已在浮點(diǎn)數(shù)表示的分辨率之下。通常階碼上溢時(shí)要進(jìn)行相應(yīng)的處理,階碼下溢時(shí)要當(dāng)作機(jī)械零處理。
浮點(diǎn)乘、除運(yùn)算
浮點(diǎn)乘除法運(yùn)算規(guī)則
兩浮點(diǎn)數(shù)乘法的運(yùn)算規(guī)則是
即兩浮點(diǎn)數(shù)相乘,其乘積的階碼為相乘兩數(shù)的階碼之和,其乘積的尾數(shù)為相乘兩數(shù)尾數(shù)之積。
兩浮點(diǎn)數(shù)除法的運(yùn)算規(guī)則是
即兩浮點(diǎn)數(shù)相除,商的階碼為被除數(shù)的階碼減去除數(shù)的階碼所得到的差,尾數(shù)為被除數(shù)的尾數(shù)除以除數(shù)的尾數(shù)所得
的商。
浮點(diǎn)乘除法運(yùn)算步驟
兩個(gè)浮點(diǎn)數(shù)乘除運(yùn)算步驟為: 完成兩浮點(diǎn)數(shù)階碼的加減運(yùn)算,并判斷結(jié)果是否溢出; 完成兩浮點(diǎn)數(shù)尾數(shù)的乘除運(yùn)
算; 根據(jù)結(jié)果的階碼判斷溢出,如果上溢則置溢出標(biāo)志。
浮點(diǎn)運(yùn)算器的設(shè)計(jì)與實(shí)現(xiàn)
硬件平臺
浮點(diǎn)運(yùn)算器的設(shè)計(jì)與實(shí)現(xiàn)都是在開發(fā)的多功能EDA 實(shí)驗(yàn)臺上完成的。該EDA 實(shí)驗(yàn)臺采用FPGA-XC4010EPC84、
62256CPLD 和其它外圍芯片(例如74LS244,74LS275)組成。XILINX 公司XC4000 系列是高容量、高成本的FPGA,能夠進(jìn)行無限次重新編程,配合公司的相應(yīng)軟件FOUNDATION 3.1,用戶可以設(shè)計(jì)和調(diào)試出具有相當(dāng)功能的控制邏輯。根據(jù)不同的要求,規(guī)劃不同控制邏輯,通過把控制邏輯下載到FPGA 芯片中構(gòu)成自己的硬件平臺。
基于VHDL 語言方式
VHDL 語言具有極強(qiáng)的描述覆蓋能力,在使用VHDL 語言實(shí)現(xiàn)的過程中,我們采用自頂向下的方法來實(shí)現(xiàn)浮點(diǎn)運(yùn)算
器。步驟如下:
(1)分析系統(tǒng)的內(nèi)部結(jié)構(gòu)并進(jìn)行系統(tǒng)劃分,確定各個(gè)模塊的功能和接口。
在設(shè)計(jì)中,根據(jù)浮點(diǎn)運(yùn)算器的功能,將其劃分為時(shí)序產(chǎn)生模塊、浮點(diǎn)數(shù)輸入模塊、浮點(diǎn)運(yùn)算模塊和結(jié)果輸出模塊4 個(gè)模
塊來實(shí)現(xiàn)。浮點(diǎn)運(yùn)算器邏輯框圖如圖1 所示。
將這4 個(gè)模塊組合成頂層設(shè)計(jì)float_alu,該頂層設(shè)計(jì)的端口定義分別為
(2)根據(jù)浮點(diǎn)運(yùn)算器各模塊的功能,分別編寫程序,輸入VHDL 代碼,并將其編譯成標(biāo)準(zhǔn)的VHDL 文件。
時(shí)序產(chǎn)生模塊:該模塊功能是對系統(tǒng)時(shí)鐘進(jìn)行分頻產(chǎn)生相應(yīng)的時(shí)鐘信號。本模塊中使用計(jì)數(shù)器級連的方法實(shí)現(xiàn)分頻。
浮點(diǎn)數(shù)輸入模塊:開關(guān)sel_1 和sel_2 為輸入數(shù)據(jù)的觸發(fā)信號。多功能EDA 實(shí)驗(yàn)臺上其余開關(guān)對應(yīng)于8 位尾數(shù)和4 位階碼輸入。當(dāng)sel_1 開關(guān)按下,即sel_1=‘1’時(shí),輸入開關(guān)中的數(shù)據(jù)作為第1 組輸入數(shù)的8 位尾數(shù)和4 位階碼;當(dāng)sel_2 開關(guān)按
下,即sel_2=‘1’時(shí),輸入開關(guān)中的數(shù)據(jù)作為第2 組輸入數(shù)的8位尾數(shù)和4 位階碼。在該模塊中用進(jìn)程process (sel_1)和process(sel_2)來實(shí)現(xiàn)。
浮點(diǎn)運(yùn)算模塊:該模塊主要完成各種浮點(diǎn)運(yùn)算,是整個(gè)系統(tǒng)的核心部分。根據(jù)輸入功能選擇按鍵,在start_clk 信號上升
沿的觸發(fā)下,對輸入的兩組浮點(diǎn)數(shù)進(jìn)行運(yùn)算。浮點(diǎn)運(yùn)算模塊的流程圖如圖2 所示。規(guī)格化浮點(diǎn)數(shù)加減運(yùn)算流程圖如圖3
所示,規(guī)格化浮點(diǎn)數(shù)乘除運(yùn)算流程圖如圖4 所示。
結(jié)果輸出模塊:該模塊的功能是將浮點(diǎn)運(yùn)算的結(jié)果輸出至多功能EDA 實(shí)驗(yàn)臺相應(yīng)的發(fā)光二極管,以供觀測。
(3)VHDL 源代碼進(jìn)行綜合優(yōu)化處理。經(jīng)過上述分析后,用VHDL 語言對各個(gè)模塊進(jìn)行描述和實(shí)現(xiàn),最后對VHDL 源
代碼進(jìn)行綜合優(yōu)化處理。
(4)仿真與配置。設(shè)計(jì)的正確性可以通過仿真來驗(yàn)證。圖5 是浮點(diǎn)減法的時(shí)序仿真圖。圖5 中的信號定義如表1 所
示。其它各種運(yùn)算的時(shí)序仿真方法相同,在此不再描述。
綜合優(yōu)化處理后的VHDL程序經(jīng)仿真正確后再將生成的位流(bit)文件配置到到FPGA 的邏輯單元陣列,以定義器件
內(nèi)的邏輯功能塊和其互連的功能。
(5)下載驗(yàn)證。將步驟(4)得到的器件編程文件下載到目標(biāo)芯片中,進(jìn)行硬件的測試。浮點(diǎn)運(yùn)算的結(jié)果顯示在多功能
EDA實(shí)驗(yàn)臺相應(yīng)的發(fā)光二極管上,通過觀測,可以證實(shí)所設(shè)計(jì)的浮點(diǎn)運(yùn)算器是正確的。
基于原理圖方式
采用原理圖方式設(shè)計(jì)一個(gè)浮點(diǎn)運(yùn)算器,首先必須分析出運(yùn)算器的組成,然后使用基本的邏輯門和觸發(fā)器來實(shí)現(xiàn)。
根據(jù)前面的分析可知,浮點(diǎn)四則運(yùn)算比起定點(diǎn)運(yùn)算來要復(fù)雜一些。在浮點(diǎn)運(yùn)算中,階碼和尾數(shù)是分別進(jìn)行運(yùn)算的,并
且都是定點(diǎn)數(shù)(階碼為定點(diǎn)整數(shù),尾數(shù)為定點(diǎn)小數(shù))。因此,可以說,浮點(diǎn)運(yùn)算器是定點(diǎn)運(yùn)算器的擴(kuò)充和強(qiáng)化。一般浮點(diǎn)運(yùn)算器都至少具有兩個(gè)定點(diǎn)數(shù)邏輯運(yùn)算單元,一個(gè)用于階碼的比較和運(yùn)算,另一個(gè)用于尾數(shù)的運(yùn)算。從運(yùn)算器結(jié)構(gòu)來講,不但要有尾數(shù)運(yùn)算器,而且還要有階碼運(yùn)算器。階碼運(yùn)算器用來求階差、修改階碼等操作,一般只進(jìn)行加減運(yùn)算。而尾數(shù)部件不但有加法器用以求和,還應(yīng)有左移和右移線路,以實(shí)現(xiàn)對尾數(shù)的操作。
我們設(shè)計(jì)的浮點(diǎn)運(yùn)算器以尾數(shù)為8 位,階碼為4 位的浮點(diǎn)數(shù)為例,根據(jù)實(shí)驗(yàn)開發(fā)平臺資源,其組成如圖6 所示。
由于XILINX 公司FOUNDATION 3.1 軟件本身提供的器件相當(dāng)豐富,小到邏輯門,大到全加器,類型豐富,所以我們開
發(fā)軟件選用XILINX 公司的FOUNDATION 3.1。在FOUNDATION3.1 原理圖編輯環(huán)境中設(shè)計(jì)出如圖5 所示浮點(diǎn)運(yùn)算器的
具體原理電路,規(guī)定器件的輸入/輸出,并定義好相應(yīng)的網(wǎng)絡(luò)名稱和總線名稱。在整個(gè)浮點(diǎn)運(yùn)算器的設(shè)計(jì)過程中,核心部
件是加法器、移位寄存器和計(jì)數(shù)器。
計(jì)數(shù)器選擇Foundation3.1 的標(biāo)準(zhǔn)庫中CB4CLED(4-Bit Loadable Cascadable Bidirectional Binary Counter with Clock Enable and Asynchronous Clear)。移位寄存器選擇Foundation3.1的標(biāo)準(zhǔn)庫中SR8CLED(8-Bit Shift Register with Clock Enable and Asynchronous Clear)。
計(jì)數(shù)器開始工作后,根據(jù)相應(yīng)的計(jì)數(shù)器輸出信號,分別對移位寄存器進(jìn)行操作。當(dāng)功能選擇的是加法或減法時(shí),對階的結(jié)果是為了移位,在實(shí)現(xiàn)過程中,我們假定為浮點(diǎn)數(shù)1大于浮點(diǎn)數(shù)2,則對浮點(diǎn)數(shù)2 的尾數(shù)進(jìn)行右移。當(dāng)計(jì)數(shù)器中的階碼差減為0 時(shí),表示右移結(jié)束,接下去便是兩浮點(diǎn)數(shù)的尾數(shù)相加或相減。當(dāng)功能選擇的是乘法或除法時(shí),計(jì)數(shù)器的初始值是字長的值,在這里是8。開始計(jì)數(shù)過程前,乘法累計(jì)器被清零。計(jì)數(shù)開始后,乘法累加器、乘數(shù)寄存器和被乘數(shù)寄存器分別根據(jù)前面所說的定點(diǎn)數(shù)相乘所規(guī)定的操作進(jìn)行運(yùn)作。當(dāng)計(jì)數(shù)器計(jì)數(shù)結(jié)束后,乘法結(jié)果分別存放于乘法累加器(高8 位)和乘數(shù)寄存器中。
當(dāng)尾數(shù)計(jì)算和階碼計(jì)算都結(jié)束后,分別把結(jié)果的階碼、尾數(shù)和溢出標(biāo)志送往EDA 實(shí)驗(yàn)臺上的發(fā)光二極管。
與其它電路不同,浮點(diǎn)運(yùn)算器在實(shí)現(xiàn)過程中必須注意時(shí)序問題。時(shí)序仿真是考慮了各個(gè)門的時(shí)延,設(shè)計(jì)出相應(yīng)的邏輯。經(jīng)過仿真和測試,其方法同VHDL 語言方式,確認(rèn)相應(yīng)的邏輯正確無誤后,生成BIT 流文件,經(jīng)下載板下載到實(shí)驗(yàn)系統(tǒng)上。
結(jié)論
在計(jì)算機(jī)應(yīng)用、儀器儀表等領(lǐng)域的電子系統(tǒng)設(shè)計(jì)中,F(xiàn)PGA 技術(shù)的含量正以驚人的速度增加。浮點(diǎn)運(yùn)算器是現(xiàn)代計(jì)算機(jī)中一個(gè)重要組成部分,利用FPGA 技術(shù),能方便靈活地設(shè)計(jì)出浮點(diǎn)運(yùn)算器。
評論
查看更多