EDA技術(shù)教程新內(nèi)容_第1頁
EDA技術(shù)教程新內(nèi)容_第2頁
EDA技術(shù)教程新內(nèi)容_第3頁
EDA技術(shù)教程新內(nèi)容_第4頁
EDA技術(shù)教程新內(nèi)容_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(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)啟動(dòng)一個(gè)帶有一個(gè)或多個(gè)參數(shù)的$monitor任務(wù)時(shí),仿真器那么建立一個(gè)處理機(jī)制,使得當(dāng)參數(shù)列表中的變量或表達(dá)式的值發(fā)生變化時(shí),整個(gè)參數(shù)列表中的變量或表達(dá)式的值都將輸出顯示。29.1系統(tǒng)任務(wù)如果同一時(shí)刻,兩個(gè)或多個(gè)參數(shù)的值發(fā)生變化,那么在該時(shí)刻只輸出顯示一次。$monitoron和$monitoroff這兩個(gè)任務(wù)的作用是通過翻開和關(guān)閉監(jiān)控標(biāo)志來控制、監(jiān)控任務(wù)$monitor的啟動(dòng)和停止,便于程序員控制$monitor何時(shí)發(fā)生。$monitoron用于翻開監(jiān)控任務(wù);$monitoroff用于關(guān)閉監(jiān)控任務(wù);通常調(diào)用$monitoron來啟動(dòng)$monitor時(shí),不管$monitor參數(shù)列表中的值是否發(fā)生變化,總是立刻輸出顯示當(dāng)前時(shí)刻參數(shù)列表中的值,這樣可以在監(jiān)控的初始時(shí)刻設(shè)定初始比較值。39.2時(shí)間度量系統(tǒng)函數(shù)$timeVerilog中具有兩種類型的時(shí)間系統(tǒng)函數(shù),$time$realtime$time$time可以返回一個(gè)以64位的整數(shù)來表示當(dāng)前的仿真時(shí)刻值。該時(shí)刻是以模塊的仿真時(shí)間尺度為基準(zhǔn)的。$realtime$realtime與$time的作用是一樣的,只是$realtime返回的時(shí)間數(shù)字是一個(gè)實(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語句宏定義語句——用一個(gè)指定的標(biāo)志符〔即宏名〕來代表一個(gè)字符串〔即宏內(nèi)容〕。‵define標(biāo)志符〔即宏名〕字符串〔即宏內(nèi)容〕[例]‵defineINina+inb+inc+ind宏展開——在編譯預(yù)處理時(shí)將宏名替換為字符串的過程?!熬幾g預(yù)處理〞是VerilogHDL編譯系統(tǒng)的一個(gè)組成局部。編譯預(yù)處理語句以西文符號(hào)“‵〞開頭——注意,不是單引號(hào)“’〞!在編譯時(shí),編譯系統(tǒng)先對(duì)編譯預(yù)處理語句進(jìn)行預(yù)處理,然后將處理結(jié)果和源程序一起進(jìn)行編譯。格式109.3編譯預(yù)處理語句宏名可以用大寫字母,也可用小寫字母表示;但建議用大寫字母,以與變量名相區(qū)別。‵define語句可以寫在模塊定義的外面或里面。宏名的有效范圍為定義命令之后到源文件結(jié)束。在引用已定義的宏名時(shí),必須在其前面加上符號(hào)“‵〞!使用宏名代替一個(gè)字符串,可簡化書寫,便于記憶,易于修改。預(yù)處理時(shí)只是將程序中的宏名替換為字符串,不管含義是否正確。只有在編譯宏展開后的源程序時(shí)才報(bào)錯(cuò)。宏名和宏內(nèi)容必須在同一行中進(jìn)行聲明!關(guān)于宏定義的說明宏定義的作用:以一個(gè)簡單的名字代替一個(gè)長的字符串或復(fù)雜表達(dá)式;以一個(gè)有含義的名字代替沒有含義的數(shù)字和符號(hào)。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)語法錯(cuò)誤!宏定義不是VerilogHDL語句,不必在行末加分號(hào)!如果加了分號(hào),會(huì)連分號(hào)一起置換!錯(cuò)誤!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í),可引用已定義的宏名,實(shí)現(xiàn)層層置換。139.3編譯預(yù)處理語句二、‵include語句文件包含語句——一個(gè)源文件可將另一個(gè)源文件的全部內(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ù)勞動(dòng)!不必將源代碼復(fù)制到自己的另一源文件中,使源文件顯得簡潔?!?〕可以將一些常用的宏定義命令或任務(wù)〔task〕組成一個(gè)文件,然后用‵include語句將該文件包含到自己的另一源文件中,相當(dāng)于將工業(yè)上的標(biāo)準(zhǔn)元件拿來使用。〔2〕當(dāng)某幾個(gè)源文件經(jīng)常需要被其他源文件調(diào)用時(shí),那么在其他源文件中用‵include語句將所需源文件包含進(jìn)來。使用‵include語句的好處159.3編譯預(yù)處理語句[例]用‵include語句設(shè)計(jì)16位加法器adder模塊位拼接改變被引用模塊adder中的參數(shù)size為my_size169.3編譯預(yù)處理語句一個(gè)‵include語句只能指定一個(gè)被包含的文件;假設(shè)要包含n個(gè)文件,需用n個(gè)‵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ù)處理語句可將多個(gè)‵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語句時(shí)間尺度語句——用于定義跟在該命令后模塊的時(shí)間單位和時(shí)間精度。‵timescale<時(shí)間單位>/<時(shí)間精度>時(shí)間單位——用于定義模塊中仿真時(shí)間和延遲時(shí)間的基準(zhǔn)單位;時(shí)間精度——用來聲明該模塊的仿真時(shí)間和延遲時(shí)間的精確程度。在同一程序設(shè)計(jì)里,可以包含采用不同時(shí)間單位的模塊。此時(shí)用最小的時(shí)間精度值決定仿真的時(shí)間單位。格式MAX+PLUSII和QuartusⅡ都不支持!通常用在測試文件中。199.3編譯預(yù)處理語句‵timescale1ps/1ns//非法!‵timescale1ns/1ps//合法!時(shí)間精度至少要和時(shí)間單位一樣精確,時(shí)間精度值不能大于時(shí)間單位值!在‵timescale語句中,用來說明時(shí)間單位和時(shí)間精度參量值的數(shù)字必須是整數(shù)。其有效數(shù)字為1、10、100;單位為秒〔s〕、毫秒〔ms〕、微秒〔us〕、納秒〔ns〕、皮秒〔ps〕、毫皮秒〔fs〕。209.3編譯預(yù)處理語句[例]‵timescale語句應(yīng)用舉例。‵timescale10ns/1ns//時(shí)間單位為10ns,時(shí)間精度為1ns……regsel;

