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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

4.1常用組合邏輯電路設計4.2常用時序邏輯電路設計

4.3小結

習題44.1常用組合邏輯電路設計

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

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

parameterN=8;//該參數(shù)定義了一個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個輸入X1、X2、X3、X4,一個輸出Y,使用控制信號sel選擇4個輸入中的1個賦給Y。(2)程序中使用parameter定義了一個參數(shù)常量N,通過修改參數(shù)可以很容易地改變輸入、輸出的位數(shù)。2.譯碼器例4-2實現(xiàn)了一個log2n?×?n的譯碼器。【例4-2】參數(shù)型log2n?×?n譯碼器。

moduledecode_N(sel,Y);

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

input[1:0]sel; //此參數(shù)為2位,通過計算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)程序中定義了一個輸入sel,一個輸出Y,使用控制信號sel來確定Y的輸出。(2)由于本程序涉及求以2為底的對數(shù)計算,因此若修改參數(shù)N,sel的位數(shù)就要手工做相應調整,這樣才可實現(xiàn)任意位數(shù)的譯碼器。3.加法器例4-3實現(xiàn)了N位加法器。【例4-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分別為本位和及進位。(2)本例使用數(shù)據(jù)流建模實現(xiàn),在綜合時會自動映射為QuartusⅡ自帶的加法器宏功能模塊。4.乘法器例4-4實現(xiàn)了N位乘法器。【例4-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ù)流建模實現(xiàn),在綜合時,會自動映射為QuartusⅡ自帶的乘法器宏功能模塊。5.比較器例4-5實現(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)比較器實現(xiàn)的功能見表4-1。(2)比較器有3個輸出,在任一時刻僅有一個輸出為1,即僅有一個輸出有效。6.?ALU例4-6實現(xiàn)了一個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實現(xiàn)的功能見表4-2。(2)算術邏輯運算ALU通過一條或多條輸入總線完成算術或邏輯運算。ALU是CPU的核心部件之一,是設計CPU時必不可少的內容。7.三態(tài)總線引入三態(tài)門有許多實際的應用,如CPU設計中的數(shù)據(jù)和地址總線的構建、RAM或堆棧的數(shù)據(jù)端口的設計等。在設計中,若對變量賦值為z,則會引入三態(tài)門,并在控制下可使其輸出呈高阻態(tài),這等效于三態(tài)門禁止輸出。三態(tài)門設計示例如例4-7。【例4-7】設計三態(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Ⅱ中的綜合結果如圖4-2所示。

