版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第9章調(diào)試用系統(tǒng)任務(wù)和常用編譯預(yù)處理語句系統(tǒng)任務(wù)編譯預(yù)處理19.1系統(tǒng)任務(wù)格式$monitor(p1,p2,…,p3)$monitor;$monitoron;$monitoroff任務(wù)$monitor提供了監(jiān)控和輸出參數(shù)列表中的表達(dá)式或變量值的功能。參數(shù)列表中的控制格式字符串和輸出列表的規(guī)那么和$display中的一樣。當(dāng)啟動一個帶有一個或多個參數(shù)的$monitor任務(wù)時,仿真器那么建立一個處理機(jī)制,使得當(dāng)參數(shù)列表中的變量或表達(dá)式的值發(fā)生變化時,整個參數(shù)列表中的變量或表達(dá)式的值都將輸出顯示。29.1系統(tǒng)任務(wù)如果同一時刻,兩個或多個參數(shù)的值發(fā)生變化,那么在該時刻只輸出顯示一次。$monitoron和$monitoroff這兩個任務(wù)的作用是通過翻開和關(guān)閉監(jiān)控標(biāo)志來控制、監(jiān)控任務(wù)$monitor的啟動和停止,便于程序員控制$monitor何時發(fā)生。$monitoron用于翻開監(jiān)控任務(wù);$monitoroff用于關(guān)閉監(jiān)控任務(wù);通常調(diào)用$monitoron來啟動$monitor時,不管$monitor參數(shù)列表中的值是否發(fā)生變化,總是立刻輸出顯示當(dāng)前時刻參數(shù)列表中的值,這樣可以在監(jiān)控的初始時刻設(shè)定初始比較值。39.2時間度量系統(tǒng)函數(shù)$timeVerilog中具有兩種類型的時間系統(tǒng)函數(shù),$time$realtime$time$time可以返回一個以64位的整數(shù)來表示當(dāng)前的仿真時刻值。該時刻是以模塊的仿真時間尺度為基準(zhǔn)的。$realtime$realtime與$time的作用是一樣的,只是$realtime返回的時間數(shù)字是一個實(shí)型數(shù),該數(shù)字也是以時間尺度為基準(zhǔn)的。4例9-1‘timescale10ns/1nsmoduletest;regset;parameterp=1.6;initialbegin$monitor($time,,“set=〞,set);#pset=0;#pset=1;endendmodule5例9-1運(yùn)行過程及結(jié)果tryitnow6例9-2‘timescale10ns/1nsmoduletest;regset;parameterp=1.55;initialbegin$monitor($realtime,,“set=〞,set〕;#pset=0;#pset=1;endendmodule7例9-2運(yùn)行過程及結(jié)果tryitnow89.3編譯預(yù)處理語句一、‵define語句二、‵include語句三、‵timescale語句四、`ifdef、`else、`endif語句內(nèi)容概要99.3編譯預(yù)處理語句一、‵define語句宏定義語句——用一個指定的標(biāo)志符〔即宏名〕來代表一個字符串〔即宏內(nèi)容〕。‵define標(biāo)志符〔即宏名〕字符串〔即宏內(nèi)容〕[例]‵defineINina+inb+inc+ind宏展開——在編譯預(yù)處理時將宏名替換為字符串的過程?!熬幾g預(yù)處理〞是VerilogHDL編譯系統(tǒng)的一個組成局部。編譯預(yù)處理語句以西文符號“‵〞開頭——注意,不是單引號“’〞!在編譯時,編譯系統(tǒng)先對編譯預(yù)處理語句進(jìn)行預(yù)處理,然后將處理結(jié)果和源程序一起進(jìn)行編譯。格式109.3編譯預(yù)處理語句宏名可以用大寫字母,也可用小寫字母表示;但建議用大寫字母,以與變量名相區(qū)別。‵define語句可以寫在模塊定義的外面或里面。宏名的有效范圍為定義命令之后到源文件結(jié)束。在引用已定義的宏名時,必須在其前面加上符號“‵〞!使用宏名代替一個字符串,可簡化書寫,便于記憶,易于修改。預(yù)處理時只是將程序中的宏名替換為字符串,不管含義是否正確。只有在編譯宏展開后的源程序時才報(bào)錯。宏名和宏內(nèi)容必須在同一行中進(jìn)行聲明!關(guān)于宏定義的說明宏定義的作用:以一個簡單的名字代替一個長的字符串或復(fù)雜表達(dá)式;以一個有含義的名字代替沒有含義的數(shù)字和符號。119.3編譯預(yù)處理語句[例]moduletest;rega,b,c,d,e,out;‵defineexpressiona+b+c+d;assignout=‵expression+e;……經(jīng)過宏展開后,assign語句為:
assignout=a+b+c+d;+e;//出現(xiàn)語法錯誤!宏定義不是VerilogHDL語句,不必在行末加分號!如果加了分號,會連分號一起置換!錯誤!129.3編譯預(yù)處理語句[例]moduletest;rega,b,c;wireout;‵defineaaa+b
‵defineccc+‵aa//引用已定義的宏名‵aa來定義宏ccassignout=‵cc;……經(jīng)過宏展開后,assign語句為:
assignout=c+a+b;在進(jìn)行宏定義時,可引用已定義的宏名,實(shí)現(xiàn)層層置換。139.3編譯預(yù)處理語句二、‵include語句文件包含語句——一個源文件可將另一個源文件的全部內(nèi)容包含進(jìn)來。‵include“文件名〞預(yù)處理后‵include“file2.v”Afile1.vBfile2.vABfile1.vMAX+PLUSII和QuartusⅡ都不支持!通常用在測試文件中。將file2.v中全部內(nèi)容復(fù)制插入到‵include“file2.v〞命令出現(xiàn)的地方格式149.3編譯預(yù)處理語句防止程序設(shè)計(jì)人員的重復(fù)勞動!不必將源代碼復(fù)制到自己的另一源文件中,使源文件顯得簡潔?!?〕可以將一些常用的宏定義命令或任務(wù)〔task〕組成一個文件,然后用‵include語句將該文件包含到自己的另一源文件中,相當(dāng)于將工業(yè)上的標(biāo)準(zhǔn)元件拿來使用?!?〕當(dāng)某幾個源文件經(jīng)常需要被其他源文件調(diào)用時,那么在其他源文件中用‵include語句將所需源文件包含進(jìn)來。使用‵include語句的好處159.3編譯預(yù)處理語句[例]用‵include語句設(shè)計(jì)16位加法器adder模塊位拼接改變被引用模塊adder中的參數(shù)size為my_size169.3編譯預(yù)處理語句一個‵include語句只能指定一個被包含的文件;假設(shè)要包含n個文件,需用n個‵include語句。‵include語句可出現(xiàn)在源程序的任何地方。被包含的文件假設(shè)與包含文件不在同一子目錄下,必須指明其路徑!‵include“aaa.v〞“bbb.v〞//非法!‵include“parts/count.v〞//合法!關(guān)于文件包含的說明‵include“aaa.v〞‵include“bbb.v〞//合法!179.3編譯預(yù)處理語句可將多個‵include語句寫在一行;在該行中,只可出現(xiàn)空格和注釋行。文件包含允許嵌套。‵include“aaa.v〞‵include“bbb.v〞//合法!‵include“file2.v”………………file1.v‵include“file3.v”………………file2.v(不包含‵include命令)………………file3.v189.3編譯預(yù)處理語句三、‵timescale語句時間尺度語句——用于定義跟在該命令后模塊的時間單位和時間精度。‵timescale<時間單位>/<時間精度>時間單位——用于定義模塊中仿真時間和延遲時間的基準(zhǔn)單位;時間精度——用來聲明該模塊的仿真時間和延遲時間的精確程度。在同一程序設(shè)計(jì)里,可以包含采用不同時間單位的模塊。此時用最小的時間精度值決定仿真的時間單位。格式MAX+PLUSII和QuartusⅡ都不支持!通常用在測試文件中。199.3編譯預(yù)處理語句‵timescale1ps/1ns//非法!‵timescale1ns/1ps//合法!時間精度至少要和時間單位一樣精確,時間精度值不能大于時間單位值!在‵timescale語句中,用來說明時間單位和時間精度參量值的數(shù)字必須是整數(shù)。其有效數(shù)字為1、10、100;單位為秒〔s〕、毫秒〔ms〕、微秒〔us〕、納秒〔ns〕、皮秒〔ps〕、毫皮秒〔fs〕。209.3編譯預(yù)處理語句[例]‵timescale語句應(yīng)用舉例。‵timescale10ns/1ns//時間單位為10ns,時間精度為1ns……regsel;
initialbegin#10sel=0;//在10ns
10時刻,sel變量被賦值為0#10sel=1;//在10ns
20時刻,sel變量被賦值為1end……219.4條件編譯命令`ifdef、`else、`endif一般情況下,Veirlog源程序中的所有的行都將參加編譯有時希望對其中的一局部內(nèi)容只有在滿足一定條件時才進(jìn)行編譯,也就是對一局部內(nèi)容指定編譯條件,這就是“條件編譯〞有時希望當(dāng)滿足條件時對一組語句進(jìn)行編譯,而當(dāng)條件不滿足時那么編譯另一局部通常在Verilog程序中用到`ifdef、`else、`endif編譯命令的情況選擇一個模塊的不同代表局部選擇不同的時序或結(jié)構(gòu)信息對不同的EDA工具,選擇不同的鼓勵。229.4條件編譯命令`ifdef、`else、`endif`ifdef宏名〔標(biāo)識符〕;程序段1`else程序段2`endif`ifdef宏名〔標(biāo)識符〕;程序段1`endif239.5小結(jié)在多模塊調(diào)試的情況下,$monitor需配合$monitoron與$monitoroff$monitor與$display的不同在于$monitor是連續(xù)監(jiān)視數(shù)據(jù)的變化$time常用在$monitor中,用來做時間標(biāo)記$stop和$finish常用在測試模塊中的initial模塊中,配合時間延遲用來控制仿真波形的持續(xù)時間$random在編寫測試程序是非常有用的,可以用來產(chǎn)生邊沿不穩(wěn)定的波形,和隨機(jī)出現(xiàn)的脈沖$readmem在編寫測試程序也是非常有用的,可以用來生成給定的復(fù)雜數(shù)據(jù)流在用`timesacle時需注意,當(dāng)多個帶不同`timescale定義的模塊包含在一起時只有最后一個才起作用宏定義字符串引用時,不要忘記,要用“`〞引導(dǎo)。這點(diǎn)與C語言不同include等編譯預(yù)處理也必須用“`〞引導(dǎo),而不是與C語言一樣用“#〞引導(dǎo)或不需要引導(dǎo)符。24第10章編程本卷須知源代碼編寫標(biāo)準(zhǔn)不同抽象級別Verilog描述設(shè)計(jì)根本技巧2510.1VerilogHDL源代碼標(biāo)準(zhǔn)編寫VerilogHDL源代碼的標(biāo)準(zhǔn)編寫VerilogHDL源代碼的標(biāo)準(zhǔn)分為兩類:〔1〕語匯代碼的編寫標(biāo)準(zhǔn)規(guī)定了文本布局、命名和注釋的約定,以提高源代碼的可讀性和可維護(hù)性?!?〕綜合代碼的編寫標(biāo)準(zhǔn)規(guī)定了Verilog風(fēng)格,盡量保證能夠綜合,以防止常見的不能綜合及綜合結(jié)果存在缺陷的問題,并在設(shè)計(jì)流程中及時發(fā)現(xiàn)綜合中存在的錯誤。綜合:將用HDL語言或圖形方式描述的電路設(shè)計(jì)轉(zhuǎn)換為實(shí)際門級電路〔如觸發(fā)器、邏輯門等〕,得到一個網(wǎng)表文件,用于進(jìn)行適配〔在實(shí)際器件中進(jìn)行布局和布線〕。2610.1VerilogHDL源代碼標(biāo)準(zhǔn)〔1〕每個VerilogHDL源文件中只準(zhǔn)編寫一個頂層模塊,也不能把一個頂層模塊分成幾局部寫在幾個源文件中?!?〕源文件名字應(yīng)與文件內(nèi)容有關(guān),最好與頂層模塊同名!源文件名字的第一個字符必須是字母或下劃線,不能是數(shù)字或$符號!〔3〕每行只寫一個聲明語句或說明。〔4〕源代碼用層層縮進(jìn)的格式來寫。1語匯代碼的編寫標(biāo)準(zhǔn)2710.1VerilogHDL源代碼標(biāo)準(zhǔn)〔5〕定義變量名的大小寫應(yīng)自始至終保持一致〔如變量名第一個字母均大寫〕?!?〕變量名應(yīng)該有意義,而且含有一定的有關(guān)信息。局部變量名〔如循環(huán)變量〕應(yīng)簡單扼要?!?〕通過注釋對源代碼做必要的說明,尤其對接口〔如模塊參數(shù)、端口、任務(wù)、函數(shù)變量〕做必要的注釋很重要。〔8〕常量盡可能多地使用參數(shù)定義和宏定義,而不要在語句中直接使用字母、數(shù)字和字符串。參數(shù)定義〔用一個標(biāo)識符來代表一個常量〕的格式:parameter參數(shù)名1=表達(dá)式,參數(shù)名2=表達(dá)式,……;宏定義〔用一個簡單的宏名來代替一個復(fù)雜的表達(dá)式〕的格式:’define標(biāo)志符〔即宏名〕字符串〔即宏內(nèi)容〕1語匯代碼的編寫標(biāo)準(zhǔn)〔續(xù)〕2810.1VerilogHDL源代碼標(biāo)準(zhǔn)〔1〕把設(shè)計(jì)分割成較小的功能塊,每塊用行為風(fēng)格設(shè)計(jì)。除設(shè)計(jì)中對速度響應(yīng)要求比較臨界的局部外,都應(yīng)防止門級描述?!?〕建立一個好的時鐘策略〔如單時鐘、多相位時鐘,經(jīng)過門產(chǎn)生的時鐘、多時鐘域等〕。保證源代碼中時鐘和復(fù)位信號是干凈的〔即不是由組合邏輯或沒有考慮到的門產(chǎn)生的〕?!?〕建立一個好的測試策略,使所有觸發(fā)器都是可復(fù)位的,使測試能通過外部管腳進(jìn)行,又沒有冗余的功能?!?〕所有源代碼都必須遵守并符合在always塊語句的4種可綜合標(biāo)準(zhǔn)模板之一。〔5〕描述組合和鎖存邏輯的always塊,必須在always塊開頭的控制事件列表中列出所有的輸入信號。2
綜合代碼的編寫標(biāo)準(zhǔn)always塊語句模板2910.1VerilogHDL源代碼標(biāo)準(zhǔn)〔6〕描述組合邏輯的always塊,一定不能有不完全賦值,即所有輸出變量必須被各輸入值的組合值賦值,不能有例外?!?〕描述組合和鎖存邏輯的always塊一定不能包含反響,即在always塊中已被定義為輸出的存放器變量絕對不能再在該always塊中讀進(jìn)來作為輸入信號?!?〕時鐘沿觸發(fā)的always塊必須是單時鐘的,且任何異步控制輸入〔通常是復(fù)位或置位信號〕必須在控制事件列表中列出。例:always@(posedgeclkornegedgesetornegedgereset)〔9〕防止生成不想要的鎖存器。在無時鐘的always塊中,假設(shè)有的輸出變量被賦了某個信號變量值,而該信號變量并未在該always塊的電平敏感控制事件中列出,那么會在綜合中生成不想要的鎖存器。2綜合代碼的編寫標(biāo)準(zhǔn)〔續(xù)1〕3010.1VerilogHDL源代碼標(biāo)準(zhǔn)〔10〕防止生成不想要的觸發(fā)器。在時鐘沿觸發(fā)的always塊中,如果用非阻塞賦值語句對reg型變量賦值;或者當(dāng)reg型變量經(jīng)過屢次循環(huán)其值仍保持不變,那么會在綜合中生成觸發(fā)器。用reg型變量生成觸發(fā)器舉例: modulerw2(clk,d,out1); inputclk,d;outputout1; regout1; always@(posedgeclk)//沿觸發(fā)out1<=d; endmodule 2綜合代碼的編寫標(biāo)準(zhǔn)〔續(xù)2〕非阻塞賦值語句dclkout1DQDFF3110.1VerilogHDL源代碼標(biāo)準(zhǔn)假設(shè)不想生成觸發(fā)器,而是希望用reg型變量生成組合邏輯,那么應(yīng)使用電平觸發(fā):modulerw2(clk,d,out1);inputclk,d;outputout1;regout1;always@(d)//電平觸發(fā)out1<=d;endmodule
2綜合代碼的編寫標(biāo)準(zhǔn)〔續(xù)3〕dout1BUFF3210.1VerilogHDL源代碼標(biāo)準(zhǔn)〔11〕所有內(nèi)部狀態(tài)存放器必須是可復(fù)位的,這是為了使RTL級和門級描述能夠被復(fù)位成同一個的狀態(tài),以便進(jìn)行門級邏輯驗(yàn)證?!?2〕對存在無效狀態(tài)的有限狀態(tài)機(jī)和其他時序電路〔如4位十進(jìn)制計(jì)數(shù)器有6個無效狀態(tài)〕,必須明確描述所有的2的N次冪種狀態(tài)下的行為〔包括無效狀態(tài)〕,才能綜合出平安可靠的狀態(tài)機(jī)?!?3〕一般地,在賦值語句中不能使用延遲,否那么是不可綜合的?!?4〕不要使用integer型和time型存放器,否那么將分別綜合成32位和64位的總線?!?5〕仔細(xì)檢查代碼中使用動態(tài)指針〔如用指針或地址變量檢索的位選擇或存儲單元〕、循環(huán)聲明或算術(shù)運(yùn)算局部,因?yàn)檫@類代碼在綜合后會生成大量的門,且難以優(yōu)化。2綜合代碼的編寫標(biāo)準(zhǔn)〔續(xù)4〕3310.2不同抽象級別的VerilogHDL模型一、VerilogHDL的門級描述二、VerilogHDL的行為級描述內(nèi)容概要3410.2不同抽象級別的VerilogHDL模型一個復(fù)雜電路的完整VerilogHDL模型由假設(shè)干個VerilogHDL模塊構(gòu)成,每個模塊由假設(shè)干的子模塊構(gòu)成——可分別用不同抽象級別的VerilogHDL描述。在同一個VerilogHDL模塊中可有多種級別的描述。系統(tǒng)級(systemlevel):用高級語言結(jié)構(gòu)〔如case語句〕實(shí)現(xiàn)的設(shè)計(jì)模塊外部性能的模型;算法級(algorithmiclevel):用高級語言結(jié)構(gòu)實(shí)現(xiàn)的設(shè)計(jì)算法模型〔寫出邏輯表達(dá)式〕;RTL級(registertransferlevel):描述數(shù)據(jù)在存放器之間流動和如何處理這些數(shù)據(jù)的模型;門級(gatelevel):描述邏輯門〔如與門、非門、或門、與非門、三態(tài)門等〕以及邏輯門之間連接的模型;開關(guān)級(switchlevel):描述器件中三極管和儲存節(jié)點(diǎn)及其之間連接的模型。3510.2不同抽象級別的VerilogHDL模型一、VerilogHDL的門級描述門類型關(guān)鍵字<例化的門名稱>(<端口列表>);門級描述即直接調(diào)用門原語進(jìn)行邏輯的結(jié)構(gòu)描述。以門級為根底的結(jié)構(gòu)描述所建立的硬件模型不僅是可仿真的,也是可綜合的;一個邏輯網(wǎng)絡(luò)由許多邏輯門和開關(guān)組成,用邏輯門的模型來描述邏輯網(wǎng)絡(luò)最直觀!門類型的關(guān)鍵字有26個,常用的有9個:not,and,nand,or,nor,xor,xnor,buf,bufif1,bufif0,notif1,notif0〔各種三態(tài)門〕調(diào)用門原語的句法:注1:在
端口列表中輸出信號列在最前面;注2:門級描述不適于描述復(fù)雜的系統(tǒng)!結(jié)構(gòu)描述,最直觀!可省略!
36
10.2不同抽象級別的VerilogHDL模型[例]調(diào)用門原語實(shí)現(xiàn)4選1數(shù)據(jù)選擇器注:首先必須根據(jù)邏輯功能畫出邏輯電路圖!輸入輸出cntrl1cntrl2out00011011in1in2in3in4真值表37
10.2不同抽象級別的VerilogHDL模型注:這里省略了所有的例化門元件名稱!38
10.2不同抽象級別的VerilogHDL模型二、VerilogHDL的行為級描述包括系統(tǒng)級,算法級,RTL級1.邏輯功能描述——算法級注:首先必須根據(jù)邏輯功能寫出邏輯表達(dá)式![例]用邏輯表達(dá)式實(shí)現(xiàn)4選1數(shù)據(jù)選擇器modulemux4_1(out,in1,in2,in3,in4,cntrl1,cntrl2);outputout;inputin1,in2,in3,in4,cntrl1,cntrl2;assignout=(in1&~cntrl1&~cntrl2)|(in2&~cntrl1&cntrl2)|(in3&cntrl1&~cntrl2)|(in4&cntrl1&cntrl2);endmodule39
10.2不同抽象級別的VerilogHDL模型2.case語句描述——系統(tǒng)級——只需知道輸入與輸出間的真值表!比調(diào)用門原語和采用邏輯功能描述都簡潔![例]用case語句描述4選1數(shù)據(jù)選擇器modulemux4_1(out,in1,in2,in3,in4,cntrl1,cntrl2);outputout;inputin1,in2,in3,in4,cntrl1,cntrl2;
regout;always@(in1orin2orin3orin4orcntrl1orcntrl2)
case({cntrl1,cntrl2})2’b00:out=in1;2’b01:out=in2;2’b10:out=in3;2’b11:out=in4;default:out=1’bx;
endcaseendmodulecase語句應(yīng)放在always塊內(nèi)!40
10.2不同抽象級別的VerilogHDL模型3.條件運(yùn)算符描述——算法級——只需知道輸入與輸出間的真值表!注:比調(diào)用門原語,采用邏輯表達(dá)式或case語句描述代碼更簡單!但也更抽象!且耗用器件資源更多![例]用條件運(yùn)算符描述4選1數(shù)據(jù)選擇器modulemux4_1(out,in1,in2,in3,in4,cntrl1,cntrl2);outputout;inputin1,in2,in3,in4,cntrl1,cntrl2;
assignout=cntrl1?(cntrl2?in4:in3):(cntrl2?in2:in1);endmodule當(dāng)cntrl1=1時執(zhí)行當(dāng)cntrl1=0時執(zhí)行41
10.2不同抽象級別的VerilogHDL模型采用的描述級別越高,設(shè)計(jì)越容易,程序代碼越簡單;但耗用器件資源更多。對特定綜合器,可能無法將某些抽象級別高的描述轉(zhuǎn)化為電路!基于門級描述的硬件模型不僅可以仿真,而且可綜合,且系統(tǒng)速度快。所有VerilogHDL編譯軟件只是支持該語言的一個子集。盡量采用編譯軟件支持的語句來描述設(shè)計(jì);或多個軟件配合使用。一般用算法級〔寫出邏輯表達(dá)式〕或RTL級來描述邏輯功能,盡量防止用門級描述,除非對系統(tǒng)速度要求比較高的場合才采用門級描述。小結(jié)42
10.2不同抽象級別的VerilogHDL模型〔1〕采用什么描述級別更適宜?系統(tǒng)級描述太抽象,有時無法綜合成具體的物理電路;門級描述要求根據(jù)邏輯功能畫出邏輯電路圖,對于復(fù)雜的數(shù)字系統(tǒng)很難做到;而算法級和RTL級描述級別適中,代碼不是很復(fù)雜,且一般容易綜合成具體的物理電路,故建議盡量采用算法級和RTL級來描述?!?〕怎樣減少器件邏輯資源的耗用?當(dāng)器件容量有限時,為減少器件邏輯資源的耗用,建議少用if-else語句和case語句,盡量直接使用邏輯表達(dá)式來描述系統(tǒng)的邏輯功能;或者用case語句取代if-else語句。思考4310.2不同抽象級別的VerilogHDL模型建議:〔1〕在進(jìn)行設(shè)計(jì)前,一定要仔細(xì)分析并熟悉所需設(shè)計(jì)電路或系統(tǒng)的整個工作過程;合理劃分功能模塊;并弄清每個模塊輸入和輸出間的邏輯關(guān)系!〔2〕在調(diào)試過程中,仔細(xì)閱讀并理解錯誤信息,隨時查閱教材和課件上有關(guān)語法,糾正語法錯誤。4410.3設(shè)計(jì)技巧1.一個變量不能在多個always塊中被賦值!這個問題一定要注意!否那么編譯不能通過。[例]帶異步清零、異步置位的D觸發(fā)器注:當(dāng)某個變量有多個觸發(fā)條件時,最好將它們放在一個always塊中,并用if-else語句描述在不同觸發(fā)條件下應(yīng)執(zhí)行的操作!正確的寫法4510.3設(shè)計(jì)技巧錯誤的寫法注:這里q和qn在兩個always塊中都被賦值!因?yàn)閍lways塊之間是并行操作,造成某些語句可能是互相矛盾的,所以編譯器無所適從,只能報(bào)錯!4610.3設(shè)計(jì)技巧2.在always塊語句中,當(dāng)敏感信號為兩個以上的時鐘邊沿觸發(fā)信號時,應(yīng)注意不要使用多個if語句!以免因邏輯關(guān)系描述不清晰而導(dǎo)致編譯錯誤。[例]在數(shù)碼管掃描顯示電路中,設(shè)計(jì)一個中間變量,將脈沖信號start轉(zhuǎn)變?yōu)殡娖叫盘杄nable。always@(posedgestartorposedgereset)if(reset)enable<=0;if(start)enable<=1;編譯后出現(xiàn)了多條警告信息,指明在語句always@(posedgestartorposedgereset)中,變量enable不能被分配新的值!錯誤的寫法4710.3設(shè)計(jì)技巧其仿真波形如下:
注:由于在最初一段,start和reset均為0,導(dǎo)致enable為不定態(tài),那么scan_data開始加1計(jì)數(shù)〔正確情況應(yīng)是在按下start時scan_data才開始加1計(jì)數(shù)〕。當(dāng)start和reset同時為1時,enable=1,那么scan_data開始加1計(jì)數(shù)。4810.3設(shè)計(jì)技巧語句“elseenable<=1;〞隱含了reset無效、且start有效的意思,因此與elseif(start)enable<=1;效果一樣!正確的仿真波形如下:always@(posedgestartorposedgereset)if(reset)enable<=0;
elseenable<=1;注:可見在最初一段,當(dāng)start和reset均為0時,enable被認(rèn)為初值為0,那么scan_data不計(jì)數(shù),保持初值為0;一旦start有效時,那么scan_data才開始加1計(jì)數(shù)。當(dāng)start和reset同時為1時,先執(zhí)行的是“if(reset)enable<=0;〞,故enable仍為0,那么scan_data保持原值0。正確的寫法4910.3設(shè)計(jì)技巧3.當(dāng)輸出信號為總線信號時,一定要在I/O說明中指明其位寬!否那么在生成邏輯符號時,輸出信號被誤認(rèn)為是單個信號,而沒有標(biāo)明位寬,就不會當(dāng)成總線信號。[例]聲明一個位寬為5的輸出信號
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《肺特殊CT征象》課件
- 《電能計(jì)量技術(shù)》課件
- 《家具的加工工藝》課件
- 第19課 七七事變與全民族抗戰(zhàn)(解析版)
- 《衛(wèi)生經(jīng)濟(jì)管理系統(tǒng)》課件
- 寒假自習(xí)課 25春初中道德與法治八年級下冊教學(xué)課件 第一單元 大單元整體設(shè)計(jì)
- 銀行宣傳推廣總結(jié)
- 《皮膚生理學(xué)》課件
- 素描藝術(shù)探索
- 風(fēng)險監(jiān)測與追蹤培訓(xùn)
- 服裝廠班組長培訓(xùn)
- 浙江省杭州二中2025屆物理高三第一學(xué)期期末聯(lián)考試題含解析
- 帶貨主播年終總結(jié)匯報(bào)
- 《激光原理及應(yīng)用》全套課件
- 2024中國綠發(fā)投資集團(tuán)限公司招聘300人高頻難、易錯點(diǎn)練習(xí)500題附帶答案詳解
- 消化系統(tǒng)護(hù)理常規(guī)
- 2024年航空職業(yè)技能鑒定考試-航空乘務(wù)員危險品考試近5年真題附答案
- 小流域水土保持綜合治理工程施工方案
- 佳能-6D-相機(jī)說明書
- 商業(yè)道德和反腐敗制度
- 2025屆新高考英語熱點(diǎn)沖刺復(fù)習(xí)語法填空
評論
0/150
提交評論