第7章Verilog設(shè)計的層次與風(fēng)格_第1頁
第7章Verilog設(shè)計的層次與風(fēng)格_第2頁
第7章Verilog設(shè)計的層次與風(fēng)格_第3頁
第7章Verilog設(shè)計的層次與風(fēng)格_第4頁
第7章Verilog設(shè)計的層次與風(fēng)格_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章

Verilog設(shè)計的層次與風(fēng)格主要內(nèi)容◆結(jié)構(gòu)(Structural)描述◆行為(Behavioural)描述◆數(shù)據(jù)流(DataFlow)描述◆基本組合電路設(shè)計◆基本時序電路設(shè)計Verilog設(shè)計的描述風(fēng)格

結(jié)構(gòu)(Structural)描述(4/5)行為(Behavioural)描述

數(shù)據(jù)流(DataFlow)描述7.1Verilog設(shè)計的層次VerilogHDL是一種能夠在多個層級對數(shù)字系統(tǒng)進行描述的語言,VerilogHDL模型可以是實際電路不同級別的抽象。這些抽象級別可分為5級。(1)系統(tǒng)級(SystemLevel)(2)算法級(AlgorithmLevel)(3)寄存器傳輸級(RTL,RegisterTransferLevel)(4)門級(GateLevel)(5)開關(guān)級(SwitchLevel)-基于晶體管的設(shè)計層次高級別結(jié)構(gòu)描述是調(diào)用電路元件來構(gòu)建電路:在Verilog程序中可通過如下方式描述電路的結(jié)構(gòu)◆調(diào)用Verilog內(nèi)置門元件(門級結(jié)構(gòu)描述)◆調(diào)用開關(guān)級元件(晶體管級結(jié)構(gòu)描述)◆用戶自定義元件UDP(也在門級)-Chapter11◆多層次結(jié)構(gòu)電路的設(shè)計中,不同模塊間的調(diào)用也屬結(jié)構(gòu)描述-7.67.2結(jié)構(gòu)(Structural)描述

Verilog的內(nèi)置門元件其真值表見P168

門元件的調(diào)用調(diào)用門元件的格式為:門元件名字<例化的門名字>(<端口列表>)其中普通門的端口列表按下面的順序列出:(輸出,輸入1,輸入2,輸入3……);比如:anda1(out,in1,in2,in3); //三輸入與門對于三態(tài)門,則按如下順序列出輸入輸出端口:(輸出,輸入,使能控制端);比如:bufif1mytri1(out,in,enable); //高電平使能的三態(tài)門門元件的調(diào)用對于buf和not兩種元件的調(diào)用,需注意的是:它們允許有多個輸出,但只能有一個輸入。比如:

notN1(out1,out2,in); //1個輸入in,2個輸出out1,out2bufB1(out1,out2,out3,in); //1個輸入in,3個輸出out1,out2,out3【例7.1】調(diào)用門元件實現(xiàn)的4選1MUXmodulemux4_1a(out,in1,in2,in3,in4,s0,s1);inputin1,in2,in3,in4,s0,s1;outputout;wires0_n,s1_n,w,x,y,z;not(s0_n,s0),(s1_n,s1);and(w,in1,s0_n,s1_n),(x,in2,s0_n,s1), (y,in3,s0,s1_n),(z,in4,s0,s1);or(out,w,x,y,z);endmodule用基本門實現(xiàn)的4選1MUX原理圖7.3行為描述

就是對設(shè)計實體的數(shù)學(xué)模型的描述,其抽象程度遠高于結(jié)構(gòu)描述方式。行為描述類似于高級編程語言,當描述一個設(shè)計實體的行為時,無需知道具體電路的結(jié)構(gòu),只需要描述清楚輸入與輸出信號的行為,而不需要花費更多的精力關(guān)注設(shè)計功能的門級實現(xiàn)?!纠?.2】用case語句描述的4選1MUXmodulemux4_1b(out,in1,in2,in3,in4,s0,s1);inputin1,in2,in3,in4,s0,s1;outputregout;always@(*) //使用通配符case({s0,s1})2'b00:out=in1;2'b01:out=in2;2'b10:out=in3;2'b11:out=in4;default:out=2'bx;endcaseendmoduleP111例4.12【例7.3】4位二進制加法計數(shù)器modulecount4(out,clr,clk);inputclr,clk;outputreg[3:0]out;always@(posedgeclkorposedgeclr)beginif(clr) out<=0;//異步清零else out<=out+1; //計數(shù)endendmodule采用行為描述方式時需注意用行為描述模式設(shè)計電路,可以降低設(shè)計難度。行為描述只需表示輸入與輸出之間的關(guān)系,不需要包含任何結(jié)構(gòu)方面的信息。設(shè)計者只需寫出源程序,而挑選電路方案的工作由EDA軟件自動完成。在電路的規(guī)模較大或者需要描述復(fù)雜的邏輯關(guān)系時,應(yīng)首先考慮用行為描述方式設(shè)計電路,如果設(shè)計的結(jié)果不能滿足資源占有率的要求,則應(yīng)改變描述方式。7.4數(shù)據(jù)流描述

