




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第3章VHDL語言入門
3.1VHDL語言概述3.2兩個簡單的組合電路示例3.3庫和程序包3.4實(shí)體描述3.5結(jié)構(gòu)體描述3.6配置3.7層次結(jié)構(gòu)的VHDL描述3.8簡單時序電路的描述第3章VHDL語言入門
3.1VHDL語言概述3.1VHDL語言概述
VHDL的主要目的是進(jìn)行系統(tǒng)的描述、行為的建模與仿真。盡管所有的VHDL代碼都是可以仿真的,但并不是所有代碼都是可以綜合的,這取決于各EDA廠商綜合器對VHDL的支持程度。
與其他的硬件描述語言相比,VHDL具有更強(qiáng)的行為描述能力,從而決定了它成為數(shù)字系統(tǒng)設(shè)計領(lǐng)域最佳的硬件描述語言之一。強(qiáng)大的行為描述能力是使其避開具體的器件結(jié)構(gòu),從邏輯行為上成為描述和設(shè)計大規(guī)模電子系統(tǒng)的重要保證。3.1VHDL語言概述
VHDL的主要目的VHDL語言的優(yōu)勢如下:
(1)?VHDL有豐富的語句形式和庫函數(shù),使其在系統(tǒng)的設(shè)計早期就能從行為特性上查驗(yàn)系統(tǒng)的功能可行性,并隨時可對設(shè)計進(jìn)行仿真。
(2)?VHDL語句的行為描述能力和代碼結(jié)構(gòu)決定了它具有支持大規(guī)模設(shè)計的分解和已有設(shè)計的再利用功能,符合大規(guī)模系統(tǒng)所需的多人協(xié)同高效工作的要求。
(3)?VHDL對設(shè)計的描述具有相對獨(dú)立性,開發(fā)者可以不懂硬件的結(jié)構(gòu),也不必關(guān)心最終設(shè)計實(shí)現(xiàn)的目標(biāo)器件是什么,便可進(jìn)行相對獨(dú)立的設(shè)計。
(4)?VHDL與設(shè)計平臺無關(guān),可移植性較好。VHDL語言的優(yōu)勢如下:
(1)?VHDL有豐富的(5)?VHDL是最早成為IEEE標(biāo)準(zhǔn)的硬件描述語言,使用廣泛,資料分享和查找非常方便,對初學(xué)者學(xué)習(xí)非常有幫助。
需要特別注意的是,VHDL與常規(guī)計算機(jī)高級程序設(shè)計語言有所不同,VHDL語句從根本上講是并發(fā)執(zhí)行的,只有在進(jìn)程(Process)、函數(shù)(Function)和過程(Procedure)內(nèi)部的語句才是順序執(zhí)行的。
VHDL描述了電路設(shè)計的行為、功能、輸入以及輸出,其本質(zhì)是用程序語言的方式來描述硬件。圖3-1顯示了VHDL的基本硬件模型。VHDL將一個電路系統(tǒng)分為外部可見部分和內(nèi)部隱藏部分。利用VHDL實(shí)現(xiàn)一個電路系統(tǒng),首先需要定義實(shí)體(Entity),在實(shí)體定義中完成與外部接口的(5)?VHDL是最早成為IEEE標(biāo)準(zhǔn)的硬件描述語言,定義,包括輸入接口(InputPorts)和輸出接口(OutputPorts)的定義,這是可見部分。實(shí)現(xiàn)電路功能的具體算法則在結(jié)構(gòu)體(Architecture)中定義。當(dāng)其他設(shè)計需要引用該設(shè)計時(或稱為對其進(jìn)行重用時),這部分像一個黑盒子一樣,是隱藏的。結(jié)構(gòu)體內(nèi)部往往包含相互連接的多個進(jìn)程和元件,它們都是并行運(yùn)行的。結(jié)構(gòu)體由信號賦值語句、進(jìn)程語句和元件例化語句等組成。進(jìn)程中可以調(diào)用子程序。不同的進(jìn)程之間通過信號進(jìn)行信息的交互。VHDL里的進(jìn)程既可以生成由觸發(fā)器等構(gòu)成的時序電路,也可以生成由邏輯門構(gòu)成的組合電路。定義,包括輸入接口(InputPorts)和輸出接口(Ou圖3-1VHDL基本硬件模型圖3-1VHDL基本硬件模型3.2兩個簡單的組合電路示例
本節(jié)以兩個簡單的示例引出VHDL語言的基本結(jié)構(gòu)、語句表述及一些語法規(guī)則。
3.2兩個簡單的組合電路示例
本節(jié)以兩個簡單的3.2.12選1多路選擇器的設(shè)計
在數(shù)字電路中,2選1多路選擇器是組合電路的典型代表。假設(shè)有a和b兩個數(shù)據(jù),控制信號為s,當(dāng)s取值為0時,選擇數(shù)據(jù)a作為輸出;否則,選擇數(shù)據(jù)b作為輸出。按照數(shù)字電路的設(shè)計方法,首先需要列出真值表、卡諾圖,然后通過化簡卡諾圖得到最簡邏輯表達(dá)式,再根據(jù)所選擇邏輯器件的要求(如采用與門、或門實(shí)現(xiàn)電路,或只能采用與非門實(shí)現(xiàn)電路)進(jìn)行表達(dá)式的變換,確認(rèn)最終的電路形式。圖3-2是2選1多路選擇器的卡諾圖及化簡后的邏輯表達(dá)式,圖3-3是根據(jù)邏輯表達(dá)式確定的最終電路形式。3.2.12選1多路選擇器的設(shè)計
在數(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)相對應(yīng)的采用VHDL語言實(shí)現(xiàn)的電路描述。
【例3-1】例3-1是與圖3-3電路結(jié)構(gòu)相對應(yīng)的采用VHDL語言實(shí)現(xiàn)由例3-1可見,此電路的VHDL描述由兩部分組成,其中L2~L5是實(shí)體描述,L7~L10是結(jié)構(gòu)體描述。下面就本例涉及到的一些語法作簡單的講解。
(1)以關(guān)鍵詞ENTITY為引導(dǎo)、ENDENTITY為結(jié)束的語句部分,稱為實(shí)體。其中mux21是設(shè)計者自行取定的實(shí)體名,取名最好依據(jù)相應(yīng)功能來確定,使其具有可讀性。VHDL的實(shí)體描述了電路器件的外部情況及信號端口的基本性質(zhì),如信號流動的方向(輸入、輸出或其他)、在其上流動的信號的數(shù)據(jù)類型等。關(guān)鍵詞PORT表示定義端口。本例中定義了a、b、s三個輸入端口(輸入信號),其數(shù)據(jù)類型為位(BIT)數(shù)據(jù)類型。BIT數(shù)據(jù)類型的信號取值只有邏輯“0”和由例3-1可見,此電路的VHDL描述由兩部分組成,其中L“1”兩種,在VHDL中表達(dá)時必須加單引號,否則VHDL綜合器會將其解釋為另一種數(shù)據(jù)類型——整型。BIT數(shù)據(jù)類型可以參與邏輯運(yùn)算,其結(jié)果仍是邏輯位的數(shù)據(jù)類型。VHDL語法規(guī)定,任何一種數(shù)據(jù)對象的應(yīng)用都必須嚴(yán)格限定其數(shù)據(jù)類型和取值范圍,不同數(shù)據(jù)類型和取值范圍的數(shù)據(jù)對象將不能相互賦值或進(jìn)行其他操作。本例還定義了一個輸出端口(輸出信號)y,其數(shù)據(jù)類型也是BIT。“1”兩種,在VHDL中表達(dá)時必須加單引號,否則VHDL綜合(2)以關(guān)鍵詞ARCHITECTURE為引導(dǎo)、ENDARCHITECTURE為結(jié)尾的語句部分,稱為結(jié)構(gòu)體。其中construct是結(jié)構(gòu)體的名稱,也是由設(shè)計者自行定義的。VHDL的結(jié)構(gòu)體負(fù)責(zé)描述電路器件的內(nèi)部邏輯功能和電路結(jié)構(gòu)。關(guān)鍵詞BEGIN意味著具體算法的開始。符號“<=”稱為賦值符號,即把符號右邊的數(shù)據(jù)向符號左邊的輸出端口y傳遞。VHDL要求賦值符號“<=”兩邊的信號數(shù)據(jù)類型必須一致。L9中出現(xiàn)的AND、OR、NOT是邏輯操作符號,分別表示與、或、非。VHDL一共有7種邏輯操作符,它們分別是AND(與)、OR(或)、NOT(非)、NAND(與非)、NOR(或非)、XOR(異或)、XNOR(同或),其功能與數(shù)字電路中常用的邏輯門相同。具體邏輯符號的使用請參見第4章。(2)以關(guān)鍵詞ARCHITECTURE為引導(dǎo)、END(3)關(guān)鍵詞是VHDL語言中預(yù)定義的有特殊含義的英文詞語,只能用作固定的用途。關(guān)鍵詞不能再用作用戶自定義的名稱。雖然在EDA工具編譯和綜合時,關(guān)鍵詞并不區(qū)分大小寫,但是對關(guān)鍵詞采用大寫字母,對設(shè)計者自己定義的實(shí)體名稱、信號名稱等其他名稱使用小寫字母,能夠提高代碼的可讀性,使其更加規(guī)范。一般而言,EDA工具的文本編輯器都能夠識別關(guān)鍵詞,即關(guān)鍵詞敏感型,EDA會用不同的顏色來顯示關(guān)鍵詞,所以在編輯代碼時一般不會誤用關(guān)鍵詞。(3)關(guān)鍵詞是VHDL語言中預(yù)定義的有特殊含義的英文詞(4)實(shí)體名稱mux21,結(jié)構(gòu)體名稱construct,輸入端口名稱a、b、s以及輸出端口名稱y都統(tǒng)稱為標(biāo)識符。所謂標(biāo)識符就是設(shè)計者在VHDL代碼中自定義的、用于不同名稱的詞語。使用標(biāo)識符也要遵循一定的規(guī)則:①標(biāo)識符由字母、數(shù)字、下劃線構(gòu)成,但必須以字母開頭;②只能是單一下劃線,且不能以下劃線作為標(biāo)識符的結(jié)束;③VHDL的關(guān)鍵詞不能再用作標(biāo)識符;④EDA工具庫中已定義好的元件名不能作為標(biāo)識符,如and2、dff等。雖然標(biāo)識符與關(guān)鍵詞一樣,在編譯和綜合時并不區(qū)分大小寫,但是為保證代碼書寫的規(guī)范,我們建議標(biāo)識符采用小寫字母。(4)實(shí)體名稱mux21,結(jié)構(gòu)體名稱construct(5)分號的作用。分號用于語句的分割,每條VHDL語句都有一個分號表示結(jié)束。需要注意的是,最后一個端口定義處的分號在括號外,如L4所示。
(6)規(guī)范的代碼書寫。盡管VHDL代碼的書寫格式要求十分寬松,但規(guī)范的書寫習(xí)慣是高效的電路設(shè)計所必備的。最頂層的ENTITY、ARCHITECTURE描述語句需要放在最左側(cè),比它們低一層次的描述語句(如PORT),需要向右靠4個小寫字母的間隔。相同層次的語句需要對齊。
(7)雙橫線“--”是注釋符。在VHDL代碼中的任何一行,只要出現(xiàn)了“--”,其后的文字或語句都不再參加編譯和綜合。良好的注釋有助于設(shè)計者閱讀、理解VHDL代碼。(5)分號的作用。分號用于語句的分割,每條VHDL語句例3-1對應(yīng)的元件符號如圖3-4所示。采用QuartusⅡ軟件仿真后的結(jié)果如圖3-5所示??梢郧宄乜吹剑?dāng)控制端口s取值為“0”時,輸出y即為輸入信號a的值;反之,則為輸入信號b的值,滿足設(shè)計要求。
例3-1采用的VHDL描述與其電路結(jié)構(gòu)是一一對應(yīng)的,讀者可能會疑惑,這樣的描述形式似乎并不能體現(xiàn)VHDL行為描述的優(yōu)勢,且設(shè)計者必須搞清楚電路結(jié)構(gòu)才能進(jìn)行VHDL代碼的編輯。其實(shí)VHDL有多種不同的描述方式,在后續(xù)章節(jié)中會詳細(xì)介紹,例3-1的目的是讓讀者能夠以數(shù)字電路的知識作為鋪墊,快速進(jìn)入EDA的學(xué)習(xí)。例3-1對應(yīng)的元件符號如圖3-4所示。采用Quartus圖3-4mux21元件符號圖3-4mux21元件符號圖3-52選1多路選擇器電路的時序波形圖3-52選1多路選擇器電路的時序波形3.2.2半加器的設(shè)計
下面再通過一個半加器的例子來說明VHDL的基本結(jié)構(gòu)形式。半加器指兩個1位二進(jìn)制數(shù)相加,只考慮兩個加數(shù)本身,而沒有考慮由低位來的進(jìn)位。圖3-6顯示了半加器的真值表和邏輯表達(dá)式,其中a、b是兩個加數(shù),co是進(jìn)位端,so是求和端。圖3-7是半加器的電路結(jié)構(gòu)。例3-2是半加器的VHDL描述,此例仍然采用邏輯操作符描述電路結(jié)構(gòu)的方式。3.2.2半加器的設(shè)計
下面再通過一個半加器的例子來圖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)體兩個部分外,還增加了庫和程序包的聲明(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)行編譯,將會產(chǎn)生如圖3-8所示錯誤,提示數(shù)據(jù)類型STD_LOGIC未聲明。這進(jìn)一步說明了此處聲明庫和程序包的作用。例3-2與例3-1相比,除了包含實(shí)體和結(jié)構(gòu)體兩個部分外,圖3-8例3-2不聲明IEEE庫和std_logic_1164程序包報錯信息圖3-8例3-2不聲明IEEE庫和std_logic_1讀者也許會問,例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代碼的開頭。讀者也許會問,例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è)計者精確地模擬一些未知的和具有高阻態(tài)的線路的情況,更適用于數(shù)字系統(tǒng)的設(shè)計。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半加器電路的時序波形圖3-9半加器電路的時序波形3.2.3VHDL代碼設(shè)計基本結(jié)構(gòu)
從例3-1和例3-2可以看出,一個能夠被綜合的VHDL代碼至少須包含實(shí)體和結(jié)構(gòu)體兩個部分,如果有需要還要進(jìn)行庫和程序包的聲明。
一般來說,把一個完整的、可綜合的VHDL設(shè)計稱為設(shè)計實(shí)體。VHDL代碼有比較固定的結(jié)構(gòu)格式,一般首先出現(xiàn)的是庫和程序包的使用聲明,然后是實(shí)體的描述以及結(jié)構(gòu)體的描述。當(dāng)然,同一個電路系統(tǒng)可能有不同的實(shí)現(xiàn)方法,有不同的電路結(jié)構(gòu),VHDL允許一個實(shí)體對應(yīng)一個或多個結(jié)構(gòu)體,不同的結(jié)構(gòu)體意味著不同的實(shí)現(xiàn)方式。如何從對應(yīng)的多個結(jié)構(gòu)體中選擇特定的一個結(jié)構(gòu)體,將其指定給實(shí)體,就需要用到配置。總結(jié)說來,VHDL代碼設(shè)計基本結(jié)構(gòu)如圖3-10所示。3.2.3VHDL代碼設(shè)計基本結(jié)構(gòu)
從例3-1和例3圖3-10VHDL代碼設(shè)計基本結(jié)構(gòu)示意圖圖3-10VHDL代碼設(shè)計基本結(jié)構(gòu)示意圖3.3庫?和?程?序?包
庫是一些常用VHDL代碼的集合,包括:數(shù)據(jù)類型的定義、函數(shù)的定義、子程序定義、元件引用聲明、常量的定義等一些可復(fù)用或是共享的VHDL代碼,類似于C語言中的頭文件。這些已定義的數(shù)據(jù)類型、子程序、常數(shù)等通常收集在程序包(Package)中,多個程序包再并入一個庫中,引用了庫之后就可以在設(shè)計者自己的代碼中使用庫中的VHDL代碼。庫和程序包的使用使得設(shè)計人員能夠遵循某些統(tǒng)一的語言標(biāo)準(zhǔn)或數(shù)據(jù)格式,也能夠方便地調(diào)用一些已設(shè)計好的內(nèi)容,提高設(shè)計效率,這一點(diǎn)對于多組開發(fā)人員并行工作的大規(guī)模電路系統(tǒng)的設(shè)計尤為重要。3.3庫?和?程?序?包
庫是一些常用庫和程序包的聲明總是放在設(shè)計單元的最前面,以便后續(xù)設(shè)計能夠隨時使用庫中指定的程序包中的內(nèi)容。每當(dāng)綜合器在較高層次的VHDL源文件中遇到庫語言,就將隨庫指定的源文件讀入,并參與綜合。在VHDL語言中可以存在多個不同的庫,但是庫與庫之間是獨(dú)立的,不能互相嵌套。庫和程序包的聲明總是放在設(shè)計單元的最前面,以便后續(xù)設(shè)計能3.3.1庫和程序包的種類
當(dāng)前在VHDL語言中存在的庫大致可以歸納為五種:IEEE庫、STD庫、WORK庫、VITAL庫和用戶自定義庫。
1.IEEE庫
IEEE庫是VHDL設(shè)計中最常用的庫之一,它包含IEEE標(biāo)準(zhǔn)的程序包以及其他一些支持工業(yè)標(biāo)準(zhǔn)的程序包。下面就幾個常用和重要的程序包作一定介紹,相關(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ǔ)上定義了有符號(SIGNED)、無符號(UNSIGNED)、小整型(SMALL_INT)數(shù)據(jù)類型,其中有符號和無符號數(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程序包對INTEGER(整型)、STD_LOGIC、STD_LOGIC_VECTOR數(shù)據(jù)類型的定義進(jìn)行了擴(kuò)展,重載了用于這些數(shù)據(jù)類型的混合運(yùn)算的運(yùn)算符,以及一個由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)容是基于有符號(SIGNED)數(shù)據(jù)類型的,即考慮了符號;而std_logic_unsigned程序包中定義的內(nèi)容是基于無符號(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個程序包已經(jīng)能夠滿足大多數(shù)的需要。所以,其他幾個程序包不再一一進(jìn)行講述,讀者如有興趣,可查閱相關(guān)資料。此外,IEEE庫還包括了math_real、number2.STD庫
STD庫中含有VHDL語言標(biāo)準(zhǔn)定義的兩個標(biāo)準(zhǔn)程序包,即standard程序包和textio程序包。
(1)?standard程序包。該程序包是VHDL標(biāo)準(zhǔn)程序包,使用時默認(rèn)打開。所以設(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ù)據(jù)類型以及相關(guān)的操作。2.STD庫
STD庫中含有VHDL語言標(biāo)準(zhǔn)定義的兩(2)?textio程序包。該程序包主要供仿真器使用,綜合器會忽略此程序包。設(shè)計者可以用文本編輯器建立一個數(shù)據(jù)文件,文件中包含仿真時需要的數(shù)據(jù)。仿真時利用textio程序包中提供的用于訪問文件的過程,即可獲得這些數(shù)據(jù)或?qū)⒎抡娼Y(jié)果保存于文件中。textio程序包實(shí)際上是專為VHDL模擬工具提供的與外部計算機(jī)文件管理系統(tǒng)進(jìn)行數(shù)據(jù)交換的通道,使用前需要使用USE語句。8.2.3節(jié)將講解該程序包的使用。(2)?textio程序包。該程序包主要供仿真器使用,3.WORK庫
WORK庫是用戶進(jìn)行VHDL設(shè)計的現(xiàn)行工作庫,用于存放用戶設(shè)計和定義的一些設(shè)計單元和程序包,是用戶自己設(shè)計的倉庫。VHDL標(biāo)準(zhǔn)規(guī)定WORK庫總是可見的,因此在實(shí)際使用時,也不需要使用LIBRARY和USE語句顯式的打開。VHDL標(biāo)準(zhǔn)要求為設(shè)計的項目建立一個文件夾,與此項目相關(guān)的工程、文件等都保存于此文件夾內(nèi)。VHDL綜合器會將此文件夾默認(rèn)為WORK庫,指向該文件夾的路徑。需要注意的是,WORK庫并不是這個文件夾的名字,它是一個邏輯名。3.WORK庫
WORK庫是用戶進(jìn)行VHDL設(shè)計的現(xiàn)4.VITAL庫
VITAL庫符合IEEE標(biāo)準(zhǔn),由含有精確ASIC時序模型的時序程序包集合vital_timing和基本元件程序包集合vital_primitives構(gòu)成,支持以ASIC單元的真實(shí)時序數(shù)據(jù)對一個VHDL設(shè)計進(jìn)行精確的模擬驗(yàn)證,提高VHDL門級時序模擬的精度。但由于各FPGA/CPLD生產(chǎn)廠商的適配工具都能夠?yàn)楦髯缘男酒蓭r序信息的VHDL門級網(wǎng)表,用VHDL仿真器仿真該網(wǎng)表就可以得到精確的時序仿真結(jié)果。因此,在FPGA/CPLD設(shè)計開發(fā)過程中,一般不需要使用VITAL庫中的程序包來進(jìn)行仿真。4.VITAL庫
VITAL庫符合IEEE標(biāo)準(zhǔn),由含5.用戶自定義庫
用戶為自身設(shè)計需要所開發(fā)的公共包集合和實(shí)體等,可以匯集在一起定義為一個庫,即用戶自定義庫,供其他開發(fā)者調(diào)用,但在使用時同樣要首先說明庫名。
此外,各EDA開發(fā)商為了便于開發(fā)設(shè)計,還提供了一些自己的庫,如Altera公司的LPM庫(本書配套的《EDA技術(shù)與VHDL設(shè)計實(shí)驗(yàn)指導(dǎo)》一書中會對LPM庫進(jìn)行講解)、Synopsys公司的Synopsys庫等。5.用戶自定義庫
用戶為自身設(shè)計需要所開發(fā)的公共包集3.3.2庫和程序包的使用
在前面提到的幾類庫中,除了STD庫和WORK庫以外,其他庫在使用前都需要首先進(jìn)行聲明。聲明格式如下:
LIBRARY<庫名>;
USE<庫名>.<程序包名>.all;
其中:第一條語句表示使用什么庫;第二條語句表示使用庫中的哪一個程序包。此處,all代表打開庫中指定程序包內(nèi)的所有資源。當(dāng)然,也可以只打開程序包內(nèi)所選定的某個項目或函數(shù),其聲明格式如下:
LIBRARY<庫名>;
USE<庫名>.<程序包名>.<項目>;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程序包中的所有資源
庫聲明語句的范圍從一個實(shí)體說明開始,到它所屬的結(jié)構(gòu)體、配置為止。當(dāng)一個源程序中出現(xiàn)兩個以上的實(shí)體時,兩條作為庫使用聲明的語句必須在每個實(shí)體說明語句前重復(fù)書寫。例3-3給出了兩種不同的聲明格式。
【例3-3】
3.3.3程序包的定義
程序包(Package)說明類似于C語言中的include語句,用來單純地羅列VHDL語言中所用到的各種常數(shù)定義,數(shù)據(jù)類型定義,元件、函數(shù)和過程定義等。程序包是一個可編譯的設(shè)計單元,也是庫結(jié)構(gòu)中的一個層次。程序包可分為預(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<程序包一個程序包的定義由兩大部分組成:程序包首和程序包體。一個完整的程序包中,程序包首和程序包體的名稱應(yīng)是同一個。程序包體是一個可選項,當(dāng)沒有定義函數(shù)和過程時,程序包可以只由程序包首構(gòu)成。程序包首的說明語句部分進(jìn)行數(shù)據(jù)類型的定義,常數(shù)的定義,元件、函數(shù)及過程的聲明等。程序包體的說明語句部分進(jìn)行具體函數(shù)、過程功能的描述。例3-4給出了一個程序包定義的示例,其程序包名稱是my_package,在其中定義了一個新的數(shù)據(jù)類型color、一個常數(shù)x以及一個函數(shù)positive_edge。由于函數(shù)必須要有具體的內(nèi)容,所以在程序包體內(nèi)進(jìn)行描述。如果該程序包在當(dāng)前WORK庫中已定義,則要使用該程序包中的內(nèi)容,可利用USE語句,如例3-5所示。例3-4相關(guān)的語法知識會在后續(xù)章節(jié)中陸續(xù)介紹,這里只是讓讀者體會程序包的格式和用法。一個程序包的定義由兩大部分組成:程序包首和程序包體。一個【例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)用于一個設(shè)計實(shí)體與其他設(shè)計實(shí)體或外部電路進(jìn)行接口的描述,是設(shè)計實(shí)體對外的一個通信界面。實(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è)計實(shí)體邏輯功能簡稱的英文字符,但要符合標(biāo)識符命名的規(guī)則,如實(shí)體名clkdiv表示分頻器。考慮到某些EDA工具的限制(如QuartusⅡ軟件)、VHDL代碼的特點(diǎn)以及調(diào)用的方便性等,建議源程序所保存的文件名與實(shí)體名保持一致,如保存文件名為clkdiv.vhd(后綴名.vhd代表采用VHDL語言編寫)。此外,在同一個庫中,實(shí)體名必須是唯一的。PORT(端口名:端口模式數(shù)據(jù)類型; --在進(jìn)行模塊化設(shè)計時,有時需要在不改變VHDL源代碼的基礎(chǔ)上,對設(shè)計實(shí)體的某些參數(shù)進(jìn)行修改,從而改變設(shè)計實(shí)體內(nèi)部的電路結(jié)構(gòu)或規(guī)模,這時就需要用到類屬參量,即在類屬聲明中聲明的參數(shù)。類屬參量提供了可供外部修改參數(shù)的通道或是窗口。當(dāng)調(diào)用該設(shè)計實(shí)體時,通過對類屬參量進(jìn)行重新賦值就能夠?qū)崿F(xiàn)對設(shè)計實(shí)體內(nèi)部相應(yīng)邏輯功能的修改,這樣既保證了電路功能的可修改性,又不會破壞VHDL程序的一致性,提高了代碼的復(fù)用性。類屬聲明部分是可選項,不是必須的,如例3-1和例3-2中都沒有類屬聲明。在進(jìn)行模塊化設(shè)計時,有時需要在不改變VHDL源代碼的基礎(chǔ)端口聲明確定了端口的數(shù)目、端口上通過的信號的數(shù)據(jù)類型以及信號的流動方向,這是硬件描述語言的一大特點(diǎn)。硬件電路中信號的流向,即信號從什么地方來、做了怎樣的處理、最后輸出到哪里去。
綜上所述,實(shí)體描述的主要內(nèi)容包括:
(1)給實(shí)體取一個有意義的名稱;
(2)根據(jù)設(shè)計實(shí)體的外部接口,設(shè)計相應(yīng)的端口并為端口確定符合邏輯功能的名稱,規(guī)定信號的流動方向和數(shù)據(jù)類型;
(3)根據(jù)需要聲明相應(yīng)的類屬參量。以下就端口聲明和類屬聲明再進(jìn)一步講解。端口聲明確定了端口的數(shù)目、端口上通過的信號的數(shù)據(jù)類型以及3.4.2端口聲明
端口聲明確定了輸入、輸出端口的數(shù)目和類型,以關(guān)鍵詞PORT引導(dǎo),有端口名、端口模式、數(shù)據(jù)類型三個要點(diǎn)。
1.端口名
端口名是指賦予每個端口(引腳)的名稱,通常用一個或幾個英文字母或者字母加數(shù)字的方式來命名,如d0、d1、sel、q、qb、input1等。
2.端口模式
端口模式是指這些通道上數(shù)據(jù)的流動方向,IEEE1076標(biāo)準(zhǔn)包中定義了四種常用的端口模式:輸入(IN)模式、輸出(OUT)模式、雙向(INOUT)模式、緩沖(BUFFER)模式。3.4.2端口聲明
端口聲明確定了輸入、輸出端口的數(shù)(1)輸入模式用保留字IN來聲明。采用輸入模式聲明的端口信號的數(shù)據(jù)流向?yàn)閷?shí)體外部到實(shí)體內(nèi)部,即數(shù)據(jù)只能通過此端口被讀入,如例3-1中的端口a、b、s。如果一個端口信號被聲明為輸入模式,則其只能作為賦值語句的右值存在,任何給該端口信號賦值的語句都會被綜合器報錯。
(2)輸出模式用保留字OUT來聲明。采用輸出模式聲明的端口信號的數(shù)據(jù)流向?yàn)閷?shí)體內(nèi)部到外部,即數(shù)據(jù)只能通過此端口輸出,如例3-1中的端口y。如果一個端口信號被聲明為輸出模式,則其只能作為賦值語句的左值存在,任何讀取該端口信號的語句都會被綜合器報錯。(1)輸入模式用保留字IN來聲明。采用輸入模式聲明的端(3)雙向模式用保留字INOUT來聲明。采用雙向模式既可以從實(shí)體內(nèi)部輸出,也可以從實(shí)體外部輸入。但是同一時刻只能進(jìn)行某一個數(shù)據(jù)流向的操作,因此雙向模式聲明的端口信號一般需要一個信號進(jìn)行方向的控制。
(4)緩沖模式用保留字BUFFER來聲明。BUFFER模式與INOUT模式類似,既可以輸出,也可以輸入。但是,其輸入的數(shù)據(jù)只允許回讀內(nèi)部輸出的信號。(3)雙向模式用保留字INOUT來聲明。采用雙向模式既3.?dāng)?shù)據(jù)類型
端口信號必須確定其數(shù)據(jù)類型,即在其上流動的數(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(時間型)、REAL(實(shí)數(shù)型)等數(shù)據(jù)類型。3.?dāng)?shù)據(jù)類型
端口信號必須確定其數(shù)據(jù)類型,即在其上流VHDL從語言屬性上講是一種強(qiáng)類型語言。VHDL規(guī)定,任何一種數(shù)據(jù)對象的應(yīng)用都必須嚴(yán)格限定其取值范圍和數(shù)值類型,不同數(shù)據(jù)對象在不同數(shù)據(jù)類型之間的賦值要作明確的界定,這一點(diǎn)和傳統(tǒng)C語言在數(shù)據(jù)對象的賦值上有比較大的區(qū)別。雖然這樣的做法在語言的靈活性上要差一些,但在大規(guī)模電路描述的排錯上卻是十分有益的,這是VHDL的特點(diǎn)之一。VHDL從語言屬性上講是一種強(qiáng)類型語言。VHDL規(guī)定,任3.4.3類屬聲明
類屬聲明可以聲明多個類屬參量(或稱類屬值、類屬變量),其中參數(shù)名和數(shù)據(jù)類型是必須的。將例3-1稍作改動,如例3-6所示。
【例3-6】3.4.3類屬聲明
類屬聲明可以聲明多個類屬參量(或EDA技術(shù)與VHDL設(shè)計(西電版)第3章-VHDL語言入門課件(1)在例3-6中加入了以關(guān)鍵詞GENERIC引導(dǎo)的語句(L3),該語句聲明了類屬參量m,其數(shù)據(jù)類型為TIME(時間類型)。設(shè)置了一個缺省值10ns,當(dāng)沒有傳入其他具體參數(shù)值時,結(jié)構(gòu)體內(nèi)凡是用到m,其值都為10ns。GENERIC語句所定義的類屬參量與常量十分類似,但它能從外部動態(tài)地接受不同的賦值。(1)在例3-6中加入了以關(guān)鍵詞GENERIC引導(dǎo)的語(2)本例中還引入了一個新的數(shù)據(jù)對象,即使用關(guān)鍵詞SIGNAL定義的信號temp(L9),其數(shù)據(jù)類型是BIT。讀者可以將其理解為C語言的變量,作為數(shù)據(jù)的一種暫存節(jié)點(diǎn)。由于temp在結(jié)構(gòu)體內(nèi)定義,屬于內(nèi)部節(jié)點(diǎn)信號,數(shù)據(jù)的進(jìn)出不像端口那樣受方向的限制,所以不必定義其端口模式(即輸入、輸出方向,如IN、OUT)。使用關(guān)鍵詞SIGNAL定義的標(biāo)識符是信號,信號屬于數(shù)據(jù)對象(DataObjects)中的一種。VHDL中共有三類數(shù)據(jù)對象,分別是:常量(CONSTANT)、變量(VARIABLE)和信號(SIGNAL)。在第4章中會對三種數(shù)據(jù)對象進(jìn)一步講解,使讀者掌握它們的用法和區(qū)別。(2)本例中還引入了一個新的數(shù)據(jù)對象,即使用關(guān)鍵詞SI(3)語句y<=tempAFTERm;表示延遲m(本例是10ns)后再將2選1數(shù)據(jù)選擇器的選擇結(jié)果送到輸出端口y上。
類屬參量多用于模塊化設(shè)計時不同層次模塊之間信息的傳遞,讀者可以將其理解為高層次模塊傳遞給底層模塊的形參。例3-6僅僅是類屬參量的一個簡單示例,目的是使讀者了解它的聲明格式等,在講解了層次型結(jié)構(gòu)后,將會用一個更加完善的例子來進(jìn)一步認(rèn)識類屬參量實(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è)計實(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è)計者自行定義,可以根據(jù)結(jié)構(gòu)體的描述方式來命名,如結(jié)構(gòu)化描述形式可以使用結(jié)構(gòu)體名construct,行為描述形式可以使用結(jié)構(gòu)體名behavior(或簡寫為bhv);但需要注意的是,結(jié)構(gòu)體名也需要符合標(biāo)識符命名的規(guī)則。結(jié)構(gòu)體描述部分的實(shí)體名應(yīng)和結(jié)構(gòu)體對應(yīng)實(shí)體的名稱一致。如果一個實(shí)體具有多個結(jié)構(gòu)體,結(jié)構(gòu)體的取名不可相重,但不同實(shí)體的結(jié)構(gòu)體可以同名。結(jié)構(gòu)體名是結(jié)構(gòu)體的標(biāo)識,由設(shè)計者自行定義,可以根據(jù)結(jié)構(gòu)體結(jié)構(gòu)體說明語句位于關(guān)鍵詞ARCHITECTURE和BEGIN之間,主要是對結(jié)構(gòu)體功能描述語句中將要用到的數(shù)據(jù)類型、常量、信號、子程序、函數(shù)、元件等的聲明。說明語句并非必須的。在一個結(jié)構(gòu)體中,說明語句部分聲明的數(shù)據(jù)類型、常量、信號、子程序、函數(shù)、元件等只能用于該結(jié)構(gòu)體。如果希望它們能夠用于其他的設(shè)計實(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;”。對于實(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聲明了兩個新的數(shù)據(jù)類型my_std_logic和color,關(guān)鍵詞SIGNAL聲明了一個信號temp,關(guān)鍵詞CONSTANT聲明了一個常量x,關(guān)鍵詞COMPONENT聲明了半加器元件halfadd,關(guān)鍵詞FUNCTION聲明了一個函數(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個元素的矢量,每個元素的數(shù)據(jù)類型都是STD_LOGIC
TYPEcolorIS(red,green,blue); --新的數(shù)據(jù)類型color,屬于枚舉型
SIGNALtemp :BIT; --信號temp,數(shù)據(jù)類型是BIT
CONSTANTx :INTEGER:=7; --常量x,數(shù)據(jù)類型是整型,取值為7
COMPONENThalfadd --元件聲明,將一個現(xiàn)成的設(shè)計實(shí)體定義為一個元件
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)程、并行信號賦值語句、元件例化語句、子程序調(diào)用語句等幾類。這幾類語句都是以并行方式工作的,即語句的執(zhí)行不以書寫語句的順序?yàn)轫樞?。而在每一種語句結(jié)構(gòu)的內(nèi)部可能含有并行運(yùn)行的邏輯描述或是順序運(yùn)行的邏輯描述。相對于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è)計單元的硬件結(jié)構(gòu),表示元件之間的互連。例3-1和例3-2都采用了結(jié)構(gòu)化建模的形式進(jìn)行電路系統(tǒng)的描述。以2選1多路選擇器為例,它的邏輯電路由與門、或門和非門構(gòu)成,而這些基本的邏輯門電路都已經(jīng)是現(xiàn)成的設(shè)計單元,那么將這些現(xiàn)成的設(shè)計單元連接就可以構(gòu)成新的電路系統(tǒng),類似于電路原理圖中所畫器件的連接。1.結(jié)構(gòu)化建模
結(jié)構(gòu)化建模通過明確的硬件實(shí)現(xiàn)來指定電另一種常見的結(jié)構(gòu)化建模的描述方式是根據(jù)設(shè)計的邏輯功能進(jìn)行模塊的劃分,首先進(jìn)行各個模塊的設(shè)計和驗(yàn)證;然后在頂層文件中對多個模塊進(jìn)行調(diào)用,描述底層各模塊之間的連接關(guān)系,即層次型的VHDL描述,該描述主要采用元件聲明和元件例化語句完成。層次型的VHDL描述將在3.7節(jié)中具體講述。另一種常見的結(jié)構(gòu)化建模的描述方式是根據(jù)設(shè)計的邏輯功能進(jìn)行2.行為建模
行為建模只規(guī)定了電路系統(tǒng)的功能或行為,不關(guān)心電路的實(shí)際結(jié)構(gòu),沒有明確指明涉及的硬件及連線等,即只關(guān)心“做什么”,不關(guān)心“怎么做”。行為建模是VHDL語言描述的一大特色,是VHDL編程的核心,它使得設(shè)計者可以在不了解硬件電路結(jié)構(gòu)的情況下實(shí)現(xiàn)電路系統(tǒng)。行為建模的描述形式充分體現(xiàn)了VHDL語言相對于其他硬件描述語言的優(yōu)勢。行為建模通常由一個或多個進(jìn)程構(gòu)成,每一個進(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用算法描述硬件行為的方法。在一個結(jié)構(gòu)體中可以有一個或多個進(jìn)程,不同的進(jìn)程間是并行運(yùn)行的,進(jìn)程內(nèi)部是由一系列順序語句構(gòu)成的。進(jìn)程語句的一般結(jié)構(gòu)如下:
[進(jìn)程標(biāo)號:]PROCESS[(敏感信號參數(shù)表)][IS]
[進(jìn)程說明部分]
BEGIN
順序描述部分
ENDPROCESS[進(jìn)程標(biāo)號];(1)以關(guān)鍵詞PROCESS引導(dǎo)開始、關(guān)鍵詞ENDP進(jìn)程語句結(jié)構(gòu)一般由三部分組成:敏感信號參數(shù)表、進(jìn)程說明部分以及順序描述部分,其中敏感信號參數(shù)表以及進(jìn)程說明部分都是可以省略的。進(jìn)程標(biāo)號是由設(shè)計者自行定義的標(biāo)識符,也是可以省略的。
進(jìn)程說明部分用于定義進(jìn)程所需的局部數(shù)據(jù)環(huán)境,通常是數(shù)據(jù)類型、常數(shù)、子程序、變量等,它們將在順序描述語句中被使用,例3-8沒有說明語句部分。但需要注意,在進(jìn)程說明部分不允許定義信號和全程變量(4.2.2節(jié)中講述)。以關(guān)鍵詞BEGIN引導(dǎo)開始的順序語句是一段順序執(zhí)行的語句,如IF語句、CASE語句、LOOP語句等。順序語句只在進(jìn)程和函數(shù)、過程結(jié)構(gòu)中使用,在第5章中會對各類語句進(jìn)一步講述。進(jìn)程語句結(jié)構(gòu)一般由三部分組成:敏感信號參數(shù)表、進(jìn)程說明部關(guān)鍵詞PROCESS后的(a,b,s)稱為進(jìn)程的敏感信號參數(shù)表,通常要求將進(jìn)程中所有的輸入信號都放在敏感信號參數(shù)表中。由于PROCESS語句的執(zhí)行依賴于敏感信號的變化,即當(dāng)某一敏感信號發(fā)生改變,如信號s從“1”跳變到“0”時就將啟動進(jìn)程語句,于是進(jìn)程內(nèi)部的順序語句就被執(zhí)行一遍,然后返回進(jìn)程的起始端,進(jìn)入等待狀態(tài),直到下一次敏感信號參數(shù)表中的敏感信號再次發(fā)生變化。關(guān)鍵詞PROCESS后的(a,b,s)稱為進(jìn)程的敏感信號(2)以關(guān)鍵詞IF引導(dǎo)開始、ENDIF結(jié)束(L14~L16)的是條件語句。條件語句是VHDL中重要、常用的順序語句,必須放置在進(jìn)程中使用。關(guān)鍵詞IF后的“s='0'”是判斷表達(dá)式,如果判斷表達(dá)式成立(即s為低電平),則返回一個布爾型的數(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顯示一個結(jié)構(gòu)體中含有兩個進(jìn)程(pro_1和pro_2)的情況。該例中就使用了進(jìn)程的標(biāo)號,用于區(qū)分不同的進(jìn)程。兩個進(jìn)程的執(zhí)行是并行、獨(dú)立的,由各自的敏感參數(shù)觸發(fā)。進(jìn)程之間通過信號temp進(jìn)行通信,信號具有全局性,因此信號的定義不能放置于進(jìn)程內(nèi)部。進(jìn)程pro_1用于實(shí)現(xiàn)數(shù)據(jù)a和b的選擇,當(dāng)控制端selx取值為“0”時,選擇數(shù)據(jù)a;反之,選擇數(shù)據(jù)b。進(jìn)程pro_1選擇的數(shù)據(jù)存于信號temp中。進(jìn)程pro_2用于實(shí)現(xiàn)數(shù)據(jù)c和temp的選擇,當(dāng)控制端sely取值為“0”時,選擇temp;反之,選擇c。因此,該例通過兩個控制信號selx和sely實(shí)現(xiàn)3選1數(shù)據(jù)選擇器。例3-9顯示一個結(jié)構(gòu)體中含有兩個進(jìn)程(pro_1和pro【例3-9】【例3-9】
下面再通過一個4位二進(jìn)制比較器的例子來說明PROCESS語句的結(jié)構(gòu)和順序語句的應(yīng)用。
下面再通過一個4位二進(jìn)制比較器的例子來【例3-10】【例3-10】(1)例3-10中,進(jìn)程語句定義了敏感信號a和b。a和b為輸入數(shù)據(jù)端口。當(dāng)輸入端口的信號發(fā)生變化時將啟動進(jìn)程的執(zhí)行。進(jìn)程中的順序語句為條件語句,語句執(zhí)行時進(jìn)行條件判斷,條件表達(dá)式使用了關(guān)系操作符小于等于“<=”來對兩個端口的數(shù)據(jù)進(jìn)行比較,如果條件成立則輸出端口y賦值“0”,否則y被賦值“1”。
(2)例3-10涉及到一個新的數(shù)據(jù)類型——標(biāo)準(zhǔn)邏輯矢量STD_LOGIC_VECTOR(L6),該類型和STD_LOGIC數(shù)據(jù)類型一樣,都定義在std_logic_1164程序包中。數(shù)據(jù)類型STD_LOGIC_VECTOR是一維數(shù)組,數(shù)組中每個元素的數(shù)據(jù)類型都是STD_LOGIC型。STD_LOGIC_VECTOR數(shù)據(jù)類型(1)例3-10中,進(jìn)程語句定義了敏感信號a和b。a和需要定義數(shù)組的寬度,即數(shù)組中元素的個數(shù),如例3-10中L6通過“3DOWNTO0”定義其數(shù)組寬度為4,即信號a和b的數(shù)據(jù)類型都是一個具有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)行判斷都是通過從左至右逐一對元素進(jìn)行比較來決定的,并不管原數(shù)組的下標(biāo)定義順序,即不管數(shù)組下標(biāo)是使用DOWNTO還是TO,比較都是從左至右。需要定義數(shù)組的寬度,即數(shù)組中元素的個數(shù),如例3-10中L6通
3.6配置
對既定的電路功能,對應(yīng)的電路結(jié)構(gòu)并不是唯一的,它可以對應(yīng)不同的電路結(jié)構(gòu)方式。這意味著一個VHDL的設(shè)計只能有一個實(shí)體,但是可以有幾個結(jié)構(gòu)體,即使用幾種方案實(shí)現(xiàn)一種功能,其中每個結(jié)構(gòu)體的地位是相同的,但結(jié)構(gòu)體名不能重復(fù)。
配置(Configuration)可以把特定的結(jié)構(gòu)體指定給一個確定的實(shí)體,它描述實(shí)體與結(jié)構(gòu)體之間的連接關(guān)系。在仿真時,可以利用配置語句來為同一實(shí)體配置不同的結(jié)構(gòu)體,進(jìn)行性能對比以得到最佳的設(shè)計方法。配置語句的一般語句格式如下:3.6配置
對既定的電路功能,CONFIGURATION配置名OF實(shí)體名IS
[配置說明];
ENDCONFIGURATION配置名;
配置語句根據(jù)不同的情況,其配置說明有簡有繁,以下是最簡單的缺省配置格式的結(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è)計(西電版)第3章-VHDL語言入門課件3.7層次結(jié)構(gòu)的VHDL描述
對于大規(guī)模的電路系統(tǒng)設(shè)計,可以將設(shè)計分成多個文件,使用層次化、分模塊的設(shè)計方式,它能夠使一個大型設(shè)計分工協(xié)作,仿真測試更加容易,代碼維護(hù)或升級更加便利。3.7層次結(jié)構(gòu)的VHDL描述
對于大規(guī)3.7.1元件聲明和元件例化
下面以一個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個輸入數(shù)據(jù),s0、s1是控制端口,決定數(shù)據(jù)的輸出。2選1多路選擇器是底層文件,作為頂層文件待調(diào)用的元件。例3-12是按照圖3-11結(jié)構(gòu)完成的頂層文件。需要注意的是,例3-1中使用的數(shù)據(jù)類型是BIT,如果使用例3-1中設(shè)計的2選1多路選擇器作為底層待調(diào)用元件,需要將數(shù)據(jù)類型改為STD_LOGIC。3.7.1元件聲明和元件例化
下面以一個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)體部分首先在說明語句處定義了信號x1和x2,用于器件內(nèi)部的連接線;利用關(guān)鍵詞COMPONENT聲明了底層待調(diào)用元件mux21。結(jié)構(gòu)體功能描述語句部分利用端口映射語句PORTMAP將三個mux21元件連接起來構(gòu)成了4選1多路選擇器。由此例可以看出,層次結(jié)構(gòu)的VHDL描述包含兩個內(nèi)容:元件聲明和元件例化。例3-12確定了頂層文件實(shí)體名mux41,在實(shí)體描述部分1.元件聲明
元件聲明是把一個現(xiàn)成的設(shè)計實(shí)體定義為一個元件,即封裝,只留出對外的接口界面。元件聲明語句的功能是對待調(diào)用的元件作出調(diào)用聲明,它的一般語句格式如下:
COMPONENT元件名
[GENERIC(類屬表);]
PORT(端口名表);
ENDCOMPONENT元件名;1.元件聲明
元件聲明是把一個現(xiàn)成的設(shè)計實(shí)體定義為一元件聲明以關(guān)鍵詞COMPONENT開始,元件名是待調(diào)用底層設(shè)計實(shí)體的實(shí)體名。類屬表部分不是必須的,當(dāng)有需要傳遞的類屬參量時才需要。端口名表需要列出該元件對外通信的各端口名,與實(shí)體中的PORT語句一致。所以,對需要調(diào)用的元件可以將對應(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è)計實(shí)體的連接說明,一般語句格式如下:
例化名:元件名PORTMAP([端口名=>]連接端口名,
?[端口名=>]連接端口名,
…);
例化名是必須的,且在結(jié)構(gòu)體中是唯一的,可以看做頂層電路系統(tǒng)中需要接受底層元件的一個插座的編號名稱。元件名與聲明時的元件名一致,即為待調(diào)用設(shè)計實(shí)體的實(shí)體名。PORTMAP語句可實(shí)現(xiàn)端口之間的映射(連接)。端口名指元件定義語句中定義的端口名稱,即底層待調(diào)用元件的端口。2.元件例化
元件例化語句是底層元件與當(dāng)前設(shè)計實(shí)體的它僅代表連接關(guān)系而不代表數(shù)據(jù)流動的方向。符號“=>”左側(cè)放置端口名,右側(cè)放置連接端口名。連接端口名指當(dāng)前電路系統(tǒng)中準(zhǔn)備與接入元件相連的端口,即頂層系統(tǒng)端口或頂層文件中定義的信號。從語句格式中可以看出,端口名和連接符號不是必須的,也就是說端口間的映射關(guān)系有兩種方式:名稱映射和位置映射。它僅代表連接關(guān)系而不代表數(shù)據(jù)流動的方向。符號“=>”左側(cè)放置(1)名稱映射是利用對應(yīng)的接口名稱進(jìn)行連接,就是將元件的各端口名稱賦予頂層系統(tǒng)中的信號名稱,即端口名與連接端口名的映射。例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)名稱映射是利用對應(yīng)的接口名稱進(jìn)行連接,就是將元件(2)位置映射是指在PORTMAP語句中不寫出端口名和連接符號“=>”,僅指定連接端口名,但連接端口名的書寫順序必須與元件端口說明中信號的書寫順序一一對應(yīng)。例3-14將顯示采用位置映射方式實(shí)現(xiàn)的4選1多路選擇器的元件例化。如果將例化u1改為“u1:mux21PORTMAP(d0,s0,d1,x1);”,則由于書寫順序的不對應(yīng),將控制端口s0連接到元件mux21的數(shù)據(jù)端口b上,而將數(shù)據(jù)d1連接到mux21的控制端口s上,最后造成錯誤的結(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)圖最后,請讀者根據(jù)元件聲明和元件例化的相關(guān)內(nèi)容以及3.2.2節(jié)中設(shè)計的半加器,以半加器為底層元件,采用層次結(jié)構(gòu)的VHDL描述形式,實(shí)現(xiàn)一位全加器的設(shè)計,其電路結(jié)構(gòu)圖如圖3-12所示。最后,請讀者根據(jù)元件聲明和元件例化的相關(guān)內(nèi)容以及3.2.3.7.2類屬參量的應(yīng)用
如3.4.3節(jié)所述,類屬參量多用于模塊化設(shè)計時不同層次模塊之間信息的傳遞,可以將其理解為高層次模塊傳遞給底層模塊的形參。下面通過兩個例子來進(jìn)行介紹。例3-17是一個頂層文件,它通過例化語句調(diào)用了例3-16,對其進(jìn)行了參數(shù)的傳遞。在例3-16中,類屬參量n的缺省取值為3,但n的具體取值可通過例3-17中參數(shù)傳遞映射GENERICMAP語句動態(tài)指定。3.7.2類屬參量的應(yīng)用
如3.4.3節(jié)所述,類屬參【例3-16】【例3-16】EDA技術(shù)與VHDL設(shè)計(西電版)第3章-VHDL語言入門課件【例3-17】【例3-17】EDA技術(shù)與VHDL設(shè)計(西電版)第3章-VHDL語言入門課件(1)例3-16中的L6使用關(guān)鍵詞GENERIC聲明了類屬參量n,其數(shù)據(jù)類型為整型,設(shè)置缺省值為3。L7利用n值來確定端口信號矢量a的長度,即標(biāo)準(zhǔn)邏輯矢量所包含的元素個數(shù)。
(2)例3-16中的L14使用關(guān)鍵詞VARIABLE聲明了變量int,用于數(shù)據(jù)的暫時存儲。變量的聲明必須在進(jìn)程內(nèi)部,它是一個局部量,不能跳出聲明它的進(jìn)程使用。變量的賦值符號是“:=”,L16為變量賦初值1。如前所述,變量與信號都屬于數(shù)據(jù)對象,它們的功能相似,但應(yīng)注意變量與信號的區(qū)別:①聲明位置不同,信號的聲明在結(jié)構(gòu)體的說明語句部分,變量的聲明在進(jìn)程或子程序內(nèi)部;②聲明位置的不同決定了它們的使用范圍不同,如在結(jié)構(gòu)體說明語句部分聲明(1)例3-16中的L6使用關(guān)鍵詞GENERIC聲明了的信號在整個結(jié)構(gòu)體內(nèi)都可以使用,但在進(jìn)程和子程序中聲明的變量則只能在該進(jìn)程或子程序內(nèi)部使用;③賦值符號的不同,信號的賦值符號是“<=”,而變量的賦值符號是“:=”。其區(qū)別將在第4章中進(jìn)一步深入介紹。
(3)?例3-16中的L17~L20使用了循環(huán)語句LOOP,屬于FOR/LOOP語句。關(guān)鍵詞FOR后的循環(huán)變量i是一個臨時變量,由設(shè)計者自行命名,屬于LOOP語句的局部變量,因此不需要事先定義,但在LOOP語句的范圍內(nèi)不能再使用其他與此循環(huán)變量同名的標(biāo)識符。關(guān)鍵詞IN后用來確定循環(huán)次數(shù),循環(huán)變量從循環(huán)次數(shù)指定的初值開始,每執(zhí)行完一次就加1,直至達(dá)到循環(huán)次數(shù)指定的最大值為止。FOR/LOOP語句的一般語句格式如下:的信號在整個結(jié)構(gòu)體內(nèi)都可以使用,但在進(jìn)程和子程序中聲明的變量[LOOP標(biāo)號:]FOR循環(huán)變量IN循環(huán)次數(shù)范圍LOOP
順序語句;
ENDLOOP[LOOP標(biāo)號];
(4)例3-17中的L11~L15對元件andn進(jìn)行聲明,L17~L20是元件例化,其中使用參數(shù)傳遞映射語句GENERICMAP實(shí)現(xiàn)了對類屬參量n的賦值。以元件u1為例,n取值為2,即信號a含有兩個元素,LOOP語句實(shí)現(xiàn)兩次循環(huán),最終實(shí)現(xiàn)一個2輸入與門的邏輯。[LOOP標(biāo)號:]FOR循環(huán)變量IN循環(huán)次數(shù)范3.8簡單時序電路的描述
以上所述示例都是組合邏輯電路,VHDL語言能夠進(jìn)行時序邏輯電路的描述,且因?yàn)樗袨榻5奶攸c(diǎn),描述時序電路更加方便。觸發(fā)器是最簡單、最具代表性的時序電路,它是數(shù)字系統(tǒng)設(shè)計中最基本的底層時序單元。觸發(fā)器的VHDL描述包含了VHDL許多有特色的語言現(xiàn)象,例3-18顯示了一個D觸發(fā)器的描述,其仿真結(jié)果如圖3-13所示。3.8簡單時序電路的描述
以上所述示例都是組【例3-18】【例3-18】圖3-13D觸發(fā)器時序波形圖3-13D觸發(fā)器時序波形從仿真結(jié)果可以看出,當(dāng)時鐘信號clk上升沿到來時,輸出信號q隨輸入信號d的變化而變化,以實(shí)現(xiàn)D觸發(fā)器的功能。例3-18涉及的相關(guān)語法如下:
(1)?IF語句中的判斷表達(dá)式“clk'EVENTANDclk?=?'1'?”用于檢測時鐘信號clk的上升沿(L15),即只要有時鐘信號clk的上升沿到來,表達(dá)式將輸出TURE,執(zhí)行賦值語句“q1<=d”,從而實(shí)現(xiàn)D觸發(fā)器的功能。從仿真結(jié)果可以看出,當(dāng)時鐘信號clk上升沿到來時,輸出信(2)關(guān)鍵詞EVENT是預(yù)定義的信號類屬性,用來獲得指定對象行為的信息,其格式一般是:<對象>‘EVENT。屬性EVENT表示如果信號在很短的時間內(nèi)發(fā)生變化,則返回TURE。L15表示:信號clk在一小段時間內(nèi)發(fā)生變化,且變化后clk取值為“1”,兩者都成立的情況下,可以推斷clk出現(xiàn)了一個上升沿,判斷表達(dá)式輸出為TURE。(2)關(guān)鍵詞EVENT是預(yù)定義的信號類屬性,用來獲得指定對(3)也可采用其他的方式來進(jìn)行上升沿的檢測,如例3-19~例3-21所示。由于clk信號的數(shù)據(jù)類型是STD_LOGIC,則它可能的取值有9種,那么語句“clk'EVENTANDclk='1'”并不能保證信號clk發(fā)生跳變前的值是“0”(有可能是從“Z”到“1”的跳變),這樣就不能確保clk出現(xiàn)了一個上升沿。例3-19使用了信號屬性LAST_VALUE,它表示在最后一次事件發(fā)生前信號的值,如果“clk'LAST_VALUE='0'”成立,則確保了信號clk發(fā)生變化前的值為“0”。例3-21使用了函數(shù)rising_egde(),該函數(shù)是在IEEE庫的標(biāo)準(zhǔn)程序包std_logic_1164中的預(yù)定義函數(shù),只能用于數(shù)據(jù)類型STD_LOGIC,指定信號的值必須是“0”到“1”的轉(zhuǎn)換,(3)也可采用其他的方式來進(jìn)行上升沿的檢測,如例3-1不允許“Z”或“X”到1的轉(zhuǎn)換。同樣在std_logic_1164程序包中還定義了測試下降沿的函數(shù)falling_edge(),指定信號的值必須是“1”到“0”的轉(zhuǎn)換。需要注意的是,在使用這兩個函數(shù)前必須打開IEEE庫和std_logic_1164程序包。雖然,例3-19~例3-21是更為嚴(yán)格的上升沿的檢測方式,但考慮到多數(shù)綜合器并不理會邊沿檢測語句中信號的STD_LOGIC數(shù)據(jù)類型,所以最常用的檢測語句仍是“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語句屬于單分支條件語句,對于不滿足條件(即沒有上升沿到來)的情況,VHDL的綜合器會解釋成跳過賦值語句q1<=d不予執(zhí)行,這意味著保持q1的原值不變。對于數(shù)字電路來說,當(dāng)輸入改變后仍能保持原值不變,就意味著使用了具有存儲功能的元件,必須引進(jìn)時序元件(寄存器)來保存q1的原值,直到滿足IF語句的判斷條件后才能更新q1的值。然而必須注意,雖然在構(gòu)成時序電路方面,可以利用這種單分支條件語句所具有的獨(dú)特功能構(gòu)成時序電路,但在利用條件語句進(jìn)行純組合電路設(shè)計時,如果沒有充分考慮到電路中所有可能出現(xiàn)的條件,即沒有列出所有的條件及其對應(yīng)的處理方法就會綜合出設(shè)計者不希望得到的組合與時序電路的混合體。因此初學(xué)者在使用IF語句形式的時候要特別注意單分支IF語句的使用。
(4)例3-18的IF語句屬于單分支條件語句,對于不滿第3章VHDL語言入門
3.1VHDL語言概述3.2兩個簡單的組合電路示例3.3庫和程序包3.4實(shí)體描述3.5結(jié)構(gòu)體描述3.6配置3.7層次結(jié)構(gòu)的VHDL描述3.8簡單時序電路的描述第3章VHDL語言入門
3.1VHDL語言概述3.1VHDL語言概述
VHDL的主要目的是進(jìn)行系統(tǒng)的描述、行為的建模與仿真。盡管所有的VHDL代碼都是可以仿真的,但并不是所有代碼都是可以綜合的,這取決于各EDA廠商綜合器對VHDL的支持程度。
與其他的硬件描述語言相比,VHDL具有更強(qiáng)的行為描述能力,從而決定了它成為數(shù)字系統(tǒng)設(shè)計領(lǐng)域最佳的硬件描述語言之一。強(qiáng)大的行為描述能力是使其避開具體的器件結(jié)構(gòu),從邏輯行為上成為描述和設(shè)計大規(guī)模電子系統(tǒng)的重要保證。3.1VHDL語言概述
VHDL的主要目的VHDL語言的優(yōu)勢如下:
(1)?VHDL有豐富的語句形式和庫函數(shù),使其在系統(tǒng)的設(shè)計早期就能從行為特性上查驗(yàn)系統(tǒng)的功能可行性,并隨時可對設(shè)計進(jìn)行仿真。
(2)?VHDL語句的行為描述能力和代碼結(jié)構(gòu)決定了它具有支持大規(guī)模設(shè)計的分解和已有設(shè)計的再利用功能,符合大規(guī)模系統(tǒng)所需的多人協(xié)同高效工作的要求。
(3)?VHDL對設(shè)計的描述具有相對獨(dú)立性,開發(fā)者可以不懂硬件的結(jié)構(gòu),也不必關(guān)心最終設(shè)計實(shí)現(xiàn)的目標(biāo)器件是什么,便可進(jìn)行相對獨(dú)立的設(shè)計。
(4)?VHDL與設(shè)計平臺無關(guān),可移植性較好。VHDL語言的優(yōu)勢如下:
(1)?VHDL有豐富的(5)?VHDL是最早成為IEEE標(biāo)準(zhǔn)的硬件描述語言,使用廣泛,資料分享和查找非常方便,對初學(xué)者學(xué)習(xí)非常有幫助。
需要特別注意的是,VHDL與常規(guī)計算機(jī)高級程序設(shè)計語言有所不同,VHDL語句從根本上講是并發(fā)執(zhí)行的,只有在進(jìn)程(Process)、函數(shù)(Function)和過程(Procedure)內(nèi)部的語句才是順序執(zhí)行的。
VHDL描述了電路設(shè)計的行為、功能、輸入以及輸出,其本質(zhì)是用程序語言的方式來描述硬件。圖3-1顯示了VHDL
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 抖音商戶直播投流ROI評估與優(yōu)化制度
- 全球生物制藥行業(yè)2025年創(chuàng)新藥研發(fā)管線與靶點(diǎn)深度報告
- 八大物流企業(yè)綠色物流實(shí)踐與行業(yè)規(guī)范制定報告
- 黑龍江中醫(yī)藥大學(xué)《藥用植物學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 公眾參與機(jī)制在2025年環(huán)境影響評價中的實(shí)踐與反思報告
- 2025屆江蘇省無錫市青陽初級中學(xué)七年級數(shù)學(xué)第一學(xué)期期末監(jiān)測試題含解析
- 安慶醫(yī)藥高等??茖W(xué)校《醫(yī)學(xué)微生物與臨床微生物檢驗(yàn)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 內(nèi)蒙古自治區(qū)赤峰市翁牛特旗烏敦套海中學(xué)2024年九年級化學(xué)第一學(xué)期期末復(fù)習(xí)檢測試題含解析
- 2024-2025學(xué)年天津市河西區(qū)新華圣功學(xué)校九上化學(xué)期末復(fù)習(xí)檢測試題含解析
- 黑龍江幼兒師范高等專科學(xué)?!吨袊幕ㄕ摗?023-2024學(xué)年第一學(xué)期期末試卷
- 2025年6月22日四川省市直事業(yè)單位遴選筆試真題及答案解析
- 慶陽市隴東學(xué)院招聘事業(yè)編制筆試真題2024
- 心理學(xué)考試題及答案
- 護(hù)理領(lǐng)域的職業(yè)發(fā)展與前景展望
- 2025上海濟(jì)光職業(yè)技術(shù)學(xué)院輔導(dǎo)員考試試題及答案
- 2024年江蘇三支一扶真題
- 主、被動防護(hù)網(wǎng)施工方案-圖文
- 2025年初中語文文學(xué)常識:???00題匯編
- 君易和文化課件
- 藥食同源106種25年4月更新
評論
0/150
提交評論