第4講 Verilog HDL高級(jí)編程技術(shù)_第1頁(yè)
第4講 Verilog HDL高級(jí)編程技術(shù)_第2頁(yè)
第4講 Verilog HDL高級(jí)編程技術(shù)_第3頁(yè)
第4講 Verilog HDL高級(jí)編程技術(shù)_第4頁(yè)
第4講 Verilog HDL高級(jí)編程技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第四講VerilogHDL高級(jí)編程技術(shù)參見(jiàn)課本的第4,9,10章加法器設(shè)計(jì)乘法器設(shè)計(jì)除法器的設(shè)計(jì)奇數(shù)分頻與小數(shù)分頻有限狀態(tài)機(jī)設(shè)計(jì)基于宏功能模塊的設(shè)計(jì)設(shè)計(jì)的可綜合性加法器設(shè)計(jì)加法、乘法作為基本的運(yùn)算,大量應(yīng)用在數(shù)字信號(hào)處理和數(shù)字通信的各種算法中。由于加法器、乘法器使用頻繁,所以其速度往往影響著整個(gè)系統(tǒng)的運(yùn)行速度。如果可實(shí)現(xiàn)快速加法器和快速乘法器的設(shè)計(jì),則可以提高整個(gè)系統(tǒng)的速度。加法運(yùn)算是最基本的運(yùn)算,在多少情況下,無(wú)論是乘法、除法、加法還是FFT等運(yùn)算,最終都可以分解為加法運(yùn)算來(lái)實(shí)現(xiàn)。加法運(yùn)算有:級(jí)連加法器、并行加法器、超前進(jìn)位加法器、流水線加法器等1.級(jí)連加法器的設(shè)計(jì)見(jiàn)課本P184-P185。級(jí)連加法器是由1位全加器級(jí)連構(gòu)成的,本級(jí)的進(jìn)位輸出作為下一級(jí)的進(jìn)位輸入。級(jí)連加法器結(jié)構(gòu)簡(jiǎn)單,但N位級(jí)連加法運(yùn)算的延時(shí)是1位全加器的N倍,延時(shí)主要是進(jìn)位信號(hào)級(jí)連造成的。在需要高性能的設(shè)計(jì)中,這種加法結(jié)構(gòu)不宜采用。例程如下:modulefull_add1(a,b,cin,sum,cout);inputa,b,cin;outputsum,cout;wires1,m1,m2,m3;and(m1,a,b),(m2,b,cin),(m3,a,cin);xor(s1,a,b),(sum,s1,cin);or(cout,m1,m2,m3);endmodulemoduleadd8(sum,cout,a,b,cin);input[7:0]a,b;inputcin;output[7:0]sum;outputcout;full_add1f0(a[0],b[0],cin,sum[0],cin1);full_add1f1(a[1],b[1],cin1,sum[1],cin2);full_add1f2(a[2],b[2],cin2,sum[2],cin3);full_add1f3(a[3],b[3],cin3,sum[3],cin4);full_add1f4(a[4],b[4],cin4,sum[4],cin5);full_add1f5(a[5],b[5],cin5,sum[5],cin6);full_add1f6(a[6],b[6],cin6,sum[6],cin7);full_add1f7(a[7],b[7],cin7,sum[7],cout);endmodule

