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

下載本文檔

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

文檔簡介

第四講VerilogHDL高級編程技術(shù)參見課本的第4,9,10章加法器設(shè)計乘法器設(shè)計除法器的設(shè)計奇數(shù)分頻與小數(shù)分頻有限狀態(tài)機(jī)設(shè)計基于宏功能模塊的設(shè)計設(shè)計的可綜合性加法器設(shè)計加法、乘法作為基本的運算,大量應(yīng)用在數(shù)字信號處理和數(shù)字通信的各種算法中。由于加法器、乘法器使用頻繁,所以其速度往往影響著整個系統(tǒng)的運行速度。如果可實現(xiàn)快速加法器和快速乘法器的設(shè)計,則可以提高整個系統(tǒng)的速度。加法運算是最基本的運算,在多少情況下,無論是乘法、除法、加法還是FFT等運算,最終都可以分解為加法運算來實現(xiàn)。加法運算有:級連加法器、并行加法器、超前進(jìn)位加法器、流水線加法器等1.級連加法器的設(shè)計見課本P184-P185。級連加法器是由1位全加器級連構(gòu)成的,本級的進(jìn)位輸出作為下一級的進(jìn)位輸入。級連加法器結(jié)構(gòu)簡單,但N位級連加法運算的延時是1位全加器的N倍,延時主要是進(jìn)位信號級連造成的。在需要高性能的設(shè)計中,這種加法結(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的加法運算符直接描述,借助于EDA綜合軟件和HDL描述語言,實現(xiàn)起來很容易,其運算速度快,但耗用資源多,尤其是當(dāng)加法運算的位數(shù)較寬時,其耗用的資源將會較大。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è)計中的一個主要問題就是要維持系統(tǒng)時鐘的速度處于或高于某一頻率。例如,如果整個系統(tǒng)是一個全同步時鐘,同時又必須運行在25MHz的頻率上,那么,從任何寄存器的輸出到它饋給信號的寄存器輸入路徑間的最大時延必須小于40ns。如果通過某些復(fù)雜邏輯的延時路徑比較長,系統(tǒng)時鐘的速度就很難維持。這時,就必須在組合邏輯間插入觸發(fā)器,使復(fù)雜的組合邏輯形成流水線。雖然流水線會增加器件資源的使用,但它降低了寄存器間的傳播延時,保證系統(tǒng)維持高的系統(tǒng)時鐘速度。流水線設(shè)計的基本思想是在邏輯電路中加入若干寄存器來暫存中間結(jié)果,雖然多用了一些寄存器資源,但減少了每一級組合電路的時延,因此可提高整個電路的運行效率。流水線設(shè)計可有效提高系統(tǒng)的工作頻率,尤其是對于FPGA器件。FPGA的邏輯單元中有大量4到5變量的查找表(LUT)以及大量的觸發(fā)器,因此在FPGA設(shè)計中采用流水線技術(shù)可以有效提高系統(tǒng)的速度。實際中的乘法器大多是有時鐘引腳的,以連續(xù)不斷地進(jìn)行乘法運算。在有時鐘信號的乘法器中,可以采用流水線設(shè)計技術(shù),以提高系統(tǒng)的運行頻率。同樣加法器也可以采用流水線設(shè)計。下面的例子就是一個兩個流水8位加法,由兩個4位加法器構(gòu)成,輸出存儲在寄存器中。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è)計乘法器也頻繁使用在數(shù)字信號處理和數(shù)字通信的各種算法中,并且往往影響著整個系統(tǒng)的運行速度,所以如果能實現(xiàn)快速乘法器的設(shè)計,可提高整個系統(tǒng)的處理速度。乘法器的設(shè)計方法主要有:并行運算(純組合邏輯)、移位相加、查找表、加法樹等。1.并行乘法器:并行乘法器是純組合邏輯的乘法器,完全由邏輯門實現(xiàn)。對于1ⅹ1乘法,只需1個與門即可實現(xiàn),P=A·B。對于2ⅹ2乘法,根據(jù)課本P189的真值表可以得出結(jié)果表達(dá)式:因此我們可以用與門、或門來實現(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器件實現(xiàn)的話,需耗用106個LE單元。而如果所用的FPGA器件中有嵌入式乘法器的話,則可采用嵌入式乘法器來實現(xiàn)乘法,比如將上例適配到CycloneII系列的EP2C5器件的話,只耗用1個LE單元和1個9位*9位的嵌入式乘法器單元。因此,如果所用的FPGA器件中有硬件乘法器,建議用硬件乘法器來實現(xiàn)乘法操作,具有速度快,資源利用合理等優(yōu)點。2.移位相加乘法器移位相加乘法器將乘法變?yōu)榧臃▽崿F(xiàn),其設(shè)計思路是:乘法通過逐次移位相加實現(xiàn),每次判斷乘數(shù)的最低位,若為1則將被乘數(shù)移位相加。被乘數(shù)A1101乘數(shù)B×1011部分積01101A左移