從圖中可以看出,三態(tài)門綜合后映射成了VerilogHDL的基本門原語buf。圖4-2三態(tài)門控制電路的綜合結果(2)參數(shù)N表示輸入、輸出的數(shù)據(jù)位寬,改變參數(shù)即可改變輸入、輸出的數(shù)據(jù)位寬,從而增強程序的可移植性。為構成數(shù)字系統(tǒng)內部的總線系統(tǒng),必須設計三態(tài)總線驅動器電路,這可以有多種表達方法,但必須注意信號多驅動源的處理問題。例4-8、例4-9和例4-10都試圖描述一個8位4通道的三態(tài)總線驅動器,但其中有一個程序不能得到預期的結果?!纠?-8】N位4通道的三態(tài)總線驅動器。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)總線驅動器(實現(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)總線驅動器(實現(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Ⅱ中綜合的結果分別如圖4-3和圖4-4所示。圖4-3例4-8的綜合結果圖4-4例4-9、例4-10的綜合結果從綜合結果來看,例4-8沒有得到預期的效果。(2)例4-8和例4-9、例4-10在QuartusⅡ中仿真的結果分別如圖4-5和圖4-6所示。圖4-6例4-9、例4-10的仿真結果從仿真結果也可以看出,例4-8沒有得到預期的效果。(3)例4-8在一個always塊中放了4個順序完成的if語句,并且是完整的條件描述語句。粗看此程序認為會產生4個N位的三態(tài)控制通道,且輸出只有一個信號out。但是,細心的讀者可能會發(fā)現(xiàn),在例4-8的always塊中輸出信號有4個賦值源,也就是4個if語句都是對out進行賦值,這樣在綜合時,只有最后一個if語句起作用,也就是說前3個if語句沒有任何意義,從綜合結果可以清楚地看到這一點。下面再通過一個小例子進行說明?!纠?-11】多個賦值源的賦值語句。always@(a,b,c,d)begin out=a; out=b; out=c; out=d;end讀者很容易理解,out的值為d,always塊中的前三條語句沒有意義。事實上,例4-8的道理跟這個例子的道理是一樣的。(4)例4-9由于使用了4個并列的assign并行語句,因此能綜合出正確的結果。這是因為,每一條assign語句都等同于一個獨立運行的always塊,每一條assign語句右側表達式中的所有變量等同于always塊中的敏感信號列表,只要有一個發(fā)生變化,assign語句就立刻執(zhí)行。因此,例4-9和例4-10是等價的,從綜合和仿真的結果也可以證明這一點。(5)例4-9和例4-10表明,要設計出能產生獨立控制的多通道的電路結構,必須使用并行語句結構。但應注意,例4-9和例4-10中對同一個輸出信號out有4個并行賦值源,在實際電路中完全可能發(fā)生“線與”。所以,在程序中,每個賦值源都使用了if…else…結構,保證了條件不滿足時,其輸出為高阻態(tài)值“z”,這樣可以保證不會發(fā)生“線與”。但如果條件不滿足,其輸出不為高阻態(tài)值,那么就無法得到預期的結果。4.2常用時序邏輯電路設計

時序邏輯電路的一個特點是:任何一個時刻的輸出狀態(tài)不僅取決于當時的輸入信號,還與電路的原始狀態(tài)有關。也就是說,時序電路含有記憶元件,具有反饋通道。時序邏輯電路包括各類觸發(fā)器、寄存器、計數(shù)器、存儲器等。就像使用較抽象的組合元件來實現(xiàn)復雜的組合邏輯一樣,也可以使用較抽象的時序元件來設計復雜的時序邏輯。圖4-7顯示了下面幾種常用的時序元件。圖4-7時序元件下面使用VerilogHDL分別對上述時序元件及常用的時序邏輯電路進行建模。1.?D觸發(fā)器和鎖存器D觸發(fā)器作為時序電路中最基本的單元,每個電路設計人員都必須能夠在理解其原理的基礎上熟練應用。D觸發(fā)器的作用是存儲一位二進制位的信息,在時鐘上升沿把數(shù)據(jù)從輸入端送到輸出端,其結構框圖如圖4-8所示。圖4-8D觸發(fā)器結構框圖使用QuartusⅡ綜合D觸發(fā)器極為簡捷方便,下面給出在時鐘上升沿觸發(fā)的D觸發(fā)器的VerilogHDL行為描述。【例4-12】一位D觸發(fā)器。實現(xiàn)方式一:modulemy_dff(clk,d,q);inputclk;inputd;outputregq;always@(posedgeclk) q<=d;endmoduleQuartusⅡ綜合的結果如圖4-8所示。實現(xiàn)方式二:調用QuartusⅡ軟件中的dff模塊實現(xiàn)D觸發(fā)器。modulemy_dff(clk,d,q);inputclk;inputd;outputq;dffmy_dff(d,clk,,,q);endmoduleQuartusⅡ綜合的結果同樣如圖4-8所示。兩種實現(xiàn)方式的仿真波形也是一樣的,如圖4-9所示。圖4-9D觸發(fā)器仿真波形從仿真波形來看,兩種實現(xiàn)方式得到的電路功能完全相同。事實上,對于一個簡單的觸發(fā)器來說,以上兩種設計方法,其核心都是一個簡單的D觸發(fā)器內核,QuartusⅡ軟件在綜合時會自動調用內部模塊,自動綜合為QuartusⅡ自帶的D觸發(fā)器電路模塊,從而使設計更加趨于合理。對于電平敏感的鎖存器,只需在D觸發(fā)器的描述中將上升沿改為電平即可,代碼如下例。例:一位電平敏感的鎖存器。modulemy_latch(clk,d,q);inputclk;inputd;outputregq;always@(clk,d) if(clk)q<=d;endmodule由一位D觸發(fā)器和一位鎖存器可以很容易地實現(xiàn)寄存器和多位鎖存器。2.寄存器寄存器是一種應用廣泛的時序邏輯器件,用于暫存數(shù)據(jù)。寄存器是時鐘邊沿敏感的。寄存器包括一般寄存器、三態(tài)寄存器,還包括具有復位、置位和使能功能的寄存器。下面分別舉例說明?!纠?-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Ⅱ綜合的結果如圖4-10所示。圖4-10一般寄存器的綜合結果②?D觸發(fā)器相當于一位寄存器,定義多位D觸發(fā)器即可構成寄存器。從兩者的代碼中也可以看出,D觸發(fā)器與寄存器的區(qū)別就是位數(shù)不同。(2)同步復位、同步置數(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)//同步復位、同步置數(shù)beginif(reset)temp<=0;elseif(load)temp<=data;elsetemp<=D;endalways@(temp,en)//異步使能beginif(en)Q<=temp;elseQ<='bz;endendmodule程序說明:①?QuartusⅡ綜合的結果如圖4-11所示。從圖中可以看出,對于QuartusⅡ軟件來說,異步方式是通過在寄存器后增加三態(tài)門來實現(xiàn)的,同步方式是通過多路選擇器來實現(xiàn)的。圖4-11同步復位、同步置數(shù)、異步使能的寄存器②同步復位、同步置數(shù)要求復位或置數(shù)必須在時鐘的上升沿發(fā)生。③事實上,復位、置數(shù)、使能三個信號可以任意選取同步、異步兩種方式之一,因此三個信號可以任意組合成8種不同功能的電路,如異步復位、同步置數(shù)、異步使能電路等。(3)異步復位、同步置數(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)//異步復位、同步置數(shù)beginif(reset)temp<=0;elseif(load)temp<=data;elsetemp<=D;endalways@(temp,en)//異步使能beginif(en)Q<=temp;elseQ<='bz;endendmodule程序說明:①?QuartusⅡ綜合的結果如圖4-12所示。圖4-12異步復位、同步置數(shù)、異步使能的寄存器②異步復位、同步置數(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Ⅱ綜合的結果如圖4-13所示。從綜合結果可以看出,三態(tài)寄存器是在寄存器后放置了一個三態(tài)門,從而實現(xiàn)了相應的功能。圖4-13三態(tài)寄存器的綜合結果②該電路的功能是:在clk的上升沿將數(shù)據(jù)d存入D觸發(fā)器,然后在en有效時,將存入Q的d值傳給q,en無效時,q的值為高阻態(tài)'bz。③引入三態(tài)電路有許多實際的應用,如CPU設計中的數(shù)據(jù)和地址總線的構建、RAM的數(shù)據(jù)端口的設計等。3.移位寄存器例4-14設計了一個n位移位寄存器,該寄存器具有左移、右移、置數(shù)功能?!纠?-14】參數(shù)型n位移位寄存器。//8位CPU中常用的移位寄存器模塊moduleshift_N(clk,Ci,mode,D,Q,Co);inputclk,Ci;//時鐘和移位輸入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];//帶進位循環(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];//帶進位循環(huán)右移 end default:temp<=temp;//保持 endcaseendassignQ=temp; //移位后輸出endmodule程序說明:(1)移位寄存器可以有多種工作模式,這由移位模式控制字mode來控制。(2)仿真波形如圖4-14所示。從圖中可以看出,第1個時鐘上升沿時,mode為3'b000,該模式為加載待置數(shù),因此D的值被裝載進Q。第2個時鐘上升沿時,mode為3'b001,該模式為帶進位循環(huán)左移,因此D的值循環(huán)左移,同時D的最低位取此時刻Ci的值。從仿真波形圖中可以看出,本段代碼實現(xiàn)了題目要求的功能。圖4-14例4-14的仿真波形4.計數(shù)器例4-15設計了一個n位計數(shù)器,該計數(shù)器有計數(shù)、清零功能?!纠?-15】參數(shù)型n位計數(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)//計數(shù)器異步復位 Q<=0;//為了能生成諸如觸發(fā)器一類的時序邏輯,建議使用非阻塞賦值 else if(en)//計數(shù)器同步使能 Q<=Q+1; endassigncout=(Q==0)?1'b1:1'b0;//計數(shù)器計滿溢出后cout輸出1endmodule程序說明:(1)仿真波形如圖4-15所示。從圖中可以看出,本段代碼實現(xiàn)了一個十六進制計數(shù)器,并且具有異步復位和同步使能功能,在計數(shù)器溢出后將cout置1。圖4-15例4-15的仿真波形(2)本計數(shù)器實現(xiàn)的是2的整數(shù)次冪計數(shù),如果不是2n計數(shù),如何實現(xiàn)呢?這時,需要使用條件語句判斷計數(shù)是否達到最大值,如果是,則使計數(shù)器清零并從零開始計數(shù)。例4-16實現(xiàn)了一個十進制加法計數(shù)器。【例4-16】十進制加法計數(shù)器,帶有異步復位和同步時鐘使能功能。

modulecnt10(clk,rst,en,Q,cout);inputclk,rst,en;outputreg[N-1:0]Q;outputcout;parameterN=4;always@(posedgerst,posedgeclk)beginif(rst)//計數(shù)器異步復位 Q<=0;//為了能生成諸如觸發(fā)器一類的時序邏輯,建議使用非阻塞賦值 else if(en)//計數(shù)器同步使能 if(Q==9)Q<=0; elseQ<=Q+1; endassigncout=(Q==0)?1'b1:1'b0;//計數(shù)器計滿溢出后cout輸出1endmodule例4-16的仿真波形如圖4-16所示。從圖中可以看出,本段代碼實現(xiàn)了一個十進制加法計數(shù)器,并在計數(shù)器溢出后將cout置1。圖4-16例4-16的仿真波形5.分頻器在具體的電路設計中,可能需要很多種不同頻率的時鐘,但實際電路中往往只有一種單一頻率的外部時鐘輸入,這時候就需要分頻或倍頻以得到我們需要的時鐘頻率。對于倍頻電路,需要具體硬件的支持,本小節(jié)暫不闡述。對于分頻電路,通過簡單的設計即可實現(xiàn)。分頻器電路是非常有用的一種電路,分頻的方法很多,最常見的是利用加法計數(shù)器對時鐘信號進行分頻。下面通過幾個例子分別介紹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)本例可實現(xiàn)2的任意整數(shù)次冪的分頻器設計,占空比為50%。(2)本例中N定義為常整數(shù)2,也就是說本例實現(xiàn)的是2的2次冪分頻,即4分頻。如果要實現(xiàn)2的N次冪分頻,則僅需要調用該模塊,并修改參數(shù)N即可。例如要實現(xiàn)8分頻,則將參數(shù)N修改為3即可,具體實現(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分頻設計實例,體會其算法(占空比為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ù)分頻,仍然采用加法計數(shù)的方法,只是要對時鐘的上升沿和下降沿分別計數(shù),這是因為輸出波形的改變不僅僅發(fā)生在時鐘上升沿。(2)本例使用了兩個計數(shù)器p和q分別對上升沿和下降沿計數(shù),然后通過組合邏輯assignclk_N=clk_p^clk_q;控制輸出時鐘的電平,從而得到需要的時鐘波形。(3)上述模塊定義了一個參數(shù)化的奇數(shù)分頻電路,并實現(xiàn)了一個3分頻電路。如果設計一個頂層模塊,調用該模塊并修改參數(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可知,上述代碼實現(xiàn)了任意奇數(shù)分頻。【例4-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ù)分頻,仍然采用加法計數(shù)的方法,只是要對時鐘的上升沿進行計數(shù),這是因為輸出波形的改變僅僅發(fā)生在時鐘上升沿。本例使用了一個計數(shù)器??p對上升沿計數(shù),計數(shù)計到一半時,控制輸出時鐘的電平取反,從而得到需要的時鐘波形。(2)上述模塊定義了一個參數(shù)化的偶數(shù)分頻電路,并實現(xiàn)了一個6分頻電路。如果設計一個頂層模塊,調用該模塊并修改參數(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可知,上述代碼實現(xiàn)了任意偶數(shù)分頻?!纠?-20】可設置參數(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ù),一個控制分頻比,另一個控制占空比,從而得到需要的時鐘波形。上例中,N=7,M=3,說明是7分頻電路,占空比為3/7。(2)上述模塊定義了一個參數(shù)化的占空比可變的分頻電路。如果設計一個頂層模塊,調用該模塊并修改參數(shù),則可實現(xiàn)任意占空比的分頻器。例如:modulediv_Para_top(rst,clk,en,clk3_2,clk5_1,clk6_3);//頂層設計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可知,上述代碼實現(xiàn)了占空比可變的任意分頻功能。分頻器是十分有用的電路,實際應用中除了需要得到任意占空比的整數(shù)分頻器外,有時還需要小數(shù)分頻器。對于小數(shù)分頻器,則需要更復雜的算法,感興趣的讀者可查閱相關資料。6.程序存儲器ROMROM在數(shù)字系統(tǒng)中用于存放指令或者常數(shù)。下面給出一個ROM實例,該ROM的數(shù)據(jù)寬度為16位,相應地它有4根地址線。將其設計為帶讀使能信號的異步ROM?!纠?-21】參數(shù)型ROM設計。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ù),M代表該ROM數(shù)據(jù)總線的寬度,N代表了地址線的數(shù)量,即2的N次方是ROM所能包含數(shù)據(jù)的最大個數(shù)。本例描述了一個8位寬,包含16個數(shù)據(jù)的ROM。(2)?ROM的特性是只讀,在使用前必須先裝入數(shù)值,因此本例使用了一個always塊為ROM賦初值。該初值需要根據(jù)實際情況設置,本例的初值設置只是為了演示其功能,沒有實際的用途。(3)波形圖為功能仿真結果,可以看到,當rd信號有效時,可將ROM中已存儲的數(shù)據(jù)讀出到rom_data中。ROM有時也用于設計組合邏輯電路,例如下面的例子可實現(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Ⅱ對上述設計的仿真結果如圖4-21所示。圖4-21使用ROM實現(xiàn)3-8線譯碼器從以上仿真波形可以看出,該設計實現(xiàn)了3

溫馨提示

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

評論

0/150

提交評論