2.并行加法器:并行加法器可采用VerilogHDL的加法運(yùn)算符直接描述,借助于EDA綜合軟件和HDL描述語(yǔ)言,實(shí)現(xiàn)起來(lái)很容易,其運(yùn)算速度快,但耗用資源多,尤其是當(dāng)加法運(yùn)算的位數(shù)較寬時(shí),其耗用的資源將會(huì)較大。moduleadd_bx(cout,sum,a,b,cin);input[7:0]a,b;inputcin;output[7:0]sum;outputcout;assign{cout,sum}=a+b+cin;endmodule3.流水線加法器:為保證數(shù)據(jù)吞吐率,電路設(shè)計(jì)中的一個(gè)主要問(wèn)題就是要維持系統(tǒng)時(shí)鐘的速度處于或高于某一頻率。例如,如果整個(gè)系統(tǒng)是一個(gè)全同步時(shí)鐘,同時(shí)又必須運(yùn)行在25MHz的頻率上,那么,從任何寄存器的輸出到它饋給信號(hào)的寄存器輸入路徑間的最大時(shí)延必須小于40ns。如果通過(guò)某些復(fù)雜邏輯的延時(shí)路徑比較長(zhǎng),系統(tǒng)時(shí)鐘的速度就很難維持。這時(shí),就必須在組合邏輯間插入觸發(fā)器,使復(fù)雜的組合邏輯形成流水線。雖然流水線會(huì)增加器件資源的使用,但它降低了寄存器間的傳播延時(shí),保證系統(tǒng)維持高的系統(tǒng)時(shí)鐘速度。流水線設(shè)計(jì)的基本思想是在邏輯電路中加入若干寄存器來(lái)暫存中間結(jié)果,雖然多用了一些寄存器資源,但減少了每一級(jí)組合電路的時(shí)延,因此可提高整個(gè)電路的運(yùn)行效率。流水線設(shè)計(jì)可有效提高系統(tǒng)的工作頻率,尤其是對(duì)于FPGA器件。FPGA的邏輯單元中有大量4到5變量的查找表(LUT)以及大量的觸發(fā)器,因此在FPGA設(shè)計(jì)中采用流水線技術(shù)可以有效提高系統(tǒng)的速度。實(shí)際中的乘法器大多是有時(shí)鐘引腳的,以連續(xù)不斷地進(jìn)行乘法運(yùn)算。在有時(shí)鐘信號(hào)的乘法器中,可以采用流水線設(shè)計(jì)技術(shù),以提高系統(tǒng)的運(yùn)行頻率。同樣加法器也可以采用流水線設(shè)計(jì)。下面的例子就是一個(gè)兩個(gè)流水8位加法,由兩個(gè)4位加法器構(gòu)成,輸出存儲(chǔ)在寄存器中。moduleadd8(cout,sum,a,b,cin,en);input[7:0]a,b;inputcin,en;output[7:0]sum;outputcout;reg[7:0]sum;regcout;reg[3:0]tempa,tempb,firsts;regfirstc;always@(posedgeen)begin{firstc,firsts}=a[3:0]+b[3:0]+cin;tempa=a[7:4];tempb=b[7:4];endalways@(posedgeen)begin{cout,sum[7:4]}=tempa+tempb+firstc;sum[3:0]=firsts;endendmodule乘法器設(shè)計(jì)乘法器也頻繁使用在數(shù)字信號(hào)處理和數(shù)字通信的各種算法中,并且往往影響著整個(gè)系統(tǒng)的運(yùn)行速度,所以如果能實(shí)現(xiàn)快速乘法器的設(shè)計(jì),可提高整個(gè)系統(tǒng)的處理速度。乘法器的設(shè)計(jì)方法主要有:并行運(yùn)算(純組合邏輯)、移位相加、查找表、加法樹(shù)等。1.并行乘法器:并行乘法器是純組合邏輯的乘法器,完全由邏輯門(mén)實(shí)現(xiàn)。對(duì)于1ⅹ1乘法,只需1個(gè)與門(mén)即可實(shí)現(xiàn),P=A·B。對(duì)于2ⅹ2乘法,根據(jù)課本P189的真值表可以得出結(jié)果表達(dá)式:因此我們可以用與門(mén)、或門(mén)來(lái)實(shí)現(xiàn)。并行乘法器示例:modulemult(outcome,a,b);parametersize=8;input[size:1]a,b;output[2*size:1]coutcome;assignoutcom=a*b;endmodule并行乘法器隨著操作數(shù)位數(shù)加寬,耗用的資源迅速變多,如果將上面的8位并行乘法器適配到Cyclone系列的EP1C3器件實(shí)現(xiàn)的話,需耗用106個(gè)LE單元。而如果所用的FPGA器件中有嵌入式乘法器的話,則可采用嵌入式乘法器來(lái)實(shí)現(xiàn)乘法,比如將上例適配到CycloneII系列的EP2C5器件的話,只耗用1個(gè)LE單元和1個(gè)9位*9位的嵌入式乘法器單元。因此,如果所用的FPGA器件中有硬件乘法器,建議用硬件乘法器來(lái)實(shí)現(xiàn)乘法操作,具有速度快,資源利用合理等優(yōu)點(diǎn)。2.移位相加乘法器移位相加乘法器將乘法變?yōu)榧臃▽?shí)現(xiàn),其設(shè)計(jì)思路是:乘法通過(guò)逐次移位相加實(shí)現(xiàn),每次判斷乘數(shù)的最低位,若為1則將被乘數(shù)移位相加。被乘數(shù)A1101乘數(shù)B×1011部分積01101A左移

11010

部分積1100111A左移

000000部分積2100111A左移

1101000積10001111對(duì)于乘數(shù)中的第i位,若為1,則將被乘數(shù)左移i位,并加到上次的部分積結(jié)果上。(若為0可以看作只移位不相加。)也可以依次判斷乘數(shù)B的最低有效位是否為1,若為1則P=P+A(部分積P在剛開(kāi)始時(shí)要清0),然后將被乘數(shù)A左移1位,乘數(shù)B右移1位(并用0填補(bǔ)高位);當(dāng)被乘數(shù)全部變?yōu)?后,乘法運(yùn)算完成。

