verilog hdl的故事之整數(shù)乘法器_第1頁
verilog hdl的故事之整數(shù)乘法器_第2頁
verilog hdl的故事之整數(shù)乘法器_第3頁
verilog hdl的故事之整數(shù)乘法器_第4頁
verilog hdl的故事之整數(shù)乘法器_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

VerilogVerilogHDLPAGE2PAGE2解開疑問之外,自然而然和“硬件乘法器”有關(guān)...器(雖然VerilogHDL語言也可以描述由組合邏輯建立而成的乘法器。話長了...話說在尋找資料之際,筆者不得不感謝那些無私的博客和博文,國內(nèi)那些打用。果然還是百科,鳥文最情切。 第一章整數(shù)乘法 BOOTH算法乘法 筆者情有獨鐘的步驟 Booth算法乘法器的改 實驗四:Booth算法乘法器改 LUT乘法 實驗五:基于Quartersquare的查表乘法 ModifiedBooth算法乘法 實驗六:ModifiedBooth乘法 1.10ModifiedBooth乘法器· 實驗七:ModifiedBooth乘法器· 整數(shù)在IEEE的規(guī)定上有,短整數(shù)shortinteger,中整數(shù)integer和長整數(shù)longinteger,它們之間的關(guān)系如下:-127~ +127+127+4-127-4,時的筆者曾經(jīng)這個東西頭疼過。一個負(fù)值表示如-4,是由+4 // // //1(+127)和B=8'b1000_0001(-127)。ififA[7] ifB[7] B280~255,但是符號位的出現(xiàn)吃掉了最,所以造成由28的取值范圍變成27=0~171。?在短整數(shù)里面存在一個成員。該成員很神秘,它不是正值,即不是負(fù)值或者0值。而且它的能力也不可忽視,它劃分了正值和負(fù)值的邊界,它就是 8'b1000_00008'b1000_0000之后是負(fù)值。如果讀者硬是要說8'b1000_00000”,筆記也無話可說 // // //13x412341。大伙們都明白那是整數(shù),但是初中的一段時間說不出話來。好一段時間筆者都是自己在嘀咕3x3x4=-3x4=-3x-4=--3x-4=4312@#¥%#¥*!%"(乘法的門兒,考試還常常滿江紅,真的悲劇的初衷時代AB正正正負(fù)負(fù)負(fù)負(fù)正3x4=12;-3x4=-3x-4=--3x-4=“異或”關(guān)系來判斷...”3~11Start_SigDone_Sig是仿順序操作的標(biāo)志性結(jié)構(gòu),不明白的去看筆者之前寫的筆記。MultiplicandMultiplier被乘數(shù)和乘數(shù)),都是8位位寬,所以輸出Product16位位寬。第16~21行是該模塊所使用的寄存器i寄存表示步驟,McandMultiplicand的正值,Mer用來暫存Multiplier的正值,Temp寄存器是操作空間。然而isNeg標(biāo)志寄存器是用來寄存Multiplicand和Multiplier之間的正負(fù)關(guān)系。0(36~45行)39行isNeg寄存“乘數(shù)和被乘數(shù)之間的正負(fù)40行,McandMultiplicand的正值,該行表示:如果被乘數(shù)的符號位是邏輯1的話,就將負(fù)值轉(zhuǎn)換為正值,然后Mcand寄存該值,否則Mcand直接寄存Multiplicand41行是用來寄存Multiplier40行很相識。寄存就遞減(49行Mer0(48行2~3是么Temp的結(jié)果從負(fù)值轉(zhuǎn)換為正值。否則直接輸出Temp的值。VerilogHDLPAGE9PAGE9VerilogVerilogHDL第39行以下和普通的仿順序操作的寫法一樣,不明白的話請看筆者以往寫過的筆記。步驟0~3,會輸入不同的乘數(shù)和被乘數(shù)來激勵multiplier_module.v。體的原因在下一章節(jié)解釋VerilogHDL語言所描述的乘法器的消耗是以“時鐘”作為時間單位。反之,組合邏輯所建立的乘法器是以“廣播時間”作為時間單位。說簡單點就是,VerilogHDL語言所假設(shè)A=10,B= AxB,那么時鐘的消耗至少需要20個,因為A值需要累加有學(xué)過乘法的朋友都知道A(B)=B(A)。如果以實驗一的乘法器作為基礎(chǔ),那么A(B)和B(A)所消耗的時間就不一樣了。所以我們可以這樣改進(jìn):{{Multiplier,Multiplicand}=Multiplicand<Multiplier?{Multiplicand,Multiplier}{Multiplier,Multiplicand舉個例子:Multiplicand2,Multiplicand10實驗二:.vt在仿真的結(jié)果上,10x22x10127x127的乘數(shù)和被乘數(shù),咋也看不出什么優(yōu)化過生活的大反轉(zhuǎn),看到了自己存在意義,有的人則...當(dāng)然補碼也有存在的意-3 8 5-38-30011110181000相加就會得到5,亦即0101。至于溢出的最可以無視掉。-3 -2 -5其實,如QuartusII綜合器,當(dāng)我們使用“-”算術(shù)操作符的時候,其實就AA=B=ABA~B1'b1:Booth它就是Booth算法乘法器。實際上Booth算法是一種“加碼”乘法運算。000110110010 //LSB右邊出現(xiàn)的就是-1 2,那么乘數(shù)2的加碼過程會是如下。00100010001000100010BB-1(-1 從數(shù)學(xué)的角度看來,確實Booth算法是麻煩的存在,但是在位操作的角度來看就不是這么一回事。實際上在千奇百怪的位操作乘法中,Booth算法其中可以容納“補碼”亦即00011011Booth算法。Booth算法在位操作的時候,它使用一個很有個性的空間,就是P空間。A70111)B20010)n4P空間的容量是nx2+1,亦即9位。________ //P空間 那么P空間如何實現(xiàn)乘法的位操作呢?-1被乘數(shù)P空間,P=00000000P[4..1]P=00000010判斷P[1:0]2'b00P=00000010],P=00000001P=00000001P空間的[8..5]AP=00000001 P=10010001],P=11001000P=11001000P空間的[8..5]Ap=11001000 P=001110001無視 P=00011100判斷P[1:0]2'b00P=00011100],P=00001110P空間的[8..1]P=00001110實驗三:Booth

如左邊的循環(huán)圖。A為被乘數(shù),AP為操作空間。一開始P導(dǎo)致P空間右移一次,至于右移由當(dāng)時P[8]說了算。n13~15行是仿真的輸出(SSimulationQOutput20~25行定義了該模塊所使用的寄存器。aA值,s-1(A)的值,p寄存器是P空表示n位,用來指示n次循環(huán)。1(43~51行)p[1:0]2(53~55行)是執(zhí)行右移一位,3~57~6172~74行是仿真用的輸出信號,功能如字面上的意思。P空間的詳細(xì)操作過程,自己看吧,界面有限的關(guān)系。從仿真結(jié)果上可以看到,4次的乘法操作所使用的時間都一樣,尤其是-127x-127的情形,不像傳統(tǒng)乘空間的[Width*2:Width+1]是用來執(zhí)行和被乘數(shù)A的操作)要先操作后移位的關(guān)系,所以多出8個時鐘的消耗在筆者初學(xué)VerilogHDLVerilogHDL語言和時序的關(guān)系,吃了步驟i有關(guān)《VerilogHDL那些事兒》那本筆記,雖然筆者的實例都和“它”有關(guān)。但是在筆記中,筆者只是微微的帶過“步驟i...i是什么,那不是初學(xué)VerilogHDL的任務(wù)。步驟i的用法很簡單,從概念上和“順序操i,低級建模里面有一個準(zhǔn)則,就是“一個模塊一個到i被清理,這也表示了這個模塊已經(jīng)結(jié)束工作?;蛘呖梢赃@樣說“一個模塊不會出現(xiàn)兩個步驟i。具體上,步驟i的“值”是指示著“第幾個時鐘沿”發(fā)生,然而VerilogHDL語言里的“步驟”和C語言里的“步驟”是不一樣。C語言里的“步驟”就好比“把大象放進(jìn)冰如上面的示意圖所示,在這個時間點里所發(fā)生的“決定”會產(chǎn)生不一樣的未來。然而在初值是0。case(case(ibeginA<=A+2'd2;B<=B+2'd3;i<=i+1'b1;if(A>3)beginB<=A;A=0;i<=i+1'b1;endelseifi<=i+1'b1;i0的時候,A2,B3在i=1的時候,如果A大于 0過后所產(chǎn)生的結(jié)果”。"<="...如果換做時間點的概念來說“<=”的操作符,表示了“在這個時間點下決定”的賦值操作符。問題A,B和Ccase(case(ibeginA<=3;B<=4;C<=0;i<=i+1'b1;C<=A+if(C>0)beginA<=0;B<=0;endelsebeginA<=1;B<=1;endi<=i+0A3,B4,C等011C的1過去的C值,還是在這一個瞬間A+B所產(chǎn)生的值?”。時間點過去的值,作為當(dāng)前時間點下決定的參考(寫到這里,筆者流淚了實際上“=”不是不可以在always@(posedgeCLK...)里出現(xiàn),只不過它比較case(case(ibeginA<=3;B<=4;C<=0;i<=i+1'b1;C=A+if(C>0)beginA<=0;B<=0;endelsebeginA<=1;B<=1;endi<=i+1CAB在某種程度上,它的存在會破壞和諧,如果沒有步驟i的控制,它很容易暴走。筆者在設(shè)計模塊中,除非出現(xiàn)“不得已”的情況,否則筆者在always@(posedgeCLK...)區(qū)Booth8個時間就是消耗在移位的方面上。那么有什么辦法改進(jìn)實驗三中的Booth算1.6iBooth乘法器:casecase(i0:...if(p[1:0]==2'b01)p<={p[16],p[16:9]+a,p[8:1]elseif(p[1:0]==2'b10)p<={p[16],p[16:9]+s,elsep<={p[16],i<=i+Booth那么問題來了,從上面的代碼看來pp[16],p[16:9a,p[8:1]};其中的p[16]是以當(dāng)前時間點的過去值作為基礎(chǔ),而不是p[1:0]操作過后的值,case(case(i0:...Diff1=p[16:9]+ Diff2=p[16:9]if(p[1:0]==2'b01)p<={Diff1[7],Diff1,elseif(p[1:0]==2'b10)p<={Diff2[7],Diff2,p[8:1]};elsep<={p[16],p[16:1]};i<=i+1~8Diff1寄存了p[16:9]+a的結(jié)果,反之Diff2寄存p[16:9]sp[1:0]pDiff1,Diff2或Diff1Diff2沒有使用“<=”,換一句話說,Diff1Diff2結(jié)果的產(chǎn)實驗四:Booth基于實驗三的Booth168個Booth55~671~8的循環(huán)操作。不再使用X寄存器作為循環(huán)計數(shù),而是直接使用步驟來指示8個循環(huán)操作。在55~67行,這樣的寫法有一個好處,就是可以使得p8個時鐘。.vt0ia值,并且填充在p空間的[8:1]0值右邊的上升沿,亦即步驟1。此時:Diff1寄存過去的p[16:9]+a,亦即 ,結(jié)果 。Diff2寄存過去的p[16:9]+s,亦即 ,結(jié)果為 2'b10,所以p值的未來是{Diff2[7],Diff2,p過去[8:1]},亦即 1值右邊的上升沿,亦即步驟2。此時:Diff1寄存過去的p[16:9]+a,亦即 ,結(jié)果 。Diff2寄存過去的p[16:9]+s,亦 ,結(jié)果為 2'b01,所以p值的未來是{Diff1[7],Diff1,p過去[8:1]},亦 0值右邊的上升沿,亦即步驟3。此時:Diff1寄存過去的p[16:9]+a,亦即 ,結(jié)果 。Diff2寄存過去的p[16:9]+s,亦 ,結(jié)果為 2'b00,所以p值的未來是{p過去[16],p過去[16:1]},亦即 0值右邊的上升沿,亦即步驟4。此時:Diff1寄存過去的p[16:9]+a,亦即 ,結(jié)果 。Diff2寄存過去的p[16:9]+s,亦即 ,結(jié)果為 2'b00,所以p值的未來是{p過去[16],p過去[16:1]},亦即 0值右邊的上升沿,亦即步驟5。此時:Diff1寄存過去的p[16:9]+a,亦即 ,結(jié)果 。Diff2寄存過去的p[16:9]+s,亦 ,結(jié)果為 2'b00,所以p值的未來是{p過去[16],p過去[16:1]},亦即 0值右邊的上升沿,亦即步驟6。此時:Diff1寄存過去的p[16:9]+a,亦即 ,結(jié)果 。Diff2寄存過去的p[16:9]+s,亦 ,結(jié)果為 2'b00,所以p值的未來是{p過去[16],p過去[16:1]},亦即 0值右邊的上升沿,亦即步驟7。此時:Diff1寄存過去的p[16:9]+a,亦即 ,結(jié)果 。Diff2寄存過去的p[16:9]+s,亦 ,結(jié)果為 2'b00,所以p值的未來是{p過去[16],p過去[16:1]},亦即 0值右邊的上升沿,亦即步驟8。此時:Diff1寄存過去的p[16:9]+a,亦即 ,結(jié)果 。Diff2寄存過去的p[16:9]+s,亦 ,結(jié)果為 2'b10,所以p值的未來是{Diff2[7],Diff2,p過去[8:1]},亦即 i,在實驗四中可能會產(chǎn)生許多思考邏輯上的。換一個想法,如果以“時間點”的概念去理解步驟i的話,從仿真圖看來間的[Width*2:Width+1]是用來執(zhí)行和被乘數(shù)A的操作)LUT只不過它們無法達(dá)到急性一族人的而已。LUT乘法器,又成為查表乘法器。用傻瓜的話來說,就是先吧各種各樣的結(jié)果在一個表中,然后將輸入資源以“查表”的方16x1600123 00001012334567890000000003456789689假設(shè)AxB4位,A10,B220。查表乘法器之所以被稱為快速乘法器,就是上面的原因(實際上許多硬件乘法器都是使用查表的方式)。AxB8256x256乘法器?。坎恢雷x者有沒有聽過Quartersquare上邊是該算法的,在的結(jié)束得到ab=((a+b)2)/4-((a-b)2)/4ab2/4ab2/4,經(jīng)過冪運算后,得到的結(jié)假設(shè)ab81271272412712724。那么我們可以得到一個結(jié)論“(a+b)2/4或者(a-b2/4使用同樣的(C)2/4查表”。C0~255(C)2/4最大值相加僅有-127+-127=-254或者127+127=254。那么問題來了,-127~127-254~254呢?C9位位寬的不正規(guī)整數(shù)AB8CABC=A+C={A[7],A}+{B[7],BA=127(0111A=127(00111B=127(0111B=127(00111 + 01111A=-127(1000B=-127(1000A=-127(11000B=-127(11000 1000 1000 10000 10000regregcase(iI1<={A[7],A}+{B[7],B//C=A+I2<={A[7],A}+{~B[7],(~B+1'b1)}; //C=A-B;i<=i+1'b1; //I1<=I1[8]?(~I1+1'b1):I2<=I2[8]?(~I2+1'b1):I2;i<=i+1'b1;I1I290,I1CABI2假設(shè)A=-1(11111111),B=-3(11111101),0的操作:I2={1111111011111111004)I1130000000110000000102)I213131I1I2I1411111100),I22000000010),1I1I1=000000011+1=00000I2=00000(C)2I1I2共用相同的查表這是必須的步驟。如果用I1和I2來表達(dá)Quartersquare,那么:((|I1|2/4)-(|I2|2/4實驗五:基于Quartersquare0~255(C)2/4lut_module.v,因為用QuartusIIrom.vI1AB,I2AB,然后I1I2都正值值,將I1和I2送至各自的查表,然后將得出的結(jié)果Q1_Sig(I1的結(jié)果)和Q2_Sig(I2的結(jié)果),執(zhí)行相減。實際上是補碼形式的相加,Q1_Sig~Q2_Sig1'b1),以致符合Quartersquare的:ab2/4ab2/4|I1|)2/4|I2|)2/4]Q1_SigQ2_Sig]15~1826~27Q1_SigQ2_Sig,實際上這兩個線型數(shù)據(jù)是U1(81~87行)和U2(91~97行)實例前申明的,可是那么混蛋,偏行)是I1和I22(63~64行)是延遲一個時鐘,給予足夠的時間從lut_module.v讀出結(jié)果。步驟3(66~67行是Quartersquare操作的最后一步。89~99lut_module.vU1I1U2是給I2使用,它們的輸出Q1_Sig和Q2_Sig。102Product輸出信號由Data寄存器驅(qū)動。然106~109行是仿真輸出的驅(qū)動,分別有I1,I2,Q1_Sig和Q2_Sig的仿真輸出。.vt文件的寫法和之前的實驗都一樣,如果真的不知道筆者在寫什么,就得好好看筆者4個時鐘的而已。比起改進(jìn)的Booth算法減少了一半的時鐘打破。感謝前人的努力吧,我們后人才能乘涼ModifiedBooth事先modifiedbooth算法和改進(jìn)的booth算法乘法器(實驗四)是沒有任何關(guān)系的。如字面上的意思modifiedbooth算法是booth算法的升級版。我們稍微來回味一下booth算法。假設(shè)B是4位位寬的乘數(shù),那么booth算對B[0:-1],B[1:0],B[2:1],B[3:2]加碼,而使得乘法運算得到簡化。booth算法有典型數(shù)學(xué)做法,也有位操作的做法。Modifiedbooth算法比起booth4B乘數(shù)的加碼返回會更廣,而使得n/2乘法運算的優(yōu)化。再假設(shè)B是4微微款的倍數(shù),那么modifiedbooth算對B[1:-1],B[3:1]000001010011100101110111pnx219位。乘數(shù)A70111),被乘數(shù)B20010)+AAA=0111,A=P0,然后P空間的[4..1]填入乘數(shù)亦即B。P=00000000P=00000010先判斷p[2:0]P=00000010P=00000001p[8:5]P=00000001 P=10010001p=11001000判斷p[2:0]p=11001000p[8:5]P=11001000 P=00111000P=00001110最終取出p[8:1]14P=000011104modifiedbooth實驗六:ModifiedBooth15~17行是仿真輸出。43~940(45~51行)取得被乘數(shù)Aa-1(被乘數(shù)A)sp空間的同時,將乘數(shù)B填入p[8:1]。(由于被乘數(shù)AB8pnx219。我知道我很長[Width*2:Width+1]是用來執(zhí)行和被乘數(shù)A的操作。12(53~62行)p[2:0]等于3'b000|111|001|010|101|110的操作。相反modifiedbooth算法當(dāng)p[2:0]3'b011和3'b100所執(zhí)行的步驟次數(shù)是不一樣(56~57行。3~5(66~73行)針對p[2:0]等于3'b011的操作(56行6~8(77~84行)針對p[2:0]3'b100的操作(57行。a,s和p.vt~2(4)127(-127)Moifiedbooth是很別扭。換句話說,用它還要圖運氣,因為不同的乘數(shù)和被乘數(shù)都有不同的時鐘消耗ModifiedBooth乘法器·modifiedboothmodifiedbooth針對乘數(shù)B000001010011100101110111A=7(0111,=2(0010在這里須注意一下當(dāng)B[1:-1]等于011或者100的時候,4位的被乘數(shù)A的取-7~7然而,+2(被乘數(shù))2(被乘數(shù))A的最大值突破取BB[1:-1]3'b1002(被乘數(shù))B[3:1]3'b100+01011001 11110010+00000111000011102booth4n次,而且乘積也是n位的次數(shù),亦即

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論