數(shù)據(jù)流描述方式主要使用持續(xù)賦值語句,多用于描述組合邏輯電路,其格式為:

assignLHS_net=RHS_expression;右邊表達式中的操作數(shù)無論何時發(fā)生變化,都會引起表達式值的重新計算,并將重新計算后的值賦予左邊表達式的net型變量?!纠?.4】數(shù)據(jù)流描述的4選1MUXmodulemux4_1c(out,in1,in2,in3,in4,s0,s1);inputin1,in2,in3,in4,s0,s1;outputout;assignout=(in1&~s0&~s1)|(in2&~s0&s1)|(in3&s0&~s1)|(in4&s0&s1);endmodule

數(shù)據(jù)流描述

用數(shù)據(jù)流描述方式設(shè)計電路與用傳統(tǒng)的邏輯方程設(shè)計電路很相似。設(shè)計中只要有了布爾代數(shù)表達式就很容易將它用數(shù)據(jù)流方式表達出來。表達方法是用Verilog中的邏輯運算符置換布爾邏輯運算符即可。比如,如果邏輯表達式為:,則用數(shù)據(jù)流方式描述為:assignF=(a&b)|(~(c&d))。7.5不同描述風(fēng)格的設(shè)計

對設(shè)計者而言,采用的描述級別越高,設(shè)計越容易;對綜合器而言,行為級的描述為綜合器的優(yōu)化提供了更大的空間,較之門級結(jié)構(gòu)描述更能發(fā)揮綜合器的性能,所以在電路設(shè)計中,除非一些關(guān)鍵路徑的設(shè)計采用門級結(jié)構(gòu)描述外,一般更多地采用行為建模方式。

【例7.12】調(diào)用門元件實現(xiàn)的1位全加器

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);endmodule【例7.13】數(shù)據(jù)流描述的1位全加器modulefull_add2(a,b,cin,sum,cout);inputa,b,cin;outputsum,cout;assignsum=a^b^cin;assigncout=(a&b)|(b&cin)|(cin&a);endmodule3、行為描述的1位全加器【例7.14】行為描述的1位全加器modulefull_add3(a,b,cin,sum,cout);inputa,b,cin;outputregsum,cout;always@*

//或?qū)憺閍lways@(aorborcin)begin{cout,sum}=a+b+cin;endendmodule4、采用層次化方式設(shè)計1位全加器兩個半加器構(gòu)成一個全加器:半加器為底層模塊,全加器為頂層模塊,在頂層模塊中調(diào)用底層模塊(模塊例化)來構(gòu)成整個系統(tǒng),類似在原理圖設(shè)計中調(diào)用元器件。【例7.15】用模塊例化方式設(shè)計的1位全加器頂層設(shè)計modulefull_add(ain,bin,cin,sum,cout);inputain,bin,cin;outputsum,cout;wired,e,f; //用于內(nèi)部連接的節(jié)點信號half_addu1(ain,bin,e,d); //半加器模塊調(diào)用,采用位置關(guān)聯(lián)方式half_addu2(e,cin,sum,f);oru3(cout,d,f); //或門調(diào)用endmodule【例7.16】半加器定義modulehalf_add(a,b,so,co);inputa,b;outputso,co;assignco=a&b;assignso=a^b;endmodule4位加法器設(shè)計moduleadd4_1(sum,cout,a,b,cin);output[3:0]sum;outputcout;input[3:0]a,b;inputcin;