注:如果B的最低有效位為0時(shí),只需接著移位,不要相加移位相加乘法器是一種相對(duì)節(jié)省資源的設(shè)計(jì)方法,為了實(shí)現(xiàn)n×n乘法,需要一個(gè)2n位的左移寄存器(存放部分積),一個(gè)n位的右移寄存器(可用除數(shù)寄存器代替),一個(gè)2n位加法器(被加數(shù)為部分積和被乘數(shù),所以還需要一個(gè)被乘數(shù)寄存器),再加少量的控制邏輯即可實(shí)現(xiàn)。尤其是當(dāng)操作數(shù)位寬增加時(shí),移位相加乘法器耗用的邏輯資源不會(huì)像并行乘法器那樣急劇增加。注:是先移位后相加移位相加乘法示例(0x18600*CNT16D[3:0])Result[20:17]=4‘b0000;//部分積的高位先清零mult[16:0]=17'h186a0;//1000*100=0x186a0Result[16:0]=CNT16D[0]?mult[16:0]:0;for(i=1;i<=3;i=i+1)beginif(CNT16D[i]==1)Result[20:0]=Result[20:0]+(mult[16:0]<<i);end注意:for循環(huán)計(jì)算是在一個(gè)時(shí)鐘周期內(nèi)完成的。

或者程序改為(不能被綜合):Result[20:0]=21‘b0;//部分積先清零mult[16:0]=17‘h186a0;//被乘數(shù)while(CNT16D[3:0]!=4’b0)//注意while循環(huán)不能被綜合beginif(CNT16D[0]==1)beginResult[20:0]=Result[20:0]<<1;Result[20:0]=Result[20:0]+mult[16:0];endelsebeginResult[20:0]=Result[20:0]<<1;endCNT16D[3:0]=CNT16D[3:0]>>1;end為何不能將while(CNT16D[3:0]!=4’b0)改成for循環(huán)然后判斷CNT16D[3:0]==4’b0時(shí)用break語(yǔ)句跳出?答:因?yàn)閂erilog中沒(méi)有break語(yǔ)句。Verilog的for循環(huán)綜合后是硬件的重復(fù),而C語(yǔ)言的for是過(guò)程的重復(fù)。所以說(shuō)在Verilog中沒(méi)有break。3.查找表乘法器查找表乘法器將乘積直接放在存儲(chǔ)器中,將操作數(shù)(乘數(shù)和被乘數(shù))作為地址訪問(wèn)存儲(chǔ)器,得到的輸出數(shù)據(jù)就是乘法運(yùn)算的結(jié)果。查找表方式的乘法器速度只局限于所使用存儲(chǔ)器的存取速度。但由于查找表的規(guī)模隨著操作數(shù)位數(shù)的增加而迅速增大,因此如果用于實(shí)現(xiàn)位數(shù)寬的乘法操作,需要FPGA器件具有較大的片內(nèi)存儲(chǔ)器模塊。比如,要實(shí)現(xiàn)8*8乘法器的地址位寬為16位,字長(zhǎng)為16位(可能性為:28*28=256*256),即存儲(chǔ)器大小為1048576(1M)比特,用這么大的存儲(chǔ)器來(lái)實(shí)現(xiàn)8*8乘法運(yùn)算,顯然是不經(jīng)濟(jì)的。3.除法器設(shè)計(jì):多數(shù)工具對(duì)除法(/)和求模(%)有限制。如對(duì)除法操作,只有當(dāng)除數(shù)是常數(shù),且是2的指數(shù)時(shí)才支持。兩個(gè)無(wú)符號(hào)數(shù)相除的時(shí)序算法是要從被除數(shù)中重復(fù)地減去除法,直到已檢測(cè)到余數(shù)小于除數(shù)。可以通過(guò)累計(jì)減法運(yùn)算的次數(shù)而得到商;余數(shù)的最終值是減法運(yùn)算序列結(jié)束時(shí)被除數(shù)中的剩余值。兩個(gè)有符號(hào)數(shù)相除的最簡(jiǎn)單方法是先將兩數(shù)相除,然后調(diào)整結(jié)果的符號(hào)。其他方法則都比較復(fù)雜。除法器的設(shè)計(jì)方法:一種是直接采用Verilog的除法指令,如:k=127/i;(注意此種方法有綜合工具的限制)另一種是采用移位減法來(lái)實(shí)現(xiàn)除法運(yùn)算(先移位后減);再一種是采用基于除法器宏功能模塊的設(shè)計(jì)。還有一種是將整數(shù)除法轉(zhuǎn)換為小數(shù)乘法的方法實(shí)現(xiàn)。(此時(shí)除數(shù)應(yīng)為常數(shù))移位減法式除法器設(shè)計(jì):除數(shù)應(yīng)大于被除數(shù)的高部分(否則不能保證商位為1);在通用程序的編寫(xiě)中,可以通過(guò)在被除數(shù)前面補(bǔ)0來(lái)實(shí)現(xiàn)。運(yùn)算時(shí)先將被除數(shù)(商+余數(shù))一起左移1位,然后用被除數(shù)的高部分減去除數(shù);判斷前面的減法是否夠減:夠減,則商加1,減法結(jié)果保存為新的余數(shù);不夠減,則商不加1,減法結(jié)果也不要保存;循環(huán)次數(shù)的確定:根據(jù)被除數(shù)位寬-除數(shù)位寬確定,因?yàn)橐莆粶p法到最后被除數(shù)由余數(shù)+商給代替,而余數(shù)總是和除數(shù)的位寬相同,剩下的就是商的寬度(也就是需要循環(huán)的次數(shù))。如果保證程序的通用性的話(即被除數(shù)的高位部分小于或等于除數(shù)),一般在被除數(shù)前面+(除數(shù)位寬)個(gè)0,構(gòu)成新的被除數(shù),這時(shí)的循環(huán)次數(shù)也就等于(原來(lái)被除數(shù)的位寬數(shù))。100|00010100010100-1000101000-1001010000-1000010001-1010100010移位相減移位相減商要加10100010移位相減移位相減余數(shù)+商00101000101000移位減法實(shí)現(xiàn)除法示例(被除數(shù)21+11=32位,除數(shù)11位)

