




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第三章VerilogHDL程序設(shè)計語句和描述方式2/26/20251MicroelectronicsSchoolXidianUniversity3.1數(shù)據(jù)流建模3.1.1連續(xù)賦值語句連續(xù)賦值的目標(biāo)類型主要是標(biāo)量線網(wǎng)和向量線網(wǎng)兩種。(1)標(biāo)量線網(wǎng),如:wirea,b;(2)向量線網(wǎng),如:wire[3:0]a,b;顯式連續(xù)賦值語句:<net_declaration><range><name>;assign#<delay><name>=Assignmentexpression;隱式連續(xù)賦值語句:<net_declaration><drive_strength><range>#<delay><name>=Assignmentexpression;2/26/20252MicroelectronicsSchoolXidianUniversity2/26/20253MicroelectronicsSchoolXidianUniversity例3.1-1顯式連續(xù)賦值語句的例子moduleexample1_assignment(a,b,m,n,c,y);input[3:0]a,b,m,n;output[3:0]c,y;wire[3:0]a,b,m,n,c,y;assigny=m|n;assign#(3,2,4)c=a&b;endmodule<net_declaration>(連線型變量類型)<range>(變量位寬),指明了變量數(shù)據(jù)類型的寬度,格式為[msb:lsb],缺省為1位。<drive_strength>(賦值驅(qū)動強度)是可選的,只能在“隱式連續(xù)賦值語句”格式中得到指定。它用來對連線型變量受到的驅(qū)動強度進行指定。wire(weak0,strong1)out=in1&in2;<delay>(延時量)這一項是可選的。#(delay1,delay2,delay3)
例3.1-2隱式連續(xù)賦值語句的例子moduleexample2_assignment(a,b,m,n,c,y,w);input[3:0]a,b,m,n;output[3:0]c,y,w;wire[3:0]a,b,m,n;wire[3:0]y=m|n;wire[3:0]#(3,2,4)c=a&b;wire(strong0,weak1)[3:0]#(2,1,3)w=(a^b)&(m^n);endmodule 連續(xù)賦值語句需要注意的以下幾點:賦值目標(biāo)只能是線網(wǎng)類型(wire);在連續(xù)賦值中,只要賦值語句右邊表達式任何一個變量有變化,表達式立即被計算,計算的結(jié)果立即賦給左邊信號(若沒有定義延時量);連續(xù)賦值語句不能出現(xiàn)在過程塊中。多個連續(xù)賦值語句之間是并行語句,因此與位置順序無關(guān)。連續(xù)賦值語句中的延時具有硬件電路中慣性延時的特性,任何小于其延時的信號變化脈沖都將被濾除掉,不會體現(xiàn)在輸出端口上。2/26/20254MicroelectronicsSchoolXidianUniversity3.2行為級建模2/26/20255MicroelectronicsSchoolXidianUniversity過程賦值語句高級程序語句過程塊連續(xù)賦值語句模塊調(diào)用……過程語句(initial/always)語句塊模塊描述定義行端口類型說明數(shù)據(jù)類型說明描述體結(jié)束行2/26/20256MicroelectronicsSchoolXidianUniversity類別語句可綜合性過程語句initialalways√語句塊串行語句塊begin-end√并行語句塊fork-join賦值語句過程連續(xù)賦值assign過程賦值=、<=√條件語句if-else√case,casez,casex√循環(huán)語句foreverrepeatwhilefor√編譯向?qū)дZ句`define√`include√`ifdef,`else,`endif√3.2.1過程語句1.initial過程語句
initial過程語句的語法格式為:
initial begin
語句1;
語句2;
...
語句n; end2/26/20257MicroelectronicsSchoolXidianUniversity例3.2-1用initial過程語句對變量A,B,C進行賦值moduleinitial_tb1;regA,B,C;initialbegin A=0;B=1;C=0; #100 A=1;B=0; #100 A=0;C=1; #100 B=1; #100 B=0;C=0; endendmodule2.a(chǎn)lways語句塊
從語法描述角度,相對于initial過程塊,always語句塊的觸發(fā)狀態(tài)是一直存在的,只要滿足always后面的敏感事件列表,就執(zhí)行過程塊。
其語法格式是:
always@(<敏感事件列表>)
語句塊;
例如:* @(a) //當(dāng)信號a的值發(fā)生改變時 @(aorb) //當(dāng)信號a或信號b的值發(fā)生改變時 @(posedgeclock) //當(dāng)clock的上升沿到來時 @(negedgeclock) //當(dāng)clock的下降沿到來時 @(posedgeclkornegedgereset) //當(dāng)clk的上升沒到來或reset信號的下降沿到來時2/26/20258MicroelectronicsSchoolXidianUniversity3.過程語句使用中需要注意的問題
在信號定義形式方面,無論是對時序邏輯還是組合邏輯描述,VerilogHDL要求在過程語句(initial和always)中,被賦值信號必須定義為“reg”類型。
在敏感事件表方面,這是VerilogHDL語言中一個關(guān)鍵性設(shè)計,如何選取敏感事件作為過程的觸發(fā)條件,在VerilogHDL程序中有一定的設(shè)計要求。
(1)采用過程對組合電路進行描述時,作為全部的輸入信號需要列入敏感信號列表。
(2)采用過程對時序電路進行描述時,需要把時間信號和部分輸入信號列入敏感信號列表。應(yīng)當(dāng)注意的是,不同的敏感事件列表會產(chǎn)生不同的電路形式。2/26/20259MicroelectronicsSchoolXidianUniversity2/26/202510MicroelectronicsSchoolXidianUniversity例3.2-2用initial語句產(chǎn)生測試信號moduleinitial_tb2;regS1;//被賦值信號定義“reg”類型initialbegin S1=0; #100 S1=1; #200 S1=0; #50 S1=1; #100 $finish;endendmodule例3.2-3用always語句描述4選1數(shù)據(jù)選擇器4選1數(shù)據(jù)選擇器是一種典型的組合邏輯電路,其VerilogHDL程序代碼是:modulemux4_1(out,in0,in1,in2,in3,sel); outputout;inputin0,in1,in2,in3;input[1:0]sel;regout; //被賦值信號定義為“reg”類型always@(in0orin1orin2orin3orsel)//敏感信號列表 case(sel) 2'b00: out=in0; 2'b01: out=in1; 2'b10: out=in2; 2'b11: out=in3; default: out=2'bx; endcaseendmodule2/26/202511MicroelectronicsSchoolXidianUniversity例3.2-4用always語句描述同步置數(shù)、同步清零計數(shù)器modulecounter1(out,data,load,reset,clk);output[7:0]out;input[7:0]data;inputload,clk,reset;reg[7:0]out; always@(posedgeclk)//clk上升沿觸發(fā)begin if(!reset) out=8’h00; //同步清0,低電平有效 elseif(load)out=data; //同步置數(shù) elseout=out+1; endendmodule例3.2-5用always過程語句描述異步清零計數(shù)器modulecounter2(clear,clk,out);output[7:0]out;inputclk,clear;reg[7:0]out;always@(posedgeclkornegedgeclear)//clk上升沿和clear低電平清零有效beginif(!clear) //異步清零out=0;elseout=out+1;endendmodule3.2.2語句塊語句塊包括串行語句塊(begin-end)和并行語句塊(fork-join)兩種。
串行語句塊采用關(guān)鍵字“begin”和“end”,其中的語句按串行方式順序執(zhí)行,可以用于可綜合電路程序和仿真測試程序。其語法格式是:2/26/202512MicroelectronicsSchoolXidianUniversitybegin:塊名
塊內(nèi)聲明語句;
語句1;
語句2;
...
語句n;endfork:塊名
塊內(nèi)聲明語句;
語句1;
語句2;...
語句n;join串行語句塊有以下幾個特點:(1)串行語句塊中的每條語句依據(jù)塊中的排列次序,先后逐條順序執(zhí)行。塊中每條語句給出的延時都是相對于前一條語句執(zhí)行結(jié)束的相對時間。(2)串行語句塊的起始執(zhí)行時間就是串行語句塊中第一條語句開始執(zhí)行的時間。串行語句塊的結(jié)束時間就是塊中最后一條語句執(zhí)行結(jié)束的時間。
并行語句塊采用關(guān)鍵字“fork”和“join”,其中的語句按并行方式并發(fā)執(zhí)行,只能用于仿真測試程序,不能用于可綜合電路程序。其語法格式是:2/26/202513MicroelectronicsSchoolXidianUniversity并行語句塊有以下幾個特點:(1)塊內(nèi)語句是同時執(zhí)行的,即程序流程控制一進入到該并行語句塊,塊內(nèi)語句則開始同時并行地執(zhí)行。(2)塊內(nèi)每條語句的延遲時間是相對于程序流程控制進入到塊內(nèi)的仿真時間的。例3.2-6分別采用串行語句塊和并行語句塊產(chǎn)生圖3.2-3的信號波形。2/26/202514MicroelectronicsSchoolXidianUniversity2/26/202515MicroelectronicsSchoolXidianUniversity(1)采用串行語句塊的VerilogHDL仿真程序代碼是:modulewave_tb1;regwave;parameterT=10;initialbegin wave=0; #T wave=1; #T wave=0; #T wave=1; #T wave=0; #T wave=1;endendmodule(2)采用并行語句塊的VerilogHDL仿真程序代碼是:modulewave_tb2;regwave;parameterT=10;initialfork wave=0; #T wave=1; #(2*T) wave=0; #(3*T) wave=1; #(4*T) wave=0; #(5*T) wave=1;joinendmodule2/26/202516MicroelectronicsSchoolXidianUniversity語句塊串行語句塊(begin-end)并行語句塊(fork-join)執(zhí)行順序按照語句順序執(zhí)行每條語句在同一時刻執(zhí)行語句前面延時的意義相對于前一條語句執(zhí)行結(jié)束的相對時間相對于并行語句塊啟動時的時間起始時間首句開始執(zhí)行的時間轉(zhuǎn)入并行語句塊的時間結(jié)束時間最后一句語句執(zhí)行結(jié)束時的時間執(zhí)行時間最長的那條語句執(zhí)行結(jié)束時的時間行為描述的意義電路中數(shù)據(jù)在時鐘及控制信號作用下,沿數(shù)據(jù)通道的各級寄存器之間的傳送過程電路上電后,各電路模塊同時開始工作的過程3.2.3過程賦值語句過程賦值語句有阻塞性過程賦值語句和非阻塞性過程賦值語句兩種形式。
阻塞賦值語句的操作符號為“=”,語法格式是:
變量=表達式;
例如:b=a;
阻塞賦值語句有如下特點:
(1)在串行語句塊中,各條阻塞賦值語句將按照先后排列順序依次執(zhí)行;在并行語句塊中的各條阻塞賦值語句則同時執(zhí)行,沒有先后順序之分;
(2)執(zhí)行阻塞賦值語句的順序是,先計算等號右端表達式的值,然后立刻將計算的值賦給左邊的變量,與仿真時間無關(guān)。2/26/202517MicroelectronicsSchoolXidianUniversity
非阻塞賦值語句的操作符號為“<=”,語法格式是:
變量<=表達式。
例如:b<=a;
非阻塞賦值語句有如下特點:
(1)在串行語句塊中,各條非阻塞賦值語句的執(zhí)行沒有先后順序之分,排在前面的語句不會影響到后面的語句的執(zhí)行,各條語句并行執(zhí)行;
(2)執(zhí)行非阻塞賦值語句的順序是,先計算右端表達式的值,然后等到延時時間結(jié)束時,將計算的值賦給左邊的變量。2/26/202518MicroelectronicsSchoolXidianUniversityb2/26/202519MicroelectronicsSchoolXidianUniversity例3.2-7:試分析下面兩段VerilogHDL程序所描述的電路結(jié)構(gòu)程序(1)moduleblock1(din,clk,out1,out2);inputdin,clk;outputout1,out2;regout1,out2;always@(posedgeclk) begin out1=din; out2=out1; endendmodule程序(2)modulenon_block1(din,clk,out1,out2);inputdin,clk;outputout1,out2;regout1,out2;always@(posedgeclk)begin out1<=din; out2<=out1; endendmodule在這兩個程序中,基本描述相同,不同的是程序(1)采用了阻塞賦值語句,而程序(2)采用了非阻塞賦值語句。2/26/202520MicroelectronicsSchoolXidianUniversity如果采用阻塞賦值語句描述程序(2)的電路,其VerilogHDL程序代碼是:
moduleblock2(din,clk,out1,out2); inputdin,clk; outputout1,out2; regout1,out2; always@(posedgeclk) begin out2=out1; out1=din; end endmodule2/26/202521MicroelectronicsSchoolXidianUniversity例3.2-8:試分析下面兩段VerilogHDL程序所描述的電路結(jié)構(gòu)程序(1)moduleblock3(a,b,c,clk,sel,out);inputa,b,c,clk,sel;outputout;regout,temp;always@(posedgeclk)begin temp=a&b; if(sel)out=temp|c; else out=c;endendmodule2/26/202522MicroelectronicsSchoolXidianUniversity程序(2)modulenon_block2(a,b,c,clk,sel,out);inputa,b,c,clk,sel;outputout;regout,temp;always@(posedgeclk)begin temp<=a&b; if(sel) out<=temp|c; else out<=c;endendmodule3.2.4過程連續(xù)賦值語句在VerilogHDL中,過程性連續(xù)賦值語句有兩種類型:賦值、重新賦值語句(assign、deassign)和強制、釋放語句(force、release)。賦值語句和重新賦值語句采用的關(guān)鍵字是“assign”和“deassign”,語法格式分別是:assign<寄存器型變量>=<賦值表達式>;deassign<寄存器型變量>;2/26/202523MicroelectronicsSchoolXidianUniversity2/26/202524MicroelectronicsSchoolXidianUniversity例3.2-9使用assign和deassign設(shè)計異步清零D觸發(fā)器 moduleassign_dff(d,clr,clk,q); inputd,clr,clk; outputq; regq; always@(clr) begin f(!clr) assignq=0; //時鐘沿來臨時,d的變化對q無效。 else deassignq; end
always@(negedgeclk)q=d; endmodule強制語句和釋放語句采用的關(guān)鍵字是“force”和“release”,可以對連線型和寄存器型變量類型進行賦值操作,“force”語句的優(yōu)先級高于“assign”語句。語法格式分別是:force<寄存器或連線型變量>=<賦值表達式>;release<寄存器或連線型變量>;2/26/202525MicroelectronicsSchoolXidianUniversity例3.2-10force和release使用例程moduleforce_release(a,b,out);inputa,b;outputout;wireout;and#1(out,a,b);initialbegin forceout=a|b; #5; releaseout;endendmodule
modulerelease_tb;rega,b;wireout;force_releaseU1(a,b,out);initialbegina=1;b=0;endendmodule3.2.5條件分支語句VerilogHDL的條件分支語句有兩種:if條件語句和case條件分支語句。1.if條件語句if條件語句就是判斷所給的條件是否滿足,然后根據(jù)判斷的結(jié)果來確定下一步的操作。2/26/202526MicroelectronicsSchoolXidianUniversity形式1:if(條件表達式)語句塊;形式2: if(條件表達式)
語句塊1; else
語句塊2;形式3:if(條件表達式1)
語句塊1; else if(條件表達式2) 語句塊2;
... else if(條件表達式i) 語句塊i; else 語句塊n;2/26/202527MicroelectronicsSchoolXidianUniversity例3.2-11if-else使用例程modulemux2_1(a,b,sel,out);inputa,b,sel;outputout;regout;always@(a,b,sel)beginif(sel) out=a;else out=b;endendmodule當(dāng)sel為真“1”時,輸出端out得到a的值,而當(dāng)sel為假“0”時,輸出端out得到b的值。這是一個典型的二選一的數(shù)據(jù)選擇器。例3.2-11if-else使用例程modulecompare_a_b(a,b,out);inputa,b;output[1:0]out;reg[1:0]out;always@(a,b)beginif(a>b) out=2'b01;elseif(a==b) out=2'b10;else out=2'b11;endendmodule例中,首先判斷a是否大于b,然后判斷a是否等于b,蘊含了優(yōu)先級的特性,這種特性會在綜合后的電路中體現(xiàn)出來。2/26/202528MicroelectronicsSchoolXidianUniversity在if語句中允許一個或多個if語句的嵌套使用,語法格式是:if(條件表達式1) if(條件表達式2) //內(nèi)嵌的if語句
語句塊1; else
語句塊2;else if(條件表達式3) //內(nèi)嵌的if語句
語句塊3 ;else
語句塊4;2.case條件分支語句相對于if語句只有兩個分支而言,case語句是一種可實現(xiàn)多路分支選擇控制的語句,比if-else條件語句顯得更為方便和直觀。一般,case語句多用于多條件譯碼電路設(shè)計,case語句的語法格式是:2/26/202529MicroelectronicsSchoolXidianUniversitycase(控制表達式)
值1:語句塊1
值2:語句塊2
...
值n:語句塊n default:語句塊n+1endcase2/26/202530MicroelectronicsSchoolXidianUniversitycase01xz0100010100x0010z0001使用case語句需要注意的是:(1)值1到值n之間必須各不相同,一旦判斷到與某值相同并執(zhí)行相應(yīng)語句塊后,case語句的執(zhí)行便結(jié)束。(2)如果某幾個連續(xù)排列的值項執(zhí)行的是同一條語句,則這幾個值項間可用逗號相隔,而將語句放在這幾個值項的最后一個中。(3)default選項相當(dāng)于if-else語句中的else部分,可依據(jù)需要用或者不用,當(dāng)前面已經(jīng)列出了敏感表達式的所有可能值,則default可以省略。(4)case語句的所有表達式的值的位寬必須相等,只有這樣控制表達式和分支表達式才能進行對應(yīng)位的比較。2/26/202531MicroelectronicsSchoolXidianUniversity例3.2-12:用case語句描述的BCD數(shù)碼管譯碼moduleBCD_decoder(out,in);output[6:0]out;input[3:0]in;reg[6:0]out;always@(in)begin case(in) 4'd0:out=7'b1111110; 4'd1:out=7'b0110000; 4'd2:out=7'b1101101; 4'd3:out=7'b1111001; 4'd4:out=7'b0110011; 4'd5:out=7'b1011011; 4'd6:out=7'b1011111; 4'd7:out=7'b1110000; 4'd8:out=7'b1111111; 4'd9:out=7'b1111011; default:out=7'bx; endcaseendendmodule字形輸入輸出inABCDEFG000001111110100010110000200101101101300111111001401000110011501011011011601101011111701111110000810001111111910011111011在使用case語句時,應(yīng)包含所有狀態(tài),如果沒包含全,那么缺省項必須寫,否則將產(chǎn)生鎖存器,這在同步時序電路設(shè)計中是不允許的。2/26/202532MicroelectronicsSchoolXidianUniversity例3.2-13:case語句的使用例程程序(1)會產(chǎn)生鎖存器的case語句modulelatch_case(a,b,sel,out);inputa,b;input[1:0]sel;outputout;regout;always@(a,b,sel) case(sel)2'b00:out=a;2'b11:out=b;endcaseendmodule程序(2)不會產(chǎn)生鎖存器的case語句modulenon_latch_case(a,b,sel,out);inputa,b;input[1:0]sel;outputout;regout;always@(a,b,sel) case(sel)2'b00:out=a;2'b11:out=b; default:out=0;endcaseendmodule除了case分支語句以外,還有casez、casex這兩種功能類似的條件分支語句2/26/202533MicroelectronicsSchoolXidianUniversitycasez01xz0100110101x0011z1111casex01xz0101110111x1111z11113.2.6循環(huán)語句1.forever循環(huán)語句關(guān)鍵字“forever”所引導(dǎo)的循環(huán)語句表示永久循環(huán)。在永久循環(huán)中不包含任何條件表達式,只執(zhí)行無限的循環(huán),直到遇到系統(tǒng)任務(wù)$finish為止。如果需要從forever循環(huán)中退出,則可以使用disable語句。forever語句的語法格式是:forever語句或語句塊;2/26/202534MicroelectronicsSchoolXidianUniversity例3.2-14:用forever語句產(chǎn)生時鐘信號 moduleforever_tb; regclock; initial begin clock=0; forever#50 clock=~clock; end endmodule
2.repeat循環(huán)語句關(guān)鍵字“repeat”所引導(dǎo)的循環(huán)語句表示執(zhí)行固定次數(shù)的循環(huán)。其語法格式是:repeat(循環(huán)次數(shù)表達式)
語句或語句塊(循環(huán)體);2/26/202535MicroelectronicsSchoolXidianUniversity例3.2-15:使用repeat循環(huán)語句產(chǎn)生固定周期數(shù)時鐘信號 modulerepeat_tb; regclock; initial begin clock=0; repeat(8)#50clock=~clock; end endmodule3.while循環(huán)語句關(guān)鍵字“while”所引導(dǎo)的循環(huán)語句表示的是一種“條件循環(huán)”。while語句根據(jù)條件表達式的真假來確定循環(huán)體的執(zhí)行,當(dāng)指定的條件表達式取值為真時才會重復(fù)執(zhí)行循環(huán)體,否則就不執(zhí)行循環(huán)體,其語法格式是:while(條件表達式)語句或語句塊;2/26/202536MicroelectronicsSchoolXidianUniversity例3.2-16:使用while語句產(chǎn)生時鐘信號modulewhile_tb;regclock;Initialbegin clock=0; while(1) #50 clock=~clock;endendmodule4.for循環(huán)語句關(guān)鍵字“for”所要引導(dǎo)的循環(huán)語句也表示一種“條件循環(huán)”,只有在指定的條件表達式成立時才進行循環(huán),其語法格式是:for(循環(huán)變量賦初值;循環(huán)結(jié)束條件;循環(huán)變量增值)語句塊;2/26/202537MicroelectronicsSchoolXidianUniversity例3.2-17:使用for語句產(chǎn)生時鐘信號modulefor_clk;regclk;integeri;initialbeginclk=0;for(i=0;i>=0;i=i+1)#50clk=~clk;endendmodule應(yīng)該說明的是循環(huán)語句也可以用于可綜合電路的設(shè)計,當(dāng)采用循環(huán)語句進行計算和賦值的描述時,可以綜合得到邏輯電路。2/26/202538MicroelectronicsSchoolXidianUniversity例3.2-18:用VerilogHDL語言設(shè)計一個8位移位寄存器程序(1)采用賦值語句實現(xiàn)moduleshift_regist1(Q,D,rst,clk);output[7:0]Q;inputD,rst,clk;reg[7:0]Q; always@(posedgeclk)if(!rst) Q<=8'b000000;elseQ<={Q[6:0],D};endmodule程序(2)采用“for”循環(huán)語句實現(xiàn)moduleshift_regist2(Q,D,rst,clk);output[7:0]Q;inputD,rst,clk;reg[7:0]Q;integeri;always@(posedgeclk)if(!rst)Q<=8'b000000;elsebegin for(i=7;i>0;i=i-1)Q[i]<=Q[i-1];Q[0]<=D;endendmodule3.3結(jié)構(gòu)化建模結(jié)構(gòu)描述方式就是將硬件電路描述成一個分級子模塊系統(tǒng),通過逐層調(diào)用這些模塊構(gòu)成功能復(fù)雜的數(shù)字邏輯電路和系統(tǒng)的一種描述方式。在這種描述方式下,組成硬件電路的各個子模塊之間的相互層次關(guān)系以及相互連接關(guān)系都需要得到說明。根據(jù)所調(diào)用子模塊的不同抽象級別,可以將模塊的結(jié)構(gòu)描述方式分成如下三類:(1)模塊級建模:通過調(diào)用由用戶設(shè)計生成的低級子模塊來對硬件電路結(jié)構(gòu)進行說明,這種情況下模塊由低級模塊的實例組成。(2)門級建模:通過調(diào)用VerilogHDL內(nèi)部的基本門級元件來對硬件電路的結(jié)構(gòu)進行說明,這種情況下模塊將由基本門級元件的實例組成。(3)開關(guān)級建模:通過調(diào)用VerilogHDL內(nèi)部的基本開關(guān)元件來對硬件電路的結(jié)構(gòu)進行說明,這種情況下模塊將由基本開關(guān)級元件的實例組成。2/26/202539MicroelectronicsSchoolXidianUniversity3.3.1模塊級建模模塊級建模就是通過調(diào)用由用戶自己描述產(chǎn)生的module模塊對硬件電路結(jié)構(gòu)進行說明,并設(shè)計出電路。模塊建模方式可以把一個模塊看作是由其它模塊像積木一樣搭建而成。模塊中被調(diào)用模塊屬于低一層次的模塊,如果當(dāng)前模塊不再被其它模塊所調(diào)用,那么這個模塊一定是所謂的頂層模塊。在對一個硬件系統(tǒng)的描述中,必定有而且只能有一個頂層模塊。1.模塊調(diào)用方式在VerilogHDL中,模塊可以被任何其它模塊調(diào)用,這種調(diào)用實際上是將模塊所描述的電路復(fù)制并連接的。其中模塊調(diào)用的基本語法格式是:模塊名<參數(shù)值列表>實例名(端口名列表);
2/26/202540MicroelectronicsSchoolXidianUniversity2/26/202541MicroelectronicsSchoolXidianUniversity例3.3-1一個簡單的模塊調(diào)用的例子。
moduleand_2(a,b,c); //2輸入與門模塊 inputa,b; outputc; assignc=a&b; endmodule
modulelogic(in1,in2,q); //頂層模塊,
inputin1,in2; outputq; and_2 U1(in1,in2,q); //模塊的調(diào)用 endmodule如果同一個模塊在當(dāng)前模塊中被調(diào)用幾次,則需要用不同的實例名加以標(biāo)識,但可在同一條模塊調(diào)用語句中被定義,只要各自的實例名和端口名列表相互間用逗號隔開即可?;菊Z法格式是:模塊名 <參數(shù)值列表>實例名1(端口名列表1), <參數(shù)值列表>實例名2(端口名列表2),
......
<參數(shù)值列表>實例名n(端口名列表n);在上面的格式當(dāng)中,模塊名就是被調(diào)用的模塊,參數(shù)值列表是可選項,實例名代表生成的模塊實例,實例名必須各不相同,端口列表指明了模塊實例與外部信號的連接。2/26/202542MicroelectronicsSchoolXidianUniversity比如在上面的例3.3-1當(dāng)中,如果想調(diào)用更多的2輸入與門實現(xiàn)更復(fù)雜的功能,就可以用使用如下的多條模塊實例語句:當(dāng)需要對同一個模塊進行多次調(diào)用時,還可以采用陣列調(diào)用的方式對模塊進行調(diào)用,其中陣列調(diào)用的語法格式如下:<被調(diào)用模塊名><實例陣列名>[陣列左邊界:陣列右邊界](<端口連接表>);其中“陣列左邊界”和“陣列右邊界”是兩個常量表達式,它們用來指定調(diào)用后生成的模塊實例陣列的大小。2/26/202543MicroelectronicsSchoolXidianUniversityand_2 U1(a1,b1,out1), U2(a2,b2,out2),
...... Un(an,bn,outn);2/26/202544MicroelectronicsSchoolXidianUniversity例3.3-2使用陣列調(diào)用方式的模塊實例語句來進行結(jié)構(gòu)描述moduleAND(andout,ina,inb); //基本的與門模塊inputina,inb;outputandout;assignandout=ina&inb;endmodule
moduleex_arrey(out,a,b); //頂層模塊,用來調(diào)用與門模塊input[15:0]a,b;output[15:0]out;wire[15:0]out;AND AND_ARREY[15:0](out,a,b);endmodule其中模塊調(diào)用語句等價于如下幾條語句:ANDAND_ARREY15(out[15],a[15],b[15]);……ANDAND_ARREY1(out[1],a[1],b[1]);ANDAND_ARREY0(out[0],a[0],b[0]);2.模塊端口對應(yīng)方式(1)端口位置對應(yīng)方式端口位置對應(yīng)方式是被調(diào)用的模塊按照一定的順序出現(xiàn)在端口連接表中的一種模塊調(diào)用方式。其語法格式是:模塊名<參數(shù)值列表>實例名(<信號名1>,<信號名2>,…,<信號名n>);2/26/202545MicroelectronicsSchoolXidianUniversity例3.3-3:采用模塊結(jié)構(gòu)建模方式用1bit半加器構(gòu)成1bit全加器modulehalfadder(a,b,s,c); //半加器模塊inputa,b;outputc,s;assigns=a^b;assignc=a&b;endmodulemodulefulladder(p,q,ci,co,sum); //全加器模塊inputp,q,ci;outputco,su;wirew1,w2,w3;halfadderU1(p,q,w1,w2);halfadderU2(ci,w1,sum,w3);orU3(co,w2,w3);endmodule(2)端口名對應(yīng)方式端口名對應(yīng)方式是VerilogHDL允許的另一種模塊調(diào)用方式,其語法格式如下:模塊名<參數(shù)值列表>實例名(.端口名1<信號名1>,.端口名2<信號名2>,…,.端口名n<信號名n>);2/26/202546MicroelectronicsSchoolXidianUniversity例3.3-4端口名對應(yīng)的模塊調(diào)用的例子moduledff(d,clk,clr,q); //D觸發(fā)器模塊,是被調(diào)用的模塊,屬于底層模塊inputd,clk,clr;outputq;regq;always@(posedgeclkornegedgeclr) begin if(!clr) q=0; else q=d; endendmodulemoduleshifter_D(din,clock,clear,out);//頂層模塊,用來調(diào)用底層模塊inputdin,clock,clear;output[3:0]out;dff U1(.q(out[0]),.d(din),.clk(clock),.clr(clear));dff U2(.q(out[1]),.d(out[0]),.clk(clock),.clr(clear));dff U3(.q(out[2]),.d(out[1]),.clk(clock),.clr(clear));dff U4(.q(out[3]),.d(out[2]),.clk(clock),.clr(clear));endmodule(3)不同端口位寬的匹配在端口和端口表達式之間存在著一種隱含的連續(xù)賦值的語句。因此當(dāng)端口和端口表達式的位寬不一致時,會進行端口的匹配,采用的位寬匹配規(guī)則與連續(xù)賦值時使用的規(guī)則相同。2/26/202547MicroelectronicsSchoolXidianUniversity例3.3-5模塊調(diào)用時不同位寬的匹配問題moduleex1(a,b);input[6:1]a;output[3:0]b;
...endmodule
moduletest;wire[5:3]c;wire[5:1]d;ex1U1(.a(c),.b(d));
...endmodule其連接對應(yīng)關(guān)系如圖所示。4.模塊參數(shù)值用下面兩種途徑可以改變模塊實例的參數(shù)值,分別是使用帶有參數(shù)的模塊實例語句修改參數(shù)值和使用定義參數(shù)語句(defparam語句)修改參數(shù)值。2/26/202548MicroelectronicsSchoolXidianUniversity(1)使用帶有參數(shù)的模塊實例語句修改參數(shù)值在這種方法中,模塊實例的本身就能指定新的參數(shù)值,其語法格式是:模塊名<參數(shù)值列表>調(diào)用名(端口名列表);其中參數(shù)值列表又分為位置對應(yīng)和名稱對應(yīng)兩種方式。例3.3-6模塊調(diào)用改變參數(shù)值的例子modulepara1(C,D); parametera=1; parameterb=1;
...endmodulemodulepara2;
... para1#(4,3)U1(C1,D1); //語句1 para1#(.b(6),.a(5))U2(C2,D2); //語句2
...endmodule(2)使用定義參數(shù)語句(defparam語句)修改參數(shù)值在進行模塊調(diào)用時更改被調(diào)用模塊內(nèi)參數(shù)值的第二種方法就是利用“參數(shù)重定義語句”(defparam語句)。參數(shù)重定義語句的語法格式是:defparam 參數(shù)名1=參數(shù)值1,
參數(shù)名2=參數(shù)值2,
...
參數(shù)名n=參數(shù)值n;需要注意的是,參數(shù)名必須采用分級路徑的形式,才能鎖定需要修改的參數(shù)是哪個模塊當(dāng)中的。2/26/202549MicroelectronicsSchoolXidianUniversity2/26/202550MicroelectronicsSchoolXidianUniversity例3.3-7使用defparam語句修改參數(shù)值modulehalfadder(a,b,s,c); //半加器模塊halfadderinputa,b;outputc,s; parameterxor_delay=2,and_delay=3;assign#xor_delays=a^b;assign#and_delayc=a&b;endmodule
modulefulladder(p,q,ci,co,sum); //全加器模塊fulladderinputp,q,ci;outputco,sum;parameteror_delay=1wirew1,w2,w3;halfadder U1(p,q,w1,w2);halfadder U2(ci,w1,sum,w3);or#or_delay U3(co,w2,w3);endmodulemoduletop1(top1a,top1b,top1s,top1c); //修改半加器模塊參數(shù)的模塊top1inputtop1a,top1b;outputtop1s,top1c;defparam U1.xor_delay=4, U1.and_delay=5;//名為U1的半加器實例中對參數(shù)xor_delay和參數(shù)and_delay值的修改halfadderU1(top1a,top1b,top1s,top1c); endmodulemoduletop2(top2p,top2q,top2ci,top2co,top2sum);//修改全加器模塊參數(shù)的模塊top2inputtop2p,top2q,top2ci;outputtop2co,top2sum;defparam U2.U1.xor_delay=6, U2.U2.and_delay=7;//名為U2的全加器實例中引用的名為U2的半加器實例中//對參數(shù)xor_delay和and_delay的修改 U2.or_delay=5;//名為U2的全加器實例中對參數(shù)or_delay值的修改fulladderU2(top2p,top2q,top2ci,top2co,top2sum); endmodule3.3.2門級建模(1)VerilogHDL基本門級元件的類型VerilogHDL內(nèi)置26個基本元件,其中14個是門級元件,12個為開關(guān)級元件,這26個基本元件及其分類見下表。2/26/202551MicroelectronicsSchoolXidianUniversity類型元件基本門多輸入門and,nand,or,nor,xor,xnor多輸出門buf,not三態(tài)門允許定義驅(qū)動強度buif0,bufif1,notif0,notif1mos開關(guān)無驅(qū)動強度nmos,pmos,cmosrnmos,rpmos,rcmos雙向開關(guān)無驅(qū)動強度tran,tranif0,tranif1無驅(qū)動強度rtran,rtranif0,rtranif1上拉、下拉電阻允許定義驅(qū)動強度pullup,pulldown這里重點介紹門級元件。VerilogHDL中豐富的門級元件為電路的門級結(jié)構(gòu)提供了方便。VerilogHDL語言中的門級元件見下表。2/26/202552MicroelectronicsSchoolXidianUniversity類別關(guān)鍵字符號示意圖門名稱多輸入門and與門nand與非門or或門nor或非門xor異或門xnor異或非門多輸出門buf緩沖器not非門三態(tài)門bufif14種三態(tài)門buif0notif1notif0(2)門級模塊調(diào)用多輸入門元件調(diào)用的語法格式是:門類型<實例名>(<輸出端口>,<輸入端口1>,<輸入端口2>,……,<輸入端口n>);例如:and A1(out1,in1,in2);or O2(a,b,c,d);xor X1(x_out,p1,p2);多輸出門元件調(diào)用的語法格式是:元件名<實例名>(<輸出端口1>,<輸出端口2>,……,<輸出端口n>,<輸入端口>);例如:not NOT_1(out1,out2,in);buf BUF_1(bufout1,bufout2,bufout3,bufin);2/26/202553
溫馨提示
- 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 土建瓦工勞務(wù)分包合同
- 常年法律顧問合同
- 詳細操作流程說明書
- 2025年撫州貨運資格證模擬考試題庫下載
- 2025年徐州市汽車租賃合同5篇
- 農(nóng)莊農(nóng)場合作經(jīng)營合同協(xié)議書范本6篇
- 公司副食品購銷合同7篇
- 房地產(chǎn)開發(fā)聯(lián)營合同
- 專利技術(shù)的授權(quán)與使用條款協(xié)議
- 無償保管合同范本-倉儲保管合同8篇
- 中小學(xué)領(lǐng)導(dǎo)班子包級包組包班制度
- 汽車掛靠經(jīng)營合同協(xié)議書模板
- 基坑土方開挖專項施工方案(完整版)
- 2025年江蘇農(nóng)牧科技職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 數(shù)據(jù)中心運維服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 2025年中煤集團新疆能源有限公司招聘筆試參考題庫含答案解析
- 2024-2025學(xué)年山東省濰坊市高一上冊1月期末考試數(shù)學(xué)檢測試題(附解析)
- 電玩城培訓(xùn)課件
- 2025年全年日歷-含農(nóng)歷、國家法定假日-帶周數(shù)豎版
- 小學(xué)生播音員課件
- 2024年重大事項內(nèi)部會審制度(3篇)
評論
0/150
提交評論