VerilogHDL數(shù)字設(shè)計(jì)教程(賀敬凱)第4章_第1頁
VerilogHDL數(shù)字設(shè)計(jì)教程(賀敬凱)第4章_第2頁
VerilogHDL數(shù)字設(shè)計(jì)教程(賀敬凱)第4章_第3頁
VerilogHDL數(shù)字設(shè)計(jì)教程(賀敬凱)第4章_第4頁
VerilogHDL數(shù)字設(shè)計(jì)教程(賀敬凱)第4章_第5頁
已閱讀5頁,還剩124頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

4.1常用組合邏輯電路設(shè)計(jì)4.2常用時(shí)序邏輯電路設(shè)計(jì)

4.3小結(jié)

習(xí)題44.1常用組合邏輯電路設(shè)計(jì)

理論上,可利用化簡真值表并采用邏輯門來實(shí)現(xiàn)電路的方法,對所有組合電路進(jìn)行設(shè)計(jì),但使用該方法設(shè)計(jì)大型組合電路則不太現(xiàn)實(shí)。例如,一個(gè)有12個(gè)輸入的電路,在真值表中會有212?=?4?K行。降低復(fù)雜度的一種方法就是采用比邏輯門功能更強(qiáng)大的組合元件,圖4-1列出了常用的幾種組合元件。圖4-1組合元件下面使用VerilogHDL分別對上述組合元件及常用的組合邏輯電路進(jìn)行建模。1.數(shù)據(jù)選擇器例4-1實(shí)現(xiàn)了一個(gè)n位,m?×?1的數(shù)據(jù)選擇器?!纠?-1】參數(shù)型n位,m?×?1數(shù)據(jù)選擇器。

modulemultiplexer_N(X1,X2,X3,X4,sel,Y);

parameterN=8;//該參數(shù)定義了一個(gè)8位的4選1多路選擇器

input[N-1:0]X1,X2,X3,X4;input[1:0]sel;outputreg[N-1:0]Y;always@(sel,X1,X2,X3,X4) case(sel) 2'b00:Y=X1; 2'b01:Y=X2; 2'b10:Y=X3; 2'b11:Y=X4;endcaseendmodule程序說明:(1)程序中定義了4個(gè)輸入X1、X2、X3、X4,一個(gè)輸出Y,使用控制信號sel選擇4個(gè)輸入中的1個(gè)賦給Y。(2)程序中使用parameter定義了一個(gè)參數(shù)常量N,通過修改參數(shù)可以很容易地改變輸入、輸出的位數(shù)。2.譯碼器例4-2實(shí)現(xiàn)了一個(gè)log2n?×?n的譯碼器?!纠?-2】參數(shù)型log2n?×?n譯碼器。

moduledecode_N(sel,Y);

parameterN=4; //該參數(shù)定義了一個(gè)4輸出(4位)譯碼器

input[1:0]sel; //此參數(shù)為2位,通過計(jì)算log24=2可得到4輸出譯碼器

outputreg[N-1:0]Y;

always@(sel)

case(sel)

2'b00:Y=4'b0001; 2'b01:Y=4'b0010; 2'b10:Y=4'b0100; 2'b11:Y=4'b1000;endcaseendmodule程序說明:

(1)程序中定義了一個(gè)輸入sel,一個(gè)輸出Y,使用控制信號sel來確定Y的輸出。(2)由于本程序涉及求以2為底的對數(shù)計(jì)算,因此若修改參數(shù)N,sel的位數(shù)就要手工做相應(yīng)調(diào)整,這樣才可實(shí)現(xiàn)任意位數(shù)的譯碼器。3.加法器例4-3實(shí)現(xiàn)了N位加法器?!纠?-3】參數(shù)型N位加法器。moduleadd_N(X,Y,sum,co);

parameterN=8;

input[N-1:0]X,Y;output[N-1:0]sum;outputco;assign{co,sum}=X+Y;endmodule程序說明:(1)程序中,X和Y分別為加數(shù)和被加數(shù),sum和co分別為本位和及進(jìn)位。(2)本例使用數(shù)據(jù)流建模實(shí)現(xiàn),在綜合時(shí)會自動(dòng)映射為QuartusⅡ自帶的加法器宏功能模塊。4.乘法器例4-4實(shí)現(xiàn)了N位乘法器?!纠?-4】參數(shù)型N位乘法器。

modulemul_N(X,Y,mul);

parameterN=8;

input[N-1:0]X,Y;

output[2*N-1:0]mul;

assignmul=X*Y;

endmodule程序說明:

(1)程序中,X和Y分別為乘數(shù)和被乘數(shù),mul為兩者的積。(2)本例使用數(shù)據(jù)流建模實(shí)現(xiàn),在綜合時(shí),會自動(dòng)映射為QuartusⅡ自帶的乘法器宏功能模塊。5.比較器例4-5實(shí)現(xiàn)了N位比較器?!纠?-5】參數(shù)型N位比較器。

modulecompare_N(X,Y,X_gt_Y,X_eq_Y,X_lt_Y);

parameterN=8;//參與比較的數(shù)的位數(shù)為8

nput[N-1:0]X,Y;

outputregX_gt_Y,X_eq_Y,X_lt_Y;always@(X,Y)

if(X>Y)

beginX_gt_Y=1;X_eq_Y=0;X_lt_Y=0;end elseif(X==Y) beginX_gt_Y=0;X_eq_Y=1;X_lt_Y=0;end else beginX_gt_Y=0;X_eq_Y=0;X_lt_Y=1;endendmodule程序說明:(1)比較器實(shí)現(xiàn)的功能見表4-1。(2)比較器有3個(gè)輸出,在任一時(shí)刻僅有一個(gè)輸出為1,即僅有一個(gè)輸出有效。6.?ALU例4-6實(shí)現(xiàn)了一個(gè)n位、m功能的ALU?!纠?-6】參數(shù)型n位、m功能ALU。

modulealu_N(X,Y,sel,result);

parameterN=8;

input[2:0]sel;//3位可定義m=8功能

input[N-1:0]X,Y;

outputreg[N-1:0]result;

always@(X,Y,sel)

begin case(sel) 3'b000:result=X+Y;//加法

3'b001:result=X-Y;//減法

3'b010:result=X<<1;//左移1位

3'b011:result=X>>1;//右移1位

3'b100:result=X&Y;//相與 3'b101:result=X^Y;//異或 3'b110:result=~X;//求反 3'b111:result=X;//直通 endcaseendendmodule程序說明:(1)?ALU實(shí)現(xiàn)的功能見表4-2。(2)算術(shù)邏輯運(yùn)算ALU通過一條或多條輸入總線完成算術(shù)或邏輯運(yùn)算。ALU是CPU的核心部件之一,是設(shè)計(jì)CPU時(shí)必不可少的內(nèi)容。7.三態(tài)總線引入三態(tài)門有許多實(shí)際的應(yīng)用,如CPU設(shè)計(jì)中的數(shù)據(jù)和地址總線的構(gòu)建、RAM或堆棧的數(shù)據(jù)端口的設(shè)計(jì)等。在設(shè)計(jì)中,若對變量賦值為z,則會引入三態(tài)門,并在控制下可使其輸出呈高阻態(tài),這等效于三態(tài)門禁止輸出。三態(tài)門設(shè)計(jì)示例如例4-7。【例4-7】設(shè)計(jì)三態(tài)門。moduletri_s(enable,datain,dataout);parameterN=8;inputenable;input[N-1:0]datain;outputreg[N-1:0]dataout;always@(enable,datain) if(enable==1)dataout=datain; elsedataout='bz;endmodule程序說明:(1)本程序在QuartusⅡ中的綜合結(jié)果如圖4-2所示。

