版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第七章
Verilog設(shè)計的層次與風(fēng)格§7.1
Verilog設(shè)計的層次§7.2
門級結(jié)構(gòu)描述§7.3
行為描述§7.4
數(shù)據(jù)流描述
§7.5
不同描述風(fēng)格的設(shè)計§7.6多層次結(jié)構(gòu)電路的設(shè)計§7.7基本組合電路設(shè)計§7.8基本時序電路設(shè)計屬性§7.9
三態(tài)邏輯設(shè)計§7.1Verilog設(shè)計的層次VerilogHDL是硬件描述語言的一種,用于數(shù)字電子系統(tǒng)設(shè)計。設(shè)計者可用它進行各種級別的邏輯設(shè)計,可用它進行數(shù)字邏輯系統(tǒng)的仿真驗證、時序分析、邏輯綜合。它是目前應(yīng)用最廣泛的一種硬件描述語言。Verilog既是一種行為描述的語言也是一種結(jié)構(gòu)描述語言。Verilog較為適合系統(tǒng)級(System)、算法級(Alogrithem)、寄存器傳輸級(RTL)、邏輯(Logic)、門級(Gate)和電路開關(guān)級(Switch)的設(shè)計。Verilog描述的模型可以是實際電路五級不同級別的抽象:系統(tǒng)級(systemlevel):用高級語言結(jié)構(gòu)(如case語句)實現(xiàn)的設(shè)計模塊外部性能的模型;算法級(algorithmiclevel):用高級語言結(jié)構(gòu)實現(xiàn)的設(shè)計算法模型(寫出邏輯表達式);RTL級(registertransferlevel):描述數(shù)據(jù)在寄存器之間流動和如何處理這些數(shù)據(jù)的模型;門級(gatelevel):描述邏輯門(如與門、非門、或門、與非門、三態(tài)門等)以及邏輯門之間連接的模型;開關(guān)級(switchlevel):描述器件中三極管和儲存節(jié)點及其之間連接的模型。Verilog設(shè)計的描述風(fēng)格(建模)分為3種:結(jié)構(gòu)(Structural)描述:先描述功能的邏輯電路圖,再調(diào)用庫中的標(biāo)準(zhǔn)元器件或已設(shè)計好的模塊加以描述,就是表示元器件之間的互連,將它們組裝起來,形成更為復(fù)雜的設(shè)計。行為(Behavioural)描述:對設(shè)計實體按算法的路徑來描述,只描述所希望電路的功能或者說電路行為,而沒有直接指明或涉及實現(xiàn)這些行為的硬件結(jié)構(gòu)。數(shù)據(jù)流(DataFlow)描述:以規(guī)定設(shè)計中的各種寄存器形式為特征,然后在寄存器之間插入組合邏輯,描述數(shù)據(jù)流程的運動路徑、運動方向和運動結(jié)果。§7.2
用庫元件實現(xiàn)結(jié)構(gòu)描述調(diào)用VerilogHDL內(nèi)置(內(nèi)部預(yù)先定義好的)基本門級元件,或用戶自定義基本元件(UDP)來對硬件電路進行結(jié)構(gòu)描述。實現(xiàn)方法:調(diào)用開關(guān)級元件;調(diào)用Verilog內(nèi)置的基本門級元件;用戶自定義元件:根據(jù)不同用戶的需要,由用戶自己定義的模塊,定義好以后可以象內(nèi)置基本門級元件一樣被調(diào)用;通過例化方式調(diào)用以不同方式表述的模塊元件。內(nèi)置基本門級元件(14個)多輸入門and(與門)nand(與非門)or(或門)nor(或非門)xor(異或門)xnor(異或非門)多輸出門buf(緩沖器)not(非門)三態(tài)門bufif0(低電平使能緩沖器)bufif1(高電平使能緩沖器)notif0(低電平使能非門)notif1(高電平使能非門)上拉、下拉電阻pullup(上拉電阻)pulldown(下拉電阻)基本門的邏輯真值表
nand
有0則1,全1則0,其它x;nor有1則0,全0則1,其它x;
xor01則1,全1則0,全0則0,其它x;
xnor
全0則1,全1則1,01則0,其它x;
buf
入出相同;not01相反,其它x;bufif10控則z,1控則同;bufif01控則z,0控則同;notif10控則z,1控則反;notif01控則z,0控則反。多輸入門包括6種門級元件:and、nand、or、nor、xor、xnor。特點:有1個或多個輸出,但只有1個輸入。多輸出門包括2種門級元件:not和buf。特點:有1個或多個輸出,但只有1個輸入。三態(tài)門有一個輸出、一個數(shù)據(jù)輸入和一個控制輸入。特點:數(shù)據(jù)輸出端可以實現(xiàn)三態(tài)輸出。bufif0(低電平使能緩沖器):若控制輸入為1,則輸出為z(輸出端處于高阻狀態(tài));若控制輸入為0,輸入數(shù)據(jù)被傳輸至輸出端。bufif1(高電平使能緩沖器):若控制輸入為1,則輸入數(shù)據(jù)被傳輸至輸出端;若控制輸入為0,則輸出為z。notif0(低電平使能非門):若控制輸入為1,則輸出為z;若控制輸入為0,則輸出端是輸入數(shù)據(jù)值的邏輯非。notif1(高電平使能非門):若控制輸入為1,則輸出端是輸入數(shù)據(jù)值的邏輯非;若控制輸入為0;則輸出為z。上拉門、下拉門(電阻)上拉門:pullup,將輸出置為1。下拉門:pulldown,將輸出置為0。它們都只有一個輸出端口而沒有輸入端口。庫元件調(diào)用格式:基本門元件名<門例化名>
(<端口列表>);列表順序:(輸出1,輸出2,…,輸入1,
輸入2,…,);端口連接須用位置關(guān)聯(lián)法。各門元件的調(diào)用
(1)多輸入門端口列表順序
(輸出,輸入1,輸入2,輸入3……);anda1(out,in1,in2,in3);(2)三態(tài)門端口列表順序
(輸出,輸入,使能控制端);bufif1mytri1(out,in,enable);(3)多輸出門端口列表順序
(輸出1,輸出2,……,輸入);notN1(out1,out2,in);門級結(jié)構(gòu)描述用基本門實現(xiàn)的4選1MUX原理圖【例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);endmodule9.
用戶自定義元件(UDP)(§9.2:P272)UDP:UserDefinedPrimitive可利用UDP來定義有自己特色的用于仿真的基本邏輯元件模塊并建立相應(yīng)的原語庫。使用UDP定義后,就能夠象調(diào)用基本門元件一樣在模塊中使用,但端口列表只能有位置關(guān)聯(lián)。UDP在ModelSimt和Quartus
Ⅱ等EDA工具可綜合,但在Pynplify
Pro等EDA工具不可綜合。UDP模塊的結(jié)構(gòu)與一般模塊類似,只是不用module而改用primitive關(guān)鍵詞開始,不用endmodule而改用endprimitive關(guān)鍵詞結(jié)束。與一般的模塊相比,UDP模塊具有下面一些特點:UDP的輸出端口只能有一個,且必須位于端口列表的第一項。只有輸出端口能被定義為reg類型。UDP的輸入端口可有多個,一般時序電路UDP的輸入端口可多至9個,組合電路UDP的輸入端口可多至10個。所有的端口變量必須是1位標(biāo)量。在table表項中,只能出現(xiàn)0、1、x三種狀態(tài),不能出現(xiàn)z狀態(tài)。UDP的定義(primitive…endprimitive)primitive元件名(輸出端口,輸入端口1,輸入端口2,…)output輸出端口名;input輸入端口1,輸入端口2,…;reg輸出端口名;initialbegin
輸出端口或內(nèi)部寄存器賦初值(0,1或x);
endtable //輸入1輸入2……:輸出
真值列表endtableendprimitive只有一個輸出端口組合電路UDP元件primitivecarry_udp(cout,cin,a,b);inputcin,a,b;outputcout;table//cina
b:cout//真值表
000:0;
010:0;
001:0;
011:1;
100:0;
101:1;
110:1;
111:1;endtableendprimitive【例9.3】1位全加器進位輸出UDP元件primitivecarry_udpx(cout,cin,a,b);inputcin,a,b;outputcout;table//cina
b
:cout
//真值表
000:0;
010:0;
001:0;
011:1;
100:0;
101:1;
110:1;
111:1;
00x:0;
0x0:0;
x00:0;
11x:1;
1x1:1;
x11:1;endtableendprimitive【例9.4】包含x態(tài)輸入的1位全加器進位輸出UDP元件
【例9.5】用簡縮符“?”表述的1位全加器進位輸出UDP元件primitivecarry_udpx(cout,cin,a,b);inputcin,a,b;outputcout;table//cina
b
:cout
//真值表
?00:0;
//只要有兩個輸入為0,則進位輸出肯定為0
0?0:0;
00?:0;
?11:1;
//只要有兩個輸入為1,則進位輸出肯定為1
1?1:1;
11?:1;endtableendprimitive時序電路UDPprimitivelatch(q,clk,reset,d);inputclk,reset,d;outputq;regq;initialq=1'b1; //初始化table//clkresetd
:
state
:
q
?
1
?:
?
:0;
0
0
0:
?
:0;
0
0
1
:
?
:1;
1
0
?
:
?
:-; endtableendprimitive【例9.6】電平敏感的1位數(shù)據(jù)鎖存器UDP元件
【例9.7】上升沿觸發(fā)的D觸發(fā)器UDP元件primitivedff_udp(q,d,clk);inputd,clk;outputq;regq;table//clkd
:state:q(01)0:
?
:0; //上升沿到來,輸出q=d(01)1:
?
:1;(0x)1:
1
:1;(0x)0:
0
:0;(?0)?:
?
:-; //沒有上升沿到來,輸出q保持原值?(??):
?
:-; //時鐘不變,輸出也不變endtableendprimitiveUDP中的縮記符§7.3
行為描述行為描述就是對設(shè)計實體的數(shù)學(xué)模型的描述,其抽象程度遠(yuǎn)高于結(jié)構(gòu)描述方式。行為描述類似于高級編程語言,當(dāng)描述一個設(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;endcaseendmodule【例7.3】行為描述的4位計數(shù)器modulecount4(clk,clr,out);inputclk,clr;output[3:0]out;reg[3:0]out;always@(posedgeclkorposedgeclr)begin if(clr) out<=0; else out<=out+1;endendmodule采用行為描述方式時需注意:用行為描述模式設(shè)計電路,可以降低設(shè)計難度。行為描述只需表示輸入與輸出之間的關(guān)系,不需要包含任何結(jié)構(gòu)方面的信息。設(shè)計者只需寫出源程序,而挑選電路方案的工作由EDA軟件自動完成。在電路的規(guī)模較大或者需要描述復(fù)雜的邏輯關(guān)系時,應(yīng)首先考慮用行為描述方式設(shè)計電路,如果設(shè)計的結(jié)果不能滿足資源占有率的要求,則應(yīng)改變描述方式?!?.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è)計電路與用傳統(tǒng)的邏輯方程設(shè)計電路很相似。設(shè)計中只要有了布爾代數(shù)表達式就很容易將它用數(shù)據(jù)流方式表達出來。表達方法是用Verilog中的邏輯運算符置換布爾邏輯運算符即可。比如,如果邏輯表達式為:f=ab+cd,則用數(shù)據(jù)流方式描述為:assignF=(a&b)|(~(c&d))數(shù)據(jù)流描述有時也表示行為,有時也含有結(jié)構(gòu)信息,因此,有的描述形式究竟屬于哪一種會很難界定,但這絕對不會影響具體描述的應(yīng)用。下面是2選1MUX三種不同的描述?!纠?.6】門級結(jié)構(gòu)描述的2選1MUXmoduleMUX2_1a(output
out,input
a,b,sel);wiresel_,a1,a2;not(sel_,sel);and(a1,a,sel_),(a2,b,sel);or(out,a1,a2);endmodule【例7.7】行為描述的2選1MUXmoduleMUX2_1b(out,a,b,sel);outputout;inputa,b,sel;regout;always@(aorborsel)begin if(sel)
out=b; else
out=a;endendmodule【例7.8】數(shù)據(jù)流描述的2選1MUXmoduleMUX2_1c(out,a,b,sel);outputout;inputa,b,sel;assignout=sel?b:a;endmodule§7.5
不同描述風(fēng)格的設(shè)計對設(shè)計者而言,采用的描述級別越高,設(shè)計越容易;對綜合器而言,行為級的描述為綜合器的優(yōu)化提供了更大的空間,較之門級結(jié)構(gòu)描述更能發(fā)揮綜合器的性能,所以在電路設(shè)計中,除非一些關(guān)鍵路徑的設(shè)計采用門級結(jié)構(gòu)描述外,一般更多地采用行為建模方式?!?.5.1
半加器設(shè)計【例7.10】數(shù)據(jù)流描述的1位半加器moduleh_add2(a,b,so,co);
inputa,b;
outputso,co;
assignso=a^b;
assign
co=a&b;
endmodule
【例7.9】門級結(jié)構(gòu)描述的1位半加器moduleh_add1(a,b,so,co);inputa,b;outputsum,cout;and(co,a,b);xor(so,a,b);endmodule【例7.11】行為描述的1位半加器moduleh_add3(a,b,so,co);inputa,b;outputsum,cout;regsum,cout;always@(aorb)begincase({a,b})2’b00:beginso=0;co=0;end2’b01:beginso=1;co=0;end2’b10:beginso=1;co=0;end2’b11:beginso=0;co=1;endendcaseendendmodule1位全加器門級結(jié)構(gòu)原理圖§7.5.2
1位全加器設(shè)計【例7.12】調(diào)用元件實現(xiàn)(門級結(jié)構(gòu)描述)的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;//方式1assignsum=a^b^cin;assigncout=(a&b)|(b&cin)|(cin&a);//方式2//assign{cout,sum}=a+b+cin;endmodule【例7.14】行為描述的1位全加器modulefull_add4(a,b,cin,sum,cout);inputa,b,cin;outputsum,cout;regsum,cout; regm1,m2,m3;always@(aorborcin)begin sum=(a^b)^cin; m1=a&b;m2=b&cin;m3=a&cin; cout=(m1|m2)|m3;endendmodule采用層次化方式設(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位全加器結(jié)構(gòu)示意圖§7.5.3
4位全加器設(shè)計【例7.17】結(jié)構(gòu)描述的4位級聯(lián)全加器'include"full_add1.v"moduleadd4_1(sum,cout,a,b,cin);output[3:0]sum;outputcout;input[3:0]a,b;inputcin;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位全加器RTL圖【例7.18】數(shù)據(jù)流描述的4位全加器moduleadd4_2(cout,sum,a,b,cin);output[3:0]sum;outputcout;input[3:0]a,b;inputcin;assign{cout,sum}=a+b+cin;endmodule【例7.19】行為描述的4位全加器moduleadd4_3(cout,sum,a,b,cin);output[3:0]sum;outputcout;input[3:0]a,b;inputcin;reg[3:0]sum;regcout;always@(aorborcin)begin {cout,sum}=a+b+cin;endendmodule行為和數(shù)據(jù)流描述的4位全加器RTL圖§7.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è)計方法。多層次結(jié)構(gòu)電路的描述既可以采用文本方式,也可以用圖形和文本混合設(shè)計的方式。用一個8位累加器的設(shè)計為例來說明這兩種設(shè)計方式。圖形與文本混合設(shè)計:
用文本先設(shè)計一個8位全加器和一個8位寄存器,再用電路圖連接起來。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)入原理圖編輯窗并連接好文本設(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)—頂層,位置關(guān)聯(lián)reg8accreg8(.qout(accout),.clear(clear), .in(sum),.clk(clk)); //調(diào)用方式2,信號名對應(yīng)—頂層,名字關(guān)聯(lián)模塊調(diào)用的指定方式----和所用的綜合器有關(guān)(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)庫管理方式§7.7
基本組合邏輯電路(CombinationalLogicCircuit)設(shè)計組合邏輯主要用于進行電路中的數(shù)學(xué)和邏輯運算,如實現(xiàn)加法、乘法、與、非運算等。組合邏輯沒有“記憶”功能,即任何時刻輸入變化時,輸出也在同一時刻變化。組合邏輯示意圖門級結(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);endmodule譯碼器譯碼是將輸入代碼轉(zhuǎn)換成特定的輸出信號。能實現(xiàn)這種譯碼功能的邏輯電路稱為譯碼器?,F(xiàn)以74138為例。74138真值表74138引腳圖modulettl74138(a,y,g1,g2a,g2b);input[2:0]a;inputg1,g2a,g2b;outputreg[7:0]y;always@(*)beginif(g1&~g2a&~g2b) //只有當(dāng)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;endendmodule七段顯示譯碼器真值表與字體結(jié)構(gòu):共陰極七段顯示譯碼器數(shù)碼管的兩種接法:moduledecode4_7(decodeout,indec);output[6:0]decodeout;input[3:0]indec;reg[6:0]decodeout;always@(indec) begincase(indec)
//用case語句進行譯碼4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b0110000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b1111001;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:decodeout=7'b1111111;4'd9:decodeout=7'b1111011;default:decodeout=7'bx;endcaseendendmodule優(yōu)先編碼器允許同時在幾個輸入端有輸入信號,編碼器按輸入信號排定的優(yōu)先順序,只對同時輸入的幾個信號中優(yōu)先權(quán)最高的一個進行編碼。現(xiàn)以74148為例?!纠?.23】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;endend
endmodule【例7.24】用函數(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;else code=3'd0;endfunctionassigndout=code(din);//函數(shù)調(diào)用endmodule【例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; //生成奇校驗位endmodule奇偶校驗位產(chǎn)生器奇偶校驗位有兩種類型:偶校(even)驗位與奇校(odd)驗位。如果一組給定數(shù)據(jù)位中1的個數(shù)是奇數(shù),那么偶校驗位就置為1,從而使得總的1的個數(shù)是偶數(shù)。如果給定一組數(shù)據(jù)位中1的個數(shù)是偶數(shù),那么奇校驗位就置為1,使得總的1的個數(shù)是奇數(shù)。時序邏輯電路,是指在VerilogHDL所描述的電路中,包含一個或多個存儲單元,這些存儲單元可以是邊沿觸發(fā)的寄存器,或者是電平觸發(fā)的鎖存器。由于引入了存儲單元,時序邏輯電路具有“記憶”功能,可以記錄當(dāng)前時刻之前的輸入激勵情況以及電路狀態(tài)。因此,與組合邏輯不同的是,時序邏輯的輸出同時取決于當(dāng)前時刻和以前時刻的輸入。§7.8基本時序邏輯電路(Sequential
Logic
Circuit)設(shè)計moduleDFF(Q,D,CLK);outputQ;inputD,CLK;regQ;always@(posedgeCLK)beginQ<=D;endendmodule觸發(fā)器:D觸發(fā)器最簡單的D觸發(fā)器(只有一個沿觸發(fā)信號)0011D0101Q
n0011Q
n+1輸出狀態(tài)同D狀態(tài)
功能D觸發(fā)器的功能表D觸發(fā)器特性方程:
Qn+1=D帶異步清0、異步置1端的D觸發(fā)器(有多個沿觸發(fā)信號)moduleDFF1(q,qn,d,clk,set,reset);inputd,clk,set,reset;outputq,qn;regq,qn;always@(posedgeclkornegedgesetornegedgereset)beginif(!reset) beginq<=0;qn<=1;end//異步清0,低電平有效elseif(!set)beginq<=1;qn<=0;end//異步置1,低電平有效else
beginq<=d;qn<=~d;endendendmodule1001Q00110Q0XX10XXX001111X
0111QQDCPRDSD輸出輸入帶同步清0和置1端的D觸發(fā)器(只有一個沿觸發(fā)信號)1001Q00110Q0XX10X
01000XX
100XQQDCPRDSD輸出輸入moduledff2(q,qn,d,clk,set,reset);inputd,clk,set,reset;outputq,qn;regq,qn;always@(posedgeclk)beginif(reset)beginq<=0;qn<=1;end
//同步清0,高電平有效elseif(set)beginq<=1;qn<=0;end
//同步置1,高電平有效else
beginq<=d;qn<=~d;endendendmoduleJK觸發(fā)器Qn+1JK功能QnJK觸發(fā)器功能表01輸出狀態(tài)同J狀態(tài)000110輸出狀態(tài)同J狀態(tài)110111011000保持0101Qn+1=QnJK觸發(fā)器特性方程:【例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;
endcase
endendmodule鎖存器與寄存器
寄存器用于寄存一組二值代碼,廣泛用于各類數(shù)字系統(tǒng)。因為一個觸發(fā)器能儲存1位二值代碼,所以用N個觸發(fā)器組成的寄存器能儲存一組N位的二值代碼。
鎖存器是指輸出端的狀態(tài)不會隨輸入端的狀態(tài)變化而變化,僅在有鎖存信號時輸入的狀態(tài)被保存到輸出,直到下一個鎖存信號到來時才改變?!纠?.28】電平敏感的1位數(shù)據(jù)鎖存器modulelatch1(q,d,le);inputd,le;outputq;assignq=le?d:q;//le為高電平時,將輸入端數(shù)據(jù)鎖存endmodule【例7.29】帶置位/復(fù)位端的1位數(shù)據(jù)鎖存器modulelatch2(q,d,le,set,reset);inputd,le,set,reset;outputq;assignq=reset?0:(set?1:(le?d:q));endmodule【例7.30】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;endendmodule【例7.31】數(shù)據(jù)寄存器—參數(shù)化設(shè)計modulereg_w(dout,din,clk,clr);parameterWIDTH=7;inputclk,clr;input[WIDTH:0]din;outputreg[WIDTH:0]dout;always@(posedgeclk,posedgeclr)begin if(clr)dout<=0; elsedout<=din;endendmodule【例7.32】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.33】可變模加法/減法計數(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ù)endendmodule4位串/并轉(zhuǎn)換器moduleserial_pal(clk,reset,en,in,out);inputclk,reset,en,in;output[3:0]out;reg[3:0]out;always@(posedgeclk)begin
if(reset)
out<=4'h0;else
if(en)out<={out,in};
end
endmodulemodulempc(instr,out);input[17:0]instr;
//instr為輸入的指令output[8:0]out;
//輸出結(jié)果regfunc;reg[8:0]out;reg[7:0]op1,op2;
//從指令中提取的兩個操作數(shù)function[16:0]code_add;input[1
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度房地產(chǎn)合作終止協(xié)議書
- 2025年度旅游文化股權(quán)合作協(xié)議書
- 二零二五年度木工機械操作人員勞務(wù)租賃合同4篇
- 2025年度牧業(yè)產(chǎn)品品牌推廣與營銷合同4篇
- 二零二五年度餐飲店員工激勵機制與績效考核合同
- 二零二五版環(huán)保技術(shù)入股合作協(xié)議書3篇
- 二零二五年度消防設(shè)施檢測與評估合同
- 2025年度汽車維修配件買賣及售后服務(wù)合同
- 二零二五年度中式快餐連鎖加盟經(jīng)營合同
- 2025年度股權(quán)代持協(xié)議書版:農(nóng)業(yè)產(chǎn)業(yè)化股權(quán)代持與農(nóng)產(chǎn)品溯源協(xié)議
- 房地產(chǎn)銷售任務(wù)及激勵制度
- 并購指南(如何發(fā)現(xiàn)好公司)
- DL-T-1642-2016環(huán)形混凝土電桿用腳扣
- 銅礦成礦作用與地質(zhì)環(huán)境分析
- 30題紀(jì)檢監(jiān)察位崗位常見面試問題含HR問題考察點及參考回答
- 詢價函模板(非常詳盡)
- 《AI營銷畫布:數(shù)字化營銷的落地與實戰(zhàn)》
- 麻醉藥品、精神藥品、放射性藥品、醫(yī)療用毒性藥品及藥品類易制毒化學(xué)品等特殊管理藥品的使用與管理規(guī)章制度
- 乘務(wù)培訓(xùn)4有限時間水上迫降
- 2023年低年級寫話教學(xué)評語方法(五篇)
- DB22T 1655-2012結(jié)直腸外科術(shù)前腸道準(zhǔn)備技術(shù)要求
評論
0/150
提交評論