VerilogHDL常用建模方法課件_第1頁
VerilogHDL常用建模方法課件_第2頁
VerilogHDL常用建模方法課件_第3頁
VerilogHDL常用建模方法課件_第4頁
VerilogHDL常用建模方法課件_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章VerilogHDL常用建模方法3.1建模方法引例3.2結(jié)構(gòu)化形式建模3.3數(shù)據(jù)流級建模3.4行為級建模3.5小結(jié)第3章VerilogHDL常用建模方法3.1建模方法引13.1建模方法引例【例3-1】設計實現(xiàn)一個3人判決電路,當3個人中有2人或者超過2個人同意,則表決結(jié)果為通過;否則表決結(jié)果不通過。3.1建模方法引例【例3-1】設計實現(xiàn)一個3人判決電路,23.1建模方法引例第一步:理解題意設a,b,c分別代表3個人,同意用1表示,不同意用0表示,y代表表決結(jié)果,1表示通過,0表示不通過。根據(jù)題意有,當a,b,c三個中有2個為1,或者3個均為1時,y為1,否則y為0。第二步:根據(jù)題意,列真值表abcy000000100100011110001011110111113.1建模方法引例第一步:理解題意abcy0000001033.1建模方法引例第三步:根據(jù)真值表,列輸出方程:y=a'bc+ab'c+abc'+abc第四步:化簡方程,可以采用代數(shù)化簡法或者卡諾圖化簡法化簡后的方程為:y=ab+bc+ca000101111000010111abcy3.1建模方法引例第三步:根據(jù)真值表,列輸出方程:第四步:43.1建模方法引例第五步:根據(jù)化簡后的方程畫出電路圖3.1建模方法引例第五步:根據(jù)化簡后的方程畫出電路圖53.1建模方法引例【例3-2】對應于步驟一的Verilog建模moduledecision_1(a,b,c,y);inputa,b,c;outputregy;always@(a,b,c) if((a&b==1)|(b&c==1)|(c&a==1)|(a&b&c==1))y=1; elsey=0;endmodule3.1建模方法引例【例3-2】對應于步驟一的Verilo63.1建模方法引例【例3-3】對應于步驟二的Verilog建模moduledecision_2(a,b,c,y);inputa,b,c;outputregy;always@(a,b,c) case({a,b,c}) 3'b000:y=0; 3'b001:y=0; 3'b010:y=0; 3'b011:y=1; 3'b100:y=0; 3'b101:y=1; 3'b110:y=1; 3'b111:y=1; endcaseendmodule3.1建模方法引例【例3-3】對應于步驟二的Verilo73.1建模方法引例【例3-4】對應于步驟三的Verilog建模moduledecision_3(a,b,c,y);inputa,b,c;outputy;assigny=(~a&b&c)|(a&~b&c)|(a&b&~c)|(a&b&c);endmodule3.1建模方法引例【例3-4】對應于步驟三的Verilo83.1建模方法引例【例3-5】對應于步驟四的Verilog建模moduledecision_4(a,b,c,y);inputa,b,c;outputy;assigny=(a&b)|(b&c)|(c&a);endmodule3.1建模方法引例【例3-5】對應于步驟四的Verilo93.1建模方法引例【例3-6】對應于步驟五的Verilog建模moduledecision_5(a,b,c,y);inputa,b,c;outputy;//assigny=(a&b)+(b&c)+(c&a);//assigny=a&b+b&c;and(ab,a,b),(bc,b,c),(ca,c,a);or(y,ab,bc,ca);endmodule3.1建模方法引例【例3-6】對應于步驟五的Verilo103.1建模方法引例圖3-6功能仿真波形3.1建模方法引例圖3-6功能仿真波形113.2結(jié)構(gòu)化形式建模1.門級建模2.用戶自定義原語3.2結(jié)構(gòu)化形式建模1.門級建模12門級建模(1)與/或門類(2)緩沖/非門類門級建模(1)與/或門類13門級建?!纠?-7】利用雙輸入端的nand門,編寫自己與門(my_and)、或門(my_or)、非門(my_not)、異或門(my_xor)。modulemy_and(a,b,y);//用兩個nand門inputa,b;outputy;wirenandab;nand(nandab,a,b),(y,nandab,nandab);endmodulemodulemy_or(a,b,y);//用三個nand門inputa,b;outputy;wirenandaa,nandbb;nand(nandaa,a,a),(nandbb,b,b),(y,nandaa,nandbb);endmodulemodulemy_not(a,y);//用一個nand門inputa;outputy;nand(y,a,a);endmodulemodulemy_xor(a,b,y);//用四個nand門實現(xiàn)異或門inputa,b;outputy;wireandab,c,d;nand(andab,a,b), (c,andab,a), (d,andab,b), (y,c,d);endmodule門級建?!纠?-7】利用雙輸入端的nand門,編寫自己與門14用戶自定義原語【例3-8】表示組合邏輯的UDP舉例:一位全加器//全加器進位實現(xiàn)部分primitiveU_ADD_C(CO,A,B,CI);outputCO;inputA,B,CI;table//ABCI:CO11?:1;1?1:1;?11:1;00?:0;0?0:0;?00:0;endtableendprimitive//全加器求和實現(xiàn)部分primitiveU_ADD_S(S,A,B,CI);outputS;inputA,B,CI;table//ABCI:S000:0;001:1;010:1;011:0;100:1;101:0;110:0;111:1;endtableendprimitive用戶自定義原語【例3-8】表示組合邏輯的UDP舉例:一位全15用戶自定義原語//調(diào)用上述兩個UDP的全加器模塊moduleU_ADD(SUM,CO,a,b,ci);inputa,b,ci;outputSUM,CO;U_ADD_SU1(SUM,a,b,ci);U_ADD_CU2(CO,a,b,ci);endmodule用戶自定義原語//調(diào)用上述兩個UDP的全加器模塊16用戶自定義原語【例3-9】表示時序邏輯的UDP舉例:D觸發(fā)器primitived_edge_ff(q,clk,data);outputq;inputclk,data;regq;table//clkdatstatenext (01)0:?:0; (01)1:?:1;//時鐘下降沿 (?0)?:?:-;//時鐘穩(wěn)定時忽略data變化 ?(??):?:-;endtableendprimitive用戶自定義原語【例3-9】表示時序邏輯的UDP舉例:D觸發(fā)173.3數(shù)據(jù)流級建模1.連續(xù)賦值語句2.運算符類型3.3數(shù)據(jù)流級建模1.連續(xù)賦值語句18連續(xù)賦值語句【例3-10】使用數(shù)據(jù)流建模,實現(xiàn)一位半加器。moduleadder_half(ain,bin,sum,co);inputain,bin;outputsum,co;assign{co,sum}=ain+bin;endmoduleinputoutputainbinsumco0000011010101101連續(xù)賦值語句【例3-10】使用數(shù)據(jù)流建模,實現(xiàn)一位半加器。19運算符類型運算符類型運算符執(zhí)行的操作操作數(shù)的個數(shù)運算符類型運算符執(zhí)行的操作操作數(shù)的個數(shù)算術(shù)*乘2關(guān)系>大于2/除2<小于2%模2>=大于等于2+加2<=小于等于2-減2==等于2邏輯!邏輯反1!=不等于2&&邏輯與2縮減&縮減與1||邏輯或2~&縮減與非1按位~按位求反1|縮減或1&按位與2~|縮減或非1|按位或2^縮減異或1^按位異或2~^縮減同或1~^按位同或2位拼接{}拼接任意移位<<左移2{{}}復制任意>>右移2條件?:條件3運算符類型運算符類型運算符執(zhí)行的操作操作數(shù)的個數(shù)運算符類型運20算術(shù)運算符【例3-11】算術(shù)運算符示例modulearith(a,b,add,sub,mul,div,mod,pow);input[7:0]a,b;output[7:0]add,sub,mul,div,mod,pow;assign add=a+b, sub=a-b,