從圖中可以看出,三態(tài)門綜合后映射成了VerilogHDL的基本門原語buf。圖4-2三態(tài)門控制電路的綜合結(jié)果(2)參數(shù)N表示輸入、輸出的數(shù)據(jù)位寬,改變參數(shù)即可改變輸入、輸出的數(shù)據(jù)位寬,從而增強(qiáng)程序的可移植性。為構(gòu)成數(shù)字系統(tǒng)內(nèi)部的總線系統(tǒng),必須設(shè)計(jì)三態(tài)總線驅(qū)動(dòng)器電路,這可以有多種表達(dá)方法,但必須注意信號多驅(qū)動(dòng)源的處理問題。例4-8、例4-9和例4-10都試圖描述一個(gè)8位4通道的三態(tài)總線驅(qū)動(dòng)器,但其中有一個(gè)程序不能得到預(yù)期的結(jié)果?!纠?-8】N位4通道的三態(tài)總線驅(qū)動(dòng)器。moduletri_bus(input3,input2,input1,input0,enable,out);parameterN=8;input[N-1:0]input3,input2,input1,input0;input[1:0]enable;outputreg[N-1:0]out;always@(enable,input3,input2,input1,input0)beginif(enable==2'b00)out=input3;elseout='bz;if(enable==2'b01)out=input2;elseout='bz;if(enable==2'b10)out=input1;elseout='bz;if(enable==2'b11)out=input0;elseout='bz;endendmodule【例4-9】N位4通道的三態(tài)總線驅(qū)動(dòng)器(實(shí)現(xiàn)方法1)。moduletri_bus_2(input3,input2,input1,input0,enable,out);parameterN=8;input[N-1:0]input3,input2,input1,input0;input[1:0]enable;output[N-1:0]out;assignout=(enable==2'b00)?input3:'bz,out=(enable==2'b01)?input2:'bz,out=(enable==2'b10)?input1:'bz,out=(enable==2'b11)?input0:'bz;endmodule【例4-10】N位4通道的三態(tài)總線驅(qū)動(dòng)器(實(shí)現(xiàn)方法2)。moduletri_bus_3(input3,input2,input1,input0,enable,out);parameterN=8;input[N-1:0]input3,input2,input1,input0;input[1:0]enable;outputreg[N-1:0]out;always@(enable,input3,input2,input1,input0)beginif(enable==2'b00)out=input3; elseout='bz;endalways@(enable,input3,input2,input1,input0)beginif(enable==2'b01)out=input2;elseout='bz;endalways@(enable,input3,input2,input1,input0)beginif(enable==2'b10)out=input1;elseout='bz;

endalways@(enable,input3,input2,input1,input0)begin if(enable==2'b11)out=input0; elseout='bz;endendmodule對例4-8、例4-9和例4-10的程序說明如下:(1)例4-8和例4-9、例4-10在QuartusⅡ中綜合的結(jié)果分別如圖4-3和圖4-4所示。圖4-3例4-8的綜合結(jié)果圖4-4例4-9、例4-10的綜合結(jié)果從綜合結(jié)果來看,例4-8沒有得到預(yù)期的效果。(2)例4-8和例4-9、例4-10在QuartusⅡ中仿真的結(jié)果分別如圖4-5和圖4-6所示。圖4-6例4-9、例4-10的仿真結(jié)果從仿真結(jié)果也可以看出,例4-8沒有得到預(yù)期的效果。(3)例4-8在一個(gè)always塊中放了4個(gè)順序完成的if語句,并且是完整的條件描述語句。粗看此程序認(rèn)為會產(chǎn)生4個(gè)N位的三態(tài)控制通道,且輸出只有一個(gè)信號out。但是,細(xì)心的讀者可能會發(fā)現(xiàn),在例4-8的always塊中輸出信號有4個(gè)賦值源,也就是4個(gè)if語句都是對out進(jìn)行賦值,這樣在綜合時(shí),只有最后一個(gè)if語句起作用,也就是說前3個(gè)if語句沒有任何意義,從綜合結(jié)果可以清楚地看到這一點(diǎn)。下面再通過一個(gè)小例子進(jìn)行說明?!纠?-11】多個(gè)賦值源的賦值語句。always@(a,b,c,d)begin out=a; out=b; out=c; out=d;end讀者很容易理解,out的值為d,always塊中的前三條語句沒有意義。事實(shí)上,例4-8的道理跟這個(gè)例子的道理是一樣的。(4)例4-9由于使用了4個(gè)并列的assign并行語句,因此能綜合出正確的結(jié)果。這是因?yàn)?,每一條assign語句都等同于一個(gè)獨(dú)立運(yùn)行的always塊,每一條assign語句右側(cè)表達(dá)式中的所有變量等同于always塊中的敏感信號列表,只要有一個(gè)發(fā)生變化,assign語句就立刻執(zhí)行。因此,例4-9和例4-10是等價(jià)的,從綜合和仿真的結(jié)果也可以證明這一點(diǎn)。(5)例4-9和例4-10表明,要設(shè)計(jì)出能產(chǎn)生獨(dú)立控制的多通道的電路結(jié)構(gòu),必須使用并行語句結(jié)構(gòu)。但應(yīng)注意,例4-9和例4-10中對同一個(gè)輸出信號out有4個(gè)并行賦值源,在實(shí)際電路中完全可能發(fā)生“線與”。所以,在程序中,每個(gè)賦值源都使用了if…else…結(jié)構(gòu),保證了條件不滿足時(shí),其輸出為高阻態(tài)值“z”,這樣可以保證不會發(fā)生“線與”。但如果條件不滿足,其輸出不為高阻態(tài)值,那么就無法得到預(yù)期的結(jié)果。4.2常用時(shí)序邏輯電路設(shè)計(jì)

時(shí)序邏輯電路的一個(gè)特點(diǎn)是:任何一個(gè)時(shí)刻的輸出狀態(tài)不僅取決于當(dāng)時(shí)的輸入信號,還與電路的原始狀態(tài)有關(guān)。也就是說,時(shí)序電路含有記憶元件,具有反饋通道。時(shí)序邏輯電路包括各類觸發(fā)器、寄存器、計(jì)數(shù)器、存儲器等。就像使用較抽象的組合元件來實(shí)現(xiàn)復(fù)雜的組合邏輯一樣,也可以使用較抽象的時(shí)序元件來設(shè)計(jì)復(fù)雜的時(shí)序邏輯。圖4-7顯示了下面幾種常用的時(shí)序元件。圖4-7時(shí)序元件下面使用VerilogHDL分別對上述時(shí)序元件及常用的時(shí)序邏輯電路進(jìn)行建模。1.?D觸發(fā)器和鎖存器D觸發(fā)器作為時(shí)序電路中最基本的單元,每個(gè)電路設(shè)計(jì)人員都必須能夠在理解其原理的基礎(chǔ)上熟練應(yīng)用。D觸發(fā)器的作用是存儲一位二進(jìn)制位的信息,在時(shí)鐘上升沿把數(shù)據(jù)從輸入端送到輸出端,其結(jié)構(gòu)框圖如圖4-8所示。圖4-8D觸發(fā)器結(jié)構(gòu)框圖使用QuartusⅡ綜合D觸發(fā)器極為簡捷方便,下面給出在時(shí)鐘上升沿觸發(fā)的D觸發(fā)器的VerilogHDL行為描述?!纠?-12】一位D觸發(fā)器。實(shí)現(xiàn)方式一:modulemy_dff(clk,d,q);inputclk;inputd;outputregq;always@(posedgeclk) q<=d;endmoduleQuartusⅡ綜合的結(jié)果如圖4-8所示。實(shí)現(xiàn)方式二:調(diào)用QuartusⅡ軟件中的dff模塊實(shí)現(xiàn)D觸發(fā)器。modulemy_dff(clk,d,q);inputclk;inputd;outputq;dffmy_dff(d,clk,,,q);endmoduleQuartusⅡ綜合的結(jié)果同樣如圖4-8所示。兩種實(shí)現(xiàn)方式的仿真波形也是一樣的,如圖4-9所示。圖4-9D觸發(fā)器仿真波形從仿真波形來看,兩種實(shí)現(xiàn)方式得到的電路功能完全相同。事實(shí)上,對于一個(gè)簡單的觸發(fā)器來說,以上兩種設(shè)計(jì)方法,其核心都是一個(gè)簡單的D觸發(fā)器內(nèi)核,QuartusⅡ軟件在綜合時(shí)會自動(dòng)調(diào)用內(nèi)部模塊,自動(dòng)綜合為QuartusⅡ自帶的D觸發(fā)器電路模塊,從而使設(shè)計(jì)更加趨于合理。對于電平敏感的鎖存器,只需在D觸發(fā)器的描述中將上升沿改為電平即可,代碼如下例。例:一位電平敏感的鎖存器。modulemy_latch(clk,d,q);inputclk;inputd;outputregq;always@(clk,d) if(clk)q<=d;endmodule由一位D觸發(fā)器和一位鎖存器可以很容易地實(shí)現(xiàn)寄存器和多位鎖存器。2.寄存器寄存器是一種應(yīng)用廣泛的時(shí)序邏輯器件,用于暫存數(shù)據(jù)。寄存器是時(shí)鐘邊沿敏感的。寄存器包括一般寄存器、三態(tài)寄存器,還包括具有復(fù)位、置位和使能功能的寄存器。下面分別舉例說明。【例4-13】參數(shù)型n位寄存器。(1)一般寄存器。

moduleregx(clk,d,q);parameterN=8;inputclk;input[N-1:0]d;outputreg[N-1:0]q;always@(posedgeclk) q<=d;endmodule程序說明:①?QuartusⅡ綜合的結(jié)果如圖4-10所示。圖4-10一般寄存器的綜合結(jié)果②?D觸發(fā)器相當(dāng)于一位寄存器,定義多位D觸發(fā)器即可構(gòu)成寄存器。從兩者的代碼中也可以看出,D觸發(fā)器與寄存器的區(qū)別就是位數(shù)不同。(2)同步復(fù)位、同步置數(shù)、異步使能的寄存器。moduleregister_N_0(D,Q,data,en,load,reset,clk);parameterN=8;inputen,load,reset,clk;

input[N-1:0]D,data;

outputreg[N-1:0]Q;reg[N-1:0]temp;always@(posedgeclk)//同步復(fù)位、同步置數(shù)beginif(reset)temp<=0;elseif(load)temp<=data;elsetemp<=D;endalways@(temp,en)//異步使能beginif(en)Q<=temp;elseQ<='bz;endendmodule程序說明:①?QuartusⅡ綜合的結(jié)果如圖4-11所示。從圖中可以看出,對于QuartusⅡ軟件來說,異步方式是通過在寄存器后增加三態(tài)門來實(shí)現(xiàn)的,同步方式是通過多路選擇器來實(shí)現(xiàn)的。圖4-11同步復(fù)位、同步置數(shù)、異步使能的寄存器②同步復(fù)位、同步置數(shù)要求復(fù)位或置數(shù)必須在時(shí)鐘的上升沿發(fā)生。③事實(shí)上,復(fù)位、置數(shù)、使能三個(gè)信號可以任意選取同步、異步兩種方式之一,因此三個(gè)信號可以任意組合成8種不同功能的電路,如異步復(fù)位、同步置數(shù)、異步使能電路等。(3)異步復(fù)位、同步置數(shù)、異步使能的寄存器。moduleregister_N(D,Q,data,en,load,reset,clk);parameterN=8;inputen,load,reset,clk;

input[N-1:0]D,data;

outputreg[N-1:0]Q;reg[N-1:0]temp;always@(posedgeclkorposedgereset)//異步復(fù)位、同步置數(shù)beginif(reset)temp<=0;elseif(load)temp<=data;elsetemp<=D;endalways@(temp,en)//異步使能beginif(en)Q<=temp;elseQ<='bz;endendmodule程序說明:①?QuartusⅡ綜合的結(jié)果如圖4-12所示。圖4-12異步復(fù)位、同步置數(shù)、異步使能的寄存器②異步復(fù)位、同步置數(shù)要求只要復(fù)位信號為有效電平就復(fù)位,而置數(shù)必須在時(shí)鐘的上升沿發(fā)生。(4)三態(tài)寄存器。moduletri_reg(a,en,clk,q);parameterN=8;input[N-1:0]a;inputen,clk;outputreg[N-1:0]q;reg[N-1:0]val;always@(posedgeclk)begin:triregdataval<=a;endalways@(en,val)begin:trireg3stif(en)q<=val;elseq<='bz;endendmodule程序說明如下:①?QuartusⅡ綜合的結(jié)果如圖4-13所示。從綜合結(jié)果可以看出,三態(tài)寄存器是在寄存器后放置了一個(gè)三態(tài)門,從而實(shí)現(xiàn)了相應(yīng)的功能。圖4-13三態(tài)寄存器的綜合結(jié)果②該電路的功能是:在clk的上升沿將數(shù)據(jù)d存入D觸發(fā)器,然后在en有效時(shí),將存入Q的d值傳給q,en無效時(shí),q的值為高阻態(tài)'bz。③引入三態(tài)電路有許多實(shí)際的應(yīng)用,如CPU設(shè)計(jì)中的數(shù)據(jù)和地址總線的構(gòu)建、RAM的數(shù)據(jù)端口的設(shè)計(jì)等。3.移位寄存器例4-14設(shè)計(jì)了一個(gè)n位移位寄存器,該寄存器具有左移、右移、置數(shù)功能?!纠?-14】參數(shù)型n位移位寄存器。//8位CPU中常用的移位寄存器模塊moduleshift_N(clk,Ci,mode,D,Q,Co);inputclk,Ci;//時(shí)鐘和移位輸入input[2:0]mode;//移位模式控制字input[N-1:0]D;//待加載移位的數(shù)據(jù)output[N-1:0]Q;//移位數(shù)據(jù)輸出outputregCo;//移位輸出reg[N-1:0]temp;parameterN=8;//8位移位寄存器always@(posedgeclk)begin case(mode)3'b000:begintemp<=D;end//加載待移數(shù) 3'b001:begintemp[0]<=Ci; temp[N-1:1]<=temp[N-2:0];Co<=temp[N-1];//帶進(jìn)位循環(huán)左移 end

3'b010:begintemp[0]<=temp[N-1]; temp[N-1:1]<=temp[N-2:0];//自循環(huán)左移 end3'b011:begintemp[N-1]<=temp[0]; temp[N-2:0]<=temp[N-1:1];//自循環(huán)右移 end 3'b100:begintemp[N-1]<=Ci; temp[N-2:0]<=temp[N-1:1];Co<=temp[0];//帶進(jìn)位循環(huán)右移 end default:temp<=temp;//保持 endcaseendassignQ=temp; //移位后輸出endmodule程序說明:(1)移位寄存器可以有多種工作模式,這由移位模式控制字mode來控制。(2)仿真波形如圖4-14所示。從圖中可以看出,第1個(gè)時(shí)鐘上升沿時(shí),mode為3'b000,該模式為加載待置數(shù),因此D的值被裝載進(jìn)Q。第2個(gè)時(shí)鐘上升沿時(shí),mode為3'b001,該模式為帶進(jìn)位循環(huán)左移,因此D的值循環(huán)左移,同時(shí)D的最低位取此時(shí)刻Ci的值。從仿真波形圖中可以看出,本段代碼實(shí)現(xiàn)了題目要求的功能。圖4-14例4-14的仿真波形4.計(jì)數(shù)器例4-15設(shè)計(jì)了一個(gè)n位計(jì)數(shù)器,該計(jì)數(shù)器有計(jì)數(shù)、清零功能。【例4-15】參數(shù)型n位計(jì)數(shù)器,帶有異步復(fù)位和同步時(shí)鐘使能。

modulecnt_N(clk,rst,en,Q,cout);inputclk,rst,en;outputreg[N-1:0]Q;outputcout;parameterN=4;always@(posedgerst,posedgeclk)begin if(rst)//計(jì)數(shù)器異步復(fù)位 Q<=0;//為了能生成諸如觸發(fā)器一類的時(shí)序邏輯,建議使用非阻塞賦值 else if(en)//計(jì)數(shù)器同步使能 Q<=Q+1; endassigncout=(Q==0)?1'b1:1'b0;//計(jì)數(shù)器計(jì)滿溢出后cout輸出1endmodule程序說明:(1)仿真波形如圖4-15所示。從圖中可以看出,本段代碼實(shí)現(xiàn)了一個(gè)十六進(jìn)制計(jì)數(shù)器,并且具有異步復(fù)位和同步使能功能,在計(jì)數(shù)器溢出后將cout置1。圖4-15例4-15的仿真波形(2)本計(jì)數(shù)器實(shí)現(xiàn)的是2的整數(shù)次冪計(jì)數(shù),如果不是2n計(jì)數(shù),如何實(shí)現(xiàn)呢?這時(shí),需要使用條件語句判斷計(jì)數(shù)是否達(dá)到最大值,如果是,則使計(jì)數(shù)器清零并從零開始計(jì)數(shù)。例4-16實(shí)現(xiàn)了一個(gè)十進(jìn)制加法計(jì)數(shù)器?!纠?-16】十進(jìn)制加法計(jì)數(shù)器,帶有異步復(fù)位和同步時(shí)鐘使能功能。

modulecnt10(clk,rst,en,Q,cout);inputclk,rst,en;outputreg[N-1:0]Q;outputcout;parameterN=4;always@(posedgerst,posedgeclk)beginif(rst)//計(jì)數(shù)器異步復(fù)位 Q<=0;//為了能生成諸如觸發(fā)器一類的時(shí)序邏輯,建議使用非阻塞賦值 else if(en)//計(jì)數(shù)器同步使能 if(Q==9)Q<=0; elseQ<=Q+1; endassigncout=(Q==0)?1'b1:1'b0;//計(jì)數(shù)器計(jì)滿溢出后cout輸出1endmodule例4-16的仿真波形如圖4-16所示。從圖中可以看出,本段代碼實(shí)現(xiàn)了一個(gè)十進(jìn)制加法計(jì)數(shù)器,并在計(jì)數(shù)器溢出后將cout置1。圖4-16例4-16的仿真波形5.分頻器在具體的電路設(shè)計(jì)中,可能需要很多種不同頻率的時(shí)鐘,但實(shí)際電路中往往只有一種單一頻率的外部時(shí)鐘輸入,這時(shí)候就需要分頻或倍頻以得到我們需要的時(shí)鐘頻率。對于倍頻電路,需要具體硬件的支持,本小節(jié)暫不闡述。對于分頻電路,通過簡單的設(shè)計(jì)即可實(shí)現(xiàn)。分頻器電路是非常有用的一種電路,分頻的方法很多,最常見的是利用加法計(jì)數(shù)器對時(shí)鐘信號進(jìn)行分頻。下面通過幾個(gè)例子分別介紹2的整數(shù)次冪分頻、奇數(shù)分頻、偶數(shù)分頻的方法?!纠?-17】參數(shù)型2n分頻,占空比為50%。moduledivf_2powN(rst,clk,en,clk_N);inputrst,clk,en;outputclk_N;

parameterN=2;

reg[N-1:0]count;always@(posedgeclk)

beginif(rst)count<=0; elseif(en)count<=count+1;endassignclk_N=count[N-1];endmodule程序說明:(1)本例可實(shí)現(xiàn)2的任意整數(shù)次冪的分頻器設(shè)計(jì),占空比為50%。(2)本例中N定義為常整數(shù)2,也就是說本例實(shí)現(xiàn)的是2的2次冪分頻,即4分頻。如果要實(shí)現(xiàn)2的N次冪分頻,則僅需要調(diào)用該模塊,并修改參數(shù)N即可。例如要實(shí)現(xiàn)8分頻,則將參數(shù)N修改為3即可,具體實(shí)現(xiàn)代碼如下:moduledivf_2pow3(rst,clk,en,clk8);inputrst,clk,en;outputclk8;divf_2powN#(3)divf8(rst,clk,en,clk8);endmodule(3)本例除了可以得到2的N次冪分頻外,還可以非常容易地得到2的N-1次冪、N-2次冪、…、1次冪分頻,只需要多添加幾條assign語句即可。例如:moduledivf_2pow4(rst,clk,en,clk2,clk4,clk8,clk16);inputrst,clk,en;outputclk2,clk4,clk8,clk16;reg[3:0]count;always@(posedgeclk)

begin if(rst)count<=0; elseif(en)count<=count+1;endassignclk2=count[0];//2分頻assignclk4=count[1];//4分頻assignclk8=count[2];//8分頻assignclk16=count[3];//16分頻endmodule【例4-18】參數(shù)型奇數(shù)分頻,要求占空比為50%。moduledivf_oddn(clk,clk_N);inputclk;outputclk_N;

parameterN=3;

integerp,q;

regclk_p,clk_q;

always@(posedgeclk)//N分頻設(shè)計(jì)實(shí)例,體會其算法(占空比為50%)

begin if(p==N-1)beginp=0;clk_p=~clk_p;endelsep=p+1;endalways@(negedgeclk)begin if(q==N-1)q=0;elseq=q+1; if(p==(N-1)/2)clk_q=~clk_q;endassignclk_N=clk_p^clk_q;endmodule程序說明:(1)對于奇數(shù)分頻,仍然采用加法計(jì)數(shù)的方法,只是要對時(shí)鐘的上升沿和下降沿分別計(jì)數(shù),這是因?yàn)檩敵霾ㄐ蔚母淖儾粌H僅發(fā)生在時(shí)鐘上升沿。(2)本例使用了兩個(gè)計(jì)數(shù)器p和q分別對上升沿和下降沿計(jì)數(shù),然后通過組合邏輯assignclk_N=clk_p^clk_q;控制輸出時(shí)鐘的電平,從而得到需要的時(shí)鐘波形。(3)上述模塊定義了一個(gè)參數(shù)化的奇數(shù)分頻電路,并實(shí)現(xiàn)了一個(gè)3分頻電路。如果設(shè)計(jì)一個(gè)頂層模塊,調(diào)用該模塊并修改參數(shù),則可實(shí)現(xiàn)任意奇數(shù)分頻。例如:moduledivf_oddn_top(clk,clk_3,clk_5,clk_7);inputclk;outputclk_3,clk_5,clk_7;divf_oddn#(3)div_odd3(clk,clk_3);divf_oddn#(5)div_odd5(clk,clk_5);divf_oddn#(7)div_odd7(clk,clk_7);endmodule上述模塊的仿真波形如圖4-17所示。圖4-17任意奇數(shù)分頻從圖4-17可知,上述代碼實(shí)現(xiàn)了任意奇數(shù)分頻?!纠?-19】參數(shù)型偶數(shù)分頻,要求占空比為50%。moduledivf_even(clk,clk_N);inputclk;outputregclk_N;parameterN=6;integerp;always@(posedgeclk)beginif(p==N/2-1)beginp=0;clk_N=~clk_N;endelsep=p+1;endendmodule程序說明:(1)對于偶數(shù)分頻,仍然采用加法計(jì)數(shù)的方法,只是要對時(shí)鐘的上升沿進(jìn)行計(jì)數(shù),這是因?yàn)檩敵霾ㄐ蔚母淖儍H僅發(fā)生在時(shí)鐘上升沿。本例使用了一個(gè)計(jì)數(shù)器??p對上升沿計(jì)數(shù),計(jì)數(shù)計(jì)到一半時(shí),控制輸出時(shí)鐘的電平取反,從而得到需要的時(shí)鐘波形。(2)上述模塊定義了一個(gè)參數(shù)化的偶數(shù)分頻電路,并實(shí)現(xiàn)了一個(gè)6分頻電路。如果設(shè)計(jì)一個(gè)頂層模塊,調(diào)用該模塊并修改參數(shù),則可實(shí)現(xiàn)任意偶數(shù)分頻。例如:moduledivf_even_top(clk,clk_12,clk_10);inputclk;outputclk_12,clk_10;divf_even#(12)div_even12(clk,clk_12);divf_even#(10)div_even10(clk,clk_10);endmodule上述模塊的仿真波形如圖4-18所示。圖4-18任意偶數(shù)分頻從圖4-18可知,上述代碼實(shí)現(xiàn)了任意偶數(shù)分頻?!纠?-20】可設(shè)置參數(shù)的任意分頻器,占空比可變。moduledivf_parameter(rst,clk,en,clkout);inputrst,clk,en;outputclkout;integertemp;//最大值為2的32次方parameterN=7,M=3;//N為分頻系數(shù),M/N為占空比always@(posedgeclk)beginif(rst)temp<=0; elseif(en) if(temp==N-1)temp<=0; elsetemp<=temp+1;endassignclkout=(temp<M)?1:0;endmodule(1)對于占空比可變的分頻器,這時(shí)需要設(shè)置兩個(gè)參數(shù),一個(gè)控制分頻比,另一個(gè)控制占空比,從而得到需要的時(shí)鐘波形。上例中,N=7,M=3,說明是7分頻電路,占空比為3/7。(2)上述模塊定義了一個(gè)參數(shù)化的占空比可變的分頻電路。如果設(shè)計(jì)一個(gè)頂層模塊,調(diào)用該模塊并修改參數(shù),則可實(shí)現(xiàn)任意占空比的分頻器。例如:modulediv_Para_top(rst,clk,en,clk3_2,clk5_1,clk6_3);//頂層設(shè)計(jì)inputrst,clk,en;outputclk3_2,clk5_1,clk6_3;divf_parameter#(3,2)f1(rst,clk,en,clk3_2);//3分頻,占空比為2/3divf_parameter#(5,1)f2(rst,clk,en,clk5_1);//5分頻,占空比為1/5divf_parameter#(6,3)f3(rst,clk,en,clk6_3);//6分頻,占空比為3/6endmodule上述模塊的仿真波形如圖4-19所示。圖4-19占空比可變的任意分頻從圖4-19可知,上述代碼實(shí)現(xiàn)了占空比可變的任意分頻功能。分頻器是十分有用的電路,實(shí)際應(yīng)用中除了需要得到任意占空比的整數(shù)分頻器外,有時(shí)還需要小數(shù)分頻器。對于小數(shù)分頻器,則需要更復(fù)雜的算法,感興趣的讀者可查閱相關(guān)資料。6.程序存儲器ROMROM在數(shù)字系統(tǒng)中用于存放指令或者常數(shù)。下面給出一個(gè)ROM實(shí)例,該ROM的數(shù)據(jù)寬度為16位,相應(yīng)地它有4根地址線。將其設(shè)計(jì)為帶讀使能信號的異步ROM?!纠?-21】參數(shù)型ROM設(shè)計(jì)。modulerom_nxm(rom_data,rom_addr,clk,rd,load);parameterM=8,N=4;//4根地址線,8位數(shù)據(jù)inputclk,rd;//rd讀使能信號inputload;//用于初始化ROM值的控制信號input[N-1:0]rom_addr;outputreg[M-1:0]rom_data;reg[M-1:0]memory[0:2**N];//4根地址線,8位數(shù)據(jù)的存儲器always@(posedgeload)begin:init//該always塊用于初始化ROM值integeri; for(i=0;i<(2**N);i=i+1) memory[i]=i+1;endalways@(posedgeclk)begin:read//該always塊用于讀取ROM值 if(rd)rom_data=memory[rom_addr];endendmodule利用QuartusⅡ仿真的波形如圖4-20所示。圖4-20ROM仿真程序說明:(1)該程序設(shè)置了兩個(gè)參數(shù),M代表該ROM數(shù)據(jù)總線的寬度,N代表了地址線的數(shù)量,即2的N次方是ROM所能包含數(shù)據(jù)的最大個(gè)數(shù)。本例描述了一個(gè)8位寬,包含16個(gè)數(shù)據(jù)的ROM。(2)?ROM的特性是只讀,在使用前必須先裝入數(shù)值,因此本例使用了一個(gè)always塊為ROM賦初值。該初值需要根據(jù)實(shí)際情況設(shè)置,本例的初值設(shè)置只是為了演示其功能,沒有實(shí)際的用途。(3)波形圖為功能仿真結(jié)果,可以看到,當(dāng)rd信號有效時(shí),可將ROM中已存儲的數(shù)據(jù)讀出到rom_data中。ROM有時(shí)也用于設(shè)計(jì)組合邏輯電路,例如下面的例子可實(shí)現(xiàn)3-8線譯碼器的功能。modulerom_38(rom_data,rom_addr,load);//3-8線譯碼器功能parameterM=8,N=3;//3根地址線,8位數(shù)據(jù)inputload;//用于初始化ROM值的控制信號input[N-1:0]rom_addr;outputreg[M-1:0]rom_data;reg[M-1:0]memory[0:2**N];//3根地址線,8位數(shù)據(jù)的存儲器always@(posedgeload)begin:init//該always塊用于初始化ROM值 integeri; for(i=0;i<(2**N);i=i+1) memory[i]=1<<i;endalways@(rom_addr)rom_data=memory[rom_addr];endmodule利用QuartusⅡ?qū)ι鲜鲈O(shè)計(jì)的仿真結(jié)果如圖4-21所示。圖4-21使用ROM實(shí)現(xiàn)3-8線譯碼器從以上仿真波形可以看出,該設(shè)計(jì)實(shí)現(xiàn)了3

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論