C=0;F0=0;Result[31:21]=11'd0;for(i=0;i<21;i=i+1)//確定循環(huán)次數(shù)

beginC=Result[31];//保存移出的最高位

Result[31:0]=Result[31:0]<<1;if(Result[31:21]>=CNT11bD[10:0])beginF0=1;Result[31:21]=Result[31:21]-CNT11bD[10:0];endelseF0=0;

if(C||F0)Result[0]=1;//商加1end思考:如果要把此除法變?yōu)榱魉€方式應(yīng)該如何設(shè)計(jì)程序?

整數(shù)除法->小數(shù)乘法整數(shù)除法也可以轉(zhuǎn)化為小數(shù)乘法,可以通過(guò)SD編碼方式轉(zhuǎn)化為移位加減法實(shí)現(xiàn)。如:x/278=x*0.0036 SD編碼(SignedDigitNumbers)是將十進(jìn)制數(shù)用數(shù)相加減的形式表示出來(lái),該編碼與傳統(tǒng)的二進(jìn)制編碼不同,它使用3個(gè)值來(lái)表示數(shù)字,即0,1,-1,其中-1常寫(xiě)為。如為整數(shù):2710=3210-410-110=1000002-1002-12=(下標(biāo)表示進(jìn)制)如為小數(shù)(將小數(shù)先乘以128):t1=128*0.8500=108.800=128-16-4+0.5+0.25+0.0625=t2=128*0.0036=0.4608=0.5-0.03125

=t1=

t2=得到:x1*t1-x2*t2=(x1<<7)–((x1<<2)<<2)–(x1<<2)+{x1[7],x1[7:1]}+{x1[7],x[7],x1[7:2]}+{x1[7],x[7],x1[7],x[7],x1[7:4]}–{x2[7],x2[7:1]}–{x2[7],x2[7],x2[7],x2[7],x2[7],x2[7],x2[7:5]}得到結(jié)果后,再將結(jié)果右移7位(因?yàn)閯傞_(kāi)始的小數(shù)乘以了128)。注:乘以128的目的是把SD碼的小數(shù)部分轉(zhuǎn)化為小于8位(最大7位)的二進(jìn)制小數(shù),這樣計(jì)算結(jié)果的右移位數(shù)就可以控制在7位之內(nèi)(最多右移7位),因?yàn)楫?dāng)一個(gè)字節(jié)右移8位后就什么都沒(méi)有,只剩下0了。奇數(shù)分頻與小數(shù)分頻1.奇數(shù)分頻在實(shí)際應(yīng)用中,我們經(jīng)常會(huì)遇到這樣的問(wèn)題,需要進(jìn)行奇數(shù)次分頻,同時(shí)又要得到占空比是50%的方波波形。如果是偶數(shù)次分頻的話,得到占空比是50%的方波并不困難,比如進(jìn)行2N次分頻,只需在計(jì)數(shù)到N-1(從0開(kāi)始)時(shí),波形翻轉(zhuǎn)即可;或者在最后一級(jí)加一個(gè)2分頻器也可實(shí)現(xiàn)。如果是奇數(shù)次分頻的話,可采用如下方法:用兩個(gè)計(jì)數(shù)器,一個(gè)由輸入時(shí)鐘上升沿觸發(fā),一個(gè)由輸入時(shí)鐘下降沿觸發(fā),最后將兩個(gè)計(jì)數(shù)器的輸出相或,即可得到占空比為50%的方波波形。下面的示例就實(shí)現(xiàn)了對(duì)輸入時(shí)鐘CLK的7分頻,同時(shí)得到了占空比為50%的方波。modulecount7(rst,clk,cout);inputclk,rst;outputcout;reg[2:0]m,n;wirecout;regcnt1,cnt2;assigncout=cnt1|cnt2;//兩個(gè)計(jì)數(shù)器的輸出相或always@(posedgeclk)beginif(!rst)begincnt1<=0;m<=0;endelseif(rst)beginif(m==6)beginm<=0;endelsem<=m+1;if(m==2)cnt1=~cnt1;elseif(m==5)cnt1=~cnt1;endendalways@(negedgeclk)beginif(!rst)begincnt2<=0;n<=0;endelseif(rst)beginif(n==6)beginn<=0;endelsen<=n+1;if(n==2)cnt2=~cnt2;elseif(n==5)cnt2=~cnt2;endendendmodule模7奇數(shù)分頻器功能仿真波形圖2.半整數(shù)分頻設(shè)有一個(gè)5MHz的時(shí)鐘信號(hào),但需要得到2MHz的時(shí)鐘,分頻比為2.5,此時(shí)可采用半整數(shù)分頻器。其設(shè)計(jì)思想為:要實(shí)現(xiàn)2.5分頻,可先設(shè)計(jì)一個(gè)模3分頻器,再設(shè)計(jì)一個(gè)脈沖扣除電路,加在模3計(jì)數(shù)器之后,每來(lái)3個(gè)脈沖就扣除半個(gè)脈沖,即可實(shí)現(xiàn)分頻系數(shù)為2.5的半整數(shù)分頻。采用類似的方法可實(shí)現(xiàn)任意半整數(shù)分頻。下圖所示為半整數(shù)分頻器原理圖。通過(guò)異或門(mén)和2分頻模塊組成脈沖扣除電路,脈沖扣除正是輸入頻率與2分頻輸出異或的結(jié)果。下面是采用上述原理設(shè)計(jì)的5.5分頻的程序。modulefdiv5_5(clkin,clr,clkout);inputclkin,clr;outputclkout;regclkout,clk1;wireclk2;integercnt;xorxor1(clk2,clkin,clk1);//異或always@(posedgeclkoutornegedgeclr)//2分頻器beginif(!clr)beginclk1<=1'b0;endelseclk1<=~clk1;endalways@(posedgeclk2ornegedgeclr)//模5分頻器beginif(!clr)begincnt<=0;clkout<=1'b0;endelseif(cnt==5)//更改cnt的值,即可實(shí)現(xiàn)不同模的半整數(shù)分頻,比如6.5,7.5等