11010

部分積1100111A左移

000000部分積2100111A左移

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

注:如果B的最低有效位為0時,只需接著移位,不要相加移位相加乘法器是一種相對節(jié)省資源的設(shè)計方法,為了實現(xiàn)n×n乘法,需要一個2n位的左移寄存器(存放部分積),一個n位的右移寄存器(可用除數(shù)寄存器代替),一個2n位加法器(被加數(shù)為部分積和被乘數(shù),所以還需要一個被乘數(shù)寄存器),再加少量的控制邏輯即可實現(xiàn)。尤其是當(dāng)操作數(shù)位寬增加時,移位相加乘法器耗用的邏輯資源不會像并行乘法器那樣急劇增加。注:是先移位后相加移位相加乘法示例(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)計算是在一個時鐘周期內(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時用break語句跳出?答:因為Verilog中沒有break語句。Verilog的for循環(huán)綜合后是硬件的重復(fù),而C語言的for是過程的重復(fù)。所以說在Verilog中沒有break。3.查找表乘法器查找表乘法器將乘積直接放在存儲器中,將操作數(shù)(乘數(shù)和被乘數(shù))作為地址訪問存儲器,得到的輸出數(shù)據(jù)就是乘法運算的結(jié)果。查找表方式的乘法器速度只局限于所使用存儲器的存取速度。但由于查找表的規(guī)模隨著操作數(shù)位數(shù)的增加而迅速增大,因此如果用于實現(xiàn)位數(shù)寬的乘法操作,需要FPGA器件具有較大的片內(nèi)存儲器模塊。比如,要實現(xiàn)8*8乘法器的地址位寬為16位,字長為16位(可能性為:28*28=256*256),即存儲器大小為1048576(1M)比特,用這么大的存儲器來實現(xiàn)8*8乘法運算,顯然是不經(jīng)濟(jì)的。3.除法器設(shè)計:多數(shù)工具對除法(/)和求模(%)有限制。如對除法操作,只有當(dāng)除數(shù)是常數(shù),且是2的指數(shù)時才支持。兩個無符號數(shù)相除的時序算法是要從被除數(shù)中重復(fù)地減去除法,直到已檢測到余數(shù)小于除數(shù)??梢酝ㄟ^累計減法運算的次數(shù)而得到商;余數(shù)的最終值是減法運算序列結(jié)束時被除數(shù)中的剩余值。兩個有符號數(shù)相除的最簡單方法是先將兩數(shù)相除,然后調(diào)整結(jié)果的符號。其他方法則都比較復(fù)雜。除法器的設(shè)計方法:一種是直接采用Verilog的除法指令,如:k=127/i;(注意此種方法有綜合工具的限制)另一種是采用移位減法來實現(xiàn)除法運算(先移位后減);再一種是采用基于除法器宏功能模塊的設(shè)計。還有一種是將整數(shù)除法轉(zhuǎn)換為小數(shù)乘法的方法實現(xiàn)。(此時除數(shù)應(yīng)為常數(shù))移位減法式除法器設(shè)計:除數(shù)應(yīng)大于被除數(shù)的高部分(否則不能保證商位為1);在通用程序的編寫中,可以通過在被除數(shù)前面補(bǔ)0來實現(xiàn)。運算時先將被除數(shù)(商+余數(shù))一起左移1位,然后用被除數(shù)的高部分減去除數(shù);判斷前面的減法是否夠減:夠減,則商加1,減法結(jié)果保存為新的余數(shù);不夠減,則商不加1,減法結(jié)果也不要保存;循環(huán)次數(shù)的確定:根據(jù)被除數(shù)位寬-除數(shù)位寬確定,因為移位減法到最后被除數(shù)由余數(shù)+商給代替,而余數(shù)總是和除數(shù)的位寬相同,剩下的就是商的寬度(也就是需要循環(huán)的次數(shù))。如果保證程序的通用性的話(即被除數(shù)的高位部分小于或等于除數(shù)),一般在被除數(shù)前面+(除數(shù)位寬)個0,構(gòu)成新的被除數(shù),這時的循環(huán)次數(shù)也就等于(原來被除數(shù)的位寬數(shù))。100|00010100010100-1000101000-1001010000-1000010001-1010100010移位相減移位相減商要加10100010移位相減移位相減余數(shù)+商00101000101000移位減法實現(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è)計程序?

整數(shù)除法->小數(shù)乘法整數(shù)除法也可以轉(zhuǎn)化為小數(shù)乘法,可以通過SD編碼方式轉(zhuǎn)化為移位加減法實現(xiàn)。如:x/278=x*0.0036 SD編碼(SignedDigitNumbers)是將十進(jìn)制數(shù)用數(shù)相加減的形式表示出來,該編碼與傳統(tǒng)的二進(jìn)制編碼不同,它使用3個值來表示數(shù)字,即0,1,-1,其中-1常寫為。如為整數(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位(因為剛開始的小數(shù)乘以了128)。注:乘以128的目的是把SD碼的小數(shù)部分轉(zhuǎn)化為小于8位(最大7位)的二進(jìn)制小數(shù),這樣計算結(jié)果的右移位數(shù)就可以控制在7位之內(nèi)(最多右移7位),因為當(dāng)一個字節(jié)右移8位后就什么都沒有,只剩下0了。奇數(shù)分頻與小數(shù)分頻1.奇數(shù)分頻在實際應(yīng)用中,我們經(jīng)常會遇到這樣的問題,需要進(jìn)行奇數(shù)次分頻,同時又要得到占空比是50%的方波波形。如果是偶數(shù)次分頻的話,得到占空比是50%的方波并不困難,比如進(jìn)行2N次分頻,只需在計數(shù)到N-1(從0開始)時,波形翻轉(zhuǎn)即可;或者在最后一級加一個2分頻器也可實現(xiàn)。如果是奇數(shù)次分頻的話,可采用如下方法:用兩個計數(shù)器,一個由輸入時鐘上升沿觸發(fā),一個由輸入時鐘下降沿觸發(fā),最后將兩個計數(shù)器的輸出相或,即可得到占空比為50%的方波波形。下面的示例就實現(xiàn)了對輸入時鐘CLK的7分頻,同時得到了占空比為50%的方波。modulecount7(rst,clk,cout);inputclk,rst;outputcout;reg[2:0]m,n;wirecout;regcnt1,cnt2;assigncout=cnt1|cnt2;//兩個計數(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è)有一個5MHz的時鐘信號,但需要得到2MHz的時鐘,分頻比為2.5,此時可采用半整數(shù)分頻器。其設(shè)計思想為:要實現(xiàn)2.5分頻,可先設(shè)計一個模3分頻器,再設(shè)計一個脈沖扣除電路,加在模3計數(shù)器之后,每來3個脈沖就扣除半個脈沖,即可實現(xiàn)分頻系數(shù)為2.5的半整數(shù)分頻。采用類似的方法可實現(xiàn)任意半整數(shù)分頻。下圖所示為半整數(shù)分頻器原理圖。通過異或門和2分頻模塊組成脈沖扣除電路,脈沖扣除正是輸入頻率與2分頻輸出異或的結(jié)果。下面是采用上述原理設(shè)計的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的值,即可實現(xiàn)不同模的半整數(shù)分頻,比如6.5,7.5等

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

3.小數(shù)分頻在實際應(yīng)用中,還經(jīng)常會遇到小數(shù)分頻。實現(xiàn)小數(shù)分頻可采用兩種方法:一種是用數(shù)字鎖相環(huán)實現(xiàn),先利用鎖相環(huán)電路將輸入時鐘倍頻,然后再利用分頻器對新產(chǎn)生的高頻信號進(jìn)行分頻得到需要的時鐘頻率。比如要實現(xiàn)5.7分頻,可以先將輸入的時鐘10倍頻,然后再將倍頻后的時鐘57分頻,這樣即可精確實現(xiàn)5.7的小數(shù)分頻。這種方法的好處是可以做到精確分頻,但是需要器件內(nèi)包含鎖相環(huán)電路PLL。還有一種方法可大致實現(xiàn)小數(shù)分頻(不精確),即先設(shè)計兩個不同分頻比的整數(shù)分頻器,然后通過控制兩種分頻比出現(xiàn)的不同次數(shù)來獲得所需要的小數(shù)分頻值,從而實現(xiàn)平均意義上的小數(shù)分頻。下例就是實現(xiàn)的一個分頻系數(shù)為8.1的小數(shù)分頻器,通過計數(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è)計有限狀態(tài)機(jī)(FiniteStateMachine,FSM)是一種很重要的時序邏輯電路,尤其適合設(shè)計數(shù)字系統(tǒng)的控制模塊,是許多數(shù)字電路的核心部件。有限狀態(tài)機(jī)的標(biāo)準(zhǔn)模型主要由三部分組成:一是次態(tài)組合邏輯電路,二是由狀態(tài)觸發(fā)器構(gòu)成的現(xiàn)態(tài)時序邏輯電路,三是輸出組合邏輯電路。根據(jù)電路的輸出信號是否與電路的輸入有關(guān),有限狀態(tài)機(jī)可分為兩種類型:一類是Mealy(米莉)型狀態(tài)機(jī),其輸出信號不僅與電路的當(dāng)前狀態(tài)有關(guān),還與電路的輸入有關(guān);另一類是Moore(摩爾)型狀態(tài)機(jī),其輸出狀態(tài)僅與電路的當(dāng)前狀態(tài)有關(guān),與電路的輸入無關(guān)。狀態(tài)機(jī)一般都應(yīng)設(shè)計為同步方式,并由一個時鐘信號來觸發(fā)。實用的狀態(tài)機(jī)都應(yīng)該設(shè)計為由唯一時鐘邊沿觸發(fā)的同步運行方式。狀態(tài)轉(zhuǎn)移圖的繪制(檢測序列110)s0:0s1:1s2:11s3:110狀態(tài)轉(zhuǎn)移圖的繪制(檢測序列0101)s0:0s1:01s2:010s3:1(無效狀態(tài))s4:0101如何進(jìn)行狀態(tài)機(jī)編程對于Mealy型FSM電路來說,由于電路的輸出除了與電路的現(xiàn)態(tài)有關(guān)外,還與電路的輸入信號有關(guān),如果輸入信號的變化不能及時被檢測,而要等待時鐘有效沿到來時才進(jìn)行檢測的話,則電路的輸出很可能是錯誤的(例如在上次時鐘有效沿和本次時鐘有效沿之間往自動售貨機(jī)里快速投入一枚硬幣)。所以在設(shè)計FSM電路時,建議采用兩個always塊或者三個always塊的方法進(jìn)行描述。也就是說,若時鐘周期相對過長,則會漏掉輸入信號。即與輸入信號有關(guān)的硬件描述語言采用組合邏輯形式。狀態(tài)編碼的定義:parameter方式(一般采用該方式)和`define方式。狀態(tài)轉(zhuǎn)換的描述:一般使用case、casez和casex語句來描述狀態(tài)之間的轉(zhuǎn)換,用case語句表述比用if-else語句更清晰明了。此外在case語句的最后,不要忘了加上default分支語句,以避免鎖存器的產(chǎn)生。用兩個always塊描述電路(檢測序列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用三個always塊描述電路(檢測序列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è)計中要考慮的注意點1)起始狀態(tài)的選擇:起始狀態(tài)是指電路復(fù)位后所處的狀態(tài),選擇一個合理的起始狀態(tài)將使整個系統(tǒng)更簡捷高效。2)狀態(tài)編碼:主要有二進(jìn)制編碼、格雷編碼和一位獨熱編碼等方式。①二進(jìn)制編碼采用普通的二進(jìn)制代表每個狀態(tài),如00、01、10、11。這種方式的缺點是狀態(tài)轉(zhuǎn)換時容易產(chǎn)生毛刺(如01->10),引起邏輯錯誤。②格雷編碼相鄰狀態(tài)每次只有一個比特位產(chǎn)生變化(00、01、11、10),減少了瞬變次數(shù),也減少了產(chǎn)生毛刺和一些暫態(tài)的可能。③一位熱碼編碼即采用n位(或n個觸發(fā)器)來編碼n個狀態(tài)的狀態(tài)機(jī)(如1000、0100、0010、0001)。這樣雖然多用了觸發(fā)器<即需要n個1位寄存器來保存n個位的數(shù)據(jù),與其他編碼方式相比,寄存器使用量增加>,但可以有效節(jié)省和簡化組合電路。對于寄存器數(shù)量多而門邏輯相對缺乏的FPGA器件來說,采用該方式可以有效提高電路的速度和可靠性,也有利于提高器件資源的利用率。因此,對于FPGA器件建議采用該編碼方式。采用一位熱碼編碼后,會出現(xiàn)一些多余的狀態(tài),即一些無效的狀態(tài)。因此,如果用case語句來描述的話,需要增加default分支項,以便在這些狀態(tài)下能自動回到起始狀態(tài)。對于Mealy型FSM電路來說,即使?fàn)顟B(tài)變化采用格雷碼或一位熱碼編碼輸出方式也不能保證輸出穩(wěn)定。因為一般Mealy型FSM電路的最后一級是采用輸入信號和當(dāng)前狀態(tài)組成組合邏輯電路的方式,而組合邏輯電路不可避免的產(chǎn)生競爭冒險(如果輸入信號是兩位以上)。這時有一種方法可以很好地消除這種輸出結(jié)果不穩(wěn)定現(xiàn)象:就是在最后的輸出端再加一級鐘控寄存器,就可以不受組合邏輯輸出競爭冒險的影響?;诤旯δ苣K的設(shè)計QuartusII為設(shè)計者提供了豐富的宏功能模塊庫,采用宏功能模塊完成設(shè)計可極大提高電路設(shè)計的效率和可靠性。QuartusII軟件自帶的宏模塊庫主要有三個,分別是Megafunctions庫、Maxplus2庫和Primitives庫。Megafunctions庫是參數(shù)化模塊庫(LibraryofParametrizedModules,LPM),庫中是一些經(jīng)過驗證的功能模塊,用戶可以根據(jù)自己的需要設(shè)定模塊的端口(Ports)和參數(shù)(Parameters),即可完成模塊的定制。按照Megafunctions庫中模塊的功能,將其分為算術(shù)運算模塊庫(arithmetic)、邏輯門庫(gates)、存儲器庫(storage)和IO模塊庫(I/O)四個子庫。有乘法器模塊、除法器模塊、計數(shù)器模塊、常數(shù)模塊、鎖相環(huán)模塊、存儲器模塊等。時鐘樹復(fù)雜的時鐘方案組合邏輯反饋循環(huán)和脈沖發(fā)生器存儲器,IO專用宏單元總做得和你一樣好綜合工具不能勝任的工作設(shè)計的可綜合性綜合工具善于優(yōu)化組合邏輯。但設(shè)計中有很大一部分不是組合邏輯。例如,時鐘樹。時鐘樹是全局的、芯片范圍的問題。在沒有版圖布局信息的情況下,要給出較優(yōu)的結(jié)果,綜合工具對塊的大小有一定的限制。綜合工具不能很好地處理復(fù)雜時鐘。通常,只允許要綜合的塊含有一個時鐘。但設(shè)計中經(jīng)常使用兩相時鐘或在雙沿時鐘。綜合工具不易實現(xiàn)脈沖產(chǎn)生邏輯,如單個脈沖,或結(jié)果依賴于反饋路徑延遲的組合反饋邏輯。對這種情況,插入延遲元件使一個信號推遲到達(dá)的效果并不好。不能用綜合產(chǎn)生大塊存儲器,因為綜合工具會用flip-flop實現(xiàn)。不是所有的綜合工具都能很好地從工藝庫里挑選擇大的單元或宏單元,這需要用戶人工實例化。一些宏單元,例如大的結(jié)構(gòu)規(guī)則的數(shù)據(jù)通路元件,最好使用生產(chǎn)商提供的硅編譯器產(chǎn)生。綜合工具不保證產(chǎn)生最小結(jié)果。通常綜合結(jié)果不如人工結(jié)果,只要你有足夠的時間。綜合工具不能勝任的工作

不要引入不必要的latch

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

條件分支不完全的條件語句(if和case語句)將會產(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á)式會使綜合工具花很多時間優(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)只有在同一個條件語句(if和case)不同的分支中的算術(shù)操作才會共享。條件操作符?:中的算術(shù)操作不共享。if(cond)z=a+b;elsez=c+d;Z=(cond)?(a+b):(c+d);資源共享利用括號分割邏輯。z=a+b+c+d;Z=(a+b)+(c+d);+ab+c+zd+ab+cd+z括號的作用在進(jìn)行可綜合的數(shù)字系統(tǒng)設(shè)計時,應(yīng)特別注意以下一些要點:1).不使用初始化語句;不使用帶有延時的描述;不使用循環(huán)次數(shù)不確定的循環(huán)語句,如forever,while等。2).應(yīng)盡量采用同步方式設(shè)計電路。3).除非是關(guān)鍵路徑的設(shè)計,一般不采用調(diào)用門級元件來描述設(shè)計的方法,建議采用行為語句來完成設(shè)計。4).用always過程塊描述組合邏輯,應(yīng)在敏感信號列表中列出塊中出現(xiàn)的所有輸入信號。5).所有的內(nèi)部寄存器都應(yīng)該能夠被復(fù)位。在使用FPGA實現(xiàn)設(shè)計時,應(yīng)盡量使用器件的全局復(fù)位端作為系統(tǒng)總的復(fù)位,因為該引腳的驅(qū)動功能最強(qiáng),到所有邏輯單元的延時也基本相同,同樣的道理,應(yīng)盡量使用器件的全局時鐘端作為系統(tǒng)外部時鐘輸入。6).在VerilogHDL模塊中,任務(wù)(task)通常被綜合成組合邏輯的形式;每個函數(shù)(function)在調(diào)用時通常也被綜合為一個獨立的組合電路形式。<任務(wù)一般只在測試基準(zhǔn)使用,因為:沒有時序控制的任務(wù)如同函數(shù);帶有時序控制的任務(wù)不

溫馨提示

  • 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

提交評論