initialbegin#10sel=0;//在10ns

10時(shí)刻,sel變量被賦值為0#10sel=1;//在10ns

20時(shí)刻,sel變量被賦值為1end……219.4條件編譯命令`ifdef、`else、`endif一般情況下,Veirlog源程序中的所有的行都將參加編譯有時(shí)希望對(duì)其中的一局部內(nèi)容只有在滿足一定條件時(shí)才進(jìn)行編譯,也就是對(duì)一局部內(nèi)容指定編譯條件,這就是“條件編譯〞有時(shí)希望當(dāng)滿足條件時(shí)對(duì)一組語句進(jìn)行編譯,而當(dāng)條件不滿足時(shí)那么編譯另一局部通常在Verilog程序中用到`ifdef、`else、`endif編譯命令的情況選擇一個(gè)模塊的不同代表局部選擇不同的時(shí)序或結(jié)構(gòu)信息對(duì)不同的EDA工具,選擇不同的鼓勵(lì)。229.4條件編譯命令`ifdef、`else、`endif`ifdef宏名〔標(biāo)識(shí)符〕;程序段1`else程序段2`endif`ifdef宏名〔標(biāo)識(shí)符〕;程序段1`endif239.5小結(jié)在多模塊調(diào)試的情況下,$monitor需配合$monitoron與$monitoroff$monitor與$display的不同在于$monitor是連續(xù)監(jiān)視數(shù)據(jù)的變化$time常用在$monitor中,用來做時(shí)間標(biāo)記$stop和$finish常用在測試模塊中的initial模塊中,配合時(shí)間延遲用來控制仿真波形的持續(xù)時(shí)間$random在編寫測試程序是非常有用的,可以用來產(chǎn)生邊沿不穩(wěn)定的波形,和隨機(jī)出現(xiàn)的脈沖$readmem在編寫測試程序也是非常有用的,可以用來生成給定的復(fù)雜數(shù)據(jù)流在用`timesacle時(shí)需注意,當(dāng)多個(gè)帶不同`timescale定義的模塊包含在一起時(shí)只有最后一個(gè)才起作用宏定義字符串引用時(shí),不要忘記,要用“`〞引導(dǎo)。這點(diǎn)與C語言不同include等編譯預(yù)處理也必須用“`〞引導(dǎo),而不是與C語言一樣用“#〞引導(dǎo)或不需要引導(dǎo)符。24第10章編程本卷須知源代碼編寫標(biāo)準(zhǔn)不同抽象級(jí)別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ì)流程中及時(shí)發(fā)現(xiàn)綜合中存在的錯(cuò)誤。綜合:將用HDL語言或圖形方式描述的電路設(shè)計(jì)轉(zhuǎn)換為實(shí)際門級(jí)電路〔如觸發(fā)器、邏輯門等〕,得到一個(gè)網(wǎng)表文件,用于進(jìn)行適配〔在實(shí)際器件中進(jìn)行布局和布線〕。2610.1VerilogHDL源代碼標(biāo)準(zhǔn)〔1〕每個(gè)VerilogHDL源文件中只準(zhǔn)編寫一個(gè)頂層模塊,也不能把一個(gè)頂層模塊分成幾局部寫在幾個(gè)源文件中。〔2〕源文件名字應(yīng)與文件內(nèi)容有關(guān),最好與頂層模塊同名!源文件名字的第一個(gè)字符必須是字母或下劃線,不能是數(shù)字或$符號(hào)!〔3〕每行只寫一個(gè)聲明語句或說明?!?〕源代碼用層層縮進(jìn)的格式來寫。1語匯代碼的編寫標(biāo)準(zhǔn)2710.1VerilogHDL源代碼標(biāo)準(zhǔn)〔5〕定義變量名的大小寫應(yīng)自始至終保持一致〔如變量名第一個(gè)字母均大寫〕?!?〕變量名應(yīng)該有意義,而且含有一定的有關(guān)信息。局部變量名〔如循環(huán)變量〕應(yīng)簡單扼要。〔7〕通過注釋對(duì)源代碼做必要的說明,尤其對(duì)接口〔如模塊參數(shù)、端口、任務(wù)、函數(shù)變量〕做必要的注釋很重要。〔8〕常量盡可能多地使用參數(shù)定義和宏定義,而不要在語句中直接使用字母、數(shù)字和字符串。參數(shù)定義〔用一個(gè)標(biāo)識(shí)符來代表一個(gè)常量〕的格式:parameter參數(shù)名1=表達(dá)式,參數(shù)名2=表達(dá)式,……;宏定義〔用一個(gè)簡單的宏名來代替一個(gè)復(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ì)中對(duì)速度響應(yīng)要求比較臨界的局部外,都應(yīng)防止門級(jí)描述?!?〕建立一個(gè)好的時(shí)鐘策略〔如單時(shí)鐘、多相位時(shí)鐘,經(jīng)過門產(chǎn)生的時(shí)鐘、多時(shí)鐘域等〕。保證源代碼中時(shí)鐘和復(fù)位信號(hào)是干凈的〔即不是由組合邏輯或沒有考慮到的門產(chǎn)生的〕?!?〕建立一個(gè)好的測試策略,使所有觸發(fā)器都是可復(fù)位的,使測試能通過外部管腳進(jìn)行,又沒有冗余的功能?!?〕所有源代碼都必須遵守并符合在always塊語句的4種可綜合標(biāo)準(zhǔn)模板之一?!?〕描述組合和鎖存邏輯的always塊,必須在always塊開頭的控制事件列表中列出所有的輸入信號(hào)。2