mul=a*b, div=a/b, mod=a%b, pow=a**4;endmodule算術(shù)運算符【例3-11】算術(shù)運算符示例21關(guān)系運算符關(guān)系運算符包括:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!==)。關(guān)系運算符關(guān)系運算符包括:大于(>)、小于(<)、大于等于(22邏輯運算符ab!a!ba&&ba||b真真假假真真真假假真假真假真真假假真假假真真假假邏輯運算符ab!a!ba&&ba||b真真假假真真真假假真假23按位運算符按位與01按位或01按位取反結(jié)果0000010110111110按位異或01按位同或01001010110101按位運算符按位與01按位或01按位取反結(jié)果00000101124縮減運算符縮減運算符包括:縮減與(&)、縮減與非(~&)、縮減或(|)、縮減或非(~|)、縮減異或(^)、縮減同或(~^,^~)??s減運算符是單目運算符,也有與、或、非運算。其與、或、非運算規(guī)則類似于位運算符的與、或、非運算規(guī)則,但其運算過程不同。

縮減運算符縮減運算符包括:縮減與(&)、縮減與非(~&)、縮25條件運算符【例3-12】試用條件運算符來實現(xiàn)一個四選一多路選擇器。modulemux4to1(out,condition1,condition2,in1,in2,in3,in4);outputout;inputin1,in2,in3,in4;inputcondition1,condition2;assignout=(condition1)?(condition2?in1:in2):(condition2?in3:in4);endmodule條件運算符【例3-12】試用條件運算符來實現(xiàn)一個四選一多路26移位運算符【例3-13】采用移位運算符實現(xiàn)兩個3位數(shù)的乘法。modulemul_3bit(a,b,mul);input[2:0]a,b;output[5:0]mul;wire[5:0]mul1,mul2,mul3;assignmul=mul3;assignmul1=b[0]?a:0;assignmul2=b[1]?(mul1+(a<<1)):mul1;assignmul3=b[2]?(mul2+(a<<2)):mul2;endmodule移位運算符【例3-13】采用移位運算符27位拼接運算符{a,b[3:0],w,3’b101}//等價于{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}{1,1}//64位,從右邊數(shù)第0位為1,第32位為1,其余位均為0{4{w}}//等價于{w,w,w,w}{b,{3{a,b}}}//等價于{b,a,b,a,b,a,b}位拼接運算符{a,b[3:0],w,3’b101}//等28優(yōu)先級別優(yōu)先級別293.4行為級建模1.結(jié)構(gòu)化過程語句always2.過程賦值語句3.塊語句4.條件語句5.多路分支語句6.循環(huán)語句7.任務和函數(shù)語句3.4行為級建模1.結(jié)構(gòu)化過程語句always30結(jié)構(gòu)化過程語句always【例3-15】使用always語句描述D觸發(fā)器modulemydff(q,clk,d);inputclk,d;outputq;regq;always@(posedgeclk)q<=d;endmodule結(jié)構(gòu)化過程語句always【例3-15】使用always語句31過程賦值語句【例3-16】阻塞賦值方式描述的移位寄存器1moduleblock1(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin//注意賦值語句的順序 Q2=Q1; Q1=Q0; Q0=D;endendmodule過程賦值語句【例3-16】阻塞賦值方式描述的移位寄存器132過程賦值語句【例3-17】阻塞賦值方式描述的移位寄存器2moduleblock2(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin//該句與下句的順序與例3-16顛倒 Q1=Q0; Q2=Q1; Q0=D;endendmodule過程賦值語句【例3-17】阻塞賦值方式描述的移位寄存器233過程賦值語句【例3-18】阻塞賦值方式描述的移位寄存器3moduleblock3(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin Q0=D;//3條賦值語句的順序與例3-16完全顛倒 Q1=Q0; Q2=Q1;endendmodule過程賦值語句【例3-18】阻塞賦值方式描述的移位寄存器334過程賦值語句【例3-19】非阻塞賦值方式描述的移位寄存器1modulenon_block1(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin Q1<=Q0; Q2<=Q1; Q0<=D;endendmodule【例3-20】非阻塞賦值方式描述的移位寄存器2modulenon_block2(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin Q0<=D;//3條賦值語句的順序與例3-19完全顛倒 Q2<=Q1; Q1<=Q0;endendmodule過程賦值語句【例3-19】非阻塞賦值方式描述的移位寄存器1【35塊語句【例3-21】完成以下兩個功能:(1)使用異或運算符對D完成縮位異或運算;(2)檢測D中1的個數(shù)Verilog實現(xiàn)代碼如下:modulenamed_block(D,xnor_D,CountOnes);input[3:0]D;outputregxnor_D;outputreg[2:0]CountOnes;always@(D)begin:block1 xnor_D=0; CountOnes=0; begin:xor_block integerI; for(I=0;I<4;I=I+1) xnor_D=xnor_D^D[I]; end//循環(huán) begin:Count_block integerJ; for(J=0;J<4;J=J+1) if(D[J]) CountOnes=CountOnes+1; endendendmodule塊語句【例3-21】完成以下兩個功能:(1)使用異或運算符對36條件語句【例3-22】使用always語句描述具有同步復位和同步置位功能的D觸發(fā)器modulemydff(q,clk,set,clr,d);inputclk,d,set,clr;outputq;regq;always@(posedgeclk)beginif(set)q<=1;elseif(!clr)q<=0;elseq<=d;endendmodule條件語句【例3-22】使用always語句描述具有同步復位37多路分支語句【例3-23】使用case語句實現(xiàn)四功能的算術(shù)邏輯單元(ALU)modulealu_4fun(a,b,sel,out);input[3:0]a,b;input[1:0]sel;outputreg[4:0]out;always@(a,b,sel)begin case(sel) 2'b00:out=a+b; 2'b01:out=a-b; 2'b10:out=a<<b; default:out=a%b; endcaseendendmodulesel信號功能2’b00out=a+b2’b01out=a-b2’b10out=a<<b其他out=a%b多路分支語句【例3-23】使用case語句實現(xiàn)四功能的算術(shù)邏38循環(huán)語句【例3-24】使用repeat循環(huán)語句及加法和移位操作來實現(xiàn)一個參數(shù)化的多位乘法器。modulemult_repeat(result,op_a,op_b);parametersize=4;input[size:1]op_a,op_b;output[2*size:1]result;reg[2*size:1]shift_opa,result;reg[size:1]shift_opb;always@(op_aorop_b)begin:multresult=0;shift_opa=op_a;shift_opb=op_b;repeat(size)beginif(shift_opb[1])result=result+shift_opa;shift_opa=shift_opa<<1;//Shiftleftshift_opb=shift_opb>>1;//Shiftrightendendendmodule循環(huán)語句【例3-24】使用repeat循環(huán)語句及加法和移位操39循環(huán)語句【例3-25】使用for循環(huán)語句實現(xiàn)一個參數(shù)化的多位乘法器。modulemult_for(result,op_a,op_b);parametersize=4;input[size:1]op_a,op_b;output[2*size:1]result;reg[2*size:1]shift_opa,result;reg[size:1]shift_opb;always@(op_aorop_b)begin:mult//由于塊中定義了局部變量i,此處必須給塊命名 integeri=0;result=0;shift_opa=op_a;shift_opb=op_b;for(i=0;i<size;i=i+1)beginif(shift_opb[1])result=result+shift_opa;shift_opa=shift_opa<<1;//Shiftleftshift_opb=shift_opb>>1;//Shiftrightendendendmodule循環(huán)語句【例3-25】使用for循環(huán)語句實現(xiàn)一個參數(shù)化的多位40循環(huán)語句【例3-26】使用for循環(huán)語句實現(xiàn)一個參數(shù)化的多位乘法器的另一種算法。modulemult_for2(result,op_a,op_b);parametersize=4;input[size:1]op_a,op_b;output[2*size:1]result;reg[2*size:1]shift_opa,result;reg[size:1]shift_opb;always@(op_aorop_b)begin:mult integerj; result=0; for(j=1;j<=size;j=j+1) if(op_b[j]) result=result+(op_a<<(j-1));endendmodule循環(huán)語句【例3-26】使用for循環(huán)語句實現(xiàn)一個參數(shù)化的多位41循環(huán)語句【例3-27】使用for循環(huán)語句對變量中的1的位進行計數(shù)的程序片斷begin:count1sreg[7:0]tempreg;count=0;for(tempreg=rega;tempreg;tempreg=tempreg>>1)if(tempreg[0])count=count+1;end循環(huán)語句【例3-27】使用for循環(huán)語句對變量中的1的位進行42任務和函數(shù)語句【例3-28】用任務實現(xiàn)輸入數(shù)據(jù)按位逆序后輸出的功能Verilog實現(xiàn)代碼如下:module task_ex(clk,D,Q);inputclk;input[MAX_BITS:1]D;outputreg[MAX_BITS:1]Q;parameterMAX_BITS=8;taskreverse_bits;input[MAX_BITS:1]data;output[MAX_BITS:1]result;integerK;for(K=0;K<MAX_BITS;K=K+1) result[MAX_BITS-K]=data[K+1];endtaskalways@(posedgeclk) reverse_bits(D,Q);endmodule任務和函數(shù)語句【例3-28】用任務實現(xiàn)輸入數(shù)據(jù)按位逆序后輸出43任務和函數(shù)語句【例3-29】用函數(shù)實現(xiàn)輸入數(shù)據(jù)位逆序后輸出的功能Verilog實現(xiàn)代碼如下:module function_ex(clk,D,Q);inputclk;input[MAX_BITS:1]D;outputreg[MAX_BITS:1]Q;parameterMAX_BITS=8;function[MAX_BITS:1]reverse_bits; input[MAX_BITS:1]data;integerK;for(K=0;K<MAX_BITS;K=K+1) reverse_bits[MAX_BITS-K]=data[K+1];endfunctionalways@(posedgeclk) Q<=reverse_bits(D);endmodule任務和函數(shù)語句【例3-29】用函數(shù)實現(xiàn)輸入數(shù)據(jù)位逆序后輸出的443.5小結(jié)在本章,我們討論了以下知識點:本章從一個典型數(shù)字電路實例入手來引入建模方法,介紹VerilogHDL的常用建模方法,并重點介紹門級建模、數(shù)據(jù)流級建模和行為級建模方法。門的基本類型包括與門(and)、或門(or)、與非門(nand)、或非門(nor)、異或門(xor)、同或門(xnor)、緩沖器(buf)和非門(not)等。每種門都有邏輯符號、真值表和對應的verilog原語。這些原語的調(diào)用方法和模塊的調(diào)用方法一樣,但這些原語是verilog語言預定義的(不需要自行編寫)。門的任意一個輸入發(fā)生變化以后,門的輸出立即被重新計算。連續(xù)賦值語句是數(shù)據(jù)流建模的主要語法結(jié)構(gòu)。連續(xù)賦值語句總是處于有效狀態(tài),即任一操作數(shù)的變化都會立即導致對表達式的重新計算。連續(xù)賦值語句的左側(cè)必須是線網(wǎng)類型的變量或者拼接。任何邏輯功能都能夠使用連續(xù)賦值語句來完成。3.5小結(jié)在本章,我們討論了以下知識點:453.5小結(jié)運算符的類型包括算術(shù)、關(guān)系、邏輯、按位、縮減、條件、移位和位拼接運算符。單目、雙目和三目運算符分別具有一個、兩個和三個操作數(shù),而拼接運算符可以具有任意多個操作數(shù)。由于運算符的優(yōu)先級被忽視或混淆而造成錯誤的情況經(jīng)常發(fā)生。為了避免源于運算符優(yōu)先級的運算錯誤,在不確定運算符優(yōu)先級的情況下,建議讀者使用小括號將各個表達式分開。另外,使用括號也可以提高程序的可讀性,明確表達各運算符間的優(yōu)先關(guān)系。電路的門級描述、數(shù)據(jù)流描述、行為描述,抽象層次越來越高,但也越來越接近人的思維,方便設計者高效準確的進行系統(tǒng)設計。利用任務和函數(shù)可以把一個很大的程序模塊分解成許多較小的任務和函數(shù),這樣便于理解和調(diào)試。VeirlogHDL函數(shù)和任務在綜合時被理解成具有獨立運算功能的電路,每調(diào)用一次函數(shù)相當于改變這部分電路的輸入以得到相應的計算結(jié)果。學會使用task和function語句可以簡化程序的結(jié)構(gòu),使程序明白易懂,是編寫較大型模塊的基本功。3.5小結(jié)運算符的類型包括算術(shù)、關(guān)系、邏輯、按位、縮減、條46P79T1、2、3、4、5、6、7、8、9、10、11作業(yè)P79作業(yè)47第3章VerilogHDL常用建模方法3.1建模方法引例3.2結(jié)構(gòu)化形式建模3.3數(shù)據(jù)流級建模3.4行為級建模3.5小結(jié)第3章VerilogHDL常用建模方法3.1建模方法引483.1建模方法引例【例3-1】設計實現(xiàn)一個3人判決電路,當3個人中有2人或者超過2個人同意,則表決結(jié)果為通過;否則表決結(jié)果不通過。3.1建模方法引例【例3-1】設計實現(xiàn)一個3人判決電路,493.1建模方法引例第一步:理解題意設a,b,c分別代表3個人,同意用1表示,不同意用0表示,y代表表決結(jié)果,1表示通過,0表示不通過。根據(jù)題意有,當a,b,c三個中有2個為1,或者3個均為1時,y為1,否則y為0。第二步:根據(jù)題意,列真值表abcy000000100100011110001011110111113.1建模方法引例第一步:理解題意abcy00000010503.1建模方法引例第三步:根據(jù)真值表,列輸出方程:y=a'bc+ab'c+abc'+abc第四步:化簡方程,可以采用代數(shù)化簡法或者卡諾圖化簡法化簡后的方程為:y=ab+bc+ca000101111000010111abcy3.1建模方法引例第三步:根據(jù)真值表,列輸出方程:第四步:513.1建模方法引例第五步:根據(jù)化簡后的方程畫出電路圖3.1建模方法引例第五步:根據(jù)化簡后的方程畫出電路圖523.1建模方法引例【例3-2】對應于步驟一的Verilog建模moduledecision_1(a,b,c,y);inputa,b,c;outputregy;always@(a,b,c) if((a&b==1)|(b&c==1)|(c&a==1)|(a&b&c==1))y=1; elsey=0;endmodule3.1建模方法引例【例3-2】對應于步驟一的Verilo533.1建模方法引例【例3-3】對應于步驟二的Verilog建模moduledecision_2(a,b,c,y);inputa,b,c;outputregy;always@(a,b,c) case({a,b,c}) 3'b000:y=0; 3'b001:y=0; 3'b010:y=0; 3'b011:y=1; 3'b100:y=0; 3'b101:y=1; 3'b110:y=1; 3'b111:y=1; endcaseendmodule3.1建模方法引例【例3-3】對應于步驟二的Verilo543.1建模方法引例【例3-4】對應于步驟三的Verilog建模moduledecision_3(a,b,c,y);inputa,b,c;outputy;assigny=(~a&b&c)|(a&~b&c)|(a&b&~c)|(a&b&c);endmodule3.1建模方法引例【例3-4】對應于步驟三的Verilo553.1建模方法引例【例3-5】對應于步驟四的Verilog建模moduledecision_4(a,b,c,y);inputa,b,c;outputy;assigny=(a&b)|(b&c)|(c&a);endmodule3.1建模方法引例【例3-5】對應于步驟四的Verilo563.1建模方法引例【例3-6】對應于步驟五的Verilog建模moduledecision_5(a,b,c,y);inputa,b,c;outputy;//assigny=(a&b)+(b&c)+(c&a);//assigny=a&b+b&c;and(ab,a,b),(bc,b,c),(ca,c,a);or(y,ab,bc,ca);endmodule3.1建模方法引例【例3-6】對應于步驟五的Verilo573.1建模方法引例圖3-6功能仿真波形3.1建模方法引例圖3-6功能仿真波形583.2結(jié)構(gòu)化形式建模1.門級建模2.用戶自定義原語3.2結(jié)構(gòu)化形式建模1.門級建模59門級建模(1)與/或門類(2)緩沖/非門類門級建模(1)與/或門類60門級建?!纠?-7】利用雙輸入端的nand門,編寫自己與門(my_and)、或門(my_or)、非門(my_not)、異或門(my_xor)。modulemy_and(a,b,y);//用兩個nand門inputa,b;outputy;wirenandab;nand(nandab,a,b),(y,nandab,nandab);endmodulemodulemy_or(a,b,y);//用三個nand門inputa,b;outputy;wirenandaa,nandbb;nand(nandaa,a,a),(nandbb,b,b),(y,nandaa,nandbb);endmodulemodulemy_not(a,y);//用一個nand門inputa;outputy;nand(y,a,a);endmodulemodulemy_xor(a,b,y);//用四個nand門實現(xiàn)異或門inputa,b;outputy;wireandab,c,d;nand(andab,a,b), (c,andab,a), (d,andab,b), (y,c,d);endmodule門級建?!纠?-7】利用雙輸入端的nand門,編寫自己與門61用戶自定義原語【例3-8】表示組合邏輯的UDP舉例:一位全加器//全加器進位實現(xiàn)部分primitiveU_ADD_C(CO,A,B,CI);outputCO;inputA,B,CI;table//ABCI:CO11?:1;1?1:1;?11:1;00?:0;0?0:0;?00:0;endtableendprimitive//全加器求和實現(xiàn)部分primitiveU_ADD_S(S,A,B,CI);outputS;inputA,B,CI;table//ABCI:S000:0;001:1;010:1;011:0;100:1;101:0;110:0;111:1;endtableendprimitive用戶自定義原語【例3-8】表示組合邏輯的UDP舉例:一位全62用戶自定義原語//調(diào)用上述兩個UDP的全加器模塊moduleU_ADD(SUM,CO,a,b,ci);inputa,b,ci;outputSUM,CO;U_ADD_SU1(SUM,a,b,ci);U_ADD_CU2(CO,a,b,ci);endmodule用戶自定義原語//調(diào)用上述兩個UDP的全加器模塊63用戶自定義原語【例3-9】表示時序邏輯的UDP舉例:D觸發(fā)器primitived_edge_ff(q,clk,data);outputq;inputclk,data;regq;table//clkdatstatenext (01)0:?:0; (01)1:?:1;//時鐘下降沿 (?0)?:?:-;//時鐘穩(wěn)定時忽略data變化 ?(??):?:-;endtableendprimitive用戶自定義原語【例3-9】表示時序邏輯的UDP舉例:D觸發(fā)643.3數(shù)據(jù)流級建模1.連續(xù)賦值語句2.運算符類型3.3數(shù)據(jù)流級建模1.連續(xù)賦值語句65連續(xù)賦值語句【例3-10】使用數(shù)據(jù)流建模,實現(xiàn)一位半加器。moduleadder_half(ain,bin,sum,co);inputain,bin;outputsum,co;assign{co,sum}=ain+bin;endmoduleinputoutputainbinsumco0000011010101101連續(xù)賦值語句【例3-10】使用數(shù)據(jù)流建模,實現(xiàn)一位半加器。66運算符類型運算符類型運算符執(zhí)行的操作操作數(shù)的個數(shù)運算符類型運算符執(zhí)行的操作操作數(shù)的個數(shù)算術(shù)*乘2關(guān)系>大于2/除2<小于2%模2>=大于等于2+加2<=小于等于2-減2==等于2邏輯!邏輯反1!=不等于2&&邏輯與2縮減&縮減與1||邏輯或2~&縮減與非1按位~按位求反1|縮減或1&按位與2~|縮減或非1|按位或2^縮減異或1^按位異或2~^縮減同或1~^按位同或2位拼接{}拼接任意移位<<左移2{{}}復制任意>>右移2條件?:條件3運算符類型運算符類型運算符執(zhí)行的操作操作數(shù)的個數(shù)運算符類型運67算術(shù)運算符【例3-11】算術(shù)運算符示例modulearith(a,b,add,sub,mul,div,mod,pow);input[7:0]a,b;output[7:0]add,sub,mul,div,mod,pow;assign add=a+b, sub=a-b,

mul=a*b, div=a/b, mod=a%b, pow=a**4;endmodule算術(shù)運算符【例3-11】算術(shù)運算符示例68關(guān)系運算符關(guān)系運算符包括:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!==)。關(guān)系運算符關(guān)系運算符包括:大于(>)、小于(<)、大于等于(69邏輯運算符ab!a!ba&&ba||b真真假假真真真假假真假真假真真假假真假假真真假假邏輯運算符ab!a!ba&&ba||b真真假假真真真假假真假70按位運算符按位與01按位或01按位取反結(jié)果0000010110111110按位異或01按位同或01001010110101按位運算符按位與01按位或01按位取反結(jié)果00000101171縮減運算符縮減運算符包括:縮減與(&)、縮減與非(~&)、縮減或(|)、縮減或非(~|)、縮減異或(^)、縮減同或(~^,^~)??s減運算符是單目運算符,也有與、或、非運算。其與、或、非運算規(guī)則類似于位運算符的與、或、非運算規(guī)則,但其運算過程不同。

縮減運算符縮減運算符包括:縮減與(&)、縮減與非(~&)、縮72條件運算符【例3-12】試用條件運算符來實現(xiàn)一個四選一多路選擇器。modulemux4to1(out,condition1,condition2,in1,in2,in3,in4);outputout;inputin1,in2,in3,in4;inputcondition1,condition2;assignout=(condition1)?(condition2?in1:in2):(condition2?in3:in4);endmodule條件運算符【例3-12】試用條件運算符來實現(xiàn)一個四選一多路73移位運算符【例3-13】采用移位運算符實現(xiàn)兩個3位數(shù)的乘法。modulemul_3bit(a,b,mul);input[2:0]a,b;output[5:0]mul;wire[5:0]mul1,mul2,mul3;assignmul=mul3;assignmul1=b[0]?a:0;assignmul2=b[1]?(mul1+(a<<1)):mul1;assignmul3=b[2]?(mul2+(a<<2)):mul2;endmodule移位運算符【例3-13】采用移位運算符74位拼接運算符{a,b[3:0],w,3’b101}//等價于{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}{1,1}//64位,從右邊數(shù)第0位為1,第32位為1,其余位均為0{4{w}}//等價于{w,w,w,w}{b,{3{a,b}}}//等價于{b,a,b,a,b,a,b}位拼接運算符{a,b[3:0],w,3’b101}//等75優(yōu)先級別優(yōu)先級別763.4行為級建模1.結(jié)構(gòu)化過程語句always2.過程賦值語句3.塊語句4.條件語句5.多路分支語句6.循環(huán)語句7.任務和函數(shù)語句3.4行為級建模1.結(jié)構(gòu)化過程語句always77結(jié)構(gòu)化過程語句always【例3-15】使用always語句描述D觸發(fā)器modulemydff(q,clk,d);inputclk,d;outputq;regq;always@(posedgeclk)q<=d;endmodule結(jié)構(gòu)化過程語句always【例3-15】使用always語句78過程賦值語句【例3-16】阻塞賦值方式描述的移位寄存器1moduleblock1(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin//注意賦值語句的順序 Q2=Q1; Q1=Q0; Q0=D;endendmodule過程賦值語句【例3-16】阻塞賦值方式描述的移位寄存器179過程賦值語句【例3-17】阻塞賦值方式描述的移位寄存器2moduleblock2(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin//該句與下句的順序與例3-16顛倒 Q1=Q0; Q2=Q1; Q0=D;endendmodule過程賦值語句【例3-17】阻塞賦值方式描述的移位寄存器280過程賦值語句【例3-18】阻塞賦值方式描述的移位寄存器3moduleblock3(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin Q0=D;//3條賦值語句的順序與例3-16完全顛倒 Q1=Q0; Q2=Q1;endendmodule過程賦值語句【例3-18】阻塞賦值方式描述的移位寄存器381過程賦值語句【例3-19】非阻塞賦值方式描述的移位寄存器1modulenon_block1(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin Q1<=Q0; Q2<=Q1; Q0<=D;endendmodule【例3-20】非阻塞賦值方式描述的移位寄存器2modulenon_block2(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin Q0<=D;//3條賦值語句的順序與例3-19完全顛倒 Q2<=Q1; Q1<=Q0;endendmodule過程賦值語句【例3-19】非阻塞賦值方式描述的移位寄存器1【82塊語句【例3-21】完成以下兩個功能:(1)使用異或運算符對D完成縮位異或運算;(2)檢測D中1的個數(shù)Verilog實現(xiàn)代碼如下:modulenamed_block(D,xnor_D,CountOnes);input[3:0]D;outputregxnor_D;outputreg[2:0]CountOnes;always@(D)begin:block1 xnor_D=0; CountOnes=0; begin:xor_block integerI; for(I=0;I<4;I=I+1) xnor_D=xnor_D^D[I]; end//循環(huán) begin:Count_block integerJ; for(J=0;J<4;J=J+1) if(D[J]) CountOnes=CountOnes+1; endendendmodule塊語句【例3-21】完成以下兩個功能:(1)使用異或運算符對83條件語句【例3-22】使用always語句描述具有同步復位和同步置位功能的D觸發(fā)器modulemydff(q,clk,set,clr,d);inputclk,d,set,clr;outputq;regq;always@(posedgeclk)beginif(set)q<=1;elseif(!clr)q<=0;elseq<=d;endendmodule條件語句【例3-22】使用always語句描述具有同步復位84多路分支語句【例3-23】使用case語句實現(xiàn)四功能的算術(shù)邏輯單元(ALU)modulealu_4fun(a,b,sel,out);input[3:0]a,b;input[1:0]sel;outputreg[4:0]out;always@(a,b,sel)begin case(sel) 2'b00:out=a+b; 2'b01:out=a-b; 2'b10:out=a<<b; default:out=a%b; endcaseendendmodulesel信號功能2’b00out=a+b2’b01out=a-b2’b10out=a<<b其他out=a%b多路分支語句【例3-23】使用case語句實現(xiàn)四功能的算術(shù)邏85循環(huán)語句【例3-24】使用repeat循環(huán)語句及加法和移位操作來實現(xiàn)一個參數(shù)化的多位乘法器。modulemult_repeat(result,op_a,op_b);parametersize=4;input[size:1]op_a,op_b;output[2*size:1]result;reg[2*size:1]shift_opa,result;reg[size:1]shift_opb;always@(op_aorop_b)begin:multresult=0;shift_opa=op_a;shift_opb=op_b;repeat(size)beginif(shift_opb[1])result=result+shift_opa;shift_opa=shift_opa<<1;//Shiftleftshift_opb=shift_opb>>1;//Shiftrightendendendmodule循環(huán)語句【例3-24】使用repeat循環(huán)語句及加法和移位操86循環(huán)語句【例3-25】使用for循環(huán)語句實現(xiàn)一個參數(shù)化的多位乘法器。modulemult_for(result,op_a,op_b);parametersize=4;input[size:1]op_a,op_b;output[2*size:1]result;reg[2*size:1]shift_opa,result;reg[size:1]shift_opb;always@(op_aorop_b)begin:mult//由于塊中定義了局部變量i,此處必須給塊命名 integeri=0;result=0;shift_opa=op_a;shift_opb=op_b;for(i=0;i<size;i=i+1)beginif(shift_opb[1])result=result+shift_opa;shift_opa=shift_opa<<1;//Shiftleftshift_opb=shift_opb>>1;//Shiftrightendendendmodul

溫馨提示

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

評論

0/150

提交評論