/*級連描述,full_add1源代碼見例7.12*/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],cout);endmodule結(jié)構(gòu)描述的4位級連全加器【例7.18】數(shù)據(jù)流描述的4位加法器moduleadd4_2(cout,sum,a,b,cin);inputcin;input[3:0]a,b;output[3:0]sum;outputcout;assign{cout,sum}=a+b+cin;endmodule7.6多層次結(jié)構(gòu)電路的設(shè)計如果數(shù)字系統(tǒng)比較復(fù)雜,可采用“Top-down”的方法進行設(shè)計。首先把系統(tǒng)分為幾個模塊,每個模塊再分為幾個子模塊,以此類推,直到易于實現(xiàn)為止。這種“Top-down”的方法能夠把復(fù)雜的設(shè)計分解為許多簡單的邏輯來實現(xiàn),同時也適合于多人進行分工合作,如同用C語言編寫大型軟件一樣。Verilog語言能夠很好地支持這種“Top-down”的設(shè)計方法。

1.2.1Top-down設(shè)計舉例:

數(shù)字頻率計組成原理框圖Moduleplj(clk,rst,signal,out);7.6多層次結(jié)構(gòu)電路的設(shè)計多層次結(jié)構(gòu)電路的描述既可以采用文本方式,也可以用圖形和文本混合設(shè)計的方式。用一個8位累加器的設(shè)計為例來說明這兩種設(shè)計方式。1.圖形與文本混合設(shè)計

8位全加器moduleadd8(sum,cout,b,a,cin);output[7:0]sum;outputcout;input[7:0]a,b;inputcin;assign{cout,sum}=a+b+cin;endmodule8位寄存器modulereg8(qout,in,clk,clear);output[7:0]qout;input[7:0]in;inputclk,clear;reg[7:0]qout;always@(posedgeclkorposedgeclear)beginif(clear)qout<=0; //異步清0elseqout<=in;endendmodule將設(shè)計項目設(shè)置成可調(diào)用的元件將所需元件全部調(diào)入原理圖編輯窗并連接好

頂層acc.bdfadd8.bsfreg8.bsf底層

add8.vreg8.v

2.文本設(shè)計moduleacc(accout,cout,accin,cin,clk,clear);output[7:0]accout;outputcout;input[7:0]accin;inputcin,clk,clear;wire[7:0]sum;add8accadd8(sum,cout,accout,accin,cin); //調(diào)用add8子模塊reg8accreg8(accout,sum,clk,clear); //調(diào)用reg8子模塊endmodule累加器頂層文本描述對于上面的模塊調(diào)用,可采用位置對應(yīng)的方式,即調(diào)用時模塊端口列表中信號的排列順序與模塊定義時端口列表中的信號排列順序相同;也可以采用信號名對應(yīng)方式,此時不必按順序,例如上面對reg8的調(diào)用:modulereg8(qout,in,clk,clear); //reg8的模塊聲明—底層reg8accreg8(accout,sum,clk,clear); //調(diào)用方式1,位置對應(yīng)—頂層reg8accreg8(.qout(accout),.clear(clear),.in(sum),.clk(clk)); //調(diào)用方式2,信號名對應(yīng)—頂層模塊調(diào)用-和所用的綜合器有關(guān)2.文本設(shè)計-模塊調(diào)用的指定方式(1)文件復(fù)制方式:將add8和reg8的代碼復(fù)制到acc.v中,在綜合時指明頂層模塊。

moduleacc(accout,cout,accin,cin,clk,clear);output[7:0]accout;outputcout;input[7:0]accin;inputcin,clk,clear;wire[7:0]sum;add8accadd8(sum,cout,accout,accin,cin); //調(diào)用add8子模塊reg8accreg8(accout,sum,clk,clear); //調(diào)用reg8子模塊endmodule

moduleadd8(sum,cout,b,a,cin);output[7:0]sum;outputcout;input[7:0]a,b;inputcin;assign{cout,sum}=a+b+cin;endmodule………………2.文本設(shè)計-模塊調(diào)用的指定方式(2)庫管理方式7.7基本組合電路(CombinationalLogicCircuit)設(shè)計門級結(jié)構(gòu)描述