綜合代碼的編寫標(biāo)準(zhǔn)always塊語句模板2910.1VerilogHDL源代碼標(biāo)準(zhǔn)〔6〕描述組合邏輯的always塊,一定不能有不完全賦值,即所有輸出變量必須被各輸入值的組合值賦值,不能有例外?!?〕描述組合和鎖存邏輯的always塊一定不能包含反響,即在always塊中已被定義為輸出的存放器變量絕對(duì)不能再在該always塊中讀進(jìn)來作為輸入信號(hào)。〔8〕時(shí)鐘沿觸發(fā)的always塊必須是單時(shí)鐘的,且任何異步控制輸入〔通常是復(fù)位或置位信號(hào)〕必須在控制事件列表中列出。例:always@(posedgeclkornegedgesetornegedgereset)〔9〕防止生成不想要的鎖存器。在無時(shí)鐘的always塊中,假設(shè)有的輸出變量被賦了某個(gè)信號(hào)變量值,而該信號(hào)變量并未在該always塊的電平敏感控制事件中列出,那么會(huì)在綜合中生成不想要的鎖存器。2綜合代碼的編寫標(biāo)準(zhǔn)〔續(xù)1〕3010.1VerilogHDL源代碼標(biāo)準(zhǔn)〔10〕防止生成不想要的觸發(fā)器。在時(shí)鐘沿觸發(fā)的always塊中,如果用非阻塞賦值語句對(duì)reg型變量賦值;或者當(dāng)reg型變量經(jīng)過屢次循環(huán)其值仍保持不變,那么會(huì)在綜合中生成觸發(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級(jí)和門級(jí)描述能夠被復(fù)位成同一個(gè)的狀態(tài),以便進(jìn)行門級(jí)邏輯驗(yàn)證?!?2〕對(duì)存在無效狀態(tài)的有限狀態(tài)機(jī)和其他時(shí)序電路〔如4位十進(jìn)制計(jì)數(shù)器有6個(gè)無效狀態(tài)〕,必須明確描述所有的2的N次冪種狀態(tài)下的行為〔包括無效狀態(tài)〕,才能綜合出平安可靠的狀態(tài)機(jī)?!?3〕一般地,在賦值語句中不能使用延遲,否那么是不可綜合的?!?4〕不要使用integer型和time型存放器,否那么將分別綜合成32位和64位的總線?!?5〕仔細(xì)檢查代碼中使用動(dòng)態(tài)指針〔如用指針或地址變量檢索的位選擇或存儲(chǔ)單元〕、循環(huán)聲明或算術(shù)運(yùn)算局部,因?yàn)檫@類代碼在綜合后會(huì)生成大量的門,且難以優(yōu)化。2綜合代碼的編寫標(biāo)準(zhǔn)〔續(xù)4〕3310.2不同抽象級(jí)別的VerilogHDL模型一、VerilogHDL的門級(jí)描述二、VerilogHDL的行為級(jí)描述內(nèi)容概要3410.2不同抽象級(jí)別的VerilogHDL模型一個(gè)復(fù)雜電路的完整VerilogHDL模型由假設(shè)干個(gè)VerilogHDL模塊構(gòu)成,每個(gè)模塊由假設(shè)干的子模塊構(gòu)成——可分別用不同抽象級(jí)別的VerilogHDL描述。在同一個(gè)VerilogHDL模塊中可有多種級(jí)別的描述。系統(tǒng)級(jí)(systemlevel):用高級(jí)語言結(jié)構(gòu)〔如case語句〕實(shí)現(xiàn)的設(shè)計(jì)模塊外部性能的模型;算法級(jí)(algorithmiclevel):用高級(jí)語言結(jié)構(gòu)實(shí)現(xiàn)的設(shè)計(jì)算法模型〔寫出邏輯表達(dá)式〕;RTL級(jí)(registertransferlevel):描述數(shù)據(jù)在存放器之間流動(dòng)和如何處理這些數(shù)據(jù)的模型;門級(jí)(gatelevel):描述邏輯門〔如與門、非門、或門、與非門、三態(tài)門等〕以及邏輯門之間連接的模型;開關(guān)級(jí)(switchlevel):描述器件中三極管和儲(chǔ)存節(jié)點(diǎn)及其之間連接的模型。3510.2不同抽象級(jí)別的VerilogHDL模型一、VerilogHDL的門級(jí)描述門類型關(guān)鍵字<例化的門名稱>(<端口列表>);門級(jí)描述即直接調(diào)用門原語進(jìn)行邏輯的結(jié)構(gòu)描述。以門級(jí)為根底的結(jié)構(gòu)描述所建立的硬件模型不僅是可仿真的,也是可綜合的;一個(gè)邏輯網(wǎng)絡(luò)由許多邏輯門和開關(guān)組成,用邏輯門的模型來描述邏輯網(wǎng)絡(luò)最直觀!門類型的關(guān)鍵字有26個(gè),常用的有9個(gè):not,and,nand,or,nor,xor,xnor,buf,bufif1,bufif0,notif1,notif0〔各種三態(tài)門〕調(diào)用門原語的句法:注1:在

