![EDA技術(shù)與VHDL設(shè)計(jì)(西電版)第3章-VHDL語言入門課件_第1頁](http://file4.renrendoc.com/view/5f0811674a996bd93f508dde9567a3fa/5f0811674a996bd93f508dde9567a3fa1.gif)
![EDA技術(shù)與VHDL設(shè)計(jì)(西電版)第3章-VHDL語言入門課件_第2頁](http://file4.renrendoc.com/view/5f0811674a996bd93f508dde9567a3fa/5f0811674a996bd93f508dde9567a3fa2.gif)
![EDA技術(shù)與VHDL設(shè)計(jì)(西電版)第3章-VHDL語言入門課件_第3頁](http://file4.renrendoc.com/view/5f0811674a996bd93f508dde9567a3fa/5f0811674a996bd93f508dde9567a3fa3.gif)
![EDA技術(shù)與VHDL設(shè)計(jì)(西電版)第3章-VHDL語言入門課件_第4頁](http://file4.renrendoc.com/view/5f0811674a996bd93f508dde9567a3fa/5f0811674a996bd93f508dde9567a3fa4.gif)
![EDA技術(shù)與VHDL設(shè)計(jì)(西電版)第3章-VHDL語言入門課件_第5頁](http://file4.renrendoc.com/view/5f0811674a996bd93f508dde9567a3fa/5f0811674a996bd93f508dde9567a3fa5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章VHDL語言入門
3.1VHDL語言概述3.2兩個(gè)簡(jiǎn)單的組合電路示例3.3庫和程序包3.4實(shí)體描述3.5結(jié)構(gòu)體描述3.6配置3.7層次結(jié)構(gòu)的VHDL描述3.8簡(jiǎn)單時(shí)序電路的描述第3章VHDL語言入門
3.1VHDL語言概述3.1VHDL語言概述
VHDL的主要目的是進(jìn)行系統(tǒng)的描述、行為的建模與仿真。盡管所有的VHDL代碼都是可以仿真的,但并不是所有代碼都是可以綜合的,這取決于各EDA廠商綜合器對(duì)VHDL的支持程度。
與其他的硬件描述語言相比,VHDL具有更強(qiáng)的行為描述能力,從而決定了它成為數(shù)字系統(tǒng)設(shè)計(jì)領(lǐng)域最佳的硬件描述語言之一。強(qiáng)大的行為描述能力是使其避開具體的器件結(jié)構(gòu),從邏輯行為上成為描述和設(shè)計(jì)大規(guī)模電子系統(tǒng)的重要保證。3.1VHDL語言概述
VHDL的主要目的VHDL語言的優(yōu)勢(shì)如下:
(1)?VHDL有豐富的語句形式和庫函數(shù),使其在系統(tǒng)的設(shè)計(jì)早期就能從行為特性上查驗(yàn)系統(tǒng)的功能可行性,并隨時(shí)可對(duì)設(shè)計(jì)進(jìn)行仿真。
(2)?VHDL語句的行為描述能力和代碼結(jié)構(gòu)決定了它具有支持大規(guī)模設(shè)計(jì)的分解和已有設(shè)計(jì)的再利用功能,符合大規(guī)模系統(tǒng)所需的多人協(xié)同高效工作的要求。
(3)?VHDL對(duì)設(shè)計(jì)的描述具有相對(duì)獨(dú)立性,開發(fā)者可以不懂硬件的結(jié)構(gòu),也不必關(guān)心最終設(shè)計(jì)實(shí)現(xiàn)的目標(biāo)器件是什么,便可進(jìn)行相對(duì)獨(dú)立的設(shè)計(jì)。
(4)?VHDL與設(shè)計(jì)平臺(tái)無關(guān),可移植性較好。VHDL語言的優(yōu)勢(shì)如下:
(1)?VHDL有豐富的(5)?VHDL是最早成為IEEE標(biāo)準(zhǔn)的硬件描述語言,使用廣泛,資料分享和查找非常方便,對(duì)初學(xué)者學(xué)習(xí)非常有幫助。
需要特別注意的是,VHDL與常規(guī)計(jì)算機(jī)高級(jí)程序設(shè)計(jì)語言有所不同,VHDL語句從根本上講是并發(fā)執(zhí)行的,只有在進(jìn)程(Process)、函數(shù)(Function)和過程(Procedure)內(nèi)部的語句才是順序執(zhí)行的。
VHDL描述了電路設(shè)計(jì)的行為、功能、輸入以及輸出,其本質(zhì)是用程序語言的方式來描述硬件。圖3-1顯示了VHDL的基本硬件模型。VHDL將一個(gè)電路系統(tǒng)分為外部可見部分和內(nèi)部隱藏部分。利用VHDL實(shí)現(xiàn)一個(gè)電路系統(tǒng),首先需要定義實(shí)體(Entity),在實(shí)體定義中完成與外部接口的(5)?VHDL是最早成為IEEE標(biāo)準(zhǔn)的硬件描述語言,定義,包括輸入接口(InputPorts)和輸出接口(OutputPorts)的定義,這是可見部分。實(shí)現(xiàn)電路功能的具體算法則在結(jié)構(gòu)體(Architecture)中定義。當(dāng)其他設(shè)計(jì)需要引用該設(shè)計(jì)時(shí)(或稱為對(duì)其進(jìn)行重用時(shí)),這部分像一個(gè)黑盒子一樣,是隱藏的。結(jié)構(gòu)體內(nèi)部往往包含相互連接的多個(gè)進(jìn)程和元件,它們都是并行運(yùn)行的。結(jié)構(gòu)體由信號(hào)賦值語句、進(jìn)程語句和元件例化語句等組成。進(jìn)程中可以調(diào)用子程序。不同的進(jìn)程之間通過信號(hào)進(jìn)行信息的交互。VHDL里的進(jìn)程既可以生成由觸發(fā)器等構(gòu)成的時(shí)序電路,也可以生成由邏輯門構(gòu)成的組合電路。定義,包括輸入接口(InputPorts)和輸出接口(Ou圖3-1VHDL基本硬件模型圖3-1VHDL基本硬件模型3.2兩個(gè)簡(jiǎn)單的組合電路示例
本節(jié)以兩個(gè)簡(jiǎn)單的示例引出VHDL語言的基本結(jié)構(gòu)、語句表述及一些語法規(guī)則。
3.2兩個(gè)簡(jiǎn)單的組合電路示例
本節(jié)以兩個(gè)簡(jiǎn)單的3.2.12選1多路選擇器的設(shè)計(jì)
在數(shù)字電路中,2選1多路選擇器是組合電路的典型代表。假設(shè)有a和b兩個(gè)數(shù)據(jù),控制信號(hào)為s,當(dāng)s取值為0時(shí),選擇數(shù)據(jù)a作為輸出;否則,選擇數(shù)據(jù)b作為輸出。按照數(shù)字電路的設(shè)計(jì)方法,首先需要列出真值表、卡諾圖,然后通過化簡(jiǎn)卡諾圖得到最簡(jiǎn)邏輯表達(dá)式,再根據(jù)所選擇邏輯器件的要求(如采用與門、或門實(shí)現(xiàn)電路,或只能采用與非門實(shí)現(xiàn)電路)進(jìn)行表達(dá)式的變換,確認(rèn)最終的電路形式。圖3-2是2選1多路選擇器的卡諾圖及化簡(jiǎn)后的邏輯表達(dá)式,圖3-3是根據(jù)邏輯表達(dá)式確定的最終電路形式。3.2.12選1多路選擇器的設(shè)計(jì)
在數(shù)字電路中,2選圖3-22選1多路選擇器卡諾圖及邏輯表達(dá)式圖3-22選1多路選擇器卡諾圖及邏輯表達(dá)式圖3-32選1多路選擇器的電路結(jié)構(gòu)圖3-32選1多路選擇器的電路結(jié)構(gòu)例3-1是與圖3-3電路結(jié)構(gòu)相對(duì)應(yīng)的采用VHDL語言實(shí)現(xiàn)的電路描述。
【例3-1】例3-1是與圖3-3電路結(jié)構(gòu)相對(duì)應(yīng)的采用VHDL語言實(shí)現(xiàn)由例3-1可見,此電路的VHDL描述由兩部分組成,其中L2~L5是實(shí)體描述,L7~L10是結(jié)構(gòu)體描述。下面就本例涉及到的一些語法作簡(jiǎn)單的講解。
(1)以關(guān)鍵詞ENTITY為引導(dǎo)、ENDENTITY為結(jié)束的語句部分,稱為實(shí)體。其中mux21是設(shè)計(jì)者自行取定的實(shí)體名,取名最好依據(jù)相應(yīng)功能來確定,使其具有可讀性。VHDL的實(shí)體描述了電路器件的外部情況及信號(hào)端口的基本性質(zhì),如信號(hào)流動(dòng)的方向(輸入、輸出或其他)、在其上流動(dòng)的信號(hào)的數(shù)據(jù)類型等。關(guān)鍵詞PORT表示定義端口。本例中定義了a、b、s三個(gè)輸入端口(輸入信號(hào)),其數(shù)據(jù)類型為位(BIT)數(shù)據(jù)類型。BIT數(shù)據(jù)類型的信號(hào)取值只有邏輯“0”和由例3-1可見,此電路的VHDL描述由兩部分組成,其中L“1”兩種,在VHDL中表達(dá)時(shí)必須加單引號(hào),否則VHDL綜合器會(huì)將其解釋為另一種數(shù)據(jù)類型——整型。BIT數(shù)據(jù)類型可以參與邏輯運(yùn)算,其結(jié)果仍是邏輯位的數(shù)據(jù)類型。VHDL語法規(guī)定,任何一種數(shù)據(jù)對(duì)象的應(yīng)用都必須嚴(yán)格限定其數(shù)據(jù)類型和取值范圍,不同數(shù)據(jù)類型和取值范圍的數(shù)據(jù)對(duì)象將不能相互賦值或進(jìn)行其他操作。本例還定義了一個(gè)輸出端口(輸出信號(hào))y,其數(shù)據(jù)類型也是BIT?!?”兩種,在VHDL中表達(dá)時(shí)必須加單引號(hào),否則VHDL綜合(2)以關(guān)鍵詞ARCHITECTURE為引導(dǎo)、ENDARCHITECTURE為結(jié)尾的語句部分,稱為結(jié)構(gòu)體。其中construct是結(jié)構(gòu)體的名稱,也是由設(shè)計(jì)者自行定義的。VHDL的結(jié)構(gòu)體負(fù)責(zé)描述電路器件的內(nèi)部邏輯功能和電路結(jié)構(gòu)。關(guān)鍵詞BEGIN意味著具體算法的開始。符號(hào)“<=”稱為賦值符號(hào),即把符號(hào)右邊的數(shù)據(jù)向符號(hào)左邊的輸出端口y傳遞。VHDL要求賦值符號(hào)“<=”兩邊的信號(hào)數(shù)據(jù)類型必須一致。L9中出現(xiàn)的AND、OR、NOT是邏輯操作符號(hào),分別表示與、或、非。VHDL一共有7種邏輯操作符,它們分別是AND(與)、OR(或)、NOT(非)、NAND(與非)、NOR(或非)、XOR(異或)、XNOR(同或),其功能與數(shù)字電路中常用的邏輯門相同。具體邏輯符號(hào)的使用請(qǐng)參見第4章。(2)以關(guān)鍵詞ARCHITECTURE為引導(dǎo)、END(3)關(guān)鍵詞是VHDL語言中預(yù)定義的有特殊含義的英文詞語,只能用作固定的用途。關(guān)鍵詞不能再用作用戶自定義的名稱。雖然在EDA工具編譯和綜合時(shí),關(guān)鍵詞并不區(qū)分大小寫,但是對(duì)關(guān)鍵詞采用大寫字母,對(duì)設(shè)計(jì)者自己定義的實(shí)體名稱、信號(hào)名稱等其他名稱使用小寫字母,能夠提高代碼的可讀性,使其更加規(guī)范。一般而言,EDA工具的文本編輯器都能夠識(shí)別關(guān)鍵詞,即關(guān)鍵詞敏感型,EDA會(huì)用不同的顏色來顯示關(guān)鍵詞,所以在編輯代碼時(shí)一般不會(huì)誤用關(guān)鍵詞。(3)關(guān)鍵詞是VHDL語言中預(yù)定義的有特殊含義的英文詞(4)實(shí)體名稱mux21,結(jié)構(gòu)體名稱construct,輸入端口名稱a、b、s以及輸出端口名稱y都統(tǒng)稱為標(biāo)識(shí)符。所謂標(biāo)識(shí)符就是設(shè)計(jì)者在VHDL代碼中自定義的、用于不同名稱的詞語。使用標(biāo)識(shí)符也要遵循一定的規(guī)則:①標(biāo)識(shí)符由字母、數(shù)字、下劃線構(gòu)成,但必須以字母開頭;②只能是單一下劃線,且不能以下劃線作為標(biāo)識(shí)符的結(jié)束;③VHDL的關(guān)鍵詞不能再用作標(biāo)識(shí)符;④EDA工具庫中已定義好的元件名不能作為標(biāo)識(shí)符,如and2、dff等。雖然標(biāo)識(shí)符與關(guān)鍵詞一樣,在編譯和綜合時(shí)并不區(qū)分大小寫,但是為保證代碼書寫的規(guī)范,我們建議標(biāo)識(shí)符采用小寫字母。(4)實(shí)體名稱mux21,結(jié)構(gòu)體名稱construct(5)分號(hào)的作用。分號(hào)用于語句的分割,每條VHDL語句都有一個(gè)分號(hào)表示結(jié)束。需要注意的是,最后一個(gè)端口定義處的分號(hào)在括號(hào)外,如L4所示。
(6)規(guī)范的代碼書寫。盡管VHDL代碼的書寫格式要求十分寬松,但規(guī)范的書寫習(xí)慣是高效的電路設(shè)計(jì)所必備的。最頂層的ENTITY、ARCHITECTURE描述語句需要放在最左側(cè),比它們低一層次的描述語句(如PORT),需要向右靠4個(gè)小寫字母的間隔。相同層次的語句需要對(duì)齊。
(7)雙橫線“--”是注釋符。在VHDL代碼中的任何一行,只要出現(xiàn)了“--”,其后的文字或語句都不再參加編譯和綜合。良好的注釋有助于設(shè)計(jì)者閱讀、理解VHDL代碼。(5)分號(hào)的作用。分號(hào)用于語句的分割,每條VHDL語句例3-1對(duì)應(yīng)的元件符號(hào)如圖3-4所示。采用QuartusⅡ軟件仿真后的結(jié)果如圖3-5所示??梢郧宄乜吹?,當(dāng)控制端口s取值為“0”時(shí),輸出y即為輸入信號(hào)a的值;反之,則為輸入信號(hào)b的值,滿足設(shè)計(jì)要求。
例3-1采用的VHDL描述與其電路結(jié)構(gòu)是一一對(duì)應(yīng)的,讀者可能會(huì)疑惑,這樣的描述形式似乎并不能體現(xiàn)VHDL行為描述的優(yōu)勢(shì),且設(shè)計(jì)者必須搞清楚電路結(jié)構(gòu)才能進(jìn)行VHDL代碼的編輯。其實(shí)VHDL有多種不同的描述方式,在后續(xù)章節(jié)中會(huì)詳細(xì)介紹,例3-1的目的是讓讀者能夠以數(shù)字電路的知識(shí)作為鋪墊,快速進(jìn)入EDA的學(xué)習(xí)。例3-1對(duì)應(yīng)的元件符號(hào)如圖3-4所示。采用Quartus圖3-4mux21元件符號(hào)圖3-4mux21元件符號(hào)圖3-52選1多路選擇器電路的時(shí)序波形圖3-52選1多路選擇器電路的時(shí)序波形3.2.2半加器的設(shè)計(jì)
下面再通過一個(gè)半加器的例子來說明VHDL的基本結(jié)構(gòu)形式。半加器指兩個(gè)1位二進(jìn)制數(shù)相加,只考慮兩個(gè)加數(shù)本身,而沒有考慮由低位來的進(jìn)位。圖3-6顯示了半加器的真值表和邏輯表達(dá)式,其中a、b是兩個(gè)加數(shù),co是進(jìn)位端,so是求和端。圖3-7是半加器的電路結(jié)構(gòu)。例3-2是半加器的VHDL描述,此例仍然采用邏輯操作符描述電路結(jié)構(gòu)的方式。3.2.2半加器的設(shè)計(jì)
下面再通過一個(gè)半加器的例子來圖3-6半加器真值表和邏輯表達(dá)式圖3-6半加器真值表和邏輯表達(dá)式圖3-7半加器電路結(jié)構(gòu)圖3-7半加器電路結(jié)構(gòu)【例3-2】【例3-2】例3-2與例3-1相比,除了包含實(shí)體和結(jié)構(gòu)體兩個(gè)部分外,還增加了庫和程序包的聲明(L2~L3)。例3-2所涉及的相關(guān)語法講解如下:
(1)?L2以關(guān)鍵詞LIBRARY為引導(dǎo),LIBRARYieee表示打開IEEE庫。L3以關(guān)鍵詞USE為引導(dǎo),表示允許使用IEEE庫中的std_logic_1164程序包中的所有內(nèi)容(.all)。例3-2使用庫和程序包的原因是本例中用到了數(shù)據(jù)類型STD_LOGIC,該數(shù)據(jù)類型的相關(guān)定義都是包含在std_logic_1164程序包中的,而該程序包在IEEE庫中,所以在使用前必須先給予聲明。如將例3-2去掉L2~L3后,再次使用QuartusⅡ軟件進(jìn)行編譯,將會(huì)產(chǎn)生如圖3-8所示錯(cuò)誤,提示數(shù)據(jù)類型STD_LOGIC未聲明。這進(jìn)一步說明了此處聲明庫和程序包的作用。例3-2與例3-1相比,除了包含實(shí)體和結(jié)構(gòu)體兩個(gè)部分外,圖3-8例3-2不聲明IEEE庫和std_logic_1164程序包報(bào)錯(cuò)信息圖3-8例3-2不聲明IEEE庫和std_logic_1讀者也許會(huì)問,例3-1也使用了數(shù)據(jù)類型BIT,為什么不需要進(jìn)行庫和程序包的聲明呢?數(shù)據(jù)類型BIT的定義是包含在VHDL標(biāo)準(zhǔn)程序包standard中的,而該程序包包含于VHDL標(biāo)準(zhǔn)庫STD中。由于VHDL標(biāo)準(zhǔn)中規(guī)定STD庫是默認(rèn)打開的,因此就不需要像例3-2這樣將庫和程序包以語句顯式地表達(dá)在VHDL代碼的開頭。讀者也許會(huì)問,例3-1也使用了數(shù)據(jù)類型BIT,為什么不需(2)數(shù)據(jù)類型STD_LOGIC稱為標(biāo)準(zhǔn)邏輯位數(shù)據(jù)類型,共定義了九種取值,分別是:“U”(未初始化的)、“X”(強(qiáng)未知的)、“0”(強(qiáng)邏輯0)、“1”(強(qiáng)邏輯1)、“Z”(高阻態(tài))、“W”(弱未知的)、“L”(弱邏輯0)、“H”(弱邏輯1)、“-”(忽略)。可以發(fā)現(xiàn),數(shù)據(jù)類型STD_LOGIC包含的內(nèi)容比數(shù)據(jù)類型BIT要豐富和完整,它可以使設(shè)計(jì)者精確地模擬一些未知的和具有高阻態(tài)的線路的情況,更適用于數(shù)字系統(tǒng)的設(shè)計(jì)。STD_LOGIC型數(shù)據(jù)能夠被綜合器接受的一般只有“X”(或“-”)、“0”、“1”、“Z”這幾種,其他的取值則不可綜合,只能用于仿真器。
例3-2的仿真結(jié)果如圖3-9所示。(2)數(shù)據(jù)類型STD_LOGIC稱為標(biāo)準(zhǔn)邏輯位數(shù)據(jù)類型圖3-9半加器電路的時(shí)序波形圖3-9半加器電路的時(shí)序波形3.2.3VHDL代碼設(shè)計(jì)基本結(jié)構(gòu)
從例3-1和例3-2可以看出,一個(gè)能夠被綜合的VHDL代碼至少須包含實(shí)體和結(jié)構(gòu)體兩個(gè)部分,如果有需要還要進(jìn)行庫和程序包的聲明。
一般來說,把一個(gè)完整的、可綜合的VHDL設(shè)計(jì)稱為設(shè)計(jì)實(shí)體。VHDL代碼有比較固定的結(jié)構(gòu)格式,一般首先出現(xiàn)的是庫和程序包的使用聲明,然后是實(shí)體的描述以及結(jié)構(gòu)體的描述。當(dāng)然,同一個(gè)電路系統(tǒng)可能有不同的實(shí)現(xiàn)方法,有不同的電路結(jié)構(gòu),VHDL允許一個(gè)實(shí)體對(duì)應(yīng)一個(gè)或多個(gè)結(jié)構(gòu)體,不同的結(jié)構(gòu)體意味著不同的實(shí)現(xiàn)方式。如何從對(duì)應(yīng)的多個(gè)結(jié)構(gòu)體中選擇特定的一個(gè)結(jié)構(gòu)體,將其指定給實(shí)體,就需要用到配置??偨Y(jié)說來,VHDL代碼設(shè)計(jì)基本結(jié)構(gòu)如圖3-10所示。3.2.3VHDL代碼設(shè)計(jì)基本結(jié)構(gòu)
從例3-1和例3圖3-10VHDL代碼設(shè)計(jì)基本結(jié)構(gòu)示意圖圖3-10VHDL代碼設(shè)計(jì)基本結(jié)構(gòu)示意圖3.3庫?和?程?序?包
庫是一些常用VHDL代碼的集合,包括:數(shù)據(jù)類型的定義、函數(shù)的定義、子程序定義、元件引用聲明、常量的定義等一些可復(fù)用或是共享的VHDL代碼,類似于C語言中的頭文件。這些已定義的數(shù)據(jù)類型、子程序、常數(shù)等通常收集在程序包(Package)中,多個(gè)程序包再并入一個(gè)庫中,引用了庫之后就可以在設(shè)計(jì)者自己的代碼中使用庫中的VHDL代碼。庫和程序包的使用使得設(shè)計(jì)人員能夠遵循某些統(tǒng)一的語言標(biāo)準(zhǔn)或數(shù)據(jù)格式,也能夠方便地調(diào)用一些已設(shè)計(jì)好的內(nèi)容,提高設(shè)計(jì)效率,這一點(diǎn)對(duì)于多組開發(fā)人員并行工作的大規(guī)模電路系統(tǒng)的設(shè)計(jì)尤為重要。3.3庫?和?程?序?包
庫是一些常用庫和程序包的聲明總是放在設(shè)計(jì)單元的最前面,以便后續(xù)設(shè)計(jì)能夠隨時(shí)使用庫中指定的程序包中的內(nèi)容。每當(dāng)綜合器在較高層次的VHDL源文件中遇到庫語言,就將隨庫指定的源文件讀入,并參與綜合。在VHDL語言中可以存在多個(gè)不同的庫,但是庫與庫之間是獨(dú)立的,不能互相嵌套。庫和程序包的聲明總是放在設(shè)計(jì)單元的最前面,以便后續(xù)設(shè)計(jì)能3.3.1庫和程序包的種類
當(dāng)前在VHDL語言中存在的庫大致可以歸納為五種:IEEE庫、STD庫、WORK庫、VITAL庫和用戶自定義庫。
1.IEEE庫
IEEE庫是VHDL設(shè)計(jì)中最常用的庫之一,它包含IEEE標(biāo)準(zhǔn)的程序包以及其他一些支持工業(yè)標(biāo)準(zhǔn)的程序包。下面就幾個(gè)常用和重要的程序包作一定介紹,相關(guān)內(nèi)容還可參見4.3節(jié)以及附錄A。附錄A中給出了相關(guān)程序包的具體定義,有助于讀者了解程序包內(nèi)定義的內(nèi)容,進(jìn)一步理解使用不同程序包的目的。3.3.1庫和程序包的種類
當(dāng)前在VHDL語言中存在(1)?std_logic_1164程序包。該程序包是最重要和最常用的程序包,是IEEE的標(biāo)準(zhǔn)程序包。std_logic_1164程序包定義了STD_LOGIC和STD_ULOGIC數(shù)據(jù)類型以及它們的矢量類型和相關(guān)操作(如適用于該數(shù)據(jù)類型的邏輯操作符AND、OR等),數(shù)據(jù)類型BIT和數(shù)據(jù)類型STD_LOGIC、STD_ULOGIC的轉(zhuǎn)換函數(shù),數(shù)據(jù)類型BIT_VECTOR和數(shù)據(jù)類型STD_LOGIC_VECTOR、STD_ULOGIC_VECTOR的轉(zhuǎn)換函數(shù),等等。(1)?std_logic_1164程序包。該程序包是(2)?std_logic_arith程序包。該程序包是Synopsys公司定義的程序包,雖然它并不是IEEE標(biāo)準(zhǔn),但由于已經(jīng)成為事實(shí)上的工業(yè)標(biāo)準(zhǔn),所以也都并入了IEEE庫。std_logic_arith程序包在std_logic_1164程序包的基礎(chǔ)上定義了有符號(hào)(SIGNED)、無符號(hào)(UNSIGNED)、小整型(SMALL_INT)數(shù)據(jù)類型,其中有符號(hào)和無符號(hào)數(shù)據(jù)類型均是基于STD_LOGIC數(shù)據(jù)類型的。該程序包還定義了這些數(shù)據(jù)類型之間的相互轉(zhuǎn)換函數(shù),以及適用于它們的一些操作符,如算術(shù)操作符、比較操作符等。(2)?std_logic_arith程序包。該程序包(3)?std_logic_signed程序包。該程序包也是由Synopsys公司定義的,同樣并入IEEE庫。std_logic_signed程序包對(duì)INTEGER(整型)、STD_LOGIC、STD_LOGIC_VECTOR數(shù)據(jù)類型的定義進(jìn)行了擴(kuò)展,重載了用于這些數(shù)據(jù)類型的混合運(yùn)算的運(yùn)算符,以及一個(gè)由STD_LOGIC_VECTOR數(shù)據(jù)類型到INTEGER的轉(zhuǎn)換函數(shù)。
(4)?std_logic_unsigned程序包。該程序包同樣是由Synopsys公司定義的,并入IEEE庫。std_logic_unsigned程序包定義內(nèi)容與std_logic_signed程序包相似。所不同的是,std_logic_signed程序包中定義的內(nèi)容是基于有符號(hào)(SIGNED)數(shù)據(jù)類型的,即考慮了符號(hào);而std_logic_unsigned程序包中定義的內(nèi)容是基于無符號(hào)(UNSIGNED)數(shù)據(jù)類型的。(3)?std_logic_signed程序包。該程序此外,IEEE庫還包括了math_real、numberic_bit、numberic_std等程序包,它們是IEEE正式認(rèn)可的標(biāo)準(zhǔn)程序包集合。一般來說,基于FPGA/CPLD的開發(fā),使用std_logic_1164、std_logic_arith、std_logic_signed以及std_logic_unsigned這4個(gè)程序包已經(jīng)能夠滿足大多數(shù)的需要。所以,其他幾個(gè)程序包不再一一進(jìn)行講述,讀者如有興趣,可查閱相關(guān)資料。此外,IEEE庫還包括了math_real、number2.STD庫
STD庫中含有VHDL語言標(biāo)準(zhǔn)定義的兩個(gè)標(biāo)準(zhǔn)程序包,即standard程序包和textio程序包。
(1)?standard程序包。該程序包是VHDL標(biāo)準(zhǔn)程序包,使用時(shí)默認(rèn)打開。所以設(shè)計(jì)者在使用時(shí),并不需要像IEEE庫中的程序包那樣使用關(guān)鍵詞LIBRARY和USE進(jìn)行顯式的聲明。如:例3-1中BIT數(shù)據(jù)類型并沒有做庫的聲明格式,就是因?yàn)锽IT數(shù)據(jù)類型是定義在standard程序包中的。standard程序包定義了諸如BOOLEAN(布爾型)、BIT(位型)、CHARACTER(字符型)、INTEGER(整型)、REAL(實(shí)數(shù)型)、TIME(時(shí)間型)等數(shù)據(jù)類型以及相關(guān)的操作。2.STD庫
STD庫中含有VHDL語言標(biāo)準(zhǔn)定義的兩(2)?textio程序包。該程序包主要供仿真器使用,綜合器會(huì)忽略此程序包。設(shè)計(jì)者可以用文本編輯器建立一個(gè)數(shù)據(jù)文件,文件中包含仿真時(shí)需要的數(shù)據(jù)。仿真時(shí)利用textio程序包中提供的用于訪問文件的過程,即可獲得這些數(shù)據(jù)或?qū)⒎抡娼Y(jié)果保存于文件中。textio程序包實(shí)際上是專為VHDL模擬工具提供的與外部計(jì)算機(jī)文件管理系統(tǒng)進(jìn)行數(shù)據(jù)交換的通道,使用前需要使用USE語句。8.2.3節(jié)將講解該程序包的使用。(2)?textio程序包。該程序包主要供仿真器使用,3.WORK庫
WORK庫是用戶進(jìn)行VHDL設(shè)計(jì)的現(xiàn)行工作庫,用于存放用戶設(shè)計(jì)和定義的一些設(shè)計(jì)單元和程序包,是用戶自己設(shè)計(jì)的倉庫。VHDL標(biāo)準(zhǔn)規(guī)定WORK庫總是可見的,因此在實(shí)際使用時(shí),也不需要使用LIBRARY和USE語句顯式的打開。VHDL標(biāo)準(zhǔn)要求為設(shè)計(jì)的項(xiàng)目建立一個(gè)文件夾,與此項(xiàng)目相關(guān)的工程、文件等都保存于此文件夾內(nèi)。VHDL綜合器會(huì)將此文件夾默認(rèn)為WORK庫,指向該文件夾的路徑。需要注意的是,WORK庫并不是這個(gè)文件夾的名字,它是一個(gè)邏輯名。3.WORK庫
WORK庫是用戶進(jìn)行VHDL設(shè)計(jì)的現(xiàn)4.VITAL庫
VITAL庫符合IEEE標(biāo)準(zhǔn),由含有精確ASIC時(shí)序模型的時(shí)序程序包集合vital_timing和基本元件程序包集合vital_primitives構(gòu)成,支持以ASIC單元的真實(shí)時(shí)序數(shù)據(jù)對(duì)一個(gè)VHDL設(shè)計(jì)進(jìn)行精確的模擬驗(yàn)證,提高VHDL門級(jí)時(shí)序模擬的精度。但由于各FPGA/CPLD生產(chǎn)廠商的適配工具都能夠?yàn)楦髯缘男酒蓭r(shí)序信息的VHDL門級(jí)網(wǎng)表,用VHDL仿真器仿真該網(wǎng)表就可以得到精確的時(shí)序仿真結(jié)果。因此,在FPGA/CPLD設(shè)計(jì)開發(fā)過程中,一般不需要使用VITAL庫中的程序包來進(jìn)行仿真。4.VITAL庫
VITAL庫符合IEEE標(biāo)準(zhǔn),由含5.用戶自定義庫
用戶為自身設(shè)計(jì)需要所開發(fā)的公共包集合和實(shí)體等,可以匯集在一起定義為一個(gè)庫,即用戶自定義庫,供其他開發(fā)者調(diào)用,但在使用時(shí)同樣要首先說明庫名。
此外,各EDA開發(fā)商為了便于開發(fā)設(shè)計(jì),還提供了一些自己的庫,如Altera公司的LPM庫(本書配套的《EDA技術(shù)與VHDL設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)》一書中會(huì)對(duì)LPM庫進(jìn)行講解)、Synopsys公司的Synopsys庫等。5.用戶自定義庫
用戶為自身設(shè)計(jì)需要所開發(fā)的公共包集3.3.2庫和程序包的使用
在前面提到的幾類庫中,除了STD庫和WORK庫以外,其他庫在使用前都需要首先進(jìn)行聲明。聲明格式如下:
LIBRARY<庫名>;
USE<庫名>.<程序包名>.all;
其中:第一條語句表示使用什么庫;第二條語句表示使用庫中的哪一個(gè)程序包。此處,all代表打開庫中指定程序包內(nèi)的所有資源。當(dāng)然,也可以只打開程序包內(nèi)所選定的某個(gè)項(xiàng)目或函數(shù),其聲明格式如下:
LIBRARY<庫名>;
USE<庫名>.<程序包名>.<項(xiàng)目>;3.3.2庫和程序包的使用
在前面提到的幾類庫中,除例3-3給出了兩種不同的聲明格式。
【例3-3】
LIBRARYieee;
USEieee.std_logic_1164.std_ulogic;--打開std_logic_1164程序包中的std_ulogic數(shù)據(jù)類型
USEieee.std_logic_1164.all --打開std_logic_1164程序包中的所有資源
庫聲明語句的范圍從一個(gè)實(shí)體說明開始,到它所屬的結(jié)構(gòu)體、配置為止。當(dāng)一個(gè)源程序中出現(xiàn)兩個(gè)以上的實(shí)體時(shí),兩條作為庫使用聲明的語句必須在每個(gè)實(shí)體說明語句前重復(fù)書寫。例3-3給出了兩種不同的聲明格式。
【例3-3】
3.3.3程序包的定義
程序包(Package)說明類似于C語言中的include語句,用來單純地羅列VHDL語言中所用到的各種常數(shù)定義,數(shù)據(jù)類型定義,元件、函數(shù)和過程定義等。程序包是一個(gè)可編譯的設(shè)計(jì)單元,也是庫結(jié)構(gòu)中的一個(gè)層次。程序包可分為預(yù)定義程序包和用戶自定義程序包兩類。上述的std_logic_1164、std_logic_arith等程序包屬于常用的預(yù)定義程序包。3.3.3程序包的定義
程序包(Package)說明定義程序包的一般結(jié)構(gòu)如下:
PACKAGE<程序包名>IS --程序包首
說明語句;
ENDPACKAGE<程序包名>;
[PACKAGEBODY<程序包名>IS --程序包體
說明語句;
ENDPACKAGEBODY<程序包名>;]定義程序包的一般結(jié)構(gòu)如下:
PACKAGE<程序包一個(gè)程序包的定義由兩大部分組成:程序包首和程序包體。一個(gè)完整的程序包中,程序包首和程序包體的名稱應(yīng)是同一個(gè)。程序包體是一個(gè)可選項(xiàng),當(dāng)沒有定義函數(shù)和過程時(shí),程序包可以只由程序包首構(gòu)成。程序包首的說明語句部分進(jìn)行數(shù)據(jù)類型的定義,常數(shù)的定義,元件、函數(shù)及過程的聲明等。程序包體的說明語句部分進(jìn)行具體函數(shù)、過程功能的描述。例3-4給出了一個(gè)程序包定義的示例,其程序包名稱是my_package,在其中定義了一個(gè)新的數(shù)據(jù)類型color、一個(gè)常數(shù)x以及一個(gè)函數(shù)positive_edge。由于函數(shù)必須要有具體的內(nèi)容,所以在程序包體內(nèi)進(jìn)行描述。如果該程序包在當(dāng)前WORK庫中已定義,則要使用該程序包中的內(nèi)容,可利用USE語句,如例3-5所示。例3-4相關(guān)的語法知識(shí)會(huì)在后續(xù)章節(jié)中陸續(xù)介紹,這里只是讓讀者體會(huì)程序包的格式和用法。一個(gè)程序包的定義由兩大部分組成:程序包首和程序包體。一個(gè)【例3-4】【例3-4】【例3-5】
USEWORK.my_package.all;--由于WORK庫是默認(rèn)打開的,因此可以省去LIBRARYWORK語句【例3-5】
USEWORK.my_package3.4實(shí)體描述
3.4.1實(shí)體描述語句的結(jié)構(gòu)
實(shí)體(Entity)用于一個(gè)設(shè)計(jì)實(shí)體與其他設(shè)計(jì)實(shí)體或外部電路進(jìn)行接口的描述,是設(shè)計(jì)實(shí)體對(duì)外的一個(gè)通信界面。實(shí)體描述包括實(shí)體名、類屬聲明以及端口聲明。實(shí)體描述的一般語句格式如下:
ENTITY實(shí)體名IS
[GENERIC(參數(shù)名:數(shù)據(jù)類型[:=設(shè)定值]; --類屬聲明
…
參數(shù)名:數(shù)據(jù)類型[:=設(shè)定值]);]3.4實(shí)體描述
3.4.1實(shí)體描PORT(端口名:端口模式數(shù)據(jù)類型; --端口聲明
…
端口名:端口模式數(shù)據(jù)類型);
ENDENTITY實(shí)體名;
實(shí)體名是實(shí)體的標(biāo)識(shí),由設(shè)計(jì)者自行定義,一般為設(shè)計(jì)實(shí)體邏輯功能簡(jiǎn)稱的英文字符,但要符合標(biāo)識(shí)符命名的規(guī)則,如實(shí)體名clkdiv表示分頻器。考慮到某些EDA工具的限制(如QuartusⅡ軟件)、VHDL代碼的特點(diǎn)以及調(diào)用的方便性等,建議源程序所保存的文件名與實(shí)體名保持一致,如保存文件名為clkdiv.vhd(后綴名.vhd代表采用VHDL語言編寫)。此外,在同一個(gè)庫中,實(shí)體名必須是唯一的。PORT(端口名:端口模式數(shù)據(jù)類型; --在進(jìn)行模塊化設(shè)計(jì)時(shí),有時(shí)需要在不改變VHDL源代碼的基礎(chǔ)上,對(duì)設(shè)計(jì)實(shí)體的某些參數(shù)進(jìn)行修改,從而改變?cè)O(shè)計(jì)實(shí)體內(nèi)部的電路結(jié)構(gòu)或規(guī)模,這時(shí)就需要用到類屬參量,即在類屬聲明中聲明的參數(shù)。類屬參量提供了可供外部修改參數(shù)的通道或是窗口。當(dāng)調(diào)用該設(shè)計(jì)實(shí)體時(shí),通過對(duì)類屬參量進(jìn)行重新賦值就能夠?qū)崿F(xiàn)對(duì)設(shè)計(jì)實(shí)體內(nèi)部相應(yīng)邏輯功能的修改,這樣既保證了電路功能的可修改性,又不會(huì)破壞VHDL程序的一致性,提高了代碼的復(fù)用性。類屬聲明部分是可選項(xiàng),不是必須的,如例3-1和例3-2中都沒有類屬聲明。在進(jìn)行模塊化設(shè)計(jì)時(shí),有時(shí)需要在不改變VHDL源代碼的基礎(chǔ)端口聲明確定了端口的數(shù)目、端口上通過的信號(hào)的數(shù)據(jù)類型以及信號(hào)的流動(dòng)方向,這是硬件描述語言的一大特點(diǎn)。硬件電路中信號(hào)的流向,即信號(hào)從什么地方來、做了怎樣的處理、最后輸出到哪里去。
綜上所述,實(shí)體描述的主要內(nèi)容包括:
(1)給實(shí)體取一個(gè)有意義的名稱;
(2)根據(jù)設(shè)計(jì)實(shí)體的外部接口,設(shè)計(jì)相應(yīng)的端口并為端口確定符合邏輯功能的名稱,規(guī)定信號(hào)的流動(dòng)方向和數(shù)據(jù)類型;
(3)根據(jù)需要聲明相應(yīng)的類屬參量。以下就端口聲明和類屬聲明再進(jìn)一步講解。端口聲明確定了端口的數(shù)目、端口上通過的信號(hào)的數(shù)據(jù)類型以及3.4.2端口聲明
端口聲明確定了輸入、輸出端口的數(shù)目和類型,以關(guān)鍵詞PORT引導(dǎo),有端口名、端口模式、數(shù)據(jù)類型三個(gè)要點(diǎn)。
1.端口名
端口名是指賦予每個(gè)端口(引腳)的名稱,通常用一個(gè)或幾個(gè)英文字母或者字母加數(shù)字的方式來命名,如d0、d1、sel、q、qb、input1等。
2.端口模式
端口模式是指這些通道上數(shù)據(jù)的流動(dòng)方向,IEEE1076標(biāo)準(zhǔn)包中定義了四種常用的端口模式:輸入(IN)模式、輸出(OUT)模式、雙向(INOUT)模式、緩沖(BUFFER)模式。3.4.2端口聲明
端口聲明確定了輸入、輸出端口的數(shù)(1)輸入模式用保留字IN來聲明。采用輸入模式聲明的端口信號(hào)的數(shù)據(jù)流向?yàn)閷?shí)體外部到實(shí)體內(nèi)部,即數(shù)據(jù)只能通過此端口被讀入,如例3-1中的端口a、b、s。如果一個(gè)端口信號(hào)被聲明為輸入模式,則其只能作為賦值語句的右值存在,任何給該端口信號(hào)賦值的語句都會(huì)被綜合器報(bào)錯(cuò)。
(2)輸出模式用保留字OUT來聲明。采用輸出模式聲明的端口信號(hào)的數(shù)據(jù)流向?yàn)閷?shí)體內(nèi)部到外部,即數(shù)據(jù)只能通過此端口輸出,如例3-1中的端口y。如果一個(gè)端口信號(hào)被聲明為輸出模式,則其只能作為賦值語句的左值存在,任何讀取該端口信號(hào)的語句都會(huì)被綜合器報(bào)錯(cuò)。(1)輸入模式用保留字IN來聲明。采用輸入模式聲明的端(3)雙向模式用保留字INOUT來聲明。采用雙向模式既可以從實(shí)體內(nèi)部輸出,也可以從實(shí)體外部輸入。但是同一時(shí)刻只能進(jìn)行某一個(gè)數(shù)據(jù)流向的操作,因此雙向模式聲明的端口信號(hào)一般需要一個(gè)信號(hào)進(jìn)行方向的控制。
(4)緩沖模式用保留字BUFFER來聲明。BUFFER模式與INOUT模式類似,既可以輸出,也可以輸入。但是,其輸入的數(shù)據(jù)只允許回讀內(nèi)部輸出的信號(hào)。(3)雙向模式用保留字INOUT來聲明。采用雙向模式既3.?dāng)?shù)據(jù)類型
端口信號(hào)必須確定其數(shù)據(jù)類型,即在其上流動(dòng)的數(shù)據(jù)的類型。在VHDL中有多種數(shù)據(jù)類型,例3-1和例3-2分別用到了BIT和STD_LOGIC數(shù)據(jù)類型。相關(guān)的數(shù)據(jù)類型還有BOOLEAN(布爾型)、INTEGER(整型)、BIT_VECTOR(位矢量型)、STD_LOGIC_VECTOR(標(biāo)準(zhǔn)邏輯矢量型)、TIME(時(shí)間型)、REAL(實(shí)數(shù)型)等數(shù)據(jù)類型。3.?dāng)?shù)據(jù)類型
端口信號(hào)必須確定其數(shù)據(jù)類型,即在其上流VHDL從語言屬性上講是一種強(qiáng)類型語言。VHDL規(guī)定,任何一種數(shù)據(jù)對(duì)象的應(yīng)用都必須嚴(yán)格限定其取值范圍和數(shù)值類型,不同數(shù)據(jù)對(duì)象在不同數(shù)據(jù)類型之間的賦值要作明確的界定,這一點(diǎn)和傳統(tǒng)C語言在數(shù)據(jù)對(duì)象的賦值上有比較大的區(qū)別。雖然這樣的做法在語言的靈活性上要差一些,但在大規(guī)模電路描述的排錯(cuò)上卻是十分有益的,這是VHDL的特點(diǎn)之一。VHDL從語言屬性上講是一種強(qiáng)類型語言。VHDL規(guī)定,任3.4.3類屬聲明
類屬聲明可以聲明多個(gè)類屬參量(或稱類屬值、類屬變量),其中參數(shù)名和數(shù)據(jù)類型是必須的。將例3-1稍作改動(dòng),如例3-6所示。
【例3-6】3.4.3類屬聲明
類屬聲明可以聲明多個(gè)類屬參量(或EDA技術(shù)與VHDL設(shè)計(jì)(西電版)第3章-VHDL語言入門課件(1)在例3-6中加入了以關(guān)鍵詞GENERIC引導(dǎo)的語句(L3),該語句聲明了類屬參量m,其數(shù)據(jù)類型為TIME(時(shí)間類型)。設(shè)置了一個(gè)缺省值10ns,當(dāng)沒有傳入其他具體參數(shù)值時(shí),結(jié)構(gòu)體內(nèi)凡是用到m,其值都為10ns。GENERIC語句所定義的類屬參量與常量十分類似,但它能從外部動(dòng)態(tài)地接受不同的賦值。(1)在例3-6中加入了以關(guān)鍵詞GENERIC引導(dǎo)的語(2)本例中還引入了一個(gè)新的數(shù)據(jù)對(duì)象,即使用關(guān)鍵詞SIGNAL定義的信號(hào)temp(L9),其數(shù)據(jù)類型是BIT。讀者可以將其理解為C語言的變量,作為數(shù)據(jù)的一種暫存節(jié)點(diǎn)。由于temp在結(jié)構(gòu)體內(nèi)定義,屬于內(nèi)部節(jié)點(diǎn)信號(hào),數(shù)據(jù)的進(jìn)出不像端口那樣受方向的限制,所以不必定義其端口模式(即輸入、輸出方向,如IN、OUT)。使用關(guān)鍵詞SIGNAL定義的標(biāo)識(shí)符是信號(hào),信號(hào)屬于數(shù)據(jù)對(duì)象(DataObjects)中的一種。VHDL中共有三類數(shù)據(jù)對(duì)象,分別是:常量(CONSTANT)、變量(VARIABLE)和信號(hào)(SIGNAL)。在第4章中會(huì)對(duì)三種數(shù)據(jù)對(duì)象進(jìn)一步講解,使讀者掌握它們的用法和區(qū)別。(2)本例中還引入了一個(gè)新的數(shù)據(jù)對(duì)象,即使用關(guān)鍵詞SI(3)語句y<=tempAFTERm;表示延遲m(本例是10ns)后再將2選1數(shù)據(jù)選擇器的選擇結(jié)果送到輸出端口y上。
類屬參量多用于模塊化設(shè)計(jì)時(shí)不同層次模塊之間信息的傳遞,讀者可以將其理解為高層次模塊傳遞給底層模塊的形參。例3-6僅僅是類屬參量的一個(gè)簡(jiǎn)單示例,目的是使讀者了解它的聲明格式等,在講解了層次型結(jié)構(gòu)后,將會(huì)用一個(gè)更加完善的例子來進(jìn)一步認(rèn)識(shí)類屬參量實(shí)現(xiàn)參數(shù)傳遞的功能。(3)語句y<=tempAFTERm;表示延3.5結(jié)?構(gòu)?體?描?述
3.5.1結(jié)構(gòu)體描述語句結(jié)構(gòu)
結(jié)構(gòu)體負(fù)責(zé)描述設(shè)計(jì)實(shí)體的內(nèi)部邏輯功能和電路結(jié)構(gòu)。結(jié)構(gòu)體一般由結(jié)構(gòu)體名、說明語句和功能描述語句組成,其一般語句格式如下:
ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS
[說明語句];
BEGIN
功能描述語句;
ENDARCHITECTURE結(jié)構(gòu)體名;3.5結(jié)?構(gòu)?體?描?述
3.5.1結(jié)構(gòu)體結(jié)構(gòu)體名是結(jié)構(gòu)體的標(biāo)識(shí),由設(shè)計(jì)者自行定義,可以根據(jù)結(jié)構(gòu)體的描述方式來命名,如結(jié)構(gòu)化描述形式可以使用結(jié)構(gòu)體名construct,行為描述形式可以使用結(jié)構(gòu)體名behavior(或簡(jiǎn)寫為bhv);但需要注意的是,結(jié)構(gòu)體名也需要符合標(biāo)識(shí)符命名的規(guī)則。結(jié)構(gòu)體描述部分的實(shí)體名應(yīng)和結(jié)構(gòu)體對(duì)應(yīng)實(shí)體的名稱一致。如果一個(gè)實(shí)體具有多個(gè)結(jié)構(gòu)體,結(jié)構(gòu)體的取名不可相重,但不同實(shí)體的結(jié)構(gòu)體可以同名。結(jié)構(gòu)體名是結(jié)構(gòu)體的標(biāo)識(shí),由設(shè)計(jì)者自行定義,可以根據(jù)結(jié)構(gòu)體結(jié)構(gòu)體說明語句位于關(guān)鍵詞ARCHITECTURE和BEGIN之間,主要是對(duì)結(jié)構(gòu)體功能描述語句中將要用到的數(shù)據(jù)類型、常量、信號(hào)、子程序、函數(shù)、元件等的聲明。說明語句并非必須的。在一個(gè)結(jié)構(gòu)體中,說明語句部分聲明的數(shù)據(jù)類型、常量、信號(hào)、子程序、函數(shù)、元件等只能用于該結(jié)構(gòu)體。如果希望它們能夠用于其他的設(shè)計(jì)實(shí)體,則需要作為程序包來處理。
結(jié)構(gòu)體功能描述語句位于關(guān)鍵詞BEGIN和ENDARCHITECTURE之間,負(fù)責(zé)具體邏輯功能和電路結(jié)構(gòu)的描述,可以是并行語句、順序語句或是二者的混合。結(jié)構(gòu)體說明語句位于關(guān)鍵詞ARCHITECTURE和BEG結(jié)構(gòu)體描述的結(jié)束語句“ENDARCHITECTURE結(jié)構(gòu)體名;”是符合VHDL93標(biāo)準(zhǔn)的語法要求的。若根據(jù)VHDL87標(biāo)準(zhǔn)的語法要求,可寫為“END結(jié)構(gòu)體名;”或直接使用“END;”。對(duì)于實(shí)體描述的結(jié)束語句,“ENDENTITY實(shí)體名;”也是符合VHDL93標(biāo)準(zhǔn)語法規(guī)則的,也可根據(jù)VHDL87標(biāo)準(zhǔn)語法要求寫成“END實(shí)體名;”或“END;”的形式。由于目前大多數(shù)EDA工具中的VHDL綜合器可以兼容兩種標(biāo)準(zhǔn)的語法規(guī)則,所以在后面的示例中不再特別指出二者的區(qū)別。需要注意的是,如果綜合器支持的VHDL標(biāo)準(zhǔn)不同,仍需要按照不同的語法規(guī)則進(jìn)行代碼的編寫。結(jié)構(gòu)體描述的結(jié)束語句“ENDARCHITECTURE3.5.2說明語句
例3-7顯示了在結(jié)構(gòu)體說明語句部分使用關(guān)鍵詞TYPE聲明了兩個(gè)新的數(shù)據(jù)類型my_std_logic和color,關(guān)鍵詞SIGNAL聲明了一個(gè)信號(hào)temp,關(guān)鍵詞CONSTANT聲明了一個(gè)常量x,關(guān)鍵詞COMPONENT聲明了半加器元件halfadd,關(guān)鍵詞FUNCTION聲明了一個(gè)函數(shù)max。具體相關(guān)語法將在后續(xù)章節(jié)中繼續(xù)介紹。3.5.2說明語句
例3-7顯示了在結(jié)構(gòu)體說明語句部【例3-7】
ARCHITECTUREbhvOFmux21IS
TYPEmy_std_logicIS(7DOWNTO0)OFSTD_LOGIC;
--新的數(shù)據(jù)類型my_std_logic,含8個(gè)元素的矢量,每個(gè)元素的數(shù)據(jù)類型都是STD_LOGIC
TYPEcolorIS(red,green,blue); --新的數(shù)據(jù)類型color,屬于枚舉型
SIGNALtemp :BIT; --信號(hào)temp,數(shù)據(jù)類型是BIT
CONSTANTx :INTEGER:=7; --常量x,數(shù)據(jù)類型是整型,取值為7
COMPONENThalfadd --元件聲明,將一個(gè)現(xiàn)成的設(shè)計(jì)實(shí)體定義為一個(gè)元件
PORT(a,b:INSTD_LOGIC; --表示在結(jié)構(gòu)體功能描述語句部分將要調(diào)用該半加器元件【例3-7】
ARCHITECTUREbhvOFmuxco,so:OUTSTD_LOGIC);
ENDCOMPONENThalfadd; --元件聲明結(jié)束
FUNCTIONmax(a,b:INSTD_LOGIC_VECTOR)RETUNSTD_LOGIC_VECTOR;
--聲明函數(shù)max,用于比較a和b的大小,a、b的數(shù)據(jù)類型是標(biāo)準(zhǔn)邏輯矢量,返回值是a、b中的最大值,其數(shù)據(jù)類型也是標(biāo)準(zhǔn)邏輯矢量
BEGIN
…
ENDARCHITECTUREbhv;co,so:OUTSTD_LOGIC);
END3.5.3功能描述語句
結(jié)構(gòu)體功能描述語句負(fù)責(zé)描述具體電路的邏輯實(shí)現(xiàn)。功能描述語句中可以包含進(jìn)程、并行信號(hào)賦值語句、元件例化語句、子程序調(diào)用語句等幾類。這幾類語句都是以并行方式工作的,即語句的執(zhí)行不以書寫語句的順序?yàn)轫樞?。而在每一種語句結(jié)構(gòu)的內(nèi)部可能含有并行運(yùn)行的邏輯描述或是順序運(yùn)行的邏輯描述。相對(duì)于C語言一類的軟件描述語言,并行語句結(jié)構(gòu)是VHDL語言最大的特色。
按照具體電路邏輯實(shí)現(xiàn)的方式進(jìn)行分類,VHDL的描述方式可分為結(jié)構(gòu)化建模和行為建模兩類,下面分別進(jìn)行介紹。3.5.3功能描述語句
結(jié)構(gòu)體功能描述語句負(fù)責(zé)描述具1.結(jié)構(gòu)化建模
結(jié)構(gòu)化建模通過明確的硬件實(shí)現(xiàn)來指定電路的功能,它描述設(shè)計(jì)單元的硬件結(jié)構(gòu),表示元件之間的互連。例3-1和例3-2都采用了結(jié)構(gòu)化建模的形式進(jìn)行電路系統(tǒng)的描述。以2選1多路選擇器為例,它的邏輯電路由與門、或門和非門構(gòu)成,而這些基本的邏輯門電路都已經(jīng)是現(xiàn)成的設(shè)計(jì)單元,那么將這些現(xiàn)成的設(shè)計(jì)單元連接就可以構(gòu)成新的電路系統(tǒng),類似于電路原理圖中所畫器件的連接。1.結(jié)構(gòu)化建模
結(jié)構(gòu)化建模通過明確的硬件實(shí)現(xiàn)來指定電另一種常見的結(jié)構(gòu)化建模的描述方式是根據(jù)設(shè)計(jì)的邏輯功能進(jìn)行模塊的劃分,首先進(jìn)行各個(gè)模塊的設(shè)計(jì)和驗(yàn)證;然后在頂層文件中對(duì)多個(gè)模塊進(jìn)行調(diào)用,描述底層各模塊之間的連接關(guān)系,即層次型的VHDL描述,該描述主要采用元件聲明和元件例化語句完成。層次型的VHDL描述將在3.7節(jié)中具體講述。另一種常見的結(jié)構(gòu)化建模的描述方式是根據(jù)設(shè)計(jì)的邏輯功能進(jìn)行2.行為建模
行為建模只規(guī)定了電路系統(tǒng)的功能或行為,不關(guān)心電路的實(shí)際結(jié)構(gòu),沒有明確指明涉及的硬件及連線等,即只關(guān)心“做什么”,不關(guān)心“怎么做”。行為建模是VHDL語言描述的一大特色,是VHDL編程的核心,它使得設(shè)計(jì)者可以在不了解硬件電路結(jié)構(gòu)的情況下實(shí)現(xiàn)電路系統(tǒng)。行為建模的描述形式充分體現(xiàn)了VHDL語言相對(duì)于其他硬件描述語言的優(yōu)勢(shì)。行為建模通常由一個(gè)或多個(gè)進(jìn)程構(gòu)成,每一個(gè)進(jìn)程內(nèi)包含了一系列的順序語句。下面仍以2選1多路選擇器為例來說明行為建模的描述方式。2.行為建模
行為建模只規(guī)定了電路系統(tǒng)的功能或行為,【例3-8】【例3-8】(1)以關(guān)鍵詞PROCESS引導(dǎo)開始、關(guān)鍵詞ENDPROCESS結(jié)束(L12~L17)的是進(jìn)程語句。進(jìn)程語句是最具有VHDL語言特色的語句,因?yàn)樗峁┝艘环N用算法描述硬件行為的方法。在一個(gè)結(jié)構(gòu)體中可以有一個(gè)或多個(gè)進(jìn)程,不同的進(jìn)程間是并行運(yùn)行的,進(jìn)程內(nèi)部是由一系列順序語句構(gòu)成的。進(jìn)程語句的一般結(jié)構(gòu)如下:
[進(jìn)程標(biāo)號(hào):]PROCESS[(敏感信號(hào)參數(shù)表)][IS]
[進(jìn)程說明部分]
BEGIN
順序描述部分
ENDPROCESS[進(jìn)程標(biāo)號(hào)];(1)以關(guān)鍵詞PROCESS引導(dǎo)開始、關(guān)鍵詞ENDP進(jìn)程語句結(jié)構(gòu)一般由三部分組成:敏感信號(hào)參數(shù)表、進(jìn)程說明部分以及順序描述部分,其中敏感信號(hào)參數(shù)表以及進(jìn)程說明部分都是可以省略的。進(jìn)程標(biāo)號(hào)是由設(shè)計(jì)者自行定義的標(biāo)識(shí)符,也是可以省略的。
進(jìn)程說明部分用于定義進(jìn)程所需的局部數(shù)據(jù)環(huán)境,通常是數(shù)據(jù)類型、常數(shù)、子程序、變量等,它們將在順序描述語句中被使用,例3-8沒有說明語句部分。但需要注意,在進(jìn)程說明部分不允許定義信號(hào)和全程變量(4.2.2節(jié)中講述)。以關(guān)鍵詞BEGIN引導(dǎo)開始的順序語句是一段順序執(zhí)行的語句,如IF語句、CASE語句、LOOP語句等。順序語句只在進(jìn)程和函數(shù)、過程結(jié)構(gòu)中使用,在第5章中會(huì)對(duì)各類語句進(jìn)一步講述。進(jìn)程語句結(jié)構(gòu)一般由三部分組成:敏感信號(hào)參數(shù)表、進(jìn)程說明部關(guān)鍵詞PROCESS后的(a,b,s)稱為進(jìn)程的敏感信號(hào)參數(shù)表,通常要求將進(jìn)程中所有的輸入信號(hào)都放在敏感信號(hào)參數(shù)表中。由于PROCESS語句的執(zhí)行依賴于敏感信號(hào)的變化,即當(dāng)某一敏感信號(hào)發(fā)生改變,如信號(hào)s從“1”跳變到“0”時(shí)就將啟動(dòng)進(jìn)程語句,于是進(jìn)程內(nèi)部的順序語句就被執(zhí)行一遍,然后返回進(jìn)程的起始端,進(jìn)入等待狀態(tài),直到下一次敏感信號(hào)參數(shù)表中的敏感信號(hào)再次發(fā)生變化。關(guān)鍵詞PROCESS后的(a,b,s)稱為進(jìn)程的敏感信號(hào)(2)以關(guān)鍵詞IF引導(dǎo)開始、ENDIF結(jié)束(L14~L16)的是條件語句。條件語句是VHDL中重要、常用的順序語句,必須放置在進(jìn)程中使用。關(guān)鍵詞IF后的“s='0'”是判斷表達(dá)式,如果判斷表達(dá)式成立(即s為低電平),則返回一個(gè)布爾型的數(shù)據(jù)類型TRUE,執(zhí)行關(guān)鍵詞THEN后的語句“y<=a”;如果判斷表達(dá)式不成立(即s為高電平),則返回FALSE,執(zhí)行關(guān)鍵詞ELSE后的語句“y<=b”。(2)以關(guān)鍵詞IF引導(dǎo)開始、ENDIF結(jié)束(L14~例3-9顯示一個(gè)結(jié)構(gòu)體中含有兩個(gè)進(jìn)程(pro_1和pro_2)的情況。該例中就使用了進(jìn)程的標(biāo)號(hào),用于區(qū)分不同的進(jìn)程。兩個(gè)進(jìn)程的執(zhí)行是并行、獨(dú)立的,由各自的敏感參數(shù)觸發(fā)。進(jìn)程之間通過信號(hào)temp進(jìn)行通信,信號(hào)具有全局性,因此信號(hào)的定義不能放置于進(jìn)程內(nèi)部。進(jìn)程pro_1用于實(shí)現(xiàn)數(shù)據(jù)a和b的選擇,當(dāng)控制端selx取值為“0”時(shí),選擇數(shù)據(jù)a;反之,選擇數(shù)據(jù)b。進(jìn)程pro_1選擇的數(shù)據(jù)存于信號(hào)temp中。進(jìn)程pro_2用于實(shí)現(xiàn)數(shù)據(jù)c和temp的選擇,當(dāng)控制端sely取值為“0”時(shí),選擇temp;反之,選擇c。因此,該例通過兩個(gè)控制信號(hào)selx和sely實(shí)現(xiàn)3選1數(shù)據(jù)選擇器。例3-9顯示一個(gè)結(jié)構(gòu)體中含有兩個(gè)進(jìn)程(pro_1和pro【例3-9】【例3-9】
下面再通過一個(gè)4位二進(jìn)制比較器的例子來說明PROCESS語句的結(jié)構(gòu)和順序語句的應(yīng)用。
下面再通過一個(gè)4位二進(jìn)制比較器的例子來【例3-10】【例3-10】(1)例3-10中,進(jìn)程語句定義了敏感信號(hào)a和b。a和b為輸入數(shù)據(jù)端口。當(dāng)輸入端口的信號(hào)發(fā)生變化時(shí)將啟動(dòng)進(jìn)程的執(zhí)行。進(jìn)程中的順序語句為條件語句,語句執(zhí)行時(shí)進(jìn)行條件判斷,條件表達(dá)式使用了關(guān)系操作符小于等于“<=”來對(duì)兩個(gè)端口的數(shù)據(jù)進(jìn)行比較,如果條件成立則輸出端口y賦值“0”,否則y被賦值“1”。
(2)例3-10涉及到一個(gè)新的數(shù)據(jù)類型——標(biāo)準(zhǔn)邏輯矢量STD_LOGIC_VECTOR(L6),該類型和STD_LOGIC數(shù)據(jù)類型一樣,都定義在std_logic_1164程序包中。數(shù)據(jù)類型STD_LOGIC_VECTOR是一維數(shù)組,數(shù)組中每個(gè)元素的數(shù)據(jù)類型都是STD_LOGIC型。STD_LOGIC_VECTOR數(shù)據(jù)類型(1)例3-10中,進(jìn)程語句定義了敏感信號(hào)a和b。a和需要定義數(shù)組的寬度,即數(shù)組中元素的個(gè)數(shù),如例3-10中L6通過“3DOWNTO0”定義其數(shù)組寬度為4,即信號(hào)a和b的數(shù)據(jù)類型都是一個(gè)具有4位位寬的矢量,即端口上的值由4位二進(jìn)制數(shù)構(gòu)成。通過數(shù)組元素排列指示關(guān)鍵詞“DOWNTO”確定數(shù)組元素下標(biāo)從左向右依次遞減:a(3)、a(2)、a(1)、a(0)和b(3)、b(2)、b(1)、b(0)。假設(shè)a值為“1110”,b值為“1101”,則利用關(guān)系操作符從左向右依次比較每一位的值:a(3)?=?b(3)?=?'1'、a(2)?=?b(2)?=?'1'、a(1)?=?'1'>?b(1)?=?'0',所以最后結(jié)果為a?>?b,即判斷表達(dá)式不成立。另一常用的數(shù)組元素排列指示關(guān)鍵詞“TO”用于確定數(shù)組元素下標(biāo)從左向右遞增,如:a(0)、a(1)、a(2)、a(3)。需要注意的是,關(guān)系操作符進(jìn)行判斷都是通過從左至右逐一對(duì)元素進(jìn)行比較來決定的,并不管原數(shù)組的下標(biāo)定義順序,即不管數(shù)組下標(biāo)是使用DOWNTO還是TO,比較都是從左至右。需要定義數(shù)組的寬度,即數(shù)組中元素的個(gè)數(shù),如例3-10中L6通
3.6配置
對(duì)既定的電路功能,對(duì)應(yīng)的電路結(jié)構(gòu)并不是唯一的,它可以對(duì)應(yīng)不同的電路結(jié)構(gòu)方式。這意味著一個(gè)VHDL的設(shè)計(jì)只能有一個(gè)實(shí)體,但是可以有幾個(gè)結(jié)構(gòu)體,即使用幾種方案實(shí)現(xiàn)一種功能,其中每個(gè)結(jié)構(gòu)體的地位是相同的,但結(jié)構(gòu)體名不能重復(fù)。
配置(Configuration)可以把特定的結(jié)構(gòu)體指定給一個(gè)確定的實(shí)體,它描述實(shí)體與結(jié)構(gòu)體之間的連接關(guān)系。在仿真時(shí),可以利用配置語句來為同一實(shí)體配置不同的結(jié)構(gòu)體,進(jìn)行性能對(duì)比以得到最佳的設(shè)計(jì)方法。配置語句的一般語句格式如下:3.6配置
對(duì)既定的電路功能,CONFIGURATION配置名OF實(shí)體名IS
[配置說明];
ENDCONFIGURATION配置名;
配置語句根據(jù)不同的情況,其配置說明有簡(jiǎn)有繁,以下是最簡(jiǎn)單的缺省配置格式的結(jié)構(gòu):
CONFIGURATION配置名OF實(shí)體名IS
FOR選配結(jié)構(gòu)體名
ENDFOR;
ENDCONFIGURATION配置名;
該配置格式用于不包含塊(Block)和元件(Component)的結(jié)構(gòu)體。例3-11是以2選1多路選擇器為例配置語句的應(yīng)用。CONFIGURATION配置名OF實(shí)體名【例3-11】【例3-11】EDA技術(shù)與VHDL設(shè)計(jì)(西電版)第3章-VHDL語言入門課件3.7層次結(jié)構(gòu)的VHDL描述
對(duì)于大規(guī)模的電路系統(tǒng)設(shè)計(jì),可以將設(shè)計(jì)分成多個(gè)文件,使用層次化、分模塊的設(shè)計(jì)方式,它能夠使一個(gè)大型設(shè)計(jì)分工協(xié)作,仿真測(cè)試更加容易,代碼維護(hù)或升級(jí)更加便利。3.7層次結(jié)構(gòu)的VHDL描述
對(duì)于大規(guī)3.7.1元件聲明和元件例化
下面以一個(gè)4選1多路選擇器的例子來說明層次結(jié)構(gòu)的VHDL描述形式。例3-1(或例3-8)已經(jīng)使用VHDL語言實(shí)現(xiàn)了2選1多路選擇器,接下來就可以利用已經(jīng)實(shí)現(xiàn)的2選1多路選擇器構(gòu)建4選1多路選擇器,其電路結(jié)構(gòu)如圖3-11所示。d0、d1、d2、d3是4個(gè)輸入數(shù)據(jù),s0、s1是控制端口,決定數(shù)據(jù)的輸出。2選1多路選擇器是底層文件,作為頂層文件待調(diào)用的元件。例3-12是按照?qǐng)D3-11結(jié)構(gòu)完成的頂層文件。需要注意的是,例3-1中使用的數(shù)據(jù)類型是BIT,如果使用例3-1中設(shè)計(jì)的2選1多路選擇器作為底層待調(diào)用元件,需要將數(shù)據(jù)類型改為STD_LOGIC。3.7.1元件聲明和元件例化
下面以一個(gè)4選1多路選圖3-114選1多路選擇器電路結(jié)構(gòu)圖3-114選1多路選擇器電路結(jié)構(gòu)【例3-12】【例3-12】例3-12確定了頂層文件實(shí)體名mux41,在實(shí)體描述部分定義了頂層的輸入、輸出端口。結(jié)構(gòu)體部分首先在說明語句處定義了信號(hào)x1和x2,用于器件內(nèi)部的連接線;利用關(guān)鍵詞COMPONENT聲明了底層待調(diào)用元件mux21。結(jié)構(gòu)體功能描述語句部分利用端口映射語句PORTMAP將三個(gè)mux21元件連接起來構(gòu)成了4選1多路選擇器。由此例可以看出,層次結(jié)構(gòu)的VHDL描述包含兩個(gè)內(nèi)容:元件聲明和元件例化。例3-12確定了頂層文件實(shí)體名mux41,在實(shí)體描述部分1.元件聲明
元件聲明是把一個(gè)現(xiàn)成的設(shè)計(jì)實(shí)體定義為一個(gè)元件,即封裝,只留出對(duì)外的接口界面。元件聲明語句的功能是對(duì)待調(diào)用的元件作出調(diào)用聲明,它的一般語句格式如下:
COMPONENT元件名
[GENERIC(類屬表);]
PORT(端口名表);
ENDCOMPONENT元件名;1.元件聲明
元件聲明是把一個(gè)現(xiàn)成的設(shè)計(jì)實(shí)體定義為一元件聲明以關(guān)鍵詞COMPONENT開始,元件名是待調(diào)用底層設(shè)計(jì)實(shí)體的實(shí)體名。類屬表部分不是必須的,當(dāng)有需要傳遞的類屬參量時(shí)才需要。端口名表需要列出該元件對(duì)外通信的各端口名,與實(shí)體中的PORT語句一致。所以,對(duì)需要調(diào)用的元件可以將對(duì)應(yīng)的VHDL代碼的實(shí)體描述部分直接復(fù)制過來即可,但不要忘記關(guān)鍵詞需要由ENTITY改為COMPONENT。元件聲明必須放在關(guān)鍵詞ARCHITECTURE和BEGIN之間,即結(jié)構(gòu)體說明語句部分。元件聲明以關(guān)鍵詞COMPONENT開始,元件名是待調(diào)用底2.元件例化
元件例化語句是底層元件與當(dāng)前設(shè)計(jì)實(shí)體的連接說明,一般語句格式如下:
例化名:元件名PORTMAP([端口名=>]連接端口名,
?[端口名=>]連接端口名,
…);
例化名是必須的,且在結(jié)構(gòu)體中是唯一的,可以看做頂層電路系統(tǒng)中需要接受底層元件的一個(gè)插座的編號(hào)名稱。元件名與聲明時(shí)的元件名一致,即為待調(diào)用設(shè)計(jì)實(shí)體的實(shí)體名。PORTMAP語句可實(shí)現(xiàn)端口之間的映射(連接)。端口名指元件定義語句中定義的端口名稱,即底層待調(diào)用元件的端口。2.元件例化
元件例化語句是底層元件與當(dāng)前設(shè)計(jì)實(shí)體的它僅代表連接關(guān)系而不代表數(shù)據(jù)流動(dòng)的方向。符號(hào)“=>”左側(cè)放置端口名,右側(cè)放置連接端口名。連接端口名指當(dāng)前電路系統(tǒng)中準(zhǔn)備與接入元件相連的端口,即頂層系統(tǒng)端口或頂層文件中定義的信號(hào)。從語句格式中可以看出,端口名和連接符號(hào)不是必須的,也就是說端口間的映射關(guān)系有兩種方式:名稱映射和位置映射。它僅代表連接關(guān)系而不代表數(shù)據(jù)流動(dòng)的方向。符號(hào)“=>”左側(cè)放置(1)名稱映射是利用對(duì)應(yīng)的接口名稱進(jìn)行連接,就是將元件的各端口名稱賦予頂層系統(tǒng)中的信號(hào)名稱,即端口名與連接端口名的映射。例3-12采用的就是這種方式。名稱映射的優(yōu)點(diǎn)是端口的順序可以任意變化,如例3-13所示,與例3-12完全一致。
【例3-13】
u1:mux21PORTMAP(s=>s0,b=>d1,a=>d0,y=>x1);--改變端口順序
u2:mux21PORTMAP(b=>d3,a=>d2,s=>s0,y=>x2);
u3:mux21PORTMAP(a=>x1,s=>s1,b=>x2,y=>f);(1)名稱映射是利用對(duì)應(yīng)的接口名稱進(jìn)行連接,就是將元件(2)位置映射是指在PORTMAP語句中不寫出端口名和連接符號(hào)“=>”,僅指定連接端口名,但連接端口名的書寫順序必須與元件端口說明中信號(hào)的書寫順序一一對(duì)應(yīng)。例3-14將顯示采用位置映射方式實(shí)現(xiàn)的4選1多路選擇器的元件例化。如果將例化u1改為“u1:mux21PORTMAP(d0,s0,d1,x1);”,則由于書寫順序的不對(duì)應(yīng),將控制端口s0連接到元件mux21的數(shù)據(jù)端口b上,而將數(shù)據(jù)d1連接到mux21的控制端口s上,最后造成錯(cuò)誤的結(jié)果。
【例3-14】
u1:mux21PORTMAP(d0,d1,s0,x1);
u2:mux21PORTMAP(d2,d3,s0,x2);
u3:mux21PORTMAP(x1,x2,s1,f);(2)位置映射是指在PORTMAP語句中不寫出端口名元件例化也可采用直接例化的形式,即可以省略元件聲明部分。例3-15將顯示采用直接例化的形式實(shí)現(xiàn)4選1多路選擇器。
【例3-15】
ARCHITECTUREconstructOFmux41IS
SIGNALx1:STD_LOGIC;
SIGNALx2:STD_LOGIC;
BEGIN
u1:ENTITYWORK.mux21PORTMAP(a=>d0,b=>d1,s=>s0,y=>x1);--直接例化
u2:ENTITYWORK.mux21PORTMAP(a=>d2,b=>d3,s=>s0,y=>x2);
u3:ENTITYWORK.mux21PORTMAP(a=>x1,b=>x2,s=>s1,y=>f);
END;元件例化也可采用直接例化的形式,即可以省略元件聲明部分。圖3-12全加器電路結(jié)構(gòu)圖圖3-12全加器電路結(jié)構(gòu)圖最后,請(qǐng)讀者根據(jù)元件聲明和元件例化的相關(guān)內(nèi)容以及3.2.2節(jié)中設(shè)計(jì)的半加器,以半加器為底層元件,采用層次結(jié)構(gòu)的VHDL描述形式,實(shí)現(xiàn)一位全加器的設(shè)計(jì),其電路結(jié)構(gòu)圖如圖3-12所示。最后,請(qǐng)讀者根據(jù)元件聲明和元件例化的相關(guān)內(nèi)容以及3.2.3.7.2類屬參量的應(yīng)用
如3.4.3節(jié)所述,類屬參量多用于模塊化設(shè)計(jì)時(shí)不同層次模塊之間信息的傳遞,可以將其理解為高層次模塊傳遞給底層模塊的形參。下面通過兩個(gè)例子來進(jìn)行介紹。例3-17是一個(gè)頂層文件,它通過例化語句調(diào)用了例3-16,對(duì)其進(jìn)行了參數(shù)的傳遞。在例3-16中,類屬參量n的缺省取值為3,但n的具體取值可通過例3-17中參數(shù)傳遞映射GENERICMAP語句動(dòng)態(tài)指定。3.7.2類屬參量的應(yīng)用
如3.4.3節(jié)所述,類屬參【例3-16】【例3-16】EDA技術(shù)與VHDL設(shè)計(jì)(西電版)第3章-VHDL語言入門課件【例3-17】【例3-17】EDA技術(shù)與VHDL設(shè)計(jì)(西電版)第3章-VHDL語言入門課件(1)例3-16中的L6使用關(guān)鍵詞GENERIC聲明了類屬參量n,其數(shù)據(jù)類型為整型,設(shè)置缺省值為3。L7利用n值來確定端口信號(hào)矢量a的長(zhǎng)度,即標(biāo)準(zhǔn)邏輯矢量所包含的元素個(gè)數(shù)。
(2)例3-16中的L14使用關(guān)鍵詞VARIABLE聲明了變量int,用于數(shù)據(jù)的暫時(shí)存儲(chǔ)。變量的聲明必須在進(jìn)程內(nèi)部,它是一個(gè)局部量,不能跳出聲明它的進(jìn)程使用。變量的賦值符號(hào)是“:=”,L16為變量賦初值1。如前所述,變量與信號(hào)都屬于數(shù)據(jù)對(duì)象,它們的功能相似,但應(yīng)注意變量與信號(hào)的區(qū)別:①聲明位置不同,信號(hào)的聲明在結(jié)構(gòu)體的說明語句部分,變量的聲明在進(jìn)程或子程序內(nèi)部;②聲明位置的不同決定了它們的使用范圍不同,如在結(jié)構(gòu)體說明語句部分聲明(1)例3-16中的L6使用關(guān)鍵詞GENERIC聲明了的信號(hào)在整個(gè)結(jié)構(gòu)體內(nèi)都可以使用,但在進(jìn)程和子程序中聲明的變量則只能在該進(jìn)程或子程序內(nèi)部使用;③賦值符號(hào)的不同,信號(hào)的賦值符號(hào)是“<=”,而變量的賦值符號(hào)是“:=”。其區(qū)別將在第4章中進(jìn)一步深入介紹。
(3)?例3-16中的L17~L20使用了循環(huán)語句LOOP,屬于FOR/LOOP語句。關(guān)鍵詞FOR后的循環(huán)變量i是一個(gè)臨時(shí)變量,由設(shè)計(jì)者自行命名,屬于LOOP語句的局部變量,因此不需要事先定義,但在LOOP語句的范圍內(nèi)不能再使用其他與此循環(huán)變量同名的標(biāo)識(shí)符。關(guān)鍵詞IN后用來確定循環(huán)次數(shù),循環(huán)變量從循環(huán)次數(shù)指定的初值開始,每執(zhí)行完一次就加1,直至達(dá)到循環(huán)次數(shù)指定的最大值為止。FOR/LOOP語句的一般語句格式如下:的信號(hào)在整個(gè)結(jié)構(gòu)體內(nèi)都可以使用,但在進(jìn)程和子程序中聲明的變量[LOOP標(biāo)號(hào):]FOR循環(huán)變量IN循環(huán)次數(shù)范圍LOOP
順序語句;
ENDLOOP[LOOP標(biāo)號(hào)];
(4)例3-17中的L11~L15對(duì)元件andn進(jìn)行聲明,L17~L20是元件例化,其中使用參數(shù)傳遞映射語句GENERICMAP實(shí)現(xiàn)了對(duì)類屬參量n的賦值。以元件u1為例,n取值為2,即信號(hào)a含有兩個(gè)元素,LOOP語句實(shí)現(xiàn)兩次循環(huán),最終實(shí)現(xiàn)一個(gè)2輸入與門的邏輯。[LOOP標(biāo)號(hào):]FOR循環(huán)變量IN循環(huán)次數(shù)范3.8簡(jiǎn)單時(shí)序電路的描述
以上所述示例都是組合邏輯電路,VHDL語言能夠進(jìn)行時(shí)序邏輯電路的描述,且因?yàn)樗袨榻5奶攸c(diǎn),描述時(shí)序電路更加方便。觸發(fā)器是最簡(jiǎn)單、最具代表性的時(shí)序電路,它是數(shù)字系統(tǒng)設(shè)計(jì)中最基本的底層時(shí)序單元。觸發(fā)器的VHDL描述包含了VHDL許多有特色的語言現(xiàn)象,例3-18顯示了一個(gè)D觸發(fā)器的描述,其仿真結(jié)果如圖3-13所示。3.8簡(jiǎn)單時(shí)序電路的描述
以上所述示例都是組【例3-18】【例3-18】圖3-13D觸發(fā)器時(shí)序波形圖3-13D觸發(fā)器時(shí)序波形從仿真結(jié)果可以看出,當(dāng)時(shí)鐘信號(hào)clk上升沿到來時(shí),輸出信號(hào)q隨輸入信號(hào)d的變化而變化,以實(shí)現(xiàn)D觸發(fā)器的功能。例3-18涉及的相關(guān)語法如下:
(1)?IF語句中的判斷表達(dá)式“clk'EVENTANDclk?=?'1'?”用于檢測(cè)時(shí)鐘信號(hào)clk的上升沿(L15),即只要有時(shí)鐘信號(hào)clk的上升沿到來,表達(dá)式將輸出TURE,執(zhí)行賦值語句“q1<=d”,從而實(shí)現(xiàn)D觸發(fā)器的功能。從仿真結(jié)果可以看出,當(dāng)時(shí)鐘信號(hào)clk上升沿到來時(shí),輸出信(2)關(guān)鍵詞EVENT是預(yù)定義的信號(hào)類屬性,用來獲得指定對(duì)象行為的信息,其格式一般是:<對(duì)象>‘EVENT。屬性EVENT表示如果信號(hào)在很短的時(shí)間內(nèi)發(fā)生變化,則返回TURE。L15表示:信號(hào)clk在一小段時(shí)間內(nèi)發(fā)生變化,且變化后clk取值為“1”,兩者都成立的情況下,可以推斷clk出現(xiàn)了一個(gè)上升沿,判斷表達(dá)式輸出為TURE。(2)關(guān)鍵詞EVENT是預(yù)定義的信號(hào)類屬性,用來獲得指定對(duì)(3)也可采用其他的方式來進(jìn)行上升沿的檢測(cè),如例3-19~例3-21所示。由于clk信號(hào)的數(shù)據(jù)類型是STD_LOGIC,則它可能的取值有9種,那么語句“clk'EVENTANDclk='1'”并不能保證信號(hào)clk發(fā)生跳變前的值是“0”(有可能是從“Z”到“1”的跳變),這樣就不能確保clk出現(xiàn)了一個(gè)上升沿。例3-19使用了信號(hào)屬性LAST_VALUE,它表示在最后一次事件發(fā)生前信號(hào)的值,如果“clk'LAST_VALUE='0'”成立,則確保了信號(hào)clk發(fā)生變化前的值為“0”。例3-21使用了函數(shù)rising_egde(),該函數(shù)是在IEEE庫的標(biāo)準(zhǔn)程序包std_logic_1164中的預(yù)定義函數(shù),只能用于數(shù)據(jù)類型STD_LOGIC,指定信號(hào)的值必須是“0”到“1”的轉(zhuǎn)換,(3)也可采用其他的方式來進(jìn)行上升沿的檢測(cè),如例3-1不允許“Z”或“X”到1的轉(zhuǎn)換。同樣在std_logic_1164程序包中還定義了測(cè)試下降沿的函數(shù)falling_edge(),指定信號(hào)的值必須是“1”到“0”的轉(zhuǎn)換。需要注意的是,在使用這兩個(gè)函數(shù)前必須打開IEEE庫和std_logic_1164程序包。雖然,例3-19~例3-21是更為嚴(yán)格的上升沿的檢測(cè)方式,但考慮到多數(shù)綜合器并不理會(huì)邊沿檢測(cè)語句中信號(hào)的STD_LOGIC數(shù)據(jù)類型,所以最常用的檢測(cè)語句仍是“clk'EVENTANDclk='1'”。不允許“Z”或“X”到1的轉(zhuǎn)換。同樣在std_logic_1【例3-19】
PROCESS(clk)
BEGIN
IFclk'EVENTANDclk='1'ANDclk'LAST_VALUE='0'THENq1<=d;
ENDIF;
ENDPROCESS;【例3-19】
PROCESS(clk)
【例3-20】
PROCESS(clk)
BEGIN
IFclk=‘1’ANDclk‘LAST_VALUE=’0‘THENq1<=d;
ENDIF;
ENDPROCESS;【例3-20】
PROCESS(clk)
BEGI【例3-21】
PROCESS(clk)
BEGIN
IFrising_edge(clk)THENq1<=d;
ENDIF;
ENDPROCESS;【例3-21】
PROCESS(clk)
BE(4)例3-18的IF語句屬于單分支條件語句,對(duì)于不滿足條件(即沒有上升沿到來)的情況,VHDL的綜合器會(huì)解釋成跳過賦值語句q1<=d不予執(zhí)行,這意味著保持q1的原值不變。對(duì)于數(shù)字電路來說,當(dāng)輸入改變后仍能保持原值不變,就意味著使用了具有存儲(chǔ)功能的元件,必須引進(jìn)時(shí)序元件(寄存器)來保存q1的原值,直到滿足IF語句的判斷條件后才能更新q1的值。然而必須注意,雖然在構(gòu)成時(shí)序電路方面,可以利用這種單分支條件語句所具有的獨(dú)特功能構(gòu)成時(shí)序電路,但在利用條件語句進(jìn)行純組合電路設(shè)計(jì)時(shí),如果沒有充分考慮到電路中所有可能出現(xiàn)的條件,即沒有列出所有的條件及其對(duì)應(yīng)的處理方法就會(huì)綜合出設(shè)計(jì)者不希望得到的組合與時(shí)序電路的混合體。因此初學(xué)者在使用IF語句形式的時(shí)候要特別注意單分支IF語句的使用。
(4)例3-18的IF語句屬于單分支條件語句,對(duì)于不滿第3章VHDL語言入門
3.1VHDL語言概述3.2兩個(gè)簡(jiǎn)單的組合電路示例3.3庫和程序包3.4實(shí)體描述3.5結(jié)構(gòu)體描述3.6配置3.7層次結(jié)構(gòu)的VHDL描述3.8簡(jiǎn)單時(shí)序電路的描述第3章VHDL語言入門
3.1VHDL語言概述3.1VHDL語言概述
VHDL的主要目的是進(jìn)行系統(tǒng)的描述、行為的建模與仿真。盡管所有的VHDL代碼都是可以仿真的,但并不是所有代碼都是可以綜合的,這取決于各EDA廠商綜合器對(duì)VHDL的支持程度。
與其他的硬件描述語言相比,VHDL具有更強(qiáng)的行為描述能力,從而決定了它成為數(shù)字系統(tǒng)設(shè)計(jì)領(lǐng)域最佳的硬件描述語言之一。強(qiáng)大的行為描述能力是使其避開具體的器件結(jié)構(gòu),從邏輯行為上成為描述和設(shè)計(jì)大規(guī)模電子系統(tǒng)的重要保證。3.1VHDL語言概述
VHDL的主要目的VHDL語言的優(yōu)勢(shì)如下:
(1)?VHDL有豐富的語句形式和庫函數(shù),使其在系統(tǒng)的設(shè)計(jì)早期就能從行為特性上查驗(yàn)系統(tǒng)的功能可行性,并隨時(shí)可對(duì)設(shè)計(jì)進(jìn)行仿真。
(2)?VHDL語句的行為描述能力和代碼結(jié)構(gòu)決定了它具有支持大規(guī)模設(shè)計(jì)的分解和已有設(shè)計(jì)的再利用功能,符合大規(guī)模系統(tǒng)所需的多人協(xié)同高效工作的要求。
(3)?VHDL對(duì)設(shè)計(jì)的描述具有相對(duì)獨(dú)立性,開發(fā)者可以不懂硬件的結(jié)構(gòu),也不必關(guān)心最終設(shè)計(jì)實(shí)現(xiàn)的目標(biāo)器件是什么,便可進(jìn)行相對(duì)獨(dú)立的設(shè)計(jì)。
(4)?VHDL與設(shè)計(jì)平臺(tái)無關(guān),可移植性較好。VHDL語言的優(yōu)勢(shì)如下:
(1)?VHDL有豐富的(5)?VHDL是最早成為IEEE標(biāo)準(zhǔn)的硬件描述語言,使用廣泛,資料分享和查找非常方便,對(duì)初學(xué)者學(xué)習(xí)非常有幫助。
需要特別注意的是,VHDL與常規(guī)計(jì)算機(jī)高級(jí)程序設(shè)計(jì)語言有所不同,VHDL語句從根本上講是并發(fā)執(zhí)行的,只有在進(jìn)程(Process)、函數(shù)(Function)和過程(Procedure)內(nèi)部的語句才是順序執(zhí)行的。
VHDL描述了電路設(shè)計(jì)的行為、功能、輸入以及輸出,其本質(zhì)是用程序語言的方式來描述硬件。圖3-1顯示了VHDL
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年點(diǎn)火線圈項(xiàng)目申請(qǐng)報(bào)告模范
- 2025年建筑行業(yè)策劃策略與綠色施工協(xié)議書
- 2025年子女監(jiān)護(hù)權(quán)策劃補(bǔ)充協(xié)議的法律效力分析
- 2025年醫(yī)療器械供應(yīng)與醫(yī)療服務(wù)合作框架協(xié)議
- 2025年先進(jìn)汽車修理設(shè)施租賃合同
- 2025年停車場(chǎng)地承包經(jīng)營(yíng)協(xié)議范本
- 2025年勞動(dòng)者家庭醫(yī)療保健策劃與子女援助協(xié)議
- 2025年?duì)幎焚r償和解協(xié)議格式
- 2025年合作導(dǎo)師協(xié)議范本
- 2025年農(nóng)業(yè)發(fā)展公司技術(shù)咨詢服務(wù)合同范本
- 《病史采集》課件
- 十大護(hù)理安全隱患
- 2025年新生兒黃疸診斷與治療研究進(jìn)展
- 廣東大灣區(qū)2024-2025學(xué)年度高一上學(xué)期期末統(tǒng)一測(cè)試英語試題(無答案)
- 失效模式和效應(yīng)分析護(hù)理
- 2025年四川中煙工業(yè)限責(zé)任公司招聘110人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年福建省莆田市數(shù)學(xué)三上期末質(zhì)量檢測(cè)模擬試題含解析
- 2025年山東菏澤投資發(fā)展集團(tuán)限公司招聘61人管理單位筆試遴選500模擬題附帶答案詳解
- 幕墻工程項(xiàng)目管理手冊(cè)
- 2025山東能源集團(tuán)新能源限公司招聘12人管理單位筆試遴選500模擬題附帶答案詳解
- 課題申報(bào)書:反饋對(duì)青少年努力投入的影響機(jī)制及干預(yù)研究
評(píng)論
0/150
提交評(píng)論