




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第五章
仿真驗證與Testbench編寫11/26/20221MicroelectronicsSchoolXidianUniversity第五章仿真驗證與Testbench編寫11/26/2025.1VerilogHDL電路仿真和驗證概述仿真,也叫模擬,是通過使用EDA仿真工具,通過輸入測試信號,比對輸出信號(波形、文本或者VCD文件)和期望值,來確認(rèn)是否得到與期望所一致的正確的設(shè)計結(jié)果,驗證設(shè)計的正確性。驗證是一個證明設(shè)計思路如何實現(xiàn),保證設(shè)計在功能上正確的一個過程。驗證在VerilogHDL設(shè)計的整個流程中分為4個階段:階段1:功能驗證;階段2:綜合后驗證;階段3:時序驗證;階段4:板級驗證。11/26/20222MicroelectronicsSchoolXidianUniversity5.1VerilogHDL電路仿真和驗證概述5.2VerilogHDL測試程序設(shè)計基礎(chǔ)5.2.1Testbench及其結(jié)構(gòu)在仿真的時候Testbench用來產(chǎn)生測試激勵給待驗證設(shè)計(DesignUnderVerification,DUV),或者稱為待測設(shè)計(DesignUnderTest,DUT)。
Testbench平臺結(jié)構(gòu)5.2VerilogHDL測試程序設(shè)計基礎(chǔ)5.2.1T測試程序的一般結(jié)構(gòu)
由于Testbench是一個測試平臺,信號集成在模塊內(nèi)部,沒有輸入輸出。
在Testbench模塊內(nèi),例化待測設(shè)計的頂層模塊,并把測試行為的代碼封裝在內(nèi),直接對待測系統(tǒng)提供測試激勵。
例5.2-1T觸發(fā)器測試程序示例moduleTflipflop_tb;//數(shù)據(jù)類型聲明regclk,rst_n,T;wiredata_out;TFFU1(.data_out(data_out),.T(T),.clk(clk),.rst_n(rst_n));//對被測模塊實例化always//產(chǎn)生測試激勵#5clk=~clk;Initialbeginclk=0;#3rst_n=0;#5rst_n=1;T=1;#30T=0;#20T=1;endInitial//對輸出響應(yīng)進(jìn)行收集begin$monitor($time,"T=%b,clk=%b,rst_n=%b,data_out=%b",T,clk,rst_n,data_out);endendmodule例5.2-1T觸發(fā)器測試程序示例T觸發(fā)器的仿真波形和部分文本輸出結(jié)果
:部分文本輸出結(jié)果:0T=x,clk=0,rst_n=x,data_out=x3T=x,clk=0,rst_n=0,data_out=05T=x,clk=1,rst_n=0,data_out=08T=1,clk=1,rst_n=1,data_out=110T=1,clk=0,rst_n=1,data_out=1T觸發(fā)器的仿真波形和部分文本輸出結(jié)果:部分文本輸出結(jié)果:從圖中可以清晰地看出Testbench的主要功能:(1)為DUT提供激勵信號。(2)正確實例化DUT。(3)將仿真數(shù)據(jù)顯示在終端或者存為文件,也可以顯示在波形窗口中以供分析檢查。(4)復(fù)雜設(shè)計可以使用EDA工具,或者通過用戶接口自動比較仿真結(jié)果與理想值,實現(xiàn)結(jié)果的自動檢查。從圖中可以清晰地看出Testbench的主要功能:在編寫Testbench時需要注意的問題
:(1)testbench代碼不需要可綜合Testbench代碼只是硬件行為描述不是硬件設(shè)計。(2)行為級描述效率高VerilogHDL語言具備5個描述層次,分別為開關(guān)級、門級、RTL級、算法級和系統(tǒng)級。(3)掌握結(jié)構(gòu)化、程式化的描述方式結(jié)構(gòu)化的描述有利于設(shè)計維護(hù),可通過initial、always以及assign語句將不同的測試激勵劃分開來。一般不要將所有的測試都放在一個語句塊中。在編寫Testbench時需要注意的問題:5.2.2測試平臺舉例DUT的仿真平臺
測試平臺需要產(chǎn)生時鐘信號、復(fù)位信號和一系列的仿真向量,觀察DUT的響應(yīng),確認(rèn)仿真結(jié)果。5.2.2測試平臺舉例DUT的仿真平臺測試平臺需要產(chǎn)生時鐘(1)組合邏輯電路仿真環(huán)境的搭建moduleadder1(a,b,ci,so,co);inputa,b,ci;outputso,co;
assign{co,so}=a+b+ci;endmodule根據(jù)全加器的真值表(表5.2-1)編寫的全加器測試程序如下:moduleadder1_tb;wireso,co;rega,b,ci;adder1U1(a,b,ci,so,co); //模塊例化
initial //測試信號產(chǎn)生
begina=0;b=0;ci=0;#20a=0;b=0;ci=1;#20a=0;b=1;ci=0;#20a=0;b=1;ci=1;#20a=1;b=0;ci=0;#20a=1;b=0;ci=1;#20a=1;b=1;ci=0;#20a=1;b=1;ci=1;#200$finish;endendmodule(1)組合邏輯電路仿真環(huán)境的搭建moduleadder1(全加器的輸入a、b和ci定義為reg型變量;把輸出so和co定義為wire型變量用模塊例化語句“adder1U1(a,b,ci,so,co);”把全加器設(shè)計電路例化到測試仿真環(huán)境中;用initial塊語句改變輸入的變化并生成測試條件,輸入的變化語句完全根據(jù)全加器的真值表編寫仿真結(jié)果:全加器的輸入a、b和ci定義為reg型變量;把輸出so和co(2)時序邏輯電路仿真環(huán)境的搭建在于時序邏輯電路仿真環(huán)境中,需要考慮時序、定時信息和全局復(fù)位、置位等信號要求,并定義這些信號。用VerilogHDL編寫的十進(jìn)制加法計數(shù)器源程序代碼是:modulecnt10(clk,rst,ena,q,cout);inputclk,rst,ena;output[3:0]q;outputcout;reg[3:0]q;always@(posedgeclkorposedgerst)beginif(rst)q=4'b0000;elseif(ena)beginif(q<9)q=q+1;elseq=0;endendassigncout=q[3]&q[0];endmoduleVerilogHDL測試程序代碼是:modulecnt10_tb;regclk,rst,ena;wire[3:0]q;wirecout;cnt10U1(clk,rst,ena,q,cout);//模塊實例化
always#50clk=~clk; //時鐘信號產(chǎn)生
initialbeginclk=0;rst=0;ena=1; //控制信號產(chǎn)生
#1200rst=1;#120rst=0;#2000ena=0;#200ena=1;#20000$finish;endendmodule(2)時序邏輯電路仿真環(huán)境的搭建在于時序邏輯電路仿真環(huán)境中,實例化語句“cnt10U1(clk,rst,ena,q,cout);”把十進(jìn)制計數(shù)模塊例化到仿真環(huán)境中;在always中用語句“#50clk=~clk;”產(chǎn)生周期為100(標(biāo)準(zhǔn)時間單位)的時鐘方波;用initial塊生成復(fù)位信號rst和使能控制信號ena的測試條件。測試結(jié)果如圖:實例化語句“cnt10U1(clk,rst,ena,q,c5.2.3VerilogHDL仿真結(jié)果確認(rèn)(1)直接觀察波形通過直接觀察各信號波形的輸出,比較測試值和期望值的大小,來確定仿真結(jié)果的正確性。5.2.3VerilogHDL仿真結(jié)果確認(rèn)(1)直接觀察(2)打印文本輸出法moduleadder1_tb;wireso,co;rega,b,ci;adder1U1(a,b,ci,so,co);//模塊例化
initial//測試信號產(chǎn)生
begina=0;b=0;ci=0;#20a=0;b=0;ci=1;#20a=0;b=1;ci=0;#20a=0;b=1;ci=1;#20a=1;b=0;ci=0;#20a=1;b=0;ci=1;#20a=1;b=1;ci=0;#20a=1;b=1;ci=1;#200$finish;end$monitor($time,"%b%b%b->%b%b",a,b,ci,so,co);endmodule其輸出的結(jié)果是:0000->0020001->1040010->1060011->0180100->10系統(tǒng)任務(wù)打印任務(wù):$display,直接輸出到標(biāo)準(zhǔn)輸出設(shè)備;$monitor,監(jiān)控參數(shù)的變化;$fdisplay,輸出到文件等(2)打印文本輸出法moduleadder1_tb;其輸出(3)自動檢查仿真結(jié)果自動檢查仿真結(jié)果是通過在設(shè)計代碼中的關(guān)鍵節(jié)點(diǎn)添加斷言監(jiān)控器,形成對電路邏輯綜合的注釋或是對設(shè)計特點(diǎn)的說明,以提高設(shè)計模塊的觀察性。(4)使用VCD文件VerilogHDL提供一系列系統(tǒng)任務(wù)用于記錄信號值變化保存到標(biāo)準(zhǔn)的VCD(ValueChangeDump)格式數(shù)據(jù)庫中。VCD文件是一種標(biāo)準(zhǔn)格式的波形記錄文件,只記錄發(fā)生變化的波形。VCD文件將在第5.3.7小節(jié)中詳細(xì)講述。(3)自動檢查仿真結(jié)果5.2.4VerilogHDL仿真效率因為要通過串行軟件代碼完成并行語義的轉(zhuǎn)化,VerilogHDL行為級仿真代碼的執(zhí)行時間比較長。提高VerilogHDL代碼的仿真代碼執(zhí)行時間:(1)減小層次結(jié)構(gòu)仿真代碼的層次越少,執(zhí)行時間就越短。(2)減少門級代碼的使用由于門級建模屬于結(jié)構(gòu)級建模,建議仿真代碼盡量使用行為級語句,建模層次越抽象,執(zhí)行時間就越短。5.2.4VerilogHDL仿真效率因為要通過串行軟件(3)仿真精度越高,效率越低計時單位值與計時精度值的差距越大,則模擬時間越長。`timescale仿真時間標(biāo)度將在第5.9.3小節(jié)中詳細(xì)講述。(4)進(jìn)程越少,效率越高代碼中的語句塊越少仿真越快,這是因為仿真器在不同進(jìn)程之間進(jìn)行切換也需要時間。(5)減少仿真器的輸出顯示VerilogHDL語言包含一些系統(tǒng)任務(wù),可以在仿真器的控制臺顯示窗口輸出一些提示信息,但會降低仿真器的執(zhí)行效率。(3)仿真精度越高,效率越低5.3與仿真相關(guān)的系統(tǒng)任務(wù)5.3.1$display和$write語法格式如下:$display(“<format_specifiers>”,<signal1,signal2,...,signaln>);$write(“<format_specifiers>”,<signal1,signal2,...,signaln>);“<format_specifiers>”通常稱為“格式控制”“<signal1,signal2,……,signaln>”則為“信號輸出列表”$display自動地在輸出后進(jìn)行換行$write輸出特定信息時不自動換行5.3與仿真相關(guān)的系統(tǒng)任務(wù)5.3.1$display和$w輸出格式說明,由“%”和格式字符組成,其作用是將輸出的數(shù)據(jù)轉(zhuǎn)換成指定的格式輸出。
常用的幾種輸出格式如右表。輸出格式說明%h或%H以十六進(jìn)制數(shù)的形式輸出%d或%D以十進(jìn)制數(shù)的形式輸出%o或%O以八進(jìn)制數(shù)的形式輸出%b或%B以二進(jìn)制數(shù)的形式輸出%c或%C以ASCII碼字符的形式輸出%v或%V輸出網(wǎng)絡(luò)型數(shù)據(jù)信號強(qiáng)度%m或%M輸出等級層次的名字%s或%S以字符串的形式輸出%t或%T以當(dāng)前的時間格式輸出%e或%E以指數(shù)的形式輸出實型數(shù)%f或%F以十進(jìn)制數(shù)的形式輸出實型數(shù)%g或%G以指數(shù)或十進(jìn)制數(shù)的形式輸出實型數(shù)輸出格式說明,由“%”和格式字符組成,其作用是將輸出的數(shù)據(jù)轉(zhuǎn)一些特殊的字符可以通過表中的轉(zhuǎn)換序列來輸出。換碼序列功能\n換行\(zhòng)t橫向跳格(即跳到下一個輸出區(qū))\\反斜杠字符\\"雙引號字符"\o1到3位八進(jìn)制數(shù)代表的字符%%百分符號%一些特殊的字符可以通過表中的轉(zhuǎn)換序列來輸出。換碼序列功能\n例5.3-1:$display和$write語句
moduledisp_tb;reg[31:0]rval;pulldown(pd);initialbeginrval=101;$display("\\\t%%\n\"\123");$display("rval=%hhex%ddecimal",rval,rval);$display("rval=%ootal%bbinary",rval,rval);$display("rvalhas%casciicharactervalue",rval);$display("pdstrengthvalueis%v",pd);$display("currentscopeis%m");$display("%sisasciivaluefor101",101);$write(“simulationtimeis”);$write(“%t\n”,$time);endendmodule其輸出結(jié)果為:\%"Srval=00000065hex101decimalrval=00000000145octal00000000000000000000000001100101binaryrvalhaseasciicharactervaluepdstrengthvalueisStXcurrentscopeisdispeisasciivaluefor101simulationtimeis0在$display中,輸出列表中數(shù)據(jù)的顯示寬度是自動按照輸出格式進(jìn)行調(diào)整的,總是用表達(dá)式的最大可能值所占的位數(shù)來顯示表達(dá)式的當(dāng)前值。例5.3-1:$display和$write語句modul5.3.2$monitor和$strobe$monitor與$stobe都提供了監(jiān)控和輸出參數(shù)列表中字符或變量的值的功能(1)$monitor語法格式:$monitor(<“format_specifiers>”,<signal1,signal2,...,signaln>);任務(wù)$monitor提供了監(jiān)控和輸出參數(shù)列表中的表達(dá)式或變量值的功能。每當(dāng)參數(shù)列表中變量或表達(dá)式的值發(fā)生變化時,整個參數(shù)列表中變量或表達(dá)式的值都將輸出顯示。
例如:$monitor($time,,"rxd=%btxd=%b",rxd,txd);注意在上面的語句中,“,,"代表一個空參數(shù)。空參數(shù)在輸出時顯示為空格。
5.3.2$monitor和$strobe$monitor$monitoron和$monitoroff任務(wù)的作用是通過打開和關(guān)閉監(jiān)控標(biāo)志來控制監(jiān)控任務(wù)$monitor的啟動和停止,這樣使得程序員可以很容易的控制$monitor何時發(fā)生。$monitor與$display的不同處在于$monitor往往在initial塊中調(diào)用,只要不調(diào)用$monitoroff,$monitor便不間斷地對所設(shè)定的信號進(jìn)行監(jiān)視。例5.3-2:$monitor系統(tǒng)任務(wù)的應(yīng)用實例modulemonitor_tb;integera,b;initialbegina=2;b=4;foreverbegin#5a=a+b;#5b=a-1;endend
initial#40$finish;
initial$monitor($time,"a=%d,b=%d",a,b);endmodule輸出結(jié)果為:0a=2,b=45a=6,b=410a=6,b=515a=11,b=520a=11,b=1025a=21,b=1030a=21,b=2035a=41,b=20$monitoron和$monitoroff任務(wù)的作用是通過(2)$strobe語法格式:$strobe(<functions_or_signals>);$strobe(“<string_and/or_variables>”,<functions_or_signals>);
探測任務(wù)用于在某時刻所有時間處理完后,在這個時間步的結(jié)尾輸出一行格式化的文本。常用的系統(tǒng)任務(wù)如下:$strobe:在所有時間處理完后,以十進(jìn)制格式輸出一行格式化的文本;$strobeb:在所有時間處理完后,以二進(jìn)制格式輸出一行格式化的文本;$strobeo:在所有時間處理完后,以八進(jìn)制格式輸出一行格式化的文本;$strobeh:在所有時間處理完后,以十六進(jìn)制格式輸出一行格式化的文本。(2)$strobe語法格式:$strobe任務(wù)在被調(diào)用的時刻所有的賦值語句都完成了,才輸出相應(yīng)的文字信息。$strobe任務(wù)提供了另一種數(shù)據(jù)顯示機(jī)制,可以保證數(shù)據(jù)只在所有賦值語句被執(zhí)行完畢后才被顯示。例5.3-3:$strobe系統(tǒng)任務(wù)的應(yīng)用實例modulestrobe_tb;rega,b;initialbegina=0;$display(“abydisplayis:”,a);$strobe(“abystrobeis:”,a);a=1;endinitialbeginb<=0;$display(“bbydisplayis:”,b);$strobe(“bbystrobeis:”,b);
#5;$display(“#5bbydisplayis:”,b);$display(“#5bbystrobeis:”,b);b<=1;endEndmodule顯示結(jié)果是:abydisplayis:0bbydisplayis:xabystrobeis:1bbystrobeis:0#5bbydisplayis:0#5bbystrobeis:0$strobe任務(wù)在被調(diào)用的時刻所有的賦值語句都5.3.3$time和$realtime用這兩個時間系統(tǒng)函數(shù)可以得到當(dāng)前的仿真時刻,所不同的是,$time函數(shù)以64位整數(shù)值的形式返回仿真時間,而$realtime函數(shù)則以實數(shù)型數(shù)據(jù)返回仿真時間。(1)系統(tǒng)函數(shù)$time例5.3-4:$time系統(tǒng)任務(wù)的應(yīng)用實例`timescale1ns/1nsmoduletime_tb;regts;parameterdelay=2;initialbegin#delayts=1;#delayts=0;#delayts=1;#delayts=0;endinitial$monitor($time,,,"ts=%b",ts);//使用函數(shù)$timeendmodule輸出結(jié)果為:0ts=x3ts=15ts=08ts=110ts=05.3.3$time和$realtime用這兩個時間系統(tǒng)函(2)$realtime系統(tǒng)函數(shù)$realtime返回的時間數(shù)字是一個實型數(shù),該數(shù)字也是以時間尺度為基準(zhǔn)的。例5.3-5:$realtime系統(tǒng)任務(wù)的應(yīng)用實例`timescale1ns/1nsmodulerealtime_tb;regset;parameterp=2;initialbegin$monitor($realtime,,"set=b%",set);//使用函數(shù)$realtime#pset=0;#pset=1;endendmodule輸出結(jié)果為:0set=x2set=04set=1(2)$realtime系統(tǒng)函數(shù)$realtime返回的時間5.3.4$finish和$stop系統(tǒng)任務(wù)$finish和$stop是用于對仿真過程進(jìn)行控制,分別表示結(jié)束仿真和中斷仿真。其語法格式:$finish;$finish(n);$stop;$stop(n);其中,n是$finish和$stop的參數(shù),n可以取0、1或2幾個值,分別表示如下含義,如下表所示。n的取值含義0不輸出任何信息1給出仿真時間和位置2給出仿真時間和位置,同時還有所用memory及CPU時間的統(tǒng)計5.3.4$finish和$stop系統(tǒng)任務(wù)$finish$finish的作用是退出仿真器,返回主操作系統(tǒng),也就是結(jié)束仿真過程。任務(wù)$finish可以帶參數(shù),根據(jù)參數(shù)的值輸出不同的特征信息。如果不帶參數(shù),默認(rèn)$finish的參數(shù)值為1。$stop任務(wù)的作用是把EDA工具(例如仿真器)置成暫停模式,在仿真環(huán)境下給出一個交互式的命令提示符,將控制權(quán)交給用戶。這個任務(wù)可以帶有參數(shù)表達(dá)式。根據(jù)參數(shù)值(0,1或2)的不同,輸出不同的信息。參數(shù)值越大,輸出的信息越多。$finish的作用是退出仿真器,返回主操作系統(tǒng),也就是結(jié)束$finish和$stop實例例5.3-6:$finish系統(tǒng)任務(wù)的應(yīng)用實例modulefinish_tb;integera,b;initialbegina=2;b=4;foreverbegin#5a=a+b;#5b=a-1;endendinitial#40$finish;initialbegin$monitor($time,"a=%d,b=%d",a,b);endendmodule在上例中,程序執(zhí)行到40個時間單位時退出仿真器。例5.3-7:$stop系統(tǒng)任務(wù)的應(yīng)用實例modulestop_tb;integera,b;initialbegina=2;b=4;foreverbegin#5a=a+b;#5b=a-1;endendinitial#40$stop;initialbegin$monitor($time,"a=%d,b=%d",a,b);endendmodule在上例中,程序執(zhí)行到40個時間單位時停止仿真,將EDA仿真器設(shè)置為暫停模式。$finish和$stop實例例5.3-6:$finish系5.3.5$readmemh和$readmem在VerilogHDL程序中有兩個系統(tǒng)任務(wù)$readmemb和$readmemh用來從文件中讀取數(shù)據(jù)到存儲器中。這兩個系統(tǒng)任務(wù)可以在仿真的任何時刻被執(zhí)行使用,其語法格式共有以下六種:(1)$readmemb("<file_name>",<memory_name>);(2)$readmemb("<file_name>",<memory_name>,<start_addr>);(3)$readmemb("<file_name>",<memory_name>,<start_addr>,<finish_addr>);(4)$readmemh("<file_name>",<memory_name>);(5)$readmemh("<file_name>",<memory_name>,<start_addr>);(6)$readmemh("<file_name>",<memory_name>,<start_addr>,<finish_addr>);11/26/202232MicroelectronicsSchoolXidianUniversity5.3.5$readmemh和$readmem在Veril11/26/202233MicroelectronicsSchoolXidianUniversity例$readmemh和$readmemb系統(tǒng)任務(wù)的應(yīng)用實例moduleread_mem_tb;reg[7:0]memory_b[0:7];reg[31:0]memory_h[0:31];integeri;initialbegin//把數(shù)據(jù)文件init_b.txt讀入存儲器中的給定地址$readmemb("init_b.txt",memory_b);//把數(shù)據(jù)文件init_h.txt讀入存儲器中的給定地址$readmemb("init_h.txt",memory_h);
//顯示初始化后的存儲器內(nèi)容for(i=0;i<8;i=i+1)begin$display("memory_b[%0d]=%b",i,memory_b[i]);$display("memory_h[%0h]=%h",i,memory_h[i]);endendendmodule11/26/202233MicroelectronicsS文件init_b.txt和init_h.txt包含初始化數(shù)據(jù)。用@<address>在數(shù)據(jù)文件中指定地址。其中,“init_b.txt”指定二進(jìn)制數(shù)據(jù)從第二位地址開始寫入;而“init_h.txt”指定十六進(jìn)制數(shù)據(jù)從地一位地址寫入。樣本文件如下所示。11/26/202234MicroelectronicsSchoolXidianUniversity“init_b.txt”文件:@00211111111010101010000000010101010@0061111zzzz00001111“init_h.txt”文件:@00100000000000000000000000000000011000000000000000000000000000001110000000000000000000000000000111100000000000000000000000000011111文件init_b.txt和init_h.txt包含初始化數(shù)據(jù)5.3.6$random$random是產(chǎn)生隨機(jī)數(shù)的系統(tǒng)函數(shù),每次調(diào)用該函數(shù)將返回一個32位的隨機(jī)數(shù),該隨機(jī)數(shù)是一個帶符號的整數(shù)。語法格式:$random%<number>;這個系統(tǒng)函數(shù)提供了一個產(chǎn)生隨機(jī)數(shù)的手段。當(dāng)函數(shù)被調(diào)用時返回一個32bit的隨機(jī)數(shù)。它是一個帶符號的整形數(shù)。$random一般的用法是:$ramdom%b,其中
b>0,它給出了一個范圍在(-b+1):(b-1)中的隨機(jī)數(shù)。11/26/202235MicroelectronicsSchoolXidianUniversity5.3.6$random$random是產(chǎn)生隨機(jī)數(shù)的系統(tǒng)函例$random系統(tǒng)任務(wù)的應(yīng)用實例11/26/202236MicroelectronicsSchoolXidianUniversity`timescale1ns/1nsmodulerandom_pulse(dout);output[9:0]dout;regdout;integerdelay1,delay2,k;initialbegin#10dout=0;for(k=0;k<100;k=k+1)begindelay1=20*({$random}%6); //delay1在0到100ns間變化delay2=20*(1+{$random}%3); //delay2在20到60ns間變化#delay1dout=1<<({$random}%10); //dout的0--9位中隨機(jī)出現(xiàn)1,并出現(xiàn)的時間在0-100ns間變化#delay2dout=0;
//脈沖的寬度在在20到60ns間變化endendendmodule
例$random系統(tǒng)任務(wù)的應(yīng)用實例11/26/202236M5.4信號時間賦值語句11/26/202237MicroelectronicsSchoolXidianUniversity5.4信號時間賦值語句11/26/202237Microel5.4.1時間延遲的語法說明延遲語句用于對各條語句的執(zhí)行時間進(jìn)行控制,從而快速滿足用戶的時序要求。VerilogHDL語言中延時控制的語法格式有兩類:(1)#<延遲時間>行為語句;(2)#<延遲時間>;其中,符號“#”是延遲控制的關(guān)鍵字符,<延遲時間>可以是直接指定的延遲時間量,并以多少個仿真時間單位的形式給出。在仿真過程中,所有時延都根據(jù)時間單位定義。下面是帶時延的賦值語句示例。#2Sum=A^B;//#2指定2個時間單位后,將A異或B的值賦值給Sum。11/26/202238MicroelectronicsSchoolXidianUniversity5.4.1時間延遲的語法說明延遲語句用于對各條語句的執(zhí)行時間根據(jù)時間控制部分在過程賦值語句中出現(xiàn)的位置,可以把過程賦值語句中的時間控制方式分為外部時間控制方式和內(nèi)部時間控制方式。(1)外部時間控制方式是時間控制出現(xiàn)在整個過程賦值語句的最左端,也就是出現(xiàn)賦值目標(biāo)變量的左邊的時間控制方式,其語法結(jié)構(gòu)如下例所示:#5a=b;在仿真執(zhí)行時就相當(dāng)于如下幾條語句的執(zhí)行:initialbegin#5;a=b;end11/26/202239MicroelectronicsSchoolXidianUniversity根據(jù)時間控制部分在過程賦值語句中出現(xiàn)的位置,可以把過程賦值語(2)內(nèi)部時間控制方式是過程賦值語句中的時間控制部分還可以出現(xiàn)在“賦值操作符”和“賦值表達(dá)式”之間的時間控制方式。其語法結(jié)構(gòu)如下例所示:a=#5b;其中時間控制部分“#5”就出現(xiàn)在賦值操作符“=”和賦值表達(dá)式“b”的中間,因此在這條過程賦值語句內(nèi)帶有內(nèi)部時間控制方式的時間控制。它在執(zhí)行時就相當(dāng)于如下幾條語句的執(zhí)行:initialbegintemp=b;//先求b的值#5;a=temp;end11/26/202240MicroelectronicsSchoolXidianUniversity(2)內(nèi)部時間控制方式是過程賦值語句中的時間控制部分還可以出5.4.2時間延遲的描述形式此處時間延遲的描述形式是指延時控制的描述形式,其分為串行延遲控制、并行延遲控制、阻塞式延遲控制和非阻塞式延遲控制四種形式。以實現(xiàn)兩組不同波形的信號為例(如圖所示q0_out和q1_out),說明四種不同時間延遲的描述形式。11/26/202241MicroelectronicsSchoolXidianUniversity5.4.2時間延遲的描述形式此處時間延遲的描述形式是指延時控(1)串行延遲控制串行延遲控制是最為常見的信號延遲控制,它是由begin-end過程塊加上延遲賦值語句構(gòu)成,其中延遲賦值語句可以為外部時間控制方式,也可以為內(nèi)部時間控制方式。在<延遲時間>之后也可根據(jù)情況來確定是否執(zhí)行相應(yīng)的行為語句。在<延遲時間>后面有相應(yīng)的行為語句,則仿真進(jìn)程遇到這條帶有延遲控制的行為語句后并不立即執(zhí)行行為語句指定的操作,而是要延遲等待到“<延遲時間>”所指定的時間量過去后才真正開始執(zhí)行行為語句指定的操作。11/26/202242MicroelectronicsSchoolXidianUniversity(1)串行延遲控制11/26/202242Microelec11/26/202243MicroelectronicsSchoolXidianUniversity`timescale1ns/1nsmoduleserial_delay(q0_out,q1_out);outputq0_out,q1_out;regq0_out,q1_out;
initialbeginq0_out=1'b0;#50q0_out=1'b1;#100 q0_out=1'b0;#100 q0_out=1'b1;#50q0_out=1'b0;#100 q0_out=1'b1;#50q0_out=1'b0;#50q0_out=1'b1;#50q0_out=1'b0;endinitialbeginq1_out=1'b0;#100 q1_out=1'b1;#100 q1_out=1'b0;#50q1_out=1'b1;#100 q1_out=1'b0;#50q1_out=1'b1;#100 q1_out=1'b0;#50q1_out=1'b1;#50q1_out=1'b0;endendmodule例VerilogHDL串行延遲控制方式設(shè)計圖示信號11/26/202243MicroelectronicsS(2)并行延遲控制并行延遲控制方式是通過fork-join過程塊加上延遲賦值語句構(gòu)成,其中延遲賦值語句同串行延遲控制方式一樣,既可以是外部時間控制方式,也可以是內(nèi)部時間控制方式。在<延遲時間>之后也可根據(jù)情況來確定是否執(zhí)行相應(yīng)的行為語句。在<延遲時間>后面有相應(yīng)的行為語句,則仿真進(jìn)程遇到這條帶有延遲控制的行為語句后并不立即執(zhí)行行為語句指定的操作,而是要延遲等待到“<延遲時間>”所指定的時間量過去后才真正開始執(zhí)行行為語句指定的操作。但并行延遲控制方式與串行延遲控制方式不同在于并行延遲控制方式中的多條延遲語句時并行執(zhí)行的,并不需要等待上一條語句的執(zhí)行完成才開始執(zhí)行當(dāng)前的語句。11/26/202244MicroelectronicsSchoolXidianUniversity(2)并行延遲控制11/26/202244Microelec11/26/202245MicroelectronicsSchoolXidianUniversity`timescale1ns/1nsmoduleparallel_delay(q0_out,q1_out);outputq0_out,q1_out;regq0_out,q1_out;initialforkq0_out=1'b0;#50q0_out=1'b1;#150 q0_out=1'b0;#250 q0_out=1'b1;#300 q0_out=1'b0;#400 q0_out=1'b1;#450 q0_out=1'b0;#500 q0_out=1'b1;#600 q0_out=1'b0;joininitialfork q1_out=1'b0;#100 q1_out=1'b1;#200 q1_out=1'b0;#250 q1_out=1'b1;#350 q1_out=1'b0;#400 q1_out=1'b1;#500 q1_out=1'b0;#550 q1_out=1'b1;#600 q1_out=1'b0;joinendmodule例VerilogHDL并行延遲控制方式設(shè)計圖示信號11/26/202245MicroelectronicsS(3)阻塞式延遲控制以賦值操作符“=”來標(biāo)識的賦值操作稱為“阻塞式過程賦值”,阻塞式過程賦值在之前已經(jīng)介紹過,在此介紹阻塞式延遲控制。阻塞式延遲控制是在阻塞式過程賦值基礎(chǔ)上帶有延時控制的情況,例如initialbegin a=0; a=#51; a=#100; a=#151;end11/26/202246MicroelectronicsSchoolXidianUniversity(3)阻塞式延遲控制11/26/202246Microele各條阻塞式賦值語句將依次得到執(zhí)行,并且在第一條語句所指定的賦值操作沒有完成之前第二條語句不會開始執(zhí)行。因此在仿真進(jìn)程開始時刻將“0”值賦給a,此條賦值語句完成之后才開始執(zhí)行第二條賦值語句;在完成第一條賦值語句之后,延遲5個時間單位將“1”賦值給a;同理第三條賦值語句是在第二條賦值語句完成之后延遲10個時間單位才開始執(zhí)行,將“0”賦值給a;最后一條賦值語句是在前三條語句都完成的時刻,延遲15個時間單位,將“1”賦值給a。下圖給出了上例中信號a的波形。上述兩例都采用的是阻塞式賦值語句。11/26/202247MicroelectronicsSchoolXidianUniversity各條阻塞式賦值語句將依次得到執(zhí)行,并且在第一條語句所指定的賦(4)非阻塞式延遲控制以賦值操作符“<=”來標(biāo)識的賦值操作稱為“非阻塞式過程賦值”,非阻塞式過程賦值也在之前講述過,在此主要介紹非阻塞式延遲控制。非阻塞式延遲控制是在非阻塞式過程賦值基礎(chǔ)上帶有延時控制的情況。如下例所示:initialbegin a<=0; a<=#51; a<=#100; a<=#151;end11/26/202248MicroelectronicsSchoolXidianUniversity(4)非阻塞式延遲控制11/26/202248Microel在上例中各條非阻塞式賦值語句均以并行方式執(zhí)行,雖然執(zhí)行語句在begin-end串行塊中,但其執(zhí)行方式與并行延遲控制方式一致,在仿真進(jìn)程開始時刻同時執(zhí)行四條延遲賦值語句。在仿真進(jìn)程開始時,將“0”值賦值給a;在離仿真開始時刻5個時間單位時,將“1”值賦值給a;在離仿真開始時刻10個時間單位時,將“0”值賦值給a;最后在離仿真開始時刻15個時間單位時,將“1”值賦值給a。下圖給出了上例中信號a的波形。11/26/202249MicroelectronicsSchoolXidianUniversity在上例中各條非阻塞式賦值語句均以并行方式執(zhí)行,雖然執(zhí)行語句在11/26/202250MicroelectronicsSchoolXidianUniversity`timescale1ns/1nsmodulenon_blocking_delay(q0_out,q1_out);outputq0_out,q1_out;regq0_out,q1_out;initialbeginq0_out<=1'b0;q0_out<=#501'b1;q0_out<=#1501'b0;q0_out<=#2501'b1;q0_out<=#3001'b0;q0_out<=#4001'b1;q0_out<=#4501'b0;q0_out<=#5001'b1;q0_out<=#6001'b0;endinitialbeginq1_out<=1'b0;q1_out<=#1001'b1;q1_out<=#2001'b0;q1_out<=#2501'b1;q1_out<=#3501'b0;q1_out<=#4001'b1;q1_out<=#5001'b0;q1_out<=#5501'b1;q1_out<=#6001'b0;endendmodule例VerilogHDL非阻塞延遲控制方式設(shè)計11/26/202250MicroelectronicsS5.4.3邊沿觸發(fā)事件控制邊沿觸發(fā)事件控制的語法格式可以為如下四種形式:形式1:@(<事件表達(dá)式>)行為語句;形式2:@(<事件表達(dá)式>);形式3:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or<事件表達(dá)式n>)行為語句;形式4:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or<事件表達(dá)式n>);11/26/202251MicroelectronicsSchoolXidianUniversity5.4.3邊沿觸發(fā)事件控制邊沿觸發(fā)事件控制的語法格式可以為如1.事件表達(dá)式在事件表達(dá)式中,可以以三種形式出現(xiàn):形式1:<信號名>形式2:posedge<信號名>形式3:negedge<信號名>其中,“<信號名>”可以是任何數(shù)據(jù)類型的標(biāo)量或矢量。形式1中,代表觸發(fā)事件的“<信號名>”在指定的信號發(fā)生邏輯變化時,執(zhí)行下面的語句,如例所示:@(in)
out=in;當(dāng)敏感事件in發(fā)生邏輯變化時(包括正跳變和負(fù)跳變),執(zhí)行對應(yīng)的賦值語句,將in的值賦值給out。11/26/202252MicroelectronicsSchoolXidianUniversity1.事件表達(dá)式11/26/202252Microelectr形式2中,代表觸發(fā)事件的“posedge<信號名>”在指定的信號發(fā)生了正跳變時,執(zhí)行下面的語句,如下例所示:@(posedgein)
out=in;當(dāng)敏感事件in發(fā)生正跳變時,執(zhí)行對應(yīng)的賦值語句,將in的值賦值給out。形式3中,代表觸發(fā)事件的“negedge<信號名>”在指定的信號發(fā)生了負(fù)跳變時,執(zhí)行下面的語句,如下例所示:@(negedgein)out=in;當(dāng)敏感事件in發(fā)生負(fù)跳變時,執(zhí)行對應(yīng)的賦值語句,將in的值賦值給out。11/26/202253MicroelectronicsSchoolXidianUniversity形式2中,代表觸發(fā)事件的“posedge<信號名>”在指定的在信號發(fā)生邏輯變化(正跳變或負(fù)跳變)的過程中,信號的值是從0、1、x、z四個值中的一個值變化到另一個值;而信號發(fā)生正跳變的過程是信號由低電平向高電平的轉(zhuǎn)變,負(fù)跳變是信號由高電平向低電平的轉(zhuǎn)變。表5.4-1為VerilogHDL中規(guī)定的正跳變和負(fù)跳變。11/26/202254MicroelectronicsSchoolXidianUniversity正跳變負(fù)跳變0→x1→x0→z1→z0→11→0x→1x→0z→1z→0在信號發(fā)生邏輯變化(正跳變或負(fù)跳變)的過程中,信號的值是從02.邊沿觸發(fā)語法格式形式1:@(<事件表達(dá)式>)行為語句;這種語法格式的敏感事件列表內(nèi)只包含了一個觸發(fā)事件,只有當(dāng)這個指定的觸發(fā)事件發(fā)生之后,后面的行為語句才能啟動執(zhí)行。在仿真進(jìn)程中遇到這種帶有事件控制的行為語句時,如果指定的觸發(fā)事件還沒有發(fā)生,則仿真進(jìn)程就會停留在此處等待,直到指定觸發(fā)事件發(fā)生之后再啟動執(zhí)行后面的行為語句,仿真進(jìn)程繼續(xù)向下進(jìn)行。11/26/202255MicroelectronicsSchoolXidianUniversity例5.4-4:時鐘脈沖計數(shù)器moduleclk_counter(clk,count_out);inputclk;outputcount_out;reg[3:0]count_out;initialcount_out=0;always@(posedgeclk)count_out=count_out+1; //在clk的每個正跳變邊沿count_out增加1endmodule2.邊沿觸發(fā)語法格式11/26/202255Microele形式2:@(<事件表達(dá)式>);這種語法格式的敏感事件列表內(nèi)也只包含了一個觸發(fā)事件,沒有行為語句來指定觸發(fā)事件發(fā)生時要執(zhí)行的操作。這種格式的事件控制語句的執(zhí)行過程與延時控制語句中沒有行為語句的情況類似,仿真進(jìn)程在遇到這條事件控制語句后會進(jìn)入等待狀態(tài),直到指定的觸發(fā)事件發(fā)生后才結(jié)束等待狀態(tài),退出該事件控制語句的執(zhí)行并開始下一條語句的執(zhí)行。11/26/202256MicroelectronicsSchoolXidianUniversity形式2:@(<事件表達(dá)式>);11/26/202256Mic11/26/202257MicroelectronicsSchoolXidianUniversitymoduleclk_time_mea(clk);inputclk;timeposedge_time,negedge_time;timehigh_last_time,low_last_time,last_time;initialbegin@(posedgeclk); /*等待,直到時鐘發(fā)生正跳變后退出等待狀態(tài),繼續(xù)執(zhí)行下一條語句*/posedge_time=$time;@(negedgeclk); /*等待,直到時鐘發(fā)生負(fù)跳變后退出等待狀態(tài),
繼續(xù)執(zhí)行下一條語句*/negedge_time=$time;@(negedgeclk); /*等待,直到時鐘再次正跳變后退出等待狀態(tài),繼續(xù)執(zhí)行下一條語句*/last_time=$time-posedge_time;high_last_time=negedge_time-posedge_time;low_last_time=last_time-high_last_time;$display("TheclkstayinHighlevelfor:%t",high_last_time);$display("TheclkstayinLowlevelfor:%t",low_last_time);$display("TheclksignalPeriodis:%t",last_time);endendmodule例用于測定輸入時鐘正電平、負(fù)電平持續(xù)時間以及時鐘周期的模塊11/26/202257MicroelectronicsS形式3:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or<事件表達(dá)式n>)行為語句;這種語法格式的“敏感事件列表”內(nèi)指定了由不同“<事件表達(dá)式>”代表的多個觸發(fā)事件,這些“<事件表達(dá)式>”之間要用關(guān)鍵詞“or”組合起來。只要這些觸發(fā)事件中的任何一個得到發(fā)生,就啟動行為語句的執(zhí)行。在仿真進(jìn)程遇到這種格式的邊沿觸發(fā)事件控制語句時如果所有的觸發(fā)事件都沒有發(fā)生,則仿真進(jìn)程就會進(jìn)入等待狀態(tài),直到其中的某一個觸發(fā)事件發(fā)生后才啟動執(zhí)行后面給出的行為語句,仿真進(jìn)程繼續(xù)向下進(jìn)行。11/26/202258MicroelectronicsSchoolXidianUniversity形式3:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or形式4:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or<事件表達(dá)式n>);同第三種語法格式一樣,這種語法格式內(nèi)指定了多個觸發(fā)事件。但是在這種格式中沒有行為語句。在這種情況下,該語句的執(zhí)行過程與第二種語法格式的執(zhí)行過程類似,仿真進(jìn)程在遇到這條事件控制語句后會進(jìn)入等待狀態(tài),直到敏感事件列表包含的多個觸發(fā)事件中的任何一個得到發(fā)生后才結(jié)束等待狀態(tài),退出該事件控制語句并開始執(zhí)行該事件控制語句后的下一條語句。11/26/202259MicroelectronicsSchoolXidianUniversity例在觸發(fā)事件發(fā)生后退出事件控制語句moduledisplay_information_change(a,b);inputa,b;wirea,b;alwaysbegin@(posedgeaornegedgeb);/*等待,直到a或b發(fā)生變化后退出等待狀態(tài),并開始下一條語句的執(zhí)行*/display("Oneofaandbchangedintime:%t",$time);endendmodule形式4:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or5.4.4電平敏感事件控制電平敏感時間控制是另一種事件控制方式,與邊沿觸發(fā)事件控制不同,它是在指定的條件表達(dá)式為真時啟動需要執(zhí)行的語句。電平敏感時間控制是用關(guān)鍵詞“wait”來表示。電平觸發(fā)事件控制的語法格式可以為如下兩種:形式1:wait(條件表達(dá)式)行為語句;形式2:wait(條件表達(dá)式);電平敏感事件控制的第一種形式中包含了行為語句,它可以是串行塊(begin-end)語句或并行塊(fork-join)語句,也可以是單條行為語句。在這種事件控制語句形式下,行為語句啟動執(zhí)行的觸發(fā)條件是:條件表達(dá)式的值為“真(邏輯1)”。如果當(dāng)仿真進(jìn)程執(zhí)行到這條電平敏感控制語句時條件表達(dá)式的值是“真”,那么語句塊立即得到執(zhí)行;否則語句塊要一直等到條件表達(dá)式變?yōu)椤罢妗睍r再開始執(zhí)行。11/26/202260MicroelectronicsSchoolXidianUniversity5.4.4電平敏感事件控制電平敏感時間控制是另一種事件控制方11/26/202261MicroelectronicsSchoolXidianUniversity例如:wait(enable==1)begin d=a&b; d=d|c;endwait語句的作用是根據(jù)條件表達(dá)式的真假來控制下面begin-end語句塊的執(zhí)行,在使能信號enable變?yōu)楦唠娖胶?,也就是enable==1的語句為真時進(jìn)行a,b,c之間的與或操作;若使能信號enable未變?yōu)楦唠娖剑瑒tbegin-end語句塊的執(zhí)行需要等到enable變?yōu)楦唠娖街蟛砰_始執(zhí)行。11/26/202261MicroelectronicsS電平敏感事件控制的第2種形式中沒有包含行為語句。在這種電平敏感事件控制語句形式下,如果當(dāng)仿真進(jìn)程執(zhí)行到該wait控制語句時條件表達(dá)式的值是“真”,那么立即結(jié)束該wait事件控制語句的執(zhí)行,仿真進(jìn)程繼續(xù)往下進(jìn)行;而如果當(dāng)仿真進(jìn)程執(zhí)行到這條wait控制語句時條件表達(dá)式的值是“假”,則仿真進(jìn)程進(jìn)入等待狀態(tài),一直等到條件表達(dá)式取值變?yōu)椤罢妗睍r才退出等待狀態(tài)同時結(jié)束該wait語句的執(zhí)行,仿真進(jìn)程繼續(xù)往下進(jìn)行。這種形式的電平敏感時間控制常常用來對串行塊中各條語句的執(zhí)行時序進(jìn)行控制。11/26/202262MicroelectronicsSchoolXidianUniversity例如:begin wait(enable==1); d=a&b; d=d|c;end電平敏感事件控制的第2種形式中沒有包含行為語句。在這種電平敏5.5任務(wù)和函數(shù)在VerilogHDL語言中提供了任務(wù)和函數(shù),可以將較大的行為級設(shè)計劃分為較小的代碼段,允許設(shè)計者將需要在多個地方重復(fù)使用的相同代碼提取出來,編寫成任務(wù)和函數(shù),這樣可以使代碼更加簡潔和易懂。5.5.1任務(wù)1.任務(wù)的定義任務(wù)定義的語法格式:11/26/202263MicroelectronicsSchoolXidianUniversitytask<任務(wù)名>;
端口和類型聲明
局部變量聲明 begin
語句1;
語句2; ……
語句n; endendtask5.5任務(wù)和函數(shù)在VerilogHDL語言中提供了任務(wù)和函任務(wù)定義是嵌入在關(guān)鍵字task和endtask之間的,其中關(guān)鍵詞task標(biāo)志著一個任務(wù)定義結(jié)構(gòu)的開端,endtask標(biāo)志著一個任務(wù)定義結(jié)構(gòu)的結(jié)束。“<任務(wù)名>”是所定義任務(wù)的名稱。在“<任務(wù)名>”后面不能出現(xiàn)輸入輸入端口列表。例以讀存儲器數(shù)據(jù)為例說明任務(wù)定義的操作11/26/202264MicroelectronicsSchoolXidianUniversitytaskread_memory; //任務(wù)定義的開頭,指定任務(wù)名為read_memory input[15:0]address; //輸入端口說明 output[31:0]data; //輸出端口說明 reg[3:0]counter; //變量類型說明 reg[7:0]temp[1:4]; //變量類型說明 begin //語句塊,任務(wù)被調(diào)用時執(zhí)行 for(counter=1;counter<=4;counter=counter+1) temp[counter]=mem[address+counter-1]; data={temp[1],temp[2],temp[3],temp[4]}; endendtask //任務(wù)定義結(jié)束任務(wù)定義是嵌入在關(guān)鍵字task和endtask之間的,其中關(guān)任務(wù)定義時需注意以下事項:(1)在第一行“task”語句中不能列出端口名列表。(2)任務(wù)中可以有延時語句、敏感事件控制語句等事件控制語句。(3)任務(wù)可以沒有或可以有一個或多個輸入、輸出和雙向端口。(4)任務(wù)可以沒有返回值,也可以通過輸出端口或雙向端口返回一個或多個返回值。(5)任務(wù)可以調(diào)用其它的任務(wù)或函數(shù),也可以調(diào)用該任務(wù)本身。(6)任務(wù)定義結(jié)構(gòu)內(nèi)不允許出現(xiàn)過程塊(initial或always過程塊)。(7)任務(wù)定義結(jié)構(gòu)內(nèi)可以出現(xiàn)disable終止語句,這條語句的執(zhí)行將中斷正在執(zhí)行的任務(wù)。在任務(wù)被中斷后,程序流程將返回到調(diào)用任務(wù)的地方繼續(xù)向下執(zhí)行。11/26/202265MicroelectronicsSchoolXidianUniversity任務(wù)定義時需注意以下事項:11/26/202265Micro2、任務(wù)的調(diào)用任務(wù)的調(diào)用是通過“任務(wù)調(diào)用語句”來實現(xiàn)的。任務(wù)調(diào)用語句列出了傳入任務(wù)的參數(shù)值和接收結(jié)果的變量值,任務(wù)的調(diào)用格式如下:<任務(wù)名>(端口1,端口2……,端口n);例以測試仿真中常用的方式來說明任務(wù)的調(diào)用11/26/202266MicroelectronicsSchoolXidianUniversitymoduledemo_task_invo_tb;reg[7:0]mem[127:0];reg[15:0]a;reg[31:0]b;initialbegina=0;read_mem(a,b);//任務(wù)的第一次調(diào)用#10;a=64;read_mem(a,b);//任務(wù)的第二次調(diào)用end
taskread_mem;//任務(wù)定義部分input[15:0]address;output[31:0]data;reg[3:0]counter;reg[7:0]temp[1:4];beginfor(counter=1;counter<=4;counter=counter+1)temp[counter]=mem[address+counter-1];data={temp[1],temp[2],temp[3],temp[4]};endendtaskendmodule2、任務(wù)的調(diào)用11/26/202266Microelectr使用任務(wù)可以使程序更加簡潔易懂,以實際中的交通燈控制為例說明任務(wù)的定義、調(diào)用的特點(diǎn)。11/26/202267MicroelectronicsSchoolXidianUniversitymoduletraffic_lights(red,amber,green);outputred,amber,green;reg[2:1]order;regclock,red,amber,green;parameterON=1,OFF=0,RED_TICS=350,AMBER_TICS=30,GREEN_TICS=200;//產(chǎn)生時鐘脈沖alwaysbegin#100clock=0;#100clock=1;end//任務(wù)的定義,該任務(wù)用于實現(xiàn)交通燈的開啟tasklight;outputred;outputamber;outputgreen;input[31:0]tic_time;input[2:1]order;beginred=OFF;green=OFF;amber=OFF;case(order)2'b01:red=ON;2'b10:green=ON;2'b11:amber=ON;
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 與同學(xué)們談地理教學(xué)設(shè)計 -2024-2025學(xué)年地理人教版七年級上冊
- 《第7課 開關(guān)量的生成》教學(xué)設(shè)計教學(xué)反思-2023-2024學(xué)年小學(xué)信息技術(shù)浙教版23六年級下冊
- ERCP病人的護(hù)理課件
- 2024-2025學(xué)年人教版初中美術(shù)九年級下冊教案
- 2024年高中物理 第二章 第3節(jié) 勻變速直線運(yùn)動的位移與時間的關(guān)系教學(xué)設(shè)計 新人教版必修1
- 2024年五年級數(shù)學(xué)上冊 五 分?jǐn)?shù)的意義第5課時 分?jǐn)?shù)與除法(2)配套教學(xué)設(shè)計 北師大版
- 2024-2025學(xué)年高中歷史 第五單元 經(jīng)濟(jì)全球化的趨勢 第26課 經(jīng)濟(jì)全球化的趨勢教學(xué)教學(xué)設(shè)計 岳麓版必修2
- 2024秋八年級英語上冊 Unit 2 How often do you exercise Section B(1a-2e)教學(xué)設(shè)計 (新版)人教新目標(biāo)版
- 藥品驗收養(yǎng)護(hù)操作規(guī)程
- 2024-2025學(xué)年高中物理 第九章 固體、液體和物態(tài)變化 4 物態(tài)變化中的能量交換教學(xué)設(shè)計1 新人教版選修3-3
- 中學(xué)生春季傳染病預(yù)防知識
- 住院透析患者操作流程
- 云倉合同標(biāo)準(zhǔn)文本
- (一模)南京市、鹽城市2025屆高三年級第一次模擬考試歷史試卷(含官方答案)
- 2025年焦作工貿(mào)職業(yè)學(xué)院單招職業(yè)技能考試題庫附答案
- 2025年塔里木職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫完美版
- 清明節(jié)假期安全教育主題班會 課件
- 倒閘操作考試試題及答案
- 2025年小學(xué)生安全知識競賽考試指導(dǎo)題庫300題(含答案)
- 專題5 壓強(qiáng) 2021年和2022年四川省成都市中考物理模擬試題匯編
- 春季預(yù)防傳染病課件
評論
0/150
提交評論