端口列表中輸出信號(hào)列在最前面;注2:門級(jí)描述不適于描述復(fù)雜的系統(tǒng)!結(jié)構(gòu)描述,最直觀!可省略!

36

10.2不同抽象級(jí)別的VerilogHDL模型[例]調(diào)用門原語實(shí)現(xiàn)4選1數(shù)據(jù)選擇器注:首先必須根據(jù)邏輯功能畫出邏輯電路圖!輸入輸出cntrl1cntrl2out00011011in1in2in3in4真值表37

10.2不同抽象級(jí)別的VerilogHDL模型注:這里省略了所有的例化門元件名稱!38

10.2不同抽象級(jí)別的VerilogHDL模型二、VerilogHDL的行為級(jí)描述包括系統(tǒng)級(jí),算法級(jí),RTL級(jí)1.邏輯功能描述——算法級(jí)注:首先必須根據(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不同抽象級(jí)別的VerilogHDL模型2.case語句描述——系統(tǒng)級(jí)——只需知道輸入與輸出間的真值表!比調(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不同抽象級(jí)別的VerilogHDL模型3.條件運(yùn)算符描述——算法級(jí)——只需知道輸入與輸出間的真值表!注:比調(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時(shí)執(zhí)行當(dāng)cntrl1=0時(shí)執(zhí)行41

10.2不同抽象級(jí)別的VerilogHDL模型采用的描述級(jí)別越高,設(shè)計(jì)越容易,程序代碼越簡單;但耗用器件資源更多。對(duì)特定綜合器,可能無法將某些抽象級(jí)別高的描述轉(zhuǎn)化為電路!基于門級(jí)描述的硬件模型不僅可以仿真,而且可綜合,且系統(tǒng)速度快。所有VerilogHDL編譯軟件只是支持該語言的一個(gè)子集。盡量采用編譯軟件支持的語句來描述設(shè)計(jì);或多個(gè)軟件配合使用。一般用算法級(jí)〔寫出邏輯表達(dá)式〕或RTL級(jí)來描述邏輯功能,盡量防止用門級(jí)描述,除非對(duì)系統(tǒng)速度要求比較高的場合才采用門級(jí)描述。小結(jié)42

10.2不同抽象級(jí)別的VerilogHDL模型〔1〕采用什么描述級(jí)別更適宜?系統(tǒng)級(jí)描述太抽象,有時(shí)無法綜合成具體的物理電路;門級(jí)描述要求根據(jù)邏輯功能畫出邏輯電路圖,對(duì)于復(fù)雜的數(shù)字系統(tǒng)很難做到;而算法級(jí)和RTL級(jí)描述級(jí)別適中,代碼不是很復(fù)雜,且一般容易綜合成具體的物理電路,故建議盡量采用算法級(jí)和RTL級(jí)來描述?!?〕怎樣減少器件邏輯資源的耗用?當(dāng)器件容量有限時(shí),為減少器件邏輯資源的耗用,建議少用if-else語句和case語句,盡量直接使用邏輯表達(dá)式來描述系統(tǒng)的邏輯功能;或者用case語句取代if-else語句。思考4310.2不同抽象級(jí)別的VerilogHDL模型建議:〔1〕在進(jìn)行設(shè)計(jì)前,一定要仔細(xì)分析并熟悉所需設(shè)計(jì)電路或系統(tǒng)的整個(gè)工作過程;合理劃分功能模塊;并弄清每個(gè)模塊輸入和輸出間的邏輯關(guān)系!〔2〕在調(diào)試過程中,仔細(xì)閱讀并理解錯(cuò)誤信息,隨時(shí)查閱教材和課件上有關(guān)語法,糾正語法錯(cuò)誤。4410.3設(shè)計(jì)技巧1.一個(gè)變量不能在多個(gè)always塊中被賦值!這個(gè)問題一定要注意!否那么編譯不能通過。[例]帶異步清零、異步置位的D觸發(fā)器注:當(dāng)某個(gè)變量有多個(gè)觸發(fā)條件時(shí),最好將它們放在一個(gè)always塊中,并用if-else語句描述在不同觸發(fā)條件下應(yīng)執(zhí)行的操作!正確的寫法4510.3設(shè)計(jì)技巧錯(cuò)誤的寫法注:這里q和qn在兩個(gè)always塊中都被賦值!因?yàn)閍lways塊之間是并行操作,造成某些語句可能是互相矛盾的,所以編譯器無所適從,只能報(bào)錯(cuò)!4610.3設(shè)計(jì)技巧2.在always塊語句中,當(dāng)敏感信號(hào)為兩個(gè)以上的時(shí)鐘邊沿觸發(fā)信號(hào)時(shí),應(yīng)注意不要使用多個(gè)if語句!以免因邏輯關(guān)系描述不清晰而導(dǎo)致編譯錯(cuò)誤。[例]在數(shù)碼管掃描顯示電路中,設(shè)計(jì)一個(gè)中間變量,將脈沖信號(hào)start轉(zhuǎn)變?yōu)殡娖叫盘?hào)enable。always@(posedgestartorposedgereset)if(reset)enable<=0;if(start)enable<=1;編譯后出現(xiàn)了多條警告信息,指明在語句always@(posedgestartorposedgereset)中,變量enable不能被分配新的值!錯(cuò)誤的寫法4710.3設(shè)計(jì)技巧其仿真波形如下:

注:由于在最初一段,start和reset均為0,導(dǎo)致enable為不定態(tài),那么scan_data開始加1計(jì)數(shù)〔正確情況應(yīng)是在按下start時(shí)scan_data才開始加1計(jì)數(shù)〕。當(dāng)start和reset同時(shí)為1時(shí),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時(shí),enable被認(rèn)為初值為0,那么scan_data不計(jì)數(shù),保持初值為0;一旦start有效時(shí),那么scan_data才開始加1計(jì)數(shù)。當(dāng)start和reset同時(shí)為1時(shí),先執(zhí)行的是“if(reset)enable<=0;〞,故enable仍為0,那么scan_data保持原值0。正確的寫法4910.3設(shè)計(jì)技巧3.當(dāng)輸出信號(hào)為總線信號(hào)時(shí),一定要在I/O說明中指明其位寬!否那么在生成邏輯符號(hào)時(shí),輸出信號(hào)被誤認(rèn)為是單個(gè)信號(hào),而沒有標(biāo)明位寬,就不會(huì)當(dāng)成總線信號(hào)。[例]聲明一個(gè)位寬為5的輸出信號(hào)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論