modulegate1(F,A,B,C,D);inputA,B,C,D;outputF;nand(F1,A,B);//調(diào)用門元件and(F2,B,C,D);or(F,F1,F2);endmodule數(shù)據(jù)流描述modulegate2(F,A,B,C,D);inputA,B,C,D;outputF;assignF=(~(A&B))|(B&C&D);endmodule1、3-8譯碼器(Decoder)【例7.24】74138的Verilog描述modulettl74138(a,y,g1,g2a,g2b);input[2:0]a;inputg1,g2a,g2b;outputreg[7:0]y;always@(*)beginif(g1&~g2a&~g2b) //只有當g1、g2a、g2b為100時,譯碼器使能begincase(a)3'b000:y=8'b11111110; //譯碼輸出3'b001:y=8'b11111101;3'b010:y=8'b11111011;3'b011:y=8'b11110111;3'b100:y=8'b11101111;3'b101:y=8'b11011111;3'b110:y=8'b10111111;3'b111:y=8'b01111111;default:y=8'b11111111;endcaseendelsey=8'b11111111;endendmodule3-8譯碼器(Decoder)Maxplus2庫—74138Primitives(原語)庫

緩沖器buffer

邏輯門logic--nand

其他功能other—gnd,vcc

引腳pin—input,output

存儲單元storage2、8-3(PriorityEncoder)【例7.25】8線—3線優(yōu)先編碼器74148的Verilog描述modulettl74148(din,ei,gs,eo,dout);input[7:0]din;inputei;outputreggs,eo;outputreg[2:0]dout;always@(ei,din)beginif(ei)begindout<=3'b111;gs<=1'b1;eo<=1'b1;endelseif(din==8'b111111111)begindout<=3'b111;gs<=1'b1;eo<=1'b0;endelseif(!din[7])begindout<=3'b000;gs<=1'b0;eo<=1'b1;endelseif(!din[6])begindout<=3'b001;gs<=1'b0;eo<=1'b1;endelseif(!din[5])begindout<=3'b010;gs<=1'b0;eo<=1'b1;endelseif(!din[4])begindout<=3'b011;gs<=1'b0;eo<=1'b1;endelseif(!din[3])begindout<=3'b100;gs<=1'b0;eo<=1'b1;endelseif(!din[2])begindout<=3'b101;gs<=1'b0;eo<=1'b1;endelseif(!din[1])begindout<=3'b110;gs<=1'b0;eo<=1'b1;endelsebegindout<=3'b111;gs<=1'b0;eo<=1'b1;endendendmodule2、8-3(PriorityEncoder)【例7.26】用函數(shù)定義的8線—3線優(yōu)先編碼器74148的Verilog描述modulecoder83(din,dout);input[7:0]din;output[2:0]dout;function[2:0]code;//函數(shù)定義input[7:0]din;//函數(shù)只有輸入端口,輸出為函數(shù)名本身if(din[7])code=3'd7;elseif(din[6])code=3'd6;elseif(din[5])code=3'd5;elseif(din[4])code=3'd4;elseif(din[3])code=3'd3;elseif(din[2])code=3'd2;elseif(din[1])code=3'd1;elsecode=3'd0;endfunctionassigndout=code(din);//函數(shù)調(diào)用endmodule在使用函數(shù)時,需注意1、函數(shù)的定義與調(diào)用須在一個module模塊內(nèi)。

2、函數(shù)只允許有輸入變量且必須至少有一個輸入變量,輸出變量由函數(shù)名本身擔(dān)任,在定義函數(shù)時,需對函數(shù)名說明其類型和位寬。

3、定義函數(shù)時,沒有端口名列表,但調(diào)用函數(shù)時,需列出端口名列表,端口名的排序和類型必須與定義時的相一致。這一點與任務(wù)相同

4、函數(shù)可以出現(xiàn)在持續(xù)賦值assign的右端表達式中。

5、函數(shù)不能調(diào)用任務(wù),而任務(wù)可以調(diào)用別的任務(wù)和函數(shù),且調(diào)用任務(wù)和函數(shù)個數(shù)不受限制。3、奇偶校驗(ParityCheck)位產(chǎn)生器【例7.27】奇偶校驗位產(chǎn)生器moduleparity(even_bit,odd_bit,a);input[7:0]a;outputeven_bit,odd_bit;assigneven_bit=^a; //生成偶校驗位assignodd_bit=~even_bit; //生成奇校驗位endmodule7.8