begincnt<=0;clkout<=1'b1;endelsebegincnt<=cnt+1;clkout<=1'b0;endendendmodule

3.小數(shù)分頻在實(shí)際應(yīng)用中,還經(jīng)常會(huì)遇到小數(shù)分頻。實(shí)現(xiàn)小數(shù)分頻可采用兩種方法:一種是用數(shù)字鎖相環(huán)實(shí)現(xiàn),先利用鎖相環(huán)電路將輸入時(shí)鐘倍頻,然后再利用分頻器對(duì)新產(chǎn)生的高頻信號(hào)進(jìn)行分頻得到需要的時(shí)鐘頻率。比如要實(shí)現(xiàn)5.7分頻,可以先將輸入的時(shí)鐘10倍頻,然后再將倍頻后的時(shí)鐘57分頻,這樣即可精確實(shí)現(xiàn)5.7的小數(shù)分頻。這種方法的好處是可以做到精確分頻,但是需要器件內(nèi)包含鎖相環(huán)電路PLL。還有一種方法可大致實(shí)現(xiàn)小數(shù)分頻(不精確),即先設(shè)計(jì)兩個(gè)不同分頻比的整數(shù)分頻器,然后通過(guò)控制兩種分頻比出現(xiàn)的不同次數(shù)來(lái)獲得所需要的小數(shù)分頻值,從而實(shí)現(xiàn)平均意義上的小數(shù)分頻。下例就是實(shí)現(xiàn)的一個(gè)分頻系數(shù)為8.1的小數(shù)分頻器,通過(guò)計(jì)數(shù)器先做9次8分頻,再做一次9分頻,這樣總的分頻值(10次分頻的平均值)為:N=(8*9+9*1)/(9+1)=8.1modulefdiv8_1(clkin,rst,clkout);inputclkin,rst;outputclkout;regclkout;reg[3:0]cnt1,cnt2;always@(posedgeclkinornegedgerst)beginif(!rst)begincnt1<=0;cnt2<=0;clkout<=0;endelseif(cnt1<9) //9次8分頻

beginif(cnt2<7)begincnt2<=cnt2+1;clkout<=0;endelsebegincnt2<=0;cnt1<=cnt1+1;clkout<=1;endendelsebegin //1次9分頻

