版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 計(jì)算機(jī)科學(xué)與工程學(xué)院</p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 題目全稱: 用硬件描述語言設(shè)計(jì)浮點(diǎn)乘法器(補(bǔ)碼一位乘法) </p><p> 課程名稱: 計(jì)算機(jī)組成原理 </p><p> 指導(dǎo)老師:
2、 職稱: </p><p><b> 指導(dǎo)老師評(píng)語:</b></p><p> 指導(dǎo)教師簽字: </p><p><b> 摘 要</b></p><p> 數(shù)字乘法器,作為現(xiàn)代計(jì)算機(jī)中必不可少的一部分,其設(shè)計(jì)工作越來越受到人們的重視
3、。本文采用硬件描述語言verilog HDL設(shè)計(jì)了一個(gè)基于補(bǔ)碼一位乘法的浮點(diǎn)乘法器,設(shè)計(jì)功能完善,靈活性較好。理論依據(jù)包括浮點(diǎn)運(yùn)算和補(bǔ)碼一位乘法運(yùn)算。本文對(duì)開發(fā)環(huán)境,測(cè)試環(huán)境做了簡(jiǎn)要介紹,并對(duì)設(shè)計(jì)過程進(jìn)行了詳細(xì)的描述分析,使用Modelsim軟件的Simulator模塊進(jìn)行了功能仿真。</p><p> 關(guān)鍵字:浮點(diǎn)運(yùn)算;補(bǔ)碼一位乘法;乘法器;verilog HDL</p><p>&l
4、t;b> Abstract</b></p><p> Digital multiplier,as an essential part of modern computer,its design has been paid more and more attention.In this paper,we use the hardware description language verilog
5、 HDL-based to design a complement of multiplication of floating-point multiplier whose function and flexibility are good.Theoretical basis includes floating-point operations and complement multiplication.In this paper,w
6、e introduce the environment of development and test briefly,and the design process is described in detail anal</p><p> Key words: floating-point operations; complement of multiplication; multiplier;</p&
7、gt;<p> verilog HDL</p><p><b> 目 錄</b></p><p> 第一章 引言4</p><p><b> 1.1課題背景4</b></p><p> 1.1.1應(yīng)用領(lǐng)域4</p><p> 1.1
8、.2國內(nèi)外研究現(xiàn)狀4</p><p> 1.2課題意義及價(jià)值5</p><p> 1.3 理論依據(jù)5</p><p> 1.3.1浮點(diǎn)運(yùn)算原理5</p><p> 1.3.2補(bǔ)碼一位乘法運(yùn)算原理6</p><p> 1.4課題的難點(diǎn)、重點(diǎn)、核心問題及方向9</p><p>
9、 1.5本組所做的工作9</p><p> 1.6主要內(nèi)容與章節(jié)安排9</p><p> 第二章 課題設(shè)計(jì)與實(shí)現(xiàn)11</p><p> 2.1開發(fā)工具簡(jiǎn)介11</p><p> 2.1.1 Verilog HDL硬件描述語言11</p><p> 2.1.2 Quartus II11<
10、;/p><p> 2.2需求分析與概要設(shè)計(jì)12</p><p> 2.3設(shè)計(jì)框架與流程圖13</p><p> 2.3.1設(shè)計(jì)框圖13</p><p> 2.3.2設(shè)計(jì)流程圖13</p><p> 2.4詳細(xì)設(shè)計(jì)16</p><p> 2.4.1補(bǔ)碼一位乘法模塊設(shè)計(jì)16<
11、;/p><p> 2.4.2規(guī)格化模塊設(shè)計(jì)19</p><p> 2.4.3控制模塊及加法模塊設(shè)計(jì)21</p><p> 2.4.3.1加法模塊設(shè)計(jì)21</p><p> 2.4.3.2控制模塊設(shè)計(jì)21</p><p> 第三章 仿真測(cè)試22</p><p> 3.1仿真
12、測(cè)試環(huán)境22</p><p> 3.2模塊仿真測(cè)試24</p><p> 3.2.1(補(bǔ)碼一位)乘法模塊仿真測(cè)試24</p><p> 3.2.2規(guī)格化模塊仿真測(cè)試25</p><p> 3.2.3加法模塊仿真測(cè)試27</p><p> 3.3總測(cè)試(控制模塊測(cè)試)29</p>&l
13、t;p> 第四章 總結(jié)與展望33</p><p> 4.1問題及解決方案總結(jié)33</p><p> 4.1.1乘法模塊編寫問題33</p><p> 4.1.2規(guī)格化模塊編寫問題33</p><p> 4.2結(jié)論及展望33</p><p><b> 參考文獻(xiàn)34</b
14、></p><p><b> 致 謝34</b></p><p> 第一章 引言</p><p><b> 1.1課題背景</b></p><p><b> 1.1.1應(yīng)用領(lǐng)域</b></p><p> 近三十年來,隨著數(shù)
15、字信號(hào)處理技術(shù)(DSP)的廣泛應(yīng)用和超大規(guī)模集成電路工藝的不斷進(jìn)步,數(shù)字乘法器的設(shè)計(jì)越來越受到人們的重視。該技術(shù)是上世紀(jì)60年代發(fā)展起來的一門新興學(xué)科,當(dāng)時(shí)主要采用計(jì)算機(jī)模擬的方法研究數(shù)字濾波器,現(xiàn)在已經(jīng)廣泛用于需要對(duì)信號(hào)進(jìn)行譜分析、濾波、壓縮的眾多學(xué)科和工程領(lǐng)域。</p><p> 1.1.2國內(nèi)外研究現(xiàn)狀</p><p> 當(dāng)今數(shù)字信號(hào)處理技術(shù)領(lǐng)域里較好,運(yùn)用較為廣泛的帶符號(hào)數(shù)乘法
16、的算法本文列出三個(gè):上世紀(jì)50年代,VLSI技術(shù)發(fā)展出的由門陣列和二維加法器陣列組成的陣列乘法器;之后是由A.D.Booth在1951年提出的Booth算法,十年后由MacSorely提出了修正之后的Booth算法,并一直廣泛運(yùn)用至今;再有就是1977年由Ron Rivest、Adi Shamirh和LenAdleman開發(fā)的當(dāng)今通信領(lǐng)域廣發(fā)運(yùn)用的加密算法之一的RSA算法,其主要涉及到的計(jì)算為:</p><p>
17、<b> (1)</b></p><p> 下面簡(jiǎn)要介紹一下上文提到過的三種算法:</p><p> 陣列乘法器:早期計(jì)算機(jī)中為了簡(jiǎn)化硬件結(jié)構(gòu),采用串行的1位乘法方案,即反復(fù)執(zhí)行“加法-移位”操作來實(shí)現(xiàn),這種方法并不需要很多的器件。而陣列乘法器的出現(xiàn)就是為了解決這種因串行執(zhí)行方式而消耗大量時(shí)間的問題,所以自從大規(guī)模集成電路問世以來,出現(xiàn)了各種形式的流水式陣列乘法
18、器,它們屬于并行乘法器。帶符號(hào)數(shù)的陣列乘法器在邏輯結(jié)構(gòu)中,由兩個(gè)求補(bǔ)器作無符號(hào)數(shù)乘法處理,和一個(gè)算后求補(bǔ)器作符號(hào)位處理。</p><p> RSA算法:它主要涉及公式(1)的計(jì)算,而用反復(fù)平方法可使上述計(jì)算時(shí)間只與log2(e)線性相關(guān)。在超大規(guī)模集成電路的發(fā)展中,高速、低功耗、版圖設(shè)計(jì)規(guī)則、占用芯片面積小等成為乘法器研究的重點(diǎn)。</p><p> Booth算法:它采用相加和相減的操
19、作計(jì)算補(bǔ)碼數(shù)據(jù)的乘積。Booth算法對(duì)乘數(shù)從低位開始判斷,根據(jù)兩個(gè)數(shù)據(jù)位的情況決定進(jìn)行加法、減法還是僅僅移位操作。判斷的兩個(gè)數(shù)據(jù)位為當(dāng)前位及其右邊的位(初始時(shí)需要增加一個(gè)輔助位0),移位操作是向右移動(dòng)。其核心思想是通過對(duì)乘數(shù)編碼,壓縮部分積個(gè)數(shù),進(jìn)而縮短乘法運(yùn)算的時(shí)間,而修正后的Booth算法將部分積的個(gè)數(shù)壓縮至原來的1/2左右,且與乘數(shù)無關(guān)。本次課程設(shè)計(jì)所選用的設(shè)計(jì)算法就是Booth算法,所以會(huì)在正文中作詳細(xì)的說明。</p>
20、;<p> 1.2課題意義及價(jià)值</p><p> 乘法運(yùn)算在數(shù)字信號(hào)處理算法中占有重要地位。因?yàn)樵跀?shù)字信號(hào)處理中存在著大量形如Y=AX+B的運(yùn)算,即兩個(gè)數(shù)相乘后與另一個(gè)數(shù)相加,而且這種運(yùn)算往往是反復(fù)進(jìn)行的。因此,研究硬件乘法器是實(shí)時(shí)數(shù)字信號(hào)處理器中乘法實(shí)現(xiàn)的需要。自數(shù)字信號(hào)處理技術(shù)誕生之日起,實(shí)時(shí)處理就是人們奮斗不懈的目標(biāo)。實(shí)時(shí)處理的實(shí)現(xiàn),一方面在于采用先進(jìn)算法降低運(yùn)算量,另一方面在于提高硬件
21、運(yùn)算的速度。根據(jù)查閱資料并顯示,假設(shè)每條基本指令按1us計(jì)算(乘除指令除外),軟件執(zhí)行完成一次4位×4位(2二進(jìn)制)的乘法需要約100us,協(xié)處理器(如8087),執(zhí)行定點(diǎn)和浮點(diǎn)乘法運(yùn)算需要20us,而硬件乘法器作為專用運(yùn)算單元,可以在幾十ns內(nèi)完成一次浮點(diǎn)乘法運(yùn)算。由此可見,乘法的硬件實(shí)現(xiàn)對(duì)于提升DSP系統(tǒng)性能有重要意義。目前再來看一組數(shù)據(jù),“目前,嵌入式設(shè)計(jì)中約有38%已經(jīng)采用了DSP芯片代替?zhèn)鹘y(tǒng)的MCU芯片,以制造具有更
22、高性能的產(chǎn)品;另外約有49%正計(jì)劃采用(Fig1.7)。全國DSP市場(chǎng)的年增長率超過30%,是集成電路平均增長速度的兩倍(Fig1.8)?!庇缮峡梢钥闯?,數(shù)字乘法器的技術(shù)發(fā)展推動(dòng)著DSP的發(fā)展。</p><p> 研究本課題,于組內(nèi)成員而言的意義在于,通過查閱相關(guān)的資料,能使我們進(jìn)一步透徹的掌握補(bǔ)碼一位乘法的計(jì)算原理,分析乘法的計(jì)算過程及整個(gè)運(yùn)算中涉及到的各模塊的工作原理。本課題實(shí)現(xiàn)的是浮點(diǎn)一位乘法運(yùn)算,這是一
23、個(gè)從簡(jiǎn)到繁的過程,對(duì)以后涉及多位乘法器打下了好的基礎(chǔ)。此外,本課程設(shè)計(jì)還是我們學(xué)習(xí)、熟悉了新的一種硬件編程語言Verilog HDL。</p><p><b> 1.3 理論依據(jù)</b></p><p> 1.3.1浮點(diǎn)運(yùn)算原理</p><p><b> 設(shè)浮點(diǎn)數(shù)A=,則</b></p><p&g
24、t; 即階碼相加,尾數(shù)相乘。其運(yùn)算可按以下步驟進(jìn)行。</p><p> ?、?檢測(cè)能否簡(jiǎn)化操作,并置結(jié)果數(shù)符。如果操作數(shù)中有一個(gè)為0,乘積必為0,不需做其他操作。如果兩數(shù)均不為0,才進(jìn)行乘法運(yùn)算。結(jié)果數(shù)符按同號(hào)相乘為正、異號(hào)相乘為負(fù)的規(guī)則確定。</p><p> ② 階碼相加。如果階碼用補(bǔ)碼表示,則階碼相加可按常規(guī)補(bǔ)碼加法進(jìn)行。如果階碼用移碼(增碼)表示,由于階碼本身已有一個(gè)偏移量,相
25、加后偏移量將加倍,所以移碼相加后應(yīng)作修正(即減去)。階碼相加有可能產(chǎn)生溢出,同號(hào)相加可能上溢(正階碼),也可能下溢(負(fù)階碼)。當(dāng)產(chǎn)生溢出時(shí),浮點(diǎn)運(yùn)算器將發(fā)出溢出信號(hào),使機(jī)器轉(zhuǎn)入溢出處理。</p><p> ?、?尾數(shù)相乘,可以用任何一種定點(diǎn)小數(shù)乘法實(shí)現(xiàn)。可見浮點(diǎn)數(shù)乘法包含兩組定點(diǎn)運(yùn)算,即定點(diǎn)整數(shù)的階碼運(yùn)算與定點(diǎn)小數(shù)的尾數(shù)運(yùn)算。這兩組運(yùn)算可以共用一個(gè)加法器,分步執(zhí)行;也可以在常規(guī)加法器的基礎(chǔ)上再設(shè)置一個(gè)專門的階碼加
26、法器,并行執(zhí)行,以提高運(yùn)算速度。</p><p> ?、?乘積規(guī)格化。尾數(shù)相乘后,可能需要左規(guī)。由于尾數(shù)是定點(diǎn)小數(shù),相乘后不會(huì)出現(xiàn)需右規(guī)的情況。左規(guī)時(shí)階碼減1,有下溢的可能。</p><p> 1.3.2補(bǔ)碼一位乘法運(yùn)算原理</p><p> 補(bǔ)碼乘法是指操作數(shù)與結(jié)果均以補(bǔ)碼表示,連同符號(hào)位一起,按相應(yīng)算法運(yùn)算。實(shí)現(xiàn)補(bǔ)碼乘法有兩種方法。一種是先按原碼乘法那樣直接
27、乘,再根據(jù)乘數(shù)符號(hào)進(jìn)行校。其算法規(guī)則如下:</p><p> 1)、不管被乘數(shù)X補(bǔ)的符號(hào)如何,只要乘數(shù)Y補(bǔ)為正,則可像原碼乘法一樣進(jìn)行運(yùn)算,其結(jié)果不需要校正。</p><p> 2)、如果乘數(shù)Y補(bǔ)為負(fù),則先按原碼乘法運(yùn)算,結(jié)果再加一個(gè)校正量-X補(bǔ)。這種算法稱為校正法。</p><p> 另一種方法是將校正法的兩種情況統(tǒng)一起來,演變?yōu)楸容^法。由于它是Booth夫
28、婦首先提出的,所以又稱為Booth算法。這是現(xiàn)在廣泛采用的補(bǔ)碼乘法,如果不加說明,一般所指的補(bǔ)碼算法就是比較法。</p><p><b> ?。?)比較算法分析</b></p><p> 補(bǔ)碼一位乘比較法可用下式表示:</p><p> (1)式(1)概括了校正法的兩種情況:如果乘數(shù)為正,即,Y的尾數(shù)乘以被乘數(shù)(X)補(bǔ),不需校正。若乘數(shù)為
29、負(fù),即,則(X)補(bǔ)乘以(Y)補(bǔ)的尾數(shù)后,再減(X)補(bǔ)校正。</p><p><b> 將式(1)改寫為:</b></p><p><b> ?。?)</b></p><p> 在機(jī)器實(shí)現(xiàn)中可在末位Yn之后再增設(shè)一個(gè)附加位Yn+1,其初始值為0,對(duì)乘數(shù)Y的值并無影響。若定義(A0)補(bǔ)為初始部分積,[A1]補(bǔ)-[An]補(bǔ)依
30、次為各步求得累加并右移后的部分積,則式(2)改寫為如下遞推公式,它更接近于乘法的分步運(yùn)算形式。</p><p> ?。?) </p><p> 式(3)表明了補(bǔ)碼一位乘法的基本操作:被乘數(shù)X補(bǔ)乘以對(duì)應(yīng)的相鄰兩位乘數(shù)之差值,再與原部分積累加,然后右移一位,形成該步的部分積累加和。由于根據(jù)相鄰兩位乘數(shù)之差(低位減高位),即兩位的比較結(jié)果來決定相應(yīng)操作,所以稱為比較法。
31、因?yàn)槊坎揭乙?位,所以參與比較的兩位始終位于最末的Yn、Yn+1,可根據(jù)這兩位的值決定操作,規(guī)則如表1-1所示。</p><p> 表1-1 補(bǔ)碼一位乘規(guī)則</p><p><b> ?。?)運(yùn)算實(shí)例</b></p><p> X=-0.1101,Y=-0.1011,求(XY)補(bǔ)。初值:A=00.0000,B=X補(bǔ)=11.0011,
32、 -B=(-X)補(bǔ)=00.1101,C =Y補(bǔ)=1.0101</p><p> 圖1-1 補(bǔ)碼一位乘實(shí)例</p><p> 本例以分步算式的形式表明了補(bǔ)碼一位乘法的運(yùn)算過程,下面再對(duì)有關(guān)要點(diǎn)進(jìn)行說明。</p><p><b> 1、初始值和符號(hào)位</b></p><p> A寄存器用來存放部分積累加和,初
33、始值為0 ,采取雙符號(hào)位。累加時(shí)可能產(chǎn)生的進(jìn)位暫存于第二符號(hào)位,第一符號(hào)位始終指示部分積累加和的正負(fù),以控制右移時(shí)補(bǔ)0或補(bǔ)1.補(bǔ)碼乘法中有加或減,相應(yīng)地,部分積可能有正有負(fù),這就需要第一符號(hào)位保持正負(fù)標(biāo)志。</p><p> B寄存器中存放補(bǔ)碼表示的被乘數(shù)X補(bǔ),雙符號(hào)為(與A相對(duì)應(yīng))。補(bǔ)碼一位乘的基本操作有A+B和A-B,所以在算式中先寫X補(bǔ)(B)和-X補(bǔ)(-B)的值。</p><p>
34、 C寄存器存放補(bǔ)碼表示的乘數(shù)Y補(bǔ)。取單符號(hào)位,以控制最后一步操作,該步操作體現(xiàn)了乘數(shù)正負(fù)的影響。Y的末位添0,稱為附加位。</p><p><b> 2、基本操作</b></p><p> 用C寄存器最末兩位(含增加的)作判斷位,按前述規(guī)則決定各步操作。如第一步,判斷位為10,低位減高位得-1,所以執(zhí)行A-B,然后右移一位。又如第二步,判斷位為01,低位減高位得
35、1,執(zhí)行A+B。</p><p> 每步加/減后讓A與C右移一位,而每次是相鄰兩位乘數(shù)比較,所以除去C的符號(hào)位和增加的末位0以外,各乘數(shù)位將參加兩次比較。注意,現(xiàn)在討論的是補(bǔ)碼一位乘,比較兩位只相當(dāng)于處理一位乘數(shù),不可誤認(rèn)為兩位乘。</p><p><b> 3、移位</b></p><p> 在右移時(shí),第二符號(hào)位值移入尾數(shù)的最高數(shù)位,第
36、一符號(hào)位值移入第二符號(hào)位。第一符號(hào)位本身不變,而A寄存器末位移入C寄存器。</p><p> 4、步數(shù)與最后一步操作</p><p> 如上例,乘數(shù)的有效位數(shù)是4位,共做5步。除C0與Cn+1位外,有效尾數(shù)中各位均參與兩次比較。注意,最后一位不移位,因?yàn)檫@一步是用來處理符號(hào)位的,按式(3),這一步不再移位。</p><p> 1.4課題的難點(diǎn)、重點(diǎn)、核心問題及
37、方向</p><p> 根據(jù)本課程設(shè)計(jì)的基本思路,課題最核心的問題在于補(bǔ)碼一位乘法模塊的設(shè)計(jì),同時(shí),這也是本課題設(shè)計(jì)的重點(diǎn)與難點(diǎn)。本課題的方向?yàn)椋垢↑c(diǎn)乘法器靈活實(shí)現(xiàn)各位數(shù)級(jí)(4位,8位,16位等)上的浮點(diǎn)乘法運(yùn)算。</p><p> 1.5本組所做的工作</p><p> 本組采用硬件描述語言設(shè)計(jì),實(shí)現(xiàn)一個(gè)基于補(bǔ)碼一位乘法的浮點(diǎn)乘法器,包括加法器,補(bǔ)碼一位乘
38、法器,規(guī)格化程序等子設(shè)計(jì)。本組所做的工作包括,對(duì)浮點(diǎn)運(yùn)算,補(bǔ)碼一位乘法運(yùn)算原理的分析,編碼實(shí)現(xiàn)浮點(diǎn)乘法器,編寫測(cè)試代碼對(duì)浮點(diǎn)乘法器進(jìn)行仿真測(cè)試。最后是將設(shè)計(jì)原理,設(shè)計(jì)框圖,設(shè)計(jì)代碼及測(cè)試代碼,以及對(duì)設(shè)計(jì)的背景與意義,總結(jié)與分析編輯,整理,撰寫成課程設(shè)計(jì)論文。</p><p> 1.6主要內(nèi)容與章節(jié)安排</p><p> 本文第二章介紹了課題的設(shè)計(jì)與實(shí)現(xiàn)過程,包括概要設(shè)計(jì)與詳細(xì)設(shè)計(jì)兩部分
39、,涵蓋了設(shè)計(jì)思想,邏輯框圖,流程圖以及程序源代碼等。第三章介紹的是對(duì)本設(shè)計(jì)所做的測(cè)試工作,包括對(duì)測(cè)試環(huán)境的介紹,以及各模塊測(cè)試和總體測(cè)試的測(cè)試用例、測(cè)試依據(jù)等的介紹。第四章主要是對(duì)代碼編寫與測(cè)試過程中遇到的問題及其解決方案的介紹,最后是對(duì)工作的總結(jié)和未來的展望。</p><p> 第二章 課題設(shè)計(jì)與實(shí)現(xiàn)</p><p><b> 2.1開發(fā)工具簡(jiǎn)介</b>&
40、lt;/p><p> 2.1.1 Verilog HDL硬件描述語言</p><p> Verilog HDL是一種硬件描述語言,用于從算法級(jí)、門級(jí)到開關(guān)級(jí)的多種抽象設(shè)計(jì)層次的數(shù)字系統(tǒng)建模。被建模的數(shù)字系統(tǒng)對(duì)象的復(fù)雜性可以介于簡(jiǎn)單的門和完整的電子數(shù)字系統(tǒng)之間。數(shù)字系統(tǒng)能夠按層次描述,并可在相同描述中顯式地進(jìn)行時(shí)序建模。</p><p> Verilog HDL語言
41、最初是于1983年由Gateway Design Automation公司為其模擬器產(chǎn)品開發(fā)的硬件建模語言。那時(shí)它只是一種專用語言。由于他們的模擬、仿真器產(chǎn)品的廣泛使用,Verilog HDL 作為一種便于使用且實(shí)用的語言逐漸為眾多設(shè)計(jì)者所接受。在一次努力增加語言普及性的活動(dòng)中,Verilog HDL語言于1990年被推向公眾領(lǐng)域。 Open Verilog International (OVI)是促進(jìn)Verilog發(fā)展的國際性組織。1
42、992年, OVI決定致力于推廣Verilog OVI標(biāo)準(zhǔn)成為IEEE標(biāo)準(zhǔn)。這一努力最后獲得成功,Verilog 語言于1995年成為IEEE標(biāo)準(zhǔn),稱為IEEE Std 1364-1995。完整的標(biāo)準(zhǔn)在Verilog硬件描述語言參考手冊(cè)中有詳細(xì)描述。</p><p> Verilog HDL 語言具有下述描述能力:設(shè)計(jì)的行為特性、設(shè)計(jì)的數(shù)據(jù)流特性、設(shè)計(jì)的結(jié)構(gòu)組成以及包含響應(yīng)監(jiān)控和設(shè)計(jì)驗(yàn)證方面的時(shí)延和波形產(chǎn)生機(jī)制
43、。所有這些都使用同一種建模語言。此外,Verilog HDL語言提供了編程語言接口,通過該接口可以在模擬、驗(yàn)證期間從設(shè)計(jì)外部訪問設(shè)計(jì),包括模擬的具體控制和運(yùn)行。</p><p> Verilog HDL語言不僅定義了語法,而且對(duì)每個(gè)語法結(jié)構(gòu)都定義了清晰的模擬、仿真語義。因此,用這種語言編寫的模型能夠使用Verilog仿真器進(jìn)行驗(yàn)證。語言從C編程語言中繼承了多種操作符和結(jié)構(gòu)。Verilog HDL提供了擴(kuò)展的建模
44、能力,其中許多擴(kuò)展最初很難理解。但是,Verilog HDL語言的核心子集非常易于學(xué)習(xí)和使用,這對(duì)大多數(shù)建模應(yīng)用來說已經(jīng)足夠。當(dāng)然,完整的硬件描述語言足以對(duì)從最復(fù)雜的芯片到完整的電子系統(tǒng)進(jìn)行描述。 </p><p> 2.1.2 Quartus II</p><p> Quartus II 是Altera公司的綜合性PLD開發(fā)軟件,支持原理圖、VHDL、Verilog HDL以及AHD
45、L(Altera Hardware Description Language)等多種設(shè)計(jì)輸入形式,內(nèi)嵌自有的綜合器以及仿真器,可以完成從設(shè)計(jì)輸入到硬件配置的完整PLD設(shè)計(jì)流程。</p><p> Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl腳本完成設(shè)計(jì)流程外,提供了完善的用戶圖形界面設(shè)計(jì)方式。具有運(yùn)行速度快,界面統(tǒng)一,功能集中,易學(xué)易用等特點(diǎn)。</p><
46、p> Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡(jiǎn)化了設(shè)計(jì)的復(fù)雜性、加快了設(shè)計(jì)速度。對(duì)第三方EDA工具的良好支持也使用戶可以在設(shè)計(jì)流程的各個(gè)階段使用熟悉的第三方EDA工具。</p><p> 此外,Quartus II 通過和DSP Builder工具與Matlab/Simulink相結(jié)合,可以方便地實(shí)現(xiàn)各種DSP應(yīng)用
47、系統(tǒng);支持Altera的片上可編程系統(tǒng)(SOPC)開發(fā),集系統(tǒng)級(jí)設(shè)計(jì)、嵌入式軟件開發(fā)、可編程邏輯設(shè)計(jì)于一體,是一種綜合性的開發(fā)平臺(tái)。</p><p> Maxplus II 作為Altera的上一代PLD設(shè)計(jì)軟件,由于其出色的易用性而得到了廣泛的應(yīng)用。目前Altera已經(jīng)停止了對(duì)Maxplus II 的更新支持,Quartus II 與之相比不僅僅是支持器件類型的豐富和圖形界面的改變。Altera在Quartu
48、s II 中包含了許多諸如SignalTap II、Chip Editor和RTL Viewer的設(shè)計(jì)輔助工具,集成了SOPC和HardCopy設(shè)計(jì)流程,并且繼承了Maxplus II 友好的圖形界面及簡(jiǎn)便的使用方法。</p><p> 2.2需求分析與概要設(shè)計(jì)</p><p> 本課題實(shí)現(xiàn)的是基于補(bǔ)碼一位乘法的浮點(diǎn)乘法器。輸入輸出情況如下:</p><p>
49、 輸入:待進(jìn)行乘法運(yùn)算的兩個(gè)浮點(diǎn)數(shù)的尾數(shù)和階碼(階底默認(rèn)為2)。</p><p> 輸出:運(yùn)算結(jié)果的尾數(shù)與階碼。</p><p> 基于以上的輸入輸出條件,設(shè)計(jì)一個(gè)加法模塊進(jìn)行階碼運(yùn)算,一個(gè)補(bǔ)碼一位乘法模塊進(jìn)行尾數(shù)運(yùn)算。此外,考慮浮點(diǎn)運(yùn)算的規(guī)格化問題,最終輸出結(jié)果,尾數(shù)應(yīng)該為大于1/2,小于1的數(shù),且乘法運(yùn)算結(jié)果可能存在溢出位需要處理,故還須設(shè)計(jì)一個(gè)規(guī)格化模塊。最后設(shè)計(jì)一個(gè)控制模塊,驅(qū)
50、動(dòng)三個(gè)模塊完成工作。</p><p> 基本運(yùn)算過程為:先后調(diào)用加法模塊計(jì)算階碼相加結(jié)果,乘法模塊計(jì)算尾數(shù)相乘結(jié)果,再調(diào)用規(guī)格化模塊對(duì)前兩個(gè)模塊得到的結(jié)果進(jìn)行規(guī)格化,最后輸出階碼與尾數(shù)結(jié)果。</p><p> 各模塊的輸入輸出設(shè)計(jì)如下:</p><p> module adder(EX,EY,EOUT);//階碼加法模塊</p><p>
51、; module multiply(Mx,My,Mout);//補(bǔ)碼一位乘法模塊</p><p> module SPEC( EIn,MIn,EOut,MOut);//規(guī)格化模塊</p><p> module run(Mx,My,E_X,E_Y,M_out,E_out);//運(yùn)行控制模塊</p><p> 2.3設(shè)計(jì)框架與流程圖</p>
52、<p><b> 2.3.1設(shè)計(jì)框圖</b></p><p><b> 圖2-1 設(shè)計(jì)框圖</b></p><p> 依照概要設(shè)計(jì)方案,使用Quartus II工具生成邏輯框圖,如圖2-1所示。其中u1為加法模塊,四位的E_X,E_Y為兩個(gè)階碼輸入,四位EOUT為階碼輸出。u2為乘法模塊,六位的Mx,My(高兩位設(shè)計(jì)為符號(hào)位)為兩
53、個(gè)尾數(shù)輸入,Mout為尾數(shù)輸出。U3為規(guī)格化模塊,4位的EIn為階碼輸入,MIn為尾數(shù)輸入,EOut和MOut分別為階碼與尾數(shù)輸出。</p><p> 2.3.2設(shè)計(jì)流程圖</p><p> 圖2-2 設(shè)計(jì)流程圖</p><p> 本流程圖左側(cè)為階碼處理模塊,右側(cè)為尾數(shù)處理模塊。階碼處理模塊將輸入的階碼相加后輸出至下一個(gè)模塊,尾數(shù)處理模塊進(jìn)行n次循環(huán)移位(n為
54、乘數(shù)的尾數(shù)小數(shù)點(diǎn)后的位數(shù)),再進(jìn)行一次判斷決定是否加(減)一次被乘數(shù)。隨后將尾數(shù)結(jié)果輸出至下一個(gè)模塊。規(guī)格化模塊接收到上兩個(gè)模塊的階碼,尾數(shù)結(jié)果后進(jìn)行溢出判斷,大小判斷,將規(guī)格化結(jié)果輸出,作為最終結(jié)果。</p><p><b> 2.4詳細(xì)設(shè)計(jì)</b></p><p> 2.4.1補(bǔ)碼一位乘法模塊設(shè)計(jì)</p><p> 設(shè)計(jì)思想:程序首先
55、進(jìn)行判0操作,如果乘數(shù)中有一個(gè)或兩個(gè)為0,則直接輸出結(jié)果0,否則進(jìn)入程序主體。程序主體分成三個(gè)判斷模塊進(jìn)行,當(dāng)乘數(shù)最低位與次低位值相等時(shí),先將乘數(shù)右移一位,再將原部分累加和右移一位至乘數(shù)最高位,同時(shí)部分積累加和的最高位根據(jù)次高位正負(fù)補(bǔ)0或1;如果乘數(shù)最低位與次低位分別為1,0時(shí),將原部分累加和加上被乘數(shù)X補(bǔ)后,再右移一位至乘數(shù)最高位,同時(shí)部分積累加和的最高位根據(jù)次高位正負(fù)補(bǔ)0或1;如果乘數(shù)最低位與次低位分別為0,1時(shí),將原部分累加和減去
56、被乘數(shù)X補(bǔ)后,再右移一位至乘數(shù)最高位,同時(shí)部分積累加和的最高位根據(jù)次高位正負(fù)補(bǔ)0或1。每次比較一次乘數(shù)的最末兩位,進(jìn)行相應(yīng)運(yùn)算后,共循環(huán)4次。循環(huán)結(jié)束后,再進(jìn)行一次判斷,如果乘數(shù)最低位與次低位分別為1、0,將原部分累加和加上被乘數(shù)X補(bǔ)。如果乘數(shù)最低位與次低位分別為0、1,將原部分累加和減去被乘數(shù)X補(bǔ)。此時(shí),最終累加和就是乘積的高位結(jié)果,取乘數(shù)的高四位作為低位結(jié)果,拼接即為最終乘法結(jié)果。</p><p><b
57、> 代碼如下:</b></p><p> module multiply(Mx,My,Mout);//補(bǔ)碼一位乘法模塊</p><p> input[5:0]Mx,My;//定義六位的尾數(shù)輸入,其中前兩位為符號(hào)位。</p><p> output reg[9:0]Mout;//定義九位的尾數(shù)輸出,其中前兩位為符號(hào)位。</p>
58、<p> reg[5:0] a;//a寄存器存放部分積累加和</p><p> reg[5:0] b,c;//b寄存器存放補(bǔ)碼表示的被乘數(shù),c寄存器存放補(bǔ)碼表示的乘數(shù)</p><p> reg[3:0] n;//n作為臨時(shí)變量,用來存放循環(huán)次數(shù)</p><p> reg p,q;//p用于負(fù)數(shù)移位補(bǔ)1操作,q用于存放添加的Cn+1</p
59、><p> always @ (Mx,My)</p><p><b> begin</b></p><p> if((Mx==0)||(My==0))</p><p><b> Mout=0;</b></p><p><b> else</b>&l
60、t;/p><p><b> begin </b></p><p> a=6'b000000; </p><p> n=4'b1111;</p><p><b> p=1'b1;</b></p><p><b> q=1'b0
61、;</b></p><p><b> b=Mx;</b></p><p><b> c=My;</b></p><p> c={c[4:0],q};</p><p><b> while(n)</b></p><p><b>
62、; begin</b></p><p><b> n=n>>1;</b></p><p> if(((c[0]==0)&&(c[1]==0))||((c[0]==1)&&(c[1]==1)))//如果Cn+1和Cn同為0或1,則只進(jìn)行移位</p><p><b> beg
63、in</b></p><p><b> c=c/2;</b></p><p> c[5]=a[0];</p><p><b> a=a/2;</b></p><p> if(a[4]==1)</p><p> a={p,a[4:0]};</p>
64、;<p><b> else</b></p><p><b> a=a;</b></p><p><b> end</b></p><p> else if((c[0]==1)&&(c[1]==0))//如果Cn=0,Cn+1=1,則先加上被乘數(shù)的補(bǔ)碼,再移位&l
65、t;/p><p><b> begin</b></p><p><b> a=a+b;</b></p><p><b> c=c/2;</b></p><p> c[5]=a[0];</p><p><b> a=a/2;</b&g
66、t;</p><p> if(a[4]==1)</p><p> a={p,a[4:0]};</p><p><b> else</b></p><p><b> a=a;</b></p><p><b> end </b></p
67、><p> else if((c[0]==0)&&(c[1]==1))//如果Cn=1,Cn+1=0,則先減去被乘數(shù)的補(bǔ)碼,再移位</p><p><b> begin</b></p><p><b> a=a-b;</b></p><p><b> c=c/2;<
68、;/b></p><p> c[5]=a[0];</p><p><b> a=a/2;</b></p><p> if(a[4]==1)</p><p> a={p,a[4:0]};</p><p><b> else</b></p><
69、p><b> a=a;</b></p><p><b> end</b></p><p><b> end</b></p><p> //四次循環(huán)后,進(jìn)行最后一步,此步不移位,用來處理符號(hào)位</p><p> if((c[0]==1)&&(c[1
70、]==0))</p><p><b> begin</b></p><p><b> a=a+b;</b></p><p><b> end</b></p><p> else if((c[0]==0)&&(c[1]==1))</p>&l
71、t;p><b> begin</b></p><p><b> a=a-b;</b></p><p><b> end</b></p><p> Mout={a,c[5:2]};</p><p><b> end </b></p>
72、;<p><b> end</b></p><p><b> endmodule</b></p><p> 2.4.2規(guī)格化模塊設(shè)計(jì)</p><p> 設(shè)計(jì)思想:當(dāng)雙符號(hào)位為00時(shí),說明沒有產(chǎn)生溢出,原尾數(shù)為正值,此時(shí)若尾數(shù)最高位數(shù)值為0,說明其絕對(duì)值小于1/2,應(yīng)該進(jìn)行左移規(guī)格化,尾數(shù)左移,階碼減1
73、。其他情況尾數(shù)和階碼均不改變,按原值輸出;</p><p> 當(dāng)雙符號(hào)位為01時(shí),產(chǎn)生正溢,說明由于尾數(shù)最高位數(shù)值相加產(chǎn)生進(jìn)位進(jìn)而產(chǎn)生溢出,使得尾數(shù)絕對(duì)值大于1,應(yīng)該進(jìn)行右移規(guī)格化,尾數(shù)右移1位,階碼加1。其他情況尾數(shù)和階碼均不改變,按原值輸出;</p><p> 當(dāng)雙符號(hào)位為11時(shí),說明沒有產(chǎn)生溢出,原尾數(shù)為負(fù)值,此時(shí)若尾數(shù)最高位數(shù)值為1,說明其絕對(duì)值小于1/2,應(yīng)該進(jìn)行左移規(guī)格化,
74、尾數(shù)左移,階碼減1。其他情況尾數(shù)和階碼均不改變,按原值輸出;</p><p> 當(dāng)雙符號(hào)位為10時(shí),產(chǎn)生負(fù)溢,說明由于尾數(shù)最高位數(shù)值相加產(chǎn)生進(jìn)位進(jìn)而產(chǎn)生溢出,使得尾數(shù)絕對(duì)值大于1,應(yīng)該進(jìn)行右移規(guī)格化,尾數(shù)右移1位,階碼加1.其他情況尾數(shù)和階碼均不改變,按原值輸出;</p><p> 其他雙符號(hào)位及尾數(shù)最高數(shù)值位情況下,不進(jìn)行規(guī)格化,按原值進(jìn)行輸出。</p><p&g
75、t;<b> 代碼如下:</b></p><p> module SPEC( EIn,MIn,EOut,MOut);</p><p> input [3:0] EIn; //規(guī)格化之前的階數(shù)</p><p> input [9:0] MIn; //規(guī)格化之前的尾數(shù)</p><p> output
76、 [3:0] EOut; //規(guī)格化之后的階數(shù)</p><p> output [9:0] MOut; //規(guī)格化之后的尾數(shù)</p><p> reg p;//臨時(shí)變量p,用于補(bǔ)充溢出處理補(bǔ)0操作。</p><p> reg q; /臨時(shí)變量q,用于補(bǔ)充溢出處理補(bǔ)1操作。</p><p> reg[3:0] t
77、mp1;//臨時(shí)變量tmp1,用于運(yùn)算、存儲(chǔ)階碼</p><p> reg[9:0] tmp2;//臨時(shí)變量tmp2,用于運(yùn)算、存儲(chǔ)尾數(shù)</p><p> always @ (EIn or MIn)</p><p><b> begin </b></p><p><b> p=1'b0;&l
78、t;/b></p><p> q=1'b1; </p><p> if(MIn[9:8]==2'b01)</p><p> //有正溢情況下應(yīng)右移,相應(yīng)階數(shù)加1</p><p><b> begin</b></p><p> tmp2={p,MIn[9
79、:1]};</p><p> tmp1=EIn+1;</p><p><b> end</b></p><p> else if(MIn[9:8]==2'b10)</p><p><b> begin</b></p><p> tmp2={q,MIn[9:1
80、]};</p><p> tmp1=EIn+1;</p><p><b> end</b></p><p> else if((MIn[9:8]==2'b00&&MIn[7]==0)||(MIn[9:8]==2'b11&&MIn[7]==1))</p><p> /
81、/無溢出情況下,若尾數(shù)絕對(duì)值小于1/2均應(yīng)左移,相應(yīng)階數(shù)減1</p><p><b> begin</b></p><p> tmp2={MIn[9:8],MIn[6:0],p};</p><p> tmp1=EIn-1;</p><p><b> end</b></p>&l
82、t;p><b> else</b></p><p><b> begin</b></p><p><b> tmp2=MIn;</b></p><p><b> tmp1=EIn;</b></p><p><b> end<
83、/b></p><p> //輸出最終結(jié)果的規(guī)格化后的尾數(shù)和階數(shù)</p><p><b> end</b></p><p> assign EOut=tmp1;</p><p> assign MOut=tmp2;</p><p><b> endmodule</b
84、></p><p> 2.4.3控制模塊及加法模塊設(shè)計(jì)</p><p> 2.4.3.1加法模塊設(shè)計(jì)</p><p> 設(shè)計(jì)思想:輸入兩個(gè)線網(wǎng)型變量的階碼,采用電平觸發(fā)的always語句相加后輸出結(jié)果。</p><p> module adder(EX,EY,EOUT);//加法模塊,實(shí)現(xiàn)階碼相加</p><
85、p> input [3:0] EX,EY;//輸入兩個(gè)階碼</p><p> output reg[3:0] EOUT;//輸出階碼</p><p> always @ (EX or EY or EOUT)</p><p> EOUT<=EX+EY;</p><p><b> endmodule</b&g
86、t;</p><p> 2.4.3.2控制模塊設(shè)計(jì)</p><p> 設(shè)計(jì)思想:將待進(jìn)行乘法運(yùn)算的兩個(gè)浮點(diǎn)數(shù)的尾數(shù)和階碼分別作為輸入(階底默認(rèn)為2),輸出運(yùn)算結(jié)果的尾數(shù)與階碼。運(yùn)算過程先后調(diào)用加法模塊計(jì)算階碼相加結(jié)果,乘法模塊計(jì)算尾數(shù)相乘結(jié)果,規(guī)格化模塊對(duì)前兩個(gè)模塊得到的結(jié)果進(jìn)行規(guī)格化,最后輸出。</p><p><b> 代碼如下:</b&g
87、t;</p><p> module run(Mx,My,E_X,E_Y,M_out,E_out);//運(yùn)行控制模塊</p><p> input [5:0] Mx,My;//六位浮點(diǎn)數(shù)尾數(shù)輸入,其中前兩位為符號(hào)位</p><p> input [3:0] E_X,E_Y;//四位無符號(hào)階碼輸入</p><p> output [9:
88、0] M_out;//十位尾數(shù)結(jié)果輸出,其中前兩位為符號(hào)位</p><p> output [3:0] E_out;//四位無符號(hào)階碼輸出</p><p> wire [3:0] E;//中間變量E,用于階碼加法模塊,輸出到規(guī)格化模塊</p><p> wire [9:0] M;//中間變量M,用于乘法模塊,輸出到規(guī)格化模塊</p><p&
89、gt; adder u1(.EX(E_X),.EY(E_Y),.EOUT(E));</p><p> multiply u2(.Mx(Mx),.My(My),.Mout(M));</p><p> SPEC u3(.EIn(E),.MIn(M),.EOut(E_out),.MOut(M_out));</p><p><b> endmodule&l
90、t;/b></p><p> 第三章 仿真測(cè)試</p><p><b> 3.1仿真測(cè)試環(huán)境</b></p><p> Mentor公司的ModelSim是業(yè)界最優(yōu)秀的HDL語言仿真軟件,它能提供友好的仿真環(huán)境,是業(yè)界唯一的單內(nèi)核支持VHDL和Verilog混合仿真的仿真器。它采用直接優(yōu)化的編譯技術(shù)、Tcl/Tk技術(shù)、和單一內(nèi)
91、核仿真技術(shù),編譯仿真速度快,編譯的代碼與平臺(tái)無關(guān),便于保護(hù)IP核,個(gè)性化的圖形界面和用戶接口,為用戶加快調(diào)錯(cuò)提供強(qiáng)有力的手段,是FPGA/ASIC設(shè)計(jì)的首選仿真軟件。</p><p><b> 主要特點(diǎn):</b></p><p> · RTL和門級(jí)優(yōu)化,本地編譯結(jié)構(gòu),編譯仿真速度快,跨平臺(tái)跨版本仿真;</p><p>
92、83; 單內(nèi)核VHDL和Verilog混合仿真;</p><p> · 源代碼模版和助手,項(xiàng)目管理;</p><p> · 集成了性能分析、波形比較、代碼覆蓋、數(shù)據(jù)流ChaseX、Signal Spy、虛擬對(duì)象Virtual Object、Memory窗口、Assertion窗口、源碼窗口顯示信號(hào)值、信號(hào)條件斷點(diǎn)等眾多調(diào)試功能;</p><p&g
93、t; · C和Tcl/Tk接口,C調(diào)試;</p><p> · 對(duì)SystemC的直接支持,和HDL任意混合;</p><p> · 支持SystemVerilog的設(shè)計(jì)功能;</p><p> · 對(duì)系統(tǒng)級(jí)描述語言的最全面支持,SystemVerilog,SystemC,PSL;</p><p&g
94、t; · ASIC Sign off。</p><p> 基于此,本設(shè)計(jì)采用ModelSim軟件對(duì)源代碼進(jìn)行仿真測(cè)試,仿真步驟如下:</p><p> 1.啟動(dòng)modelsim軟件</p><p> 先在磁盤中建立工作文件夾,在modelsim中選擇File -> Change Directory,在彈出的Choose folder對(duì)話框中
95、設(shè)置目錄路徑為工作文件夾路徑。</p><p><b> 2.建立工程</b></p><p> 在modelsim中建立project,選擇File ->New ->Project.</p><p> 在Project Name欄中填寫項(xiàng)目名字,建議和你的頂層文件名字一致。Project Location是工作目錄,可通過B
96、rose按鈕來選擇或改變。Ddfault Library Name可以采用工具默認(rèn)的work。Workspace窗口的library中就會(huì)出現(xiàn)work庫。 </p><p><b> 3.為工程添加文件</b></p><p> 工程建立后,選擇Add Exsiting File后,根據(jù)相應(yīng)提示將文件加到該P(yáng)roject中</p><p>
97、<b> 4.編譯文件</b></p><p> 編譯(包括源代碼和庫文件的編譯)。編譯可點(diǎn)擊ComlileComlile All來完成。 </p><p><b> 5.裝載文件</b></p><p> (1)雙擊libray 中work中的裝載測(cè)試代碼文件(例中為count_tp)</p>&l
98、t;p> (2)點(diǎn)擊simulate – start simulation</p><p><b> 設(shè)置好之后點(diǎn)擊ok</b></p><p><b> 6.開始仿真</b></p><p> 點(diǎn)擊workspace下的sim,點(diǎn)擊測(cè)試代碼文件(count_tp),選擇add add to wave<
99、;/p><p> 然后點(diǎn)run –all,開始仿真</p><p><b> 7.退出仿真</b></p><p> 在仿真調(diào)試完成后退出仿真,在主窗口中選擇simulate end simulation</p><p> 圖3-1 ModelSim測(cè)試環(huán)境使用界面</p><p><
100、b> 3.2模塊仿真測(cè)試</b></p><p> 3.2.1(補(bǔ)碼一位)乘法模塊仿真測(cè)試</p><p> module multiply_tp;</p><p> reg[5:0] Mx,My;//測(cè)試尾數(shù)輸入</p><p> wire[9:0] Mout;//測(cè)試尾數(shù)輸出</p><p&
101、gt; parameter DElY=100;//時(shí)延量定義</p><p> multiply test(Mx,My,Mout);</p><p><b> initial </b></p><p><b> begin</b></p><p> #DElY Mx=6'b110
102、011;My=6'b110101;</p><p> #DElY Mx=6'b001010;My=6'b000011;</p><p> #DElY Mx=6'b110011;My=6'b001001;</p><p> #DElY Mx=6'b001111;My=6'b111111;</p>
103、<p> #DElY $finish;</p><p><b> end</b></p><p><b> endmodule</b></p><p> 圖3-2 (補(bǔ)碼一位)乘法模塊編譯情況</p><p> 圖3-3(補(bǔ)碼一位)乘法模塊仿真波形圖</p>&
104、lt;p> 表3-1 (補(bǔ)碼一位)乘法模塊測(cè)試用例</p><p> 考慮測(cè)試的全面完整性,本測(cè)試將輸入的Mx(被乘數(shù)變量),My(乘數(shù)變量)依次設(shè)置為負(fù)數(shù)與負(fù)數(shù)、正數(shù)與正數(shù)、負(fù)數(shù)與正數(shù)、正數(shù)與負(fù)數(shù)。測(cè)試結(jié)果表明,結(jié)果正確,乘法模塊功能實(shí)現(xiàn)。</p><p> 3.2.2規(guī)格化模塊仿真測(cè)試</p><p> `timescale 1ns/1ns<
105、/p><p> module SPEC_tp;</p><p> reg[9:0] MIn; //測(cè)試尾數(shù)輸入</p><p> reg[3:0] EIn;//測(cè)試階碼輸入</p><p> wire[3:0] EOut; //測(cè)試階碼輸出</p><p> wire[9:0] MOut; //測(cè)試尾數(shù)輸出<
106、;/p><p> parameter DELY=100;//時(shí)延量定義</p><p> initial begin</p><p> EIn=4'd0;MIn=10'b0;</p><p> #DELY EIn =4'b0100; MIn =10'b0010101010;</p><p
107、> #DELY EIn =4'b1001; MIn =10'b0111010100; </p><p> #DELY EIn =4'b0110; MIn =10'b1000110100; </p><p> #DELY EIn =4'b0011; MIn =10'b1110011010;</p><p>
108、 #DELY $finish;</p><p><b> end</b></p><p> SPEC m(.EIn(EIn),.MIn(MIn),.EOut(EOut),.MOut(MOut));</p><p><b> endmodule</b></p><p> 圖3-4 規(guī)格化模塊編
109、譯情況</p><p> 圖3-5 規(guī)格化模塊仿真波形圖</p><p> 表3-2 規(guī)格化模塊測(cè)試用例</p><p> 本模塊分別輸入尾數(shù)符號(hào)為01,10的兩組數(shù)據(jù),測(cè)試規(guī)格化模塊對(duì)正溢情況的處理能力。此外輸入一組初始全零模塊測(cè)試規(guī)格化模塊對(duì)邊界情況的處理能力,以及一組不需要規(guī)格化操作的數(shù)據(jù),測(cè)試規(guī)格化模塊功能是否正常。仿真結(jié)果表明,本模塊功能正常實(shí)現(xiàn)。&
110、lt;/p><p> 3.2.3加法模塊仿真測(cè)試</p><p> module adder_tp;</p><p> reg [3:0] EX,EY;//測(cè)試階碼輸入</p><p> wire [3:0] EOUT;//測(cè)試階碼輸出</p><p> parameter DELY=100;//時(shí)延量定義<
111、;/p><p> adder a_t(EX,EY,EOUT);</p><p><b> initial</b></p><p><b> begin</b></p><p> EX=4’b0000;EY=4’b0000;</p><p> #DELY EX={$ran
112、dom}%16;EY={$random}%16;</p><p> #DELY EX={$random}%16;EY={$random}%16;</p><p> #DELY EX={$random}%16;EY={$random}%16;</p><p> #DELY $finish;</p><p><b> end&l
113、t;/b></p><p><b> endmodule</b></p><p> 圖3-6 (階碼)加法模塊編譯情況</p><p> 圖3-7 (階碼)加法模塊仿真波形圖</p><p> 表3-3 (階碼)加法模塊測(cè)試用例</p><p> 本測(cè)試調(diào)用系統(tǒng)函數(shù),產(chǎn)生四組隨機(jī)輸
114、入,保證測(cè)試的可靠性。仿真結(jié)果表明,本模塊功能正常實(shí)現(xiàn)。</p><p> 3.3總測(cè)試(控制模塊測(cè)試)</p><p> module run_tp;</p><p> reg [5:0] Mx,My;//測(cè)試浮點(diǎn)數(shù)尾數(shù)輸入</p><p> reg [3:0] E_X,E_Y;//測(cè)試浮點(diǎn)數(shù)階碼輸入</p><
115、p> wire [9:0] M_out;//測(cè)試浮點(diǎn)數(shù)尾數(shù)輸出</p><p> wire [3:0] E_out;//測(cè)試浮點(diǎn)數(shù)階碼輸出</p><p> parameter DElY=100;//時(shí)延量定義</p><p> run floatx(Mx,My,E_X,E_Y,M_out,E_out);</p><p><
116、;b> initial </b></p><p><b> begin</b></p><p> #DElY Mx=6'b110011;My=6'b110101;E_X =4'b0100;E_Y =4'b0110; </p><p> #DElY Mx=6'b001010;My
117、=6'b001011;E_X =4'b0001;E_Y =4'b0101; </p><p> #DElY Mx=6'b110011;My=6'b001001;E_X =4'b0010;E_Y =4'b0100; </p><p> #DElY Mx=6'b001111;My=6'b110111;E_X =4&
118、#39;b0110;E_Y =4'b1000; </p><p> #DElY $finish;</p><p><b> end</b></p><p><b> endmodule</b></p><p> 圖3-8 控制模塊編譯情況</p><p>
119、圖3-9 控制模塊仿真波形圖</p><p> 圖3-10 總測(cè)試數(shù)據(jù)流圖</p><p> 表3-4 控制模塊(總模塊)測(cè)試用例</p><p> 本模塊測(cè)試輸入的被乘數(shù)與乘數(shù)分別為負(fù)數(shù)與負(fù)數(shù),正數(shù)與正數(shù),負(fù)數(shù)與正數(shù),正數(shù)與負(fù)數(shù),涵蓋四種乘數(shù)可能性。仿真結(jié)果表明,本浮點(diǎn)乘法運(yùn)算器設(shè)計(jì)功能成功實(shí)現(xiàn)!</p><p> 第四章 總
120、結(jié)與展望</p><p> 4.1問題及解決方案總結(jié)</p><p> 4.1.1乘法模塊編寫問題</p><p> 編寫問題:這個(gè)模塊編寫的主要問題集中在兩點(diǎn),一個(gè)是變量賦值問題,一個(gè)是運(yùn)算符使用問題。</p><p> ?。?)變量賦值部分,由于變量某些位數(shù)有特殊用途,最開始我們使用的是逐位賦值來給特定位賦值,導(dǎo)致代碼臃腫,可讀性較
121、差。后來經(jīng)過對(duì)verilog語法的仔細(xì)分析,我們?cè)撚梦黄唇舆\(yùn)算符,有效地解決了這個(gè)問題。</p><p> ?。?)運(yùn)算符使用問題是一個(gè)細(xì)節(jié)性問題,在進(jìn)行或運(yùn)算時(shí),我們?cè)谛枰褂冒次换蜻\(yùn)算符的地方不慎使用了一個(gè)邏輯或運(yùn)算符,導(dǎo)致仿真結(jié)果一直不對(duì)。在沒有找到問題所在的情況下,我們先后采用了單步仿真(將循環(huán)次數(shù)設(shè)置為1)和單句仿真(只保留一句功能語句)的方法,找到了問題之所在,解決了這個(gè)難題。</p>
122、<p> 4.1.2規(guī)格化模塊編寫問題</p><p> 編寫問題:這個(gè)模塊編寫的主要問題是對(duì)溢出情況的處理問題。最開始我們的設(shè)計(jì)只考慮到尾數(shù)大小的規(guī)格化,所以本模塊測(cè)試時(shí)沒有問題,但是總體測(cè)試時(shí)就有結(jié)果異常的情況發(fā)生。經(jīng)過仔細(xì)地分析,我們認(rèn)為乘法運(yùn)算結(jié)束后,可能有數(shù)值位溢出到了符號(hào)位的低位,所以規(guī)格化模塊應(yīng)該對(duì)溢出情況做判斷處理。加入這個(gè)判斷模塊后,本模塊功能得到了完善。</p>&
123、lt;p><b> 4.2結(jié)論及展望</b></p><p> 本次課程設(shè)計(jì),通過使用硬件描述語言編寫硬件程序,并進(jìn)行仿真測(cè)試,我們證實(shí),基于補(bǔ)碼一位乘法的浮點(diǎn)乘法運(yùn)算原理是正確的。</p><p> 在本次課程設(shè)計(jì)中,我們收獲了很多,具體集中在以下幾點(diǎn):</p><p> 即使編寫代碼的整個(gè)邏輯是很清晰的,但是實(shí)際中要編寫一段能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)電課程設(shè)計(jì)報(bào)告---運(yùn)算器
- 基于fpga的浮點(diǎn)運(yùn)算器設(shè)計(jì)
- 基于fpga的浮點(diǎn)運(yùn)算器設(shè)計(jì)
- 課程設(shè)計(jì)--設(shè)計(jì)一個(gè)矩陣運(yùn)算器
- 基于cpld的64位乘法運(yùn)算器的設(shè)計(jì)
- 基于FPGA的浮點(diǎn)運(yùn)算器設(shè)計(jì).pdf
- 課程設(shè)計(jì)---稀疏矩陣加法運(yùn)算器
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告--稀疏矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--稀疏矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 稀疏矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 稀疏矩陣運(yùn)算器設(shè)計(jì)
- eda課程設(shè)計(jì)--2位十進(jìn)制四則運(yùn)算器電路四則運(yùn)算器
- 課程設(shè)計(jì)-單片機(jī)課程設(shè)計(jì)論文-4位數(shù)加法運(yùn)算器的設(shè)計(jì)
- 基于FPGA浮點(diǎn)運(yùn)算器的研究.pdf
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--稀疏矩陣運(yùn)算器
- eda課程設(shè)計(jì)之2位十進(jìn)制四則運(yùn)算器電路四則運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--基本稀疏矩陣運(yùn)算的運(yùn)算器
- 基于參數(shù)化IP核的浮點(diǎn)運(yùn)算器設(shè)計(jì).pdf
- eda課程設(shè)計(jì)--2位十進(jìn)制四則運(yùn)算器電路
- 數(shù)字邏輯課程設(shè)計(jì)---基于fpga的簡(jiǎn)單運(yùn)算器
評(píng)論
0/150
提交評(píng)論