基本時序電路設(shè)計【例7.29】帶異步清0/異步置1的JK觸發(fā)器modulejkff_rs(clk,j,k,q,rs,set);inputclk,j,k,set,rs;outputregq;always@(posedgeclk,negedgers,negedgeset)beginif(!rs)q<=1'b0;elseif(!set)q<=1'b1;elsecase({j,k})2'b00:q<=q;2'b01:q<=1'b0;2'b10:q<=1'b1;2'b11:q<=~q;default:q<=1'bx;endcaseendendmodule鎖存器(latch)【例7.30】電平敏感的1位數(shù)據(jù)鎖存器modulelatch1(q,d,le);inputd,le;outputq;assignq=le?d:q; //le為高電平時,將輸入端數(shù)據(jù)鎖存endmodule鎖存器(latch)【例7.31】帶置位/復(fù)位端的1位數(shù)據(jù)鎖存器modulelatch2(q,d,le,set,reset);inputd,le,set,reset;outputq;assignq=reset?0:(set?1:(le?d:q));endmodule鎖存器(latch)【例7.32】8位數(shù)據(jù)鎖存器(74LS373)modulettl373(le,oe,q,d);inputle,oe;input[7:0]d;outputreg[7:0]q;always@* //或?qū)憺閍lways@(le,oe,d)beginif(~oe&le)q<=d; //或?qū)憺閕f((!oe)&&(le))elseq<=8'bz;endendmodule3.4.6

存儲器模塊(storage)P89參數(shù)化鎖存器lpm_latch數(shù)據(jù)寄存器(register)【例7.33】數(shù)據(jù)寄存器modulereg_w(dout,din,clk,clr);parameterWIDTH=7;inputclk,clr;input[WIDTH:0]din;outputreg[WIDTH:0]dout;always@(posedgeclk,posedgeclr)beginif(clr)dout<=0;elsedout<=din;endendmodule數(shù)據(jù)鎖存器與數(shù)據(jù)寄存器-P183數(shù)據(jù)鎖存器(latch)與數(shù)據(jù)寄存器(register)的區(qū)別:(1)Latch:一般由電平信號控制,屬于電平敏感型;Register:一般由時鐘信號控制,屬于邊沿敏感型。(2)有不同的使用場合,主要取決于控制方式及控制信號和數(shù)據(jù)信號之間的時序關(guān)系:若數(shù)據(jù)有效滯后于控制信號有效,則只能用鎖存器;若數(shù)據(jù)提前于控制信號,并要求同步操作,則可以選擇寄存器來存放數(shù)據(jù)。8位移位寄存器-P183【例7.34】8位移位寄存器moduleshift8(dout,din,clk,clr);inputclk,clr,din;outputreg[7:0]dout;always@(posedgeclk)beginif(clr)dout<=8‘b0;//同步清0,高電平有效elsebegindout<=dout<<1;//輸出信號左移一位

dout[0]<=din;//輸入信號補充到輸出信號的最低位

endendendmodule計數(shù)器【例7.35】可變模加法/減法計數(shù)器moduleupdown_count(d,clk,clear,load,up_down,qd);inputclk,clear,load,up_down;input[7:0]d;output[7:0]qd;reg[7:0]cnt;assignqd=cnt;always@(posedgeclk)beginif(!clear) cnt<=8'h00; //同步清0,低電平有效elseif(load) cnt<=d; //同步預(yù)置elseif(up_down) cnt<=cnt+1; //加法計數(shù)else cnt<=cnt-1; //減法計數(shù)endendmodule7.9三態(tài)邏輯設(shè)計

【例7.39】行為描述的三態(tài)門moduletristate1(in,en,out);inputin,en;outputregout;always@(inoren)beginif(en)out<=in;elseout<=1'bz;endendmodule【例7.40】調(diào)用門元件bufif1描述的三態(tài)門moduletristate2(in,en,out);inputin,en;outputout;triout;bufif1b1(out,in,en); //注意三態(tài)門端口的排列順序endmodule【例7.41】數(shù)據(jù)流描述的三態(tài)門moduletristate3(out,in,en);inputin,en;outputout;assignout=en?in:1‘bz; //若en=1,out=in; //若en=0,out為高阻態(tài)endmodule【例7.42】三態(tài)雙向驅(qū)動器modulebidir(y,a,en,b);inputa,en;outputb;inouty;assigny=en?a:'bz;assignb=y;endmodule【例7.44】三態(tài)雙向總線緩沖器modulettl245(a,b,oe,dir);inputoe,dir; //使能信號和方向控制inout[7:0]a,b; //雙向數(shù)據(jù)線assigna=({oe,

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論