if(cnt2<8)begincnt2<=cnt2+1;clkout<=0;endelsebegincnt2<=0;cnt1<=0;clkout<=1;endendendendmodule8.1小數(shù)分頻功能仿真波形思考:如果分頻系數(shù)為7.2應(yīng)該怎么做?有限狀態(tài)機(jī)設(shè)計(jì)有限狀態(tài)機(jī)(FiniteStateMachine,FSM)是一種很重要的時(shí)序邏輯電路,尤其適合設(shè)計(jì)數(shù)字系統(tǒng)的控制模塊,是許多數(shù)字電路的核心部件。有限狀態(tài)機(jī)的標(biāo)準(zhǔn)模型主要由三部分組成:一是次態(tài)組合邏輯電路,二是由狀態(tài)觸發(fā)器構(gòu)成的現(xiàn)態(tài)時(shí)序邏輯電路,三是輸出組合邏輯電路。根據(jù)電路的輸出信號(hào)是否與電路的輸入有關(guān),有限狀態(tài)機(jī)可分為兩種類型:一類是Mealy(米莉)型狀態(tài)機(jī),其輸出信號(hào)不僅與電路的當(dāng)前狀態(tài)有關(guān),還與電路的輸入有關(guān);另一類是Moore(摩爾)型狀態(tài)機(jī),其輸出狀態(tài)僅與電路的當(dāng)前狀態(tài)有關(guān),與電路的輸入無(wú)關(guān)。狀態(tài)機(jī)一般都應(yīng)設(shè)計(jì)為同步方式,并由一個(gè)時(shí)鐘信號(hào)來(lái)觸發(fā)。實(shí)用的狀態(tài)機(jī)都應(yīng)該設(shè)計(jì)為由唯一時(shí)鐘邊沿觸發(fā)的同步運(yùn)行方式。狀態(tài)轉(zhuǎn)移圖的繪制(檢測(cè)序列110)s0:0s1:1s2:11s3:110狀態(tài)轉(zhuǎn)移圖的繪制(檢測(cè)序列0101)s0:0s1:01s2:010s3:1(無(wú)效狀態(tài))s4:0101如何進(jìn)行狀態(tài)機(jī)編程對(duì)于Mealy型FSM電路來(lái)說(shuō),由于電路的輸出除了與電路的現(xiàn)態(tài)有關(guān)外,還與電路的輸入信號(hào)有關(guān),如果輸入信號(hào)的變化不能及時(shí)被檢測(cè),而要等待時(shí)鐘有效沿到來(lái)時(shí)才進(jìn)行檢測(cè)的話,則電路的輸出很可能是錯(cuò)誤的(例如在上次時(shí)鐘有效沿和本次時(shí)鐘有效沿之間往自動(dòng)售貨機(jī)里快速投入一枚硬幣)。所以在設(shè)計(jì)FSM電路時(shí),建議采用兩個(gè)always塊或者三個(gè)always塊的方法進(jìn)行描述。也就是說(shuō),若時(shí)鐘周期相對(duì)過(guò)長(zhǎng),則會(huì)漏掉輸入信號(hào)。即與輸入信號(hào)有關(guān)的硬件描述語(yǔ)言采用組合邏輯形式。狀態(tài)編碼的定義:parameter方式(一般采用該方式)和`define方式。狀態(tài)轉(zhuǎn)換的描述:一般使用case、casez和casex語(yǔ)句來(lái)描述狀態(tài)之間的轉(zhuǎn)換,用case語(yǔ)句表述比用if-else語(yǔ)句更清晰明了。此外在case語(yǔ)句的最后,不要忘了加上default分支語(yǔ)句,以避免鎖存器的產(chǎn)生。用兩個(gè)always塊描述電路(檢測(cè)序列110)modulepusle(data,clk,nclr,out);inputdata,clk,nclr;outputout;regout;reg[2:0]current_state,next_state;parameter[1:0]s0=0,s1=1,s2=2,s3=3;always@(posedgeclk)//thestateregisterbeginif(!nclr)current_state<=s0;elsecurrent_state<=next_state;end//thecombinationlogic,assignthenext_statealways@(current_stateordata)begincase(current_state)s0:beginout=0;next_state=(data==1)?s1:s0;ends1:beginout=0;next_state=(data==1)?s2:s0;ends2:if(data==1)beginout=0;next_state=s2;endelsebeginout=1;next_state=s3;ends3:beginout=0;next_state=(data==1)?s1:s0;endendcaseendendmodule用三個(gè)always塊描述電路(檢測(cè)序列110)modulepusle(data,clk,nclr,out);inputdata,clk,nclr;outputout;regout;reg[2:0]current_state,next_state;parameter[1:0]s0=0,s1=1,s2=2,s3=3;always@(posedgeclk)//thestateregisterbeginif(!nclr)current_state<=s0;elsecurrent_state<=next_state;end//thecombinationlogic,assignthenext_statealways@(current_stateordata)begincase(current_state)s0:next_state=(data==1)?s1:s0;s1:next_state=(data==1)?s2:s0;s2:if(data==1)next_state=s2;elsenext_state=s3;s3:next_state=(data==1)?s1:s0;endcaseendendmodule//thecombinationallogicblockforoutputsalways@(current_stateordata)begincase(current_state)s0:out=0;s1:out=0;s2:if(data==1)out=0;elseout=1;s3:out=0;endcaseendendmodule

狀態(tài)機(jī)設(shè)計(jì)中要考慮的注意點(diǎn)1)起始狀態(tài)的選擇:起始狀態(tài)是指電路復(fù)位后所處的狀態(tài),選擇一個(gè)合理的起始狀態(tài)將使整個(gè)系統(tǒng)更簡(jiǎn)捷高效。2)狀態(tài)編碼:主要有二進(jìn)制編碼、格雷編碼和一位獨(dú)熱編碼等方式。①二進(jìn)制編碼采用普通的二進(jìn)制代表每個(gè)狀態(tài),如00、01、10、11。這種方式的缺點(diǎn)是狀態(tài)轉(zhuǎn)換時(shí)容易產(chǎn)生毛刺(如01->10),引起邏輯錯(cuò)誤。②格雷編碼相鄰狀態(tài)每次只有一個(gè)比特位產(chǎn)生變化(00、01、11、10),減少了瞬變次數(shù),也減少了產(chǎn)生毛刺和一些暫態(tài)的可能。③一位熱碼編碼即采用n位(或n個(gè)觸發(fā)器)來(lái)編碼n個(gè)狀態(tài)的狀態(tài)機(jī)(如1000、0100、0010、0001)。這樣雖然多用了觸發(fā)器<即需要n個(gè)1位寄存器來(lái)保存n個(gè)位的數(shù)據(jù),與其他編碼方式相比,寄存器使用量增加>,但可以有效節(jié)省和簡(jiǎn)化組合電路。對(duì)于寄存器數(shù)量多而門(mén)邏輯相對(duì)缺乏的FPGA器件來(lái)說(shuō),采用該方式可以有效提高電路的速度和可靠性,也有利于提高器件資源的利用率。因此,對(duì)于FPGA器件建議采用該編碼方式。采用一位熱碼編碼后,會(huì)出現(xiàn)一些多余的狀態(tài),即一些無(wú)效的狀態(tài)。因此,如果用case語(yǔ)句來(lái)描述的話,需要增加default分支項(xiàng),以便在這些狀態(tài)下能自動(dòng)回到起始狀態(tài)。對(duì)于Mealy型FSM電路來(lái)說(shuō),即使?fàn)顟B(tài)變化采用格雷碼或一位熱碼編碼輸出方式也不能保證輸出穩(wěn)定。因?yàn)橐话鉓ealy型FSM電路的最后一級(jí)是采用輸入信號(hào)和當(dāng)前狀態(tài)組成組合邏輯電路的方式,而組合邏輯電路不可避免的產(chǎn)生競(jìng)爭(zhēng)冒險(xiǎn)(如果輸入信號(hào)是兩位以上)。這時(shí)有一種方法可以很好地消除這種輸出結(jié)果不穩(wěn)定現(xiàn)象:就是在最后的輸出端再加一級(jí)鐘控寄存器,就可以不受組合邏輯輸出競(jìng)爭(zhēng)冒險(xiǎn)的影響?;诤旯δ苣K的設(shè)計(jì)QuartusII為設(shè)計(jì)者提供了豐富的宏功能模塊庫(kù),采用宏功能模塊完成設(shè)計(jì)可極大提高電路設(shè)計(jì)的效率和可靠性。QuartusII軟件自帶的宏模塊庫(kù)主要有三個(gè),分別是Megafunctions庫(kù)、Maxplus2庫(kù)和Primitives庫(kù)。Megafunctions庫(kù)是參數(shù)化模塊庫(kù)(LibraryofParametrizedModules,LPM),庫(kù)中是一些經(jīng)過(guò)驗(yàn)證的功能模塊,用戶可以根據(jù)自己的需要設(shè)定模塊的端口(Ports)和參數(shù)(Parameters),即可完成模塊的定制。按照Megafunctions庫(kù)中模塊的功能,將其分為算術(shù)運(yùn)算模塊庫(kù)(arithmetic)、邏輯門(mén)庫(kù)(gates)、存儲(chǔ)器庫(kù)(storage)和IO模塊庫(kù)(I/O)四個(gè)子庫(kù)。有乘法器模塊、除法器模塊、計(jì)數(shù)器模塊、常數(shù)模塊、鎖相環(huán)模塊、存儲(chǔ)器模塊等。時(shí)鐘樹(shù)復(fù)雜的時(shí)鐘方案組合邏輯反饋循環(huán)和脈沖發(fā)生器存儲(chǔ)器,IO專用宏單元總做得和你一樣好綜合工具不能勝任的工作設(shè)計(jì)的可綜合性綜合工具善于優(yōu)化組合邏輯。但設(shè)計(jì)中有很大一部分不是組合邏輯。例如,時(shí)鐘樹(shù)。時(shí)鐘樹(shù)是全局的、芯片范圍的問(wèn)題。在沒(méi)有版圖布局信息的情況下,要給出較優(yōu)的結(jié)果,綜合工具對(duì)塊的大小有一定的限制。綜合工具不能很好地處理復(fù)雜時(shí)鐘。通常,只允許要綜合的塊含有一個(gè)時(shí)鐘。但設(shè)計(jì)中經(jīng)常使用兩相時(shí)鐘或在雙沿時(shí)鐘。綜合工具不易實(shí)現(xiàn)脈沖產(chǎn)生邏輯,如單個(gè)脈沖,或結(jié)果依賴于反饋路徑延遲的組合反饋邏輯。對(duì)這種情況,插入延遲元件使一個(gè)信號(hào)推遲到達(dá)的效果并不好。不能用綜合產(chǎn)生大塊存儲(chǔ)器,因?yàn)榫C合工具會(huì)用flip-flop實(shí)現(xiàn)。不是所有的綜合工具都能很好地從工藝庫(kù)里挑選擇大的單元或宏單元,這需要用戶人工實(shí)例化。一些宏單元,例如大的結(jié)構(gòu)規(guī)則的數(shù)據(jù)通路元件,最好使用生產(chǎn)商提供的硅編譯器產(chǎn)生。綜合工具不保證產(chǎn)生最小結(jié)果。通常綜合結(jié)果不如人工結(jié)果,只要你有足夠的時(shí)間。綜合工具不能勝任的工作

不要引入不必要的latch

敏感表要完整非結(jié)構(gòu)化的for循環(huán)資源共享其它要注意的問(wèn)題

條件分支不完全的條件語(yǔ)句(if和case語(yǔ)句)將會(huì)產(chǎn)生鎖存器always@(cond_1)beginif(cond_1)data_out<=data_in;endalways@(seloraorborcord)begincase(sel)2’b00:a=b;2’b01:a=c;2’b10:a=d;endcaseend不要產(chǎn)生不需要的latch不完整的的敏感表將引起綜合后網(wǎng)表的仿真結(jié)果與以前的不一致。always@(dorclr)if(clr)q=1’b0;elseif(e)q=d;always@(dorclrore)if(clr)q=1’b0;elseif(e)q=d;敏感表要完整綜合工具處理循環(huán)的方法是將循環(huán)內(nèi)的結(jié)構(gòu)重復(fù)。在循環(huán)中包含不變化的表達(dá)式會(huì)使綜合工具花很多時(shí)間優(yōu)化這些冗余邏輯。for(I=0;i<4;i=i+1)beginsig1=sig2;--unchangingstatementdata_out[I]=data_in[I];endsig1=sig2;--unchangingstatementfor(I=0;i<4;i=i+1)data_out[I]=data_in[I];非結(jié)構(gòu)化的for循環(huán)只有在同一個(gè)條件語(yǔ)句(if和case)不同的分支中的算術(shù)操作才會(huì)共享。條件操作符?:中的算術(shù)操作不共享。if(cond)z=a+b;elsez=c+d;Z=(cond)?(a+b):(c+d);資源共享利用括號(hào)分割邏輯。z=a+b+c+d;Z=(a+b)+(c+d);+ab+c+zd+ab+cd+z括號(hào)的作用在進(jìn)行可綜合的數(shù)字系統(tǒng)設(shè)計(jì)時(shí),應(yīng)特別注意以下一些要點(diǎn):1).不使用初始化語(yǔ)句;不使用帶有延時(shí)的描述;不使用循環(huán)次數(shù)不確定的循環(huán)語(yǔ)句,如forever,while等。2).應(yīng)盡量采用同步方式設(shè)計(jì)電路。3).除非是關(guān)鍵路徑的設(shè)計(jì),一般不采用調(diào)用門(mén)級(jí)元件來(lái)描述設(shè)計(jì)的方法,建議采用行為語(yǔ)句來(lái)完成設(shè)計(jì)。4).用always過(guò)程塊描述組合邏輯,應(yīng)在敏感信號(hào)列表中列出塊中出現(xiàn)的所有輸入信號(hào)。5).所有的內(nèi)部寄存器都應(yīng)該能夠被復(fù)位。在使用FPGA實(shí)現(xiàn)設(shè)計(jì)時(shí),應(yīng)盡量使用器件的全局復(fù)位端作為系統(tǒng)總的復(fù)位,因?yàn)樵撘_的驅(qū)動(dòng)功能最強(qiáng),到所有邏輯單元的延時(shí)也基本相同,同樣的道理,應(yīng)盡量使用器件的全局時(shí)鐘端作為系統(tǒng)外部時(shí)鐘輸入。6).在VerilogHDL模塊中,任務(wù)(task)通常被綜合成組合邏輯的形式;每個(gè)函數(shù)(function)在調(diào)用時(shí)通常也被綜合為一個(gè)獨(dú)立的組合電路形式。<任務(wù)一般只在測(cè)試基準(zhǔn)使用,因?yàn)?沒(méi)有時(shí)序控制的任務(wù)如同函數(shù);帶有時(shí)序控制的任務(wù)不

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論