EDA技術與VHDL設計(西電版)第3章-VHDL語言入門課件_第1頁
EDA技術與VHDL設計(西電版)第3章-VHDL語言入門課件_第2頁
EDA技術與VHDL設計(西電版)第3章-VHDL語言入門課件_第3頁
EDA技術與VHDL設計(西電版)第3章-VHDL語言入門課件_第4頁
EDA技術與VHDL設計(西電版)第3章-VHDL語言入門課件_第5頁
已閱讀5頁,還剩241頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第3章VHDL語言入門

3.1VHDL語言概述3.2兩個簡單的組合電路示例3.3庫和程序包3.4實體描述3.5結(jié)構(gòu)體描述3.6配置3.7層次結(jié)構(gòu)的VHDL描述3.8簡單時序電路的描述第3章VHDL語言入門

3.1VHDL語言概述3.1VHDL語言概述

VHDL的主要目的是進行系統(tǒng)的描述、行為的建模與仿真。盡管所有的VHDL代碼都是可以仿真的,但并不是所有代碼都是可以綜合的,這取決于各EDA廠商綜合器對VHDL的支持程度。

與其他的硬件描述語言相比,VHDL具有更強的行為描述能力,從而決定了它成為數(shù)字系統(tǒng)設計領域最佳的硬件描述語言之一。強大的行為描述能力是使其避開具體的器件結(jié)構(gòu),從邏輯行為上成為描述和設計大規(guī)模電子系統(tǒng)的重要保證。3.1VHDL語言概述

VHDL的主要目的VHDL語言的優(yōu)勢如下:

(1)?VHDL有豐富的語句形式和庫函數(shù),使其在系統(tǒng)的設計早期就能從行為特性上查驗系統(tǒng)的功能可行性,并隨時可對設計進行仿真。

(2)?VHDL語句的行為描述能力和代碼結(jié)構(gòu)決定了它具有支持大規(guī)模設計的分解和已有設計的再利用功能,符合大規(guī)模系統(tǒng)所需的多人協(xié)同高效工作的要求。

(3)?VHDL對設計的描述具有相對獨立性,開發(fā)者可以不懂硬件的結(jié)構(gòu),也不必關心最終設計實現(xiàn)的目標器件是什么,便可進行相對獨立的設計。

(4)?VHDL與設計平臺無關,可移植性較好。VHDL語言的優(yōu)勢如下:

(1)?VHDL有豐富的(5)?VHDL是最早成為IEEE標準的硬件描述語言,使用廣泛,資料分享和查找非常方便,對初學者學習非常有幫助。

需要特別注意的是,VHDL與常規(guī)計算機高級程序設計語言有所不同,VHDL語句從根本上講是并發(fā)執(zhí)行的,只有在進程(Process)、函數(shù)(Function)和過程(Procedure)內(nèi)部的語句才是順序執(zhí)行的。

VHDL描述了電路設計的行為、功能、輸入以及輸出,其本質(zhì)是用程序語言的方式來描述硬件。圖3-1顯示了VHDL的基本硬件模型。VHDL將一個電路系統(tǒng)分為外部可見部分和內(nèi)部隱藏部分。利用VHDL實現(xiàn)一個電路系統(tǒng),首先需要定義實體(Entity),在實體定義中完成與外部接口的(5)?VHDL是最早成為IEEE標準的硬件描述語言,定義,包括輸入接口(InputPorts)和輸出接口(OutputPorts)的定義,這是可見部分。實現(xiàn)電路功能的具體算法則在結(jié)構(gòu)體(Architecture)中定義。當其他設計需要引用該設計時(或稱為對其進行重用時),這部分像一個黑盒子一樣,是隱藏的。結(jié)構(gòu)體內(nèi)部往往包含相互連接的多個進程和元件,它們都是并行運行的。結(jié)構(gòu)體由信號賦值語句、進程語句和元件例化語句等組成。進程中可以調(diào)用子程序。不同的進程之間通過信號進行信息的交互。VHDL里的進程既可以生成由觸發(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ù)字電路中,2選1多路選擇器是組合電路的典型代表。假設有a和b兩個數(shù)據(jù),控制信號為s,當s取值為0時,選擇數(shù)據(jù)a作為輸出;否則,選擇數(shù)據(jù)b作為輸出。按照數(shù)字電路的設計方法,首先需要列出真值表、卡諾圖,然后通過化簡卡諾圖得到最簡邏輯表達式,再根據(jù)所選擇邏輯器件的要求(如采用與門、或門實現(xiàn)電路,或只能采用與非門實現(xiàn)電路)進行表達式的變換,確認最終的電路形式。圖3-2是2選1多路選擇器的卡諾圖及化簡后的邏輯表達式,圖3-3是根據(jù)邏輯表達式確定的最終電路形式。3.2.12選1多路選擇器的設計

在數(shù)字電路中,2選圖3-22選1多路選擇器卡諾圖及邏輯表達式圖3-22選1多路選擇器卡諾圖及邏輯表達式圖3-32選1多路選擇器的電路結(jié)構(gòu)圖3-32選1多路選擇器的電路結(jié)構(gòu)例3-1是與圖3-3電路結(jié)構(gòu)相對應的采用VHDL語言實現(xiàn)的電路描述。

【例3-1】例3-1是與圖3-3電路結(jié)構(gòu)相對應的采用VHDL語言實現(xiàn)由例3-1可見,此電路的VHDL描述由兩部分組成,其中L2~L5是實體描述,L7~L10是結(jié)構(gòu)體描述。下面就本例涉及到的一些語法作簡單的講解。

(1)以關鍵詞ENTITY為引導、ENDENTITY為結(jié)束的語句部分,稱為實體。其中mux21是設計者自行取定的實體名,取名最好依據(jù)相應功能來確定,使其具有可讀性。VHDL的實體描述了電路器件的外部情況及信號端口的基本性質(zhì),如信號流動的方向(輸入、輸出或其他)、在其上流動的信號的數(shù)據(jù)類型等。關鍵詞PORT表示定義端口。本例中定義了a、b、s三個輸入端口(輸入信號),其數(shù)據(jù)類型為位(BIT)數(shù)據(jù)類型。BIT數(shù)據(jù)類型的信號取值只有邏輯“0”和由例3-1可見,此電路的VHDL描述由兩部分組成,其中L“1”兩種,在VHDL中表達時必須加單引號,否則VHDL綜合器會將其解釋為另一種數(shù)據(jù)類型——整型。BIT數(shù)據(jù)類型可以參與邏輯運算,其結(jié)果仍是邏輯位的數(shù)據(jù)類型。VHDL語法規(guī)定,任何一種數(shù)據(jù)對象的應用都必須嚴格限定其數(shù)據(jù)類型和取值范圍,不同數(shù)據(jù)類型和取值范圍的數(shù)據(jù)對象將不能相互賦值或進行其他操作。本例還定義了一個輸出端口(輸出信號)y,其數(shù)據(jù)類型也是BIT?!?”兩種,在VHDL中表達時必須加單引號,否則VHDL綜合(2)以關鍵詞ARCHITECTURE為引導、ENDARCHITECTURE為結(jié)尾的語句部分,稱為結(jié)構(gòu)體。其中construct是結(jié)構(gòu)體的名稱,也是由設計者自行定義的。VHDL的結(jié)構(gòu)體負責描述電路器件的內(nèi)部邏輯功能和電路結(jié)構(gòu)。關鍵詞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)以關鍵詞ARCHITECTURE為引導、END(3)關鍵詞是VHDL語言中預定義的有特殊含義的英文詞語,只能用作固定的用途。關鍵詞不能再用作用戶自定義的名稱。雖然在EDA工具編譯和綜合時,關鍵詞并不區(qū)分大小寫,但是對關鍵詞采用大寫字母,對設計者自己定義的實體名稱、信號名稱等其他名稱使用小寫字母,能夠提高代碼的可讀性,使其更加規(guī)范。一般而言,EDA工具的文本編輯器都能夠識別關鍵詞,即關鍵詞敏感型,EDA會用不同的顏色來顯示關鍵詞,所以在編輯代碼時一般不會誤用關鍵詞。(3)關鍵詞是VHDL語言中預定義的有特殊含義的英文詞(4)實體名稱mux21,結(jié)構(gòu)體名稱construct,輸入端口名稱a、b、s以及輸出端口名稱y都統(tǒng)稱為標識符。所謂標識符就是設計者在VHDL代碼中自定義的、用于不同名稱的詞語。使用標識符也要遵循一定的規(guī)則:①標識符由字母、數(shù)字、下劃線構(gòu)成,但必須以字母開頭;②只能是單一下劃線,且不能以下劃線作為標識符的結(jié)束;③VHDL的關鍵詞不能再用作標識符;④EDA工具庫中已定義好的元件名不能作為標識符,如and2、dff等。雖然標識符與關鍵詞一樣,在編譯和綜合時并不區(qū)分大小寫,但是為保證代碼書寫的規(guī)范,我們建議標識符采用小寫字母。(4)實體名稱mux21,結(jié)構(gòu)體名稱construct(5)分號的作用。分號用于語句的分割,每條VHDL語句都有一個分號表示結(jié)束。需要注意的是,最后一個端口定義處的分號在括號外,如L4所示。

(6)規(guī)范的代碼書寫。盡管VHDL代碼的書寫格式要求十分寬松,但規(guī)范的書寫習慣是高效的電路設計所必備的。最頂層的ENTITY、ARCHITECTURE描述語句需要放在最左側(cè),比它們低一層次的描述語句(如PORT),需要向右靠4個小寫字母的間隔。相同層次的語句需要對齊。

(7)雙橫線“--”是注釋符。在VHDL代碼中的任何一行,只要出現(xiàn)了“--”,其后的文字或語句都不再參加編譯和綜合。良好的注釋有助于設計者閱讀、理解VHDL代碼。(5)分號的作用。分號用于語句的分割,每條VHDL語句例3-1對應的元件符號如圖3-4所示。采用QuartusⅡ軟件仿真后的結(jié)果如圖3-5所示??梢郧宄乜吹剑斂刂贫丝趕取值為“0”時,輸出y即為輸入信號a的值;反之,則為輸入信號b的值,滿足設計要求。

例3-1采用的VHDL描述與其電路結(jié)構(gòu)是一一對應的,讀者可能會疑惑,這樣的描述形式似乎并不能體現(xiàn)VHDL行為描述的優(yōu)勢,且設計者必須搞清楚電路結(jié)構(gòu)才能進行VHDL代碼的編輯。其實VHDL有多種不同的描述方式,在后續(xù)章節(jié)中會詳細介紹,例3-1的目的是讓讀者能夠以數(shù)字電路的知識作為鋪墊,快速進入EDA的學習。例3-1對應的元件符號如圖3-4所示。采用Quartus圖3-4mux21元件符號圖3-4mux21元件符號圖3-52選1多路選擇器電路的時序波形圖3-52選1多路選擇器電路的時序波形3.2.2半加器的設計

下面再通過一個半加器的例子來說明VHDL的基本結(jié)構(gòu)形式。半加器指兩個1位二進制數(shù)相加,只考慮兩個加數(shù)本身,而沒有考慮由低位來的進位。圖3-6顯示了半加器的真值表和邏輯表達式,其中a、b是兩個加數(shù),co是進位端,so是求和端。圖3-7是半加器的電路結(jié)構(gòu)。例3-2是半加器的VHDL描述,此例仍然采用邏輯操作符描述電路結(jié)構(gòu)的方式。3.2.2半加器的設計

下面再通過一個半加器的例子來圖3-6半加器真值表和邏輯表達式圖3-6半加器真值表和邏輯表達式圖3-7半加器電路結(jié)構(gòu)圖3-7半加器電路結(jié)構(gòu)【例3-2】【例3-2】例3-2與例3-1相比,除了包含實體和結(jié)構(gòu)體兩個部分外,還增加了庫和程序包的聲明(L2~L3)。例3-2所涉及的相關語法講解如下:

(1)?L2以關鍵詞LIBRARY為引導,LIBRARYieee表示打開IEEE庫。L3以關鍵詞USE為引導,表示允許使用IEEE庫中的std_logic_1164程序包中的所有內(nèi)容(.all)。例3-2使用庫和程序包的原因是本例中用到了數(shù)據(jù)類型STD_LOGIC,該數(shù)據(jù)類型的相關定義都是包含在std_logic_1164程序包中的,而該程序包在IEEE庫中,所以在使用前必須先給予聲明。如將例3-2去掉L2~L3后,再次使用QuartusⅡ軟件進行編譯,將會產(chǎn)生如圖3-8所示錯誤,提示數(shù)據(jù)類型STD_LOGIC未聲明。這進一步說明了此處聲明庫和程序包的作用。例3-2與例3-1相比,除了包含實體和結(jié)構(gòu)體兩個部分外,圖3-8例3-2不聲明IEEE庫和std_logic_1164程序包報錯信息圖3-8例3-2不聲明IEEE庫和std_logic_1讀者也許會問,例3-1也使用了數(shù)據(jù)類型BIT,為什么不需要進行庫和程序包的聲明呢?數(shù)據(jù)類型BIT的定義是包含在VHDL標準程序包standard中的,而該程序包包含于VHDL標準庫STD中。由于VHDL標準中規(guī)定STD庫是默認打開的,因此就不需要像例3-2這樣將庫和程序包以語句顯式地表達在VHDL代碼的開頭。讀者也許會問,例3-1也使用了數(shù)據(jù)類型BIT,為什么不需(2)數(shù)據(jù)類型STD_LOGIC稱為標準邏輯位數(shù)據(jù)類型,共定義了九種取值,分別是:“U”(未初始化的)、“X”(強未知的)、“0”(強邏輯0)、“1”(強邏輯1)、“Z”(高阻態(tài))、“W”(弱未知的)、“L”(弱邏輯0)、“H”(弱邏輯1)、“-”(忽略)??梢园l(fā)現(xiàn),數(shù)據(jù)類型STD_LOGIC包含的內(nèi)容比數(shù)據(jù)類型BIT要豐富和完整,它可以使設計者精確地模擬一些未知的和具有高阻態(tài)的線路的情況,更適用于數(shù)字系統(tǒng)的設計。STD_LOGIC型數(shù)據(jù)能夠被綜合器接受的一般只有“X”(或“-”)、“0”、“1”、“Z”這幾種,其他的取值則不可綜合,只能用于仿真器。

例3-2的仿真結(jié)果如圖3-9所示。(2)數(shù)據(jù)類型STD_LOGIC稱為標準邏輯位數(shù)據(jù)類型圖3-9半加器電路的時序波形圖3-9半加器電路的時序波形3.2.3VHDL代碼設計基本結(jié)構(gòu)

從例3-1和例3-2可以看出,一個能夠被綜合的VHDL代碼至少須包含實體和結(jié)構(gòu)體兩個部分,如果有需要還要進行庫和程序包的聲明。

一般來說,把一個完整的、可綜合的VHDL設計稱為設計實體。VHDL代碼有比較固定的結(jié)構(gòu)格式,一般首先出現(xiàn)的是庫和程序包的使用聲明,然后是實體的描述以及結(jié)構(gòu)體的描述。當然,同一個電路系統(tǒng)可能有不同的實現(xiàn)方法,有不同的電路結(jié)構(gòu),VHDL允許一個實體對應一個或多個結(jié)構(gòu)體,不同的結(jié)構(gòu)體意味著不同的實現(xiàn)方式。如何從對應的多個結(jié)構(gòu)體中選擇特定的一個結(jié)構(gòu)體,將其指定給實體,就需要用到配置??偨Y(jié)說來,VHDL代碼設計基本結(jié)構(gòu)如圖3-10所示。3.2.3VHDL代碼設計基本結(jié)構(gòu)

從例3-1和例3圖3-10VHDL代碼設計基本結(jié)構(gòu)示意圖圖3-10VHDL代碼設計基本結(jié)構(gòu)示意圖3.3庫?和?程?序?包

庫是一些常用VHDL代碼的集合,包括:數(shù)據(jù)類型的定義、函數(shù)的定義、子程序定義、元件引用聲明、常量的定義等一些可復用或是共享的VHDL代碼,類似于C語言中的頭文件。這些已定義的數(shù)據(jù)類型、子程序、常數(shù)等通常收集在程序包(Package)中,多個程序包再并入一個庫中,引用了庫之后就可以在設計者自己的代碼中使用庫中的VHDL代碼。庫和程序包的使用使得設計人員能夠遵循某些統(tǒng)一的語言標準或數(shù)據(jù)格式,也能夠方便地調(diào)用一些已設計好的內(nèi)容,提高設計效率,這一點對于多組開發(fā)人員并行工作的大規(guī)模電路系統(tǒng)的設計尤為重要。3.3庫?和?程?序?包

庫是一些常用庫和程序包的聲明總是放在設計單元的最前面,以便后續(xù)設計能夠隨時使用庫中指定的程序包中的內(nèi)容。每當綜合器在較高層次的VHDL源文件中遇到庫語言,就將隨庫指定的源文件讀入,并參與綜合。在VHDL語言中可以存在多個不同的庫,但是庫與庫之間是獨立的,不能互相嵌套。庫和程序包的聲明總是放在設計單元的最前面,以便后續(xù)設計能3.3.1庫和程序包的種類

當前在VHDL語言中存在的庫大致可以歸納為五種:IEEE庫、STD庫、WORK庫、VITAL庫和用戶自定義庫。

1.IEEE庫

IEEE庫是VHDL設計中最常用的庫之一,它包含IEEE標準的程序包以及其他一些支持工業(yè)標準的程序包。下面就幾個常用和重要的程序包作一定介紹,相關內(nèi)容還可參見4.3節(jié)以及附錄A。附錄A中給出了相關程序包的具體定義,有助于讀者了解程序包內(nèi)定義的內(nèi)容,進一步理解使用不同程序包的目的。3.3.1庫和程序包的種類

當前在VHDL語言中存在(1)?std_logic_1164程序包。該程序包是最重要和最常用的程序包,是IEEE的標準程序包。std_logic_1164程序包定義了STD_LOGIC和STD_ULOGIC數(shù)據(jù)類型以及它們的矢量類型和相關操作(如適用于該數(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標準,但由于已經(jīng)成為事實上的工業(yè)標準,所以也都并入了IEEE庫。std_logic_arith程序包在std_logic_1164程序包的基礎上定義了有符號(SIGNED)、無符號(UNSIGNED)、小整型(SMALL_INT)數(shù)據(jù)類型,其中有符號和無符號數(shù)據(jù)類型均是基于STD_LOGIC數(shù)據(jù)類型的。該程序包還定義了這些數(shù)據(jù)類型之間的相互轉(zhuǎn)換函數(shù),以及適用于它們的一些操作符,如算術操作符、比較操作符等。(2)?std_logic_arith程序包。該程序包(3)?std_logic_signed程序包。該程序包也是由Synopsys公司定義的,同樣并入IEEE庫。std_logic_signed程序包對INTEGER(整型)、STD_LOGIC、STD_LOGIC_VECTOR數(shù)據(jù)類型的定義進行了擴展,重載了用于這些數(shù)據(jù)類型的混合運算的運算符,以及一個由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正式認可的標準程序包集合。一般來說,基于FPGA/CPLD的開發(fā),使用std_logic_1164、std_logic_arith、std_logic_signed以及std_logic_unsigned這4個程序包已經(jīng)能夠滿足大多數(shù)的需要。所以,其他幾個程序包不再一一進行講述,讀者如有興趣,可查閱相關資料。此外,IEEE庫還包括了math_real、number2.STD庫

STD庫中含有VHDL語言標準定義的兩個標準程序包,即standard程序包和textio程序包。

(1)?standard程序包。該程序包是VHDL標準程序包,使用時默認打開。所以設計者在使用時,并不需要像IEEE庫中的程序包那樣使用關鍵詞LIBRARY和USE進行顯式的聲明。如:例3-1中BIT數(shù)據(jù)類型并沒有做庫的聲明格式,就是因為BIT數(shù)據(jù)類型是定義在standard程序包中的。standard程序包定義了諸如BOOLEAN(布爾型)、BIT(位型)、CHARACTER(字符型)、INTEGER(整型)、REAL(實數(shù)型)、TIME(時間型)等數(shù)據(jù)類型以及相關的操作。2.STD庫

STD庫中含有VHDL語言標準定義的兩(2)?textio程序包。該程序包主要供仿真器使用,綜合器會忽略此程序包。設計者可以用文本編輯器建立一個數(shù)據(jù)文件,文件中包含仿真時需要的數(shù)據(jù)。仿真時利用textio程序包中提供的用于訪問文件的過程,即可獲得這些數(shù)據(jù)或?qū)⒎抡娼Y(jié)果保存于文件中。textio程序包實際上是專為VHDL模擬工具提供的與外部計算機文件管理系統(tǒng)進行數(shù)據(jù)交換的通道,使用前需要使用USE語句。8.2.3節(jié)將講解該程序包的使用。(2)?textio程序包。該程序包主要供仿真器使用,3.WORK庫

WORK庫是用戶進行VHDL設計的現(xiàn)行工作庫,用于存放用戶設計和定義的一些設計單元和程序包,是用戶自己設計的倉庫。VHDL標準規(guī)定WORK庫總是可見的,因此在實際使用時,也不需要使用LIBRARY和USE語句顯式的打開。VHDL標準要求為設計的項目建立一個文件夾,與此項目相關的工程、文件等都保存于此文件夾內(nèi)。VHDL綜合器會將此文件夾默認為WORK庫,指向該文件夾的路徑。需要注意的是,WORK庫并不是這個文件夾的名字,它是一個邏輯名。3.WORK庫

WORK庫是用戶進行VHDL設計的現(xiàn)4.VITAL庫

VITAL庫符合IEEE標準,由含有精確ASIC時序模型的時序程序包集合vital_timing和基本元件程序包集合vital_primitives構(gòu)成,支持以ASIC單元的真實時序數(shù)據(jù)對一個VHDL設計進行精確的模擬驗證,提高VHDL門級時序模擬的精度。但由于各FPGA/CPLD生產(chǎn)廠商的適配工具都能夠為各自的芯片生成帶時序信息的VHDL門級網(wǎng)表,用VHDL仿真器仿真該網(wǎng)表就可以得到精確的時序仿真結(jié)果。因此,在FPGA/CPLD設計開發(fā)過程中,一般不需要使用VITAL庫中的程序包來進行仿真。4.VITAL庫

VITAL庫符合IEEE標準,由含5.用戶自定義庫

用戶為自身設計需要所開發(fā)的公共包集合和實體等,可以匯集在一起定義為一個庫,即用戶自定義庫,供其他開發(fā)者調(diào)用,但在使用時同樣要首先說明庫名。

此外,各EDA開發(fā)商為了便于開發(fā)設計,還提供了一些自己的庫,如Altera公司的LPM庫(本書配套的《EDA技術與VHDL設計實驗指導》一書中會對LPM庫進行講解)、Synopsys公司的Synopsys庫等。5.用戶自定義庫

用戶為自身設計需要所開發(fā)的公共包集3.3.2庫和程序包的使用

在前面提到的幾類庫中,除了STD庫和WORK庫以外,其他庫在使用前都需要首先進行聲明。聲明格式如下:

LIBRARY<庫名>;

USE<庫名>.<程序包名>.all;

其中:第一條語句表示使用什么庫;第二條語句表示使用庫中的哪一個程序包。此處,all代表打開庫中指定程序包內(nèi)的所有資源。當然,也可以只打開程序包內(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程序包中的所有資源

庫聲明語句的范圍從一個實體說明開始,到它所屬的結(jié)構(gòu)體、配置為止。當一個源程序中出現(xiàn)兩個以上的實體時,兩條作為庫使用聲明的語句必須在每個實體說明語句前重復書寫。例3-3給出了兩種不同的聲明格式。

【例3-3】

3.3.3程序包的定義

程序包(Package)說明類似于C語言中的include語句,用來單純地羅列VHDL語言中所用到的各種常數(shù)定義,數(shù)據(jù)類型定義,元件、函數(shù)和過程定義等。程序包是一個可編譯的設計單元,也是庫結(jié)構(gòu)中的一個層次。程序包可分為預定義程序包和用戶自定義程序包兩類。上述的std_logic_1164、std_logic_arith等程序包屬于常用的預定義程序包。3.3.3程序包的定義

程序包(Package)說明定義程序包的一般結(jié)構(gòu)如下:

PACKAGE<程序包名>IS --程序包首

說明語句;

ENDPACKAGE<程序包名>;

[PACKAGEBODY<程序包名>IS --程序包體

說明語句;

ENDPACKAGEBODY<程序包名>;]定義程序包的一般結(jié)構(gòu)如下:

PACKAGE<程序包一個程序包的定義由兩大部分組成:程序包首和程序包體。一個完整的程序包中,程序包首和程序包體的名稱應是同一個。程序包體是一個可選項,當沒有定義函數(shù)和過程時,程序包可以只由程序包首構(gòu)成。程序包首的說明語句部分進行數(shù)據(jù)類型的定義,常數(shù)的定義,元件、函數(shù)及過程的聲明等。程序包體的說明語句部分進行具體函數(shù)、過程功能的描述。例3-4給出了一個程序包定義的示例,其程序包名稱是my_package,在其中定義了一個新的數(shù)據(jù)類型color、一個常數(shù)x以及一個函數(shù)positive_edge。由于函數(shù)必須要有具體的內(nèi)容,所以在程序包體內(nèi)進行描述。如果該程序包在當前WORK庫中已定義,則要使用該程序包中的內(nèi)容,可利用USE語句,如例3-5所示。例3-4相關的語法知識會在后續(xù)章節(jié)中陸續(xù)介紹,這里只是讓讀者體會程序包的格式和用法。一個程序包的定義由兩大部分組成:程序包首和程序包體。一個【例3-4】【例3-4】【例3-5】

USEWORK.my_package.all;--由于WORK庫是默認打開的,因此可以省去LIBRARYWORK語句【例3-5】

USEWORK.my_package3.4實體描述

3.4.1實體描述語句的結(jié)構(gòu)

實體(Entity)用于一個設計實體與其他設計實體或外部電路進行接口的描述,是設計實體對外的一個通信界面。實體描述包括實體名、類屬聲明以及端口聲明。實體描述的一般語句格式如下:

ENTITY實體名IS

[GENERIC(參數(shù)名:數(shù)據(jù)類型[:=設定值]; --類屬聲明

參數(shù)名:數(shù)據(jù)類型[:=設定值]);]3.4實體描述

3.4.1實體描PORT(端口名:端口模式數(shù)據(jù)類型; --端口聲明

端口名:端口模式數(shù)據(jù)類型);

ENDENTITY實體名;

實體名是實體的標識,由設計者自行定義,一般為設計實體邏輯功能簡稱的英文字符,但要符合標識符命名的規(guī)則,如實體名clkdiv表示分頻器。考慮到某些EDA工具的限制(如QuartusⅡ軟件)、VHDL代碼的特點以及調(diào)用的方便性等,建議源程序所保存的文件名與實體名保持一致,如保存文件名為clkdiv.vhd(后綴名.vhd代表采用VHDL語言編寫)。此外,在同一個庫中,實體名必須是唯一的。PORT(端口名:端口模式數(shù)據(jù)類型; --在進行模塊化設計時,有時需要在不改變VHDL源代碼的基礎上,對設計實體的某些參數(shù)進行修改,從而改變設計實體內(nèi)部的電路結(jié)構(gòu)或規(guī)模,這時就需要用到類屬參量,即在類屬聲明中聲明的參數(shù)。類屬參量提供了可供外部修改參數(shù)的通道或是窗口。當調(diào)用該設計實體時,通過對類屬參量進行重新賦值就能夠?qū)崿F(xiàn)對設計實體內(nèi)部相應邏輯功能的修改,這樣既保證了電路功能的可修改性,又不會破壞VHDL程序的一致性,提高了代碼的復用性。類屬聲明部分是可選項,不是必須的,如例3-1和例3-2中都沒有類屬聲明。在進行模塊化設計時,有時需要在不改變VHDL源代碼的基礎端口聲明確定了端口的數(shù)目、端口上通過的信號的數(shù)據(jù)類型以及信號的流動方向,這是硬件描述語言的一大特點。硬件電路中信號的流向,即信號從什么地方來、做了怎樣的處理、最后輸出到哪里去。

綜上所述,實體描述的主要內(nèi)容包括:

(1)給實體取一個有意義的名稱;

(2)根據(jù)設計實體的外部接口,設計相應的端口并為端口確定符合邏輯功能的名稱,規(guī)定信號的流動方向和數(shù)據(jù)類型;

(3)根據(jù)需要聲明相應的類屬參量。以下就端口聲明和類屬聲明再進一步講解。端口聲明確定了端口的數(shù)目、端口上通過的信號的數(shù)據(jù)類型以及3.4.2端口聲明

端口聲明確定了輸入、輸出端口的數(shù)目和類型,以關鍵詞PORT引導,有端口名、端口模式、數(shù)據(jù)類型三個要點。

1.端口名

端口名是指賦予每個端口(引腳)的名稱,通常用一個或幾個英文字母或者字母加數(shù)字的方式來命名,如d0、d1、sel、q、qb、input1等。

2.端口模式

端口模式是指這些通道上數(shù)據(jù)的流動方向,IEEE1076標準包中定義了四種常用的端口模式:輸入(IN)模式、輸出(OUT)模式、雙向(INOUT)模式、緩沖(BUFFER)模式。3.4.2端口聲明

端口聲明確定了輸入、輸出端口的數(shù)(1)輸入模式用保留字IN來聲明。采用輸入模式聲明的端口信號的數(shù)據(jù)流向為實體外部到實體內(nèi)部,即數(shù)據(jù)只能通過此端口被讀入,如例3-1中的端口a、b、s。如果一個端口信號被聲明為輸入模式,則其只能作為賦值語句的右值存在,任何給該端口信號賦值的語句都會被綜合器報錯。

(2)輸出模式用保留字OUT來聲明。采用輸出模式聲明的端口信號的數(shù)據(jù)流向為實體內(nèi)部到外部,即數(shù)據(jù)只能通過此端口輸出,如例3-1中的端口y。如果一個端口信號被聲明為輸出模式,則其只能作為賦值語句的左值存在,任何讀取該端口信號的語句都會被綜合器報錯。(1)輸入模式用保留字IN來聲明。采用輸入模式聲明的端(3)雙向模式用保留字INOUT來聲明。采用雙向模式既可以從實體內(nèi)部輸出,也可以從實體外部輸入。但是同一時刻只能進行某一個數(shù)據(jù)流向的操作,因此雙向模式聲明的端口信號一般需要一個信號進行方向的控制。

(4)緩沖模式用保留字BUFFER來聲明。BUFFER模式與INOUT模式類似,既可以輸出,也可以輸入。但是,其輸入的數(shù)據(jù)只允許回讀內(nèi)部輸出的信號。(3)雙向模式用保留字INOUT來聲明。采用雙向模式既3.數(shù)據(jù)類型

端口信號必須確定其數(shù)據(jù)類型,即在其上流動的數(shù)據(jù)的類型。在VHDL中有多種數(shù)據(jù)類型,例3-1和例3-2分別用到了BIT和STD_LOGIC數(shù)據(jù)類型。相關的數(shù)據(jù)類型還有BOOLEAN(布爾型)、INTEGER(整型)、BIT_VECTOR(位矢量型)、STD_LOGIC_VECTOR(標準邏輯矢量型)、TIME(時間型)、REAL(實數(shù)型)等數(shù)據(jù)類型。3.數(shù)據(jù)類型

端口信號必須確定其數(shù)據(jù)類型,即在其上流VHDL從語言屬性上講是一種強類型語言。VHDL規(guī)定,任何一種數(shù)據(jù)對象的應用都必須嚴格限定其取值范圍和數(shù)值類型,不同數(shù)據(jù)對象在不同數(shù)據(jù)類型之間的賦值要作明確的界定,這一點和傳統(tǒng)C語言在數(shù)據(jù)對象的賦值上有比較大的區(qū)別。雖然這樣的做法在語言的靈活性上要差一些,但在大規(guī)模電路描述的排錯上卻是十分有益的,這是VHDL的特點之一。VHDL從語言屬性上講是一種強類型語言。VHDL規(guī)定,任3.4.3類屬聲明

類屬聲明可以聲明多個類屬參量(或稱類屬值、類屬變量),其中參數(shù)名和數(shù)據(jù)類型是必須的。將例3-1稍作改動,如例3-6所示。

【例3-6】3.4.3類屬聲明

類屬聲明可以聲明多個類屬參量(或EDA技術與VHDL設計(西電版)第3章-VHDL語言入門課件(1)在例3-6中加入了以關鍵詞GENERIC引導的語句(L3),該語句聲明了類屬參量m,其數(shù)據(jù)類型為TIME(時間類型)。設置了一個缺省值10ns,當沒有傳入其他具體參數(shù)值時,結(jié)構(gòu)體內(nèi)凡是用到m,其值都為10ns。GENERIC語句所定義的類屬參量與常量十分類似,但它能從外部動態(tài)地接受不同的賦值。(1)在例3-6中加入了以關鍵詞GENERIC引導的語(2)本例中還引入了一個新的數(shù)據(jù)對象,即使用關鍵詞SIGNAL定義的信號temp(L9),其數(shù)據(jù)類型是BIT。讀者可以將其理解為C語言的變量,作為數(shù)據(jù)的一種暫存節(jié)點。由于temp在結(jié)構(gòu)體內(nèi)定義,屬于內(nèi)部節(jié)點信號,數(shù)據(jù)的進出不像端口那樣受方向的限制,所以不必定義其端口模式(即輸入、輸出方向,如IN、OUT)。使用關鍵詞SIGNAL定義的標識符是信號,信號屬于數(shù)據(jù)對象(DataObjects)中的一種。VHDL中共有三類數(shù)據(jù)對象,分別是:常量(CONSTANT)、變量(VARIABLE)和信號(SIGNAL)。在第4章中會對三種數(shù)據(jù)對象進一步講解,使讀者掌握它們的用法和區(qū)別。(2)本例中還引入了一個新的數(shù)據(jù)對象,即使用關鍵詞SI(3)語句y<=tempAFTERm;表示延遲m(本例是10ns)后再將2選1數(shù)據(jù)選擇器的選擇結(jié)果送到輸出端口y上。

類屬參量多用于模塊化設計時不同層次模塊之間信息的傳遞,讀者可以將其理解為高層次模塊傳遞給底層模塊的形參。例3-6僅僅是類屬參量的一個簡單示例,目的是使讀者了解它的聲明格式等,在講解了層次型結(jié)構(gòu)后,將會用一個更加完善的例子來進一步認識類屬參量實現(xiàn)參數(shù)傳遞的功能。(3)語句y<=tempAFTERm;表示延3.5結(jié)?構(gòu)?體?描?述

3.5.1結(jié)構(gòu)體描述語句結(jié)構(gòu)

結(jié)構(gòu)體負責描述設計實體的內(nèi)部邏輯功能和電路結(jié)構(gòu)。結(jié)構(gòu)體一般由結(jié)構(gòu)體名、說明語句和功能描述語句組成,其一般語句格式如下:

ARCHITECTURE結(jié)構(gòu)體名OF實體名IS

[說明語句];

BEGIN

功能描述語句;

ENDARCHITECTURE結(jié)構(gòu)體名;3.5結(jié)?構(gòu)?體?描?述

3.5.1結(jié)構(gòu)體結(jié)構(gòu)體名是結(jié)構(gòu)體的標識,由設計者自行定義,可以根據(jù)結(jié)構(gòu)體的描述方式來命名,如結(jié)構(gòu)化描述形式可以使用結(jié)構(gòu)體名construct,行為描述形式可以使用結(jié)構(gòu)體名behavior(或簡寫為bhv);但需要注意的是,結(jié)構(gòu)體名也需要符合標識符命名的規(guī)則。結(jié)構(gòu)體描述部分的實體名應和結(jié)構(gòu)體對應實體的名稱一致。如果一個實體具有多個結(jié)構(gòu)體,結(jié)構(gòu)體的取名不可相重,但不同實體的結(jié)構(gòu)體可以同名。結(jié)構(gòu)體名是結(jié)構(gòu)體的標識,由設計者自行定義,可以根據(jù)結(jié)構(gòu)體結(jié)構(gòu)體說明語句位于關鍵詞ARCHITECTURE和BEGIN之間,主要是對結(jié)構(gòu)體功能描述語句中將要用到的數(shù)據(jù)類型、常量、信號、子程序、函數(shù)、元件等的聲明。說明語句并非必須的。在一個結(jié)構(gòu)體中,說明語句部分聲明的數(shù)據(jù)類型、常量、信號、子程序、函數(shù)、元件等只能用于該結(jié)構(gòu)體。如果希望它們能夠用于其他的設計實體,則需要作為程序包來處理。

結(jié)構(gòu)體功能描述語句位于關鍵詞BEGIN和ENDARCHITECTURE之間,負責具體邏輯功能和電路結(jié)構(gòu)的描述,可以是并行語句、順序語句或是二者的混合。結(jié)構(gòu)體說明語句位于關鍵詞ARCHITECTURE和BEG結(jié)構(gòu)體描述的結(jié)束語句“ENDARCHITECTURE結(jié)構(gòu)體名;”是符合VHDL93標準的語法要求的。若根據(jù)VHDL87標準的語法要求,可寫為“END結(jié)構(gòu)體名;”或直接使用“END;”。對于實體描述的結(jié)束語句,“ENDENTITY實體名;”也是符合VHDL93標準語法規(guī)則的,也可根據(jù)VHDL87標準語法要求寫成“END實體名;”或“END;”的形式。由于目前大多數(shù)EDA工具中的VHDL綜合器可以兼容兩種標準的語法規(guī)則,所以在后面的示例中不再特別指出二者的區(qū)別。需要注意的是,如果綜合器支持的VHDL標準不同,仍需要按照不同的語法規(guī)則進行代碼的編寫。結(jié)構(gòu)體描述的結(jié)束語句“ENDARCHITECTURE3.5.2說明語句

例3-7顯示了在結(jié)構(gòu)體說明語句部分使用關鍵詞TYPE聲明了兩個新的數(shù)據(jù)類型my_std_logic和color,關鍵詞SIGNAL聲明了一個信號temp,關鍵詞CONSTANT聲明了一個常量x,關鍵詞COMPONENT聲明了半加器元件halfadd,關鍵詞FUNCTION聲明了一個函數(shù)max。具體相關語法將在后續(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)成的設計實體定義為一個元件

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ù)類型是標準邏輯矢量,返回值是a、b中的最大值,其數(shù)據(jù)類型也是標準邏輯矢量

BEGIN

ENDARCHITECTUREbhv;co,so:OUTSTD_LOGIC);

END3.5.3功能描述語句

結(jié)構(gòu)體功能描述語句負責描述具體電路的邏輯實現(xiàn)。功能描述語句中可以包含進程、并行信號賦值語句、元件例化語句、子程序調(diào)用語句等幾類。這幾類語句都是以并行方式工作的,即語句的執(zhí)行不以書寫語句的順序為順序。而在每一種語句結(jié)構(gòu)的內(nèi)部可能含有并行運行的邏輯描述或是順序運行的邏輯描述。相對于C語言一類的軟件描述語言,并行語句結(jié)構(gòu)是VHDL語言最大的特色。

按照具體電路邏輯實現(xiàn)的方式進行分類,VHDL的描述方式可分為結(jié)構(gòu)化建模和行為建模兩類,下面分別進行介紹。3.5.3功能描述語句

結(jié)構(gòu)體功能描述語句負責描述具1.結(jié)構(gòu)化建模

結(jié)構(gòu)化建模通過明確的硬件實現(xiàn)來指定電路的功能,它描述設計單元的硬件結(jié)構(gòu),表示元件之間的互連。例3-1和例3-2都采用了結(jié)構(gòu)化建模的形式進行電路系統(tǒng)的描述。以2選1多路選擇器為例,它的邏輯電路由與門、或門和非門構(gòu)成,而這些基本的邏輯門電路都已經(jīng)是現(xiàn)成的設計單元,那么將這些現(xiàn)成的設計單元連接就可以構(gòu)成新的電路系統(tǒng),類似于電路原理圖中所畫器件的連接。1.結(jié)構(gòu)化建模

結(jié)構(gòu)化建模通過明確的硬件實現(xiàn)來指定電另一種常見的結(jié)構(gòu)化建模的描述方式是根據(jù)設計的邏輯功能進行模塊的劃分,首先進行各個模塊的設計和驗證;然后在頂層文件中對多個模塊進行調(diào)用,描述底層各模塊之間的連接關系,即層次型的VHDL描述,該描述主要采用元件聲明和元件例化語句完成。層次型的VHDL描述將在3.7節(jié)中具體講述。另一種常見的結(jié)構(gòu)化建模的描述方式是根據(jù)設計的邏輯功能進行2.行為建模

行為建模只規(guī)定了電路系統(tǒng)的功能或行為,不關心電路的實際結(jié)構(gòu),沒有明確指明涉及的硬件及連線等,即只關心“做什么”,不關心“怎么做”。行為建模是VHDL語言描述的一大特色,是VHDL編程的核心,它使得設計者可以在不了解硬件電路結(jié)構(gòu)的情況下實現(xiàn)電路系統(tǒng)。行為建模的描述形式充分體現(xiàn)了VHDL語言相對于其他硬件描述語言的優(yōu)勢。行為建模通常由一個或多個進程構(gòu)成,每一個進程內(nèi)包含了一系列的順序語句。下面仍以2選1多路選擇器為例來說明行為建模的描述方式。2.行為建模

行為建模只規(guī)定了電路系統(tǒng)的功能或行為,【例3-8】【例3-8】(1)以關鍵詞PROCESS引導開始、關鍵詞ENDPROCESS結(jié)束(L12~L17)的是進程語句。進程語句是最具有VHDL語言特色的語句,因為它提供了一種用算法描述硬件行為的方法。在一個結(jié)構(gòu)體中可以有一個或多個進程,不同的進程間是并行運行的,進程內(nèi)部是由一系列順序語句構(gòu)成的。進程語句的一般結(jié)構(gòu)如下:

[進程標號:]PROCESS[(敏感信號參數(shù)表)][IS]

[進程說明部分]

BEGIN

順序描述部分

ENDPROCESS[進程標號];(1)以關鍵詞PROCESS引導開始、關鍵詞ENDP進程語句結(jié)構(gòu)一般由三部分組成:敏感信號參數(shù)表、進程說明部分以及順序描述部分,其中敏感信號參數(shù)表以及進程說明部分都是可以省略的。進程標號是由設計者自行定義的標識符,也是可以省略的。

進程說明部分用于定義進程所需的局部數(shù)據(jù)環(huán)境,通常是數(shù)據(jù)類型、常數(shù)、子程序、變量等,它們將在順序描述語句中被使用,例3-8沒有說明語句部分。但需要注意,在進程說明部分不允許定義信號和全程變量(4.2.2節(jié)中講述)。以關鍵詞BEGIN引導開始的順序語句是一段順序執(zhí)行的語句,如IF語句、CASE語句、LOOP語句等。順序語句只在進程和函數(shù)、過程結(jié)構(gòu)中使用,在第5章中會對各類語句進一步講述。進程語句結(jié)構(gòu)一般由三部分組成:敏感信號參數(shù)表、進程說明部關鍵詞PROCESS后的(a,b,s)稱為進程的敏感信號參數(shù)表,通常要求將進程中所有的輸入信號都放在敏感信號參數(shù)表中。由于PROCESS語句的執(zhí)行依賴于敏感信號的變化,即當某一敏感信號發(fā)生改變,如信號s從“1”跳變到“0”時就將啟動進程語句,于是進程內(nèi)部的順序語句就被執(zhí)行一遍,然后返回進程的起始端,進入等待狀態(tài),直到下一次敏感信號參數(shù)表中的敏感信號再次發(fā)生變化。關鍵詞PROCESS后的(a,b,s)稱為進程的敏感信號(2)以關鍵詞IF引導開始、ENDIF結(jié)束(L14~L16)的是條件語句。條件語句是VHDL中重要、常用的順序語句,必須放置在進程中使用。關鍵詞IF后的“s='0'”是判斷表達式,如果判斷表達式成立(即s為低電平),則返回一個布爾型的數(shù)據(jù)類型TRUE,執(zhí)行關鍵詞THEN后的語句“y<=a”;如果判斷表達式不成立(即s為高電平),則返回FALSE,執(zhí)行關鍵詞ELSE后的語句“y<=b”。(2)以關鍵詞IF引導開始、ENDIF結(jié)束(L14~例3-9顯示一個結(jié)構(gòu)體中含有兩個進程(pro_1和pro_2)的情況。該例中就使用了進程的標號,用于區(qū)分不同的進程。兩個進程的執(zhí)行是并行、獨立的,由各自的敏感參數(shù)觸發(fā)。進程之間通過信號temp進行通信,信號具有全局性,因此信號的定義不能放置于進程內(nèi)部。進程pro_1用于實現(xiàn)數(shù)據(jù)a和b的選擇,當控制端selx取值為“0”時,選擇數(shù)據(jù)a;反之,選擇數(shù)據(jù)b。進程pro_1選擇的數(shù)據(jù)存于信號temp中。進程pro_2用于實現(xiàn)數(shù)據(jù)c和temp的選擇,當控制端sely取值為“0”時,選擇temp;反之,選擇c。因此,該例通過兩個控制信號selx和sely實現(xiàn)3選1數(shù)據(jù)選擇器。例3-9顯示一個結(jié)構(gòu)體中含有兩個進程(pro_1和pro【例3-9】【例3-9】

下面再通過一個4位二進制比較器的例子來說明PROCESS語句的結(jié)構(gòu)和順序語句的應用。

下面再通過一個4位二進制比較器的例子來【例3-10】【例3-10】(1)例3-10中,進程語句定義了敏感信號a和b。a和b為輸入數(shù)據(jù)端口。當輸入端口的信號發(fā)生變化時將啟動進程的執(zhí)行。進程中的順序語句為條件語句,語句執(zhí)行時進行條件判斷,條件表達式使用了關系操作符小于等于“<=”來對兩個端口的數(shù)據(jù)進行比較,如果條件成立則輸出端口y賦值“0”,否則y被賦值“1”。

(2)例3-10涉及到一個新的數(shù)據(jù)類型——標準邏輯矢量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中,進程語句定義了敏感信號a和b。a和需要定義數(shù)組的寬度,即數(shù)組中元素的個數(shù),如例3-10中L6通過“3DOWNTO0”定義其數(shù)組寬度為4,即信號a和b的數(shù)據(jù)類型都是一個具有4位位寬的矢量,即端口上的值由4位二進制數(shù)構(gòu)成。通過數(shù)組元素排列指示關鍵詞“DOWNTO”確定數(shù)組元素下標從左向右依次遞減:a(3)、a(2)、a(1)、a(0)和b(3)、b(2)、b(1)、b(0)。假設a值為“1110”,b值為“1101”,則利用關系操作符從左向右依次比較每一位的值:a(3)?=?b(3)?=?'1'、a(2)?=?b(2)?=?'1'、a(1)?=?'1'>?b(1)?=?'0',所以最后結(jié)果為a?>?b,即判斷表達式不成立。另一常用的數(shù)組元素排列指示關鍵詞“TO”用于確定數(shù)組元素下標從左向右遞增,如:a(0)、a(1)、a(2)、a(3)。需要注意的是,關系操作符進行判斷都是通過從左至右逐一對元素進行比較來決定的,并不管原數(shù)組的下標定義順序,即不管數(shù)組下標是使用DOWNTO還是TO,比較都是從左至右。需要定義數(shù)組的寬度,即數(shù)組中元素的個數(shù),如例3-10中L6通

3.6配置

對既定的電路功能,對應的電路結(jié)構(gòu)并不是唯一的,它可以對應不同的電路結(jié)構(gòu)方式。這意味著一個VHDL的設計只能有一個實體,但是可以有幾個結(jié)構(gòu)體,即使用幾種方案實現(xiàn)一種功能,其中每個結(jié)構(gòu)體的地位是相同的,但結(jié)構(gòu)體名不能重復。

配置(Configuration)可以把特定的結(jié)構(gòu)體指定給一個確定的實體,它描述實體與結(jié)構(gòu)體之間的連接關系。在仿真時,可以利用配置語句來為同一實體配置不同的結(jié)構(gòu)體,進行性能對比以得到最佳的設計方法。配置語句的一般語句格式如下:3.6配置

對既定的電路功能,CONFIGURATION配置名OF實體名IS

[配置說明];

ENDCONFIGURATION配置名;

配置語句根據(jù)不同的情況,其配置說明有簡有繁,以下是最簡單的缺省配置格式的結(jié)構(gòu):

CONFIGURATION配置名OF實體名IS

FOR選配結(jié)構(gòu)體名

ENDFOR;

ENDCONFIGURATION配置名;

該配置格式用于不包含塊(Block)和元件(Component)的結(jié)構(gòu)體。例3-11是以2選1多路選擇器為例配置語句的應用。CONFIGURATION配置名OF實體名【例3-11】【例3-11】EDA技術與VHDL設計(西電版)第3章-VHDL語言入門課件3.7層次結(jié)構(gòu)的VHDL描述

對于大規(guī)模的電路系統(tǒng)設計,可以將設計分成多個文件,使用層次化、分模塊的設計方式,它能夠使一個大型設計分工協(xié)作,仿真測試更加容易,代碼維護或升級更加便利。3.7層次結(jié)構(gòu)的VHDL描述

對于大規(guī)3.7.1元件聲明和元件例化

下面以一個4選1多路選擇器的例子來說明層次結(jié)構(gòu)的VHDL描述形式。例3-1(或例3-8)已經(jīng)使用VHDL語言實現(xiàn)了2選1多路選擇器,接下來就可以利用已經(jīng)實現(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中設計的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確定了頂層文件實體名mux41,在實體描述部分定義了頂層的輸入、輸出端口。結(jié)構(gòu)體部分首先在說明語句處定義了信號x1和x2,用于器件內(nèi)部的連接線;利用關鍵詞COMPONENT聲明了底層待調(diào)用元件mux21。結(jié)構(gòu)體功能描述語句部分利用端口映射語句PORTMAP將三個mux21元件連接起來構(gòu)成了4選1多路選擇器。由此例可以看出,層次結(jié)構(gòu)的VHDL描述包含兩個內(nèi)容:元件聲明和元件例化。例3-12確定了頂層文件實體名mux41,在實體描述部分1.元件聲明

元件聲明是把一個現(xiàn)成的設計實體定義為一個元件,即封裝,只留出對外的接口界面。元件聲明語句的功能是對待調(diào)用的元件作出調(diào)用聲明,它的一般語句格式如下:

COMPONENT元件名

[GENERIC(類屬表);]

PORT(端口名表);

ENDCOMPONENT元件名;1.元件聲明

元件聲明是把一個現(xiàn)成的設計實體定義為一元件聲明以關鍵詞COMPONENT開始,元件名是待調(diào)用底層設計實體的實體名。類屬表部分不是必須的,當有需要傳遞的類屬參量時才需要。端口名表需要列出該元件對外通信的各端口名,與實體中的PORT語句一致。所以,對需要調(diào)用的元件可以將對應的VHDL代碼的實體描述部分直接復制過來即可,但不要忘記關鍵詞需要由ENTITY改為COMPONENT。元件聲明必須放在關鍵詞ARCHITECTURE和BEGIN之間,即結(jié)構(gòu)體說明語句部分。元件聲明以關鍵詞COMPONENT開始,元件名是待調(diào)用底2.元件例化

元件例化語句是底層元件與當前設計實體的連接說明,一般語句格式如下:

例化名:元件名PORTMAP([端口名=>]連接端口名,

?[端口名=>]連接端口名,

…);

例化名是必須的,且在結(jié)構(gòu)體中是唯一的,可以看做頂層電路系統(tǒng)中需要接受底層元件的一個插座的編號名稱。元件名與聲明時的元件名一致,即為待調(diào)用設計實體的實體名。PORTMAP語句可實現(xiàn)端口之間的映射(連接)。端口名指元件定義語句中定義的端口名稱,即底層待調(diào)用元件的端口。2.元件例化

元件例化語句是底層元件與當前設計實體的它僅代表連接關系而不代表數(shù)據(jù)流動的方向。符號“=>”左側(cè)放置端口名,右側(cè)放置連接端口名。連接端口名指當前電路系統(tǒng)中準備與接入元件相連的端口,即頂層系統(tǒng)端口或頂層文件中定義的信號。從語句格式中可以看出,端口名和連接符號不是必須的,也就是說端口間的映射關系有兩種方式:名稱映射和位置映射。它僅代表連接關系而不代表數(shù)據(jù)流動的方向。符號“=>”左側(cè)放置(1)名稱映射是利用對應的接口名稱進行連接,就是將元件的各端口名稱賦予頂層系統(tǒng)中的信號名稱,即端口名與連接端口名的映射。例3-12采用的就是這種方式。名稱映射的優(yōu)點是端口的順序可以任意變化,如例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)名稱映射是利用對應的接口名稱進行連接,就是將元件(2)位置映射是指在PORTMAP語句中不寫出端口名和連接符號“=>”,僅指定連接端口名,但連接端口名的書寫順序必須與元件端口說明中信號的書寫順序一一對應。例3-14將顯示采用位置映射方式實現(xiàn)的4選1多路選擇器的元件例化。如果將例化u1改為“u1:mux21PORTMAP(d0,s0,d1,x1);”,則由于書寫順序的不對應,將控制端口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將顯示采用直接例化的形式實現(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ù)元件聲明和元件例化的相關內(nèi)容以及3.2.2節(jié)中設計的半加器,以半加器為底層元件,采用層次結(jié)構(gòu)的VHDL描述形式,實現(xiàn)一位全加器的設計,其電路結(jié)構(gòu)圖如圖3-12所示。最后,請讀者根據(jù)元件聲明和元件例化的相關內(nèi)容以及3.2.3.7.2類屬參量的應用

如3.4.3節(jié)所述,類屬參量多用于模塊化設計時不同層次模塊之間信息的傳遞,可以將其理解為高層次模塊傳遞給底層模塊的形參。下面通過兩個例子來進行介紹。例3-17是一個頂層文件,它通過例化語句調(diào)用了例3-16,對其進行了參數(shù)的傳遞。在例3-16中,類屬參量n的缺省取值為3,但n的具體取值可通過例3-17中參數(shù)傳遞映射GENERICMAP語句動態(tài)指定。3.7.2類屬參量的應用

如3.4.3節(jié)所述,類屬參【例3-16】【例3-16】EDA技術與VHDL設計(西電版)第3章-VHDL語言入門課件【例3-17】【例3-17】EDA技術與VHDL設計(西電版)第3章-VHDL語言入門課件(1)例3-16中的L6使用關鍵詞GENERIC聲明了類屬參量n,其數(shù)據(jù)類型為整型,設置缺省值為3。L7利用n值來確定端口信號矢量a的長度,即標準邏輯矢量所包含的元素個數(shù)。

(2)例3-16中的L14使用關鍵詞VARIABLE聲明了變量int,用于數(shù)據(jù)的暫時存儲。變量的聲明必須在進程內(nèi)部,它是一個局部量,不能跳出聲明它的進程使用。變量的賦值符號是“:=”,L16為變量賦初值1。如前所述,變量與信號都屬于數(shù)據(jù)對象,它們的功能相似,但應注意變量與信號的區(qū)別:①聲明位置不同,信號的聲明在結(jié)構(gòu)體的說明語句部分,變量的聲明在進程或子程序內(nèi)部;②聲明位置的不同決定了它們的使用范圍不同,如在結(jié)構(gòu)體說明語句部分聲明(1)例3-16中的L6使用關鍵詞GENERIC聲明了的信號在整個結(jié)構(gòu)體內(nèi)都可以使用,但在進程和子程序中聲明的變量則只能在該進程或子程序內(nèi)部使用;③賦值符號的不同,信號的賦值符號是“<=”,而變量的賦值符號是“:=”。其區(qū)別將在第4章中進一步深入介紹。

(3)?例3-16中的L17~L20使用了循環(huán)語句LOOP,屬于FOR/LOOP語句。關鍵詞FOR后的循環(huán)變量i是一個臨時變量,由設計者自行命名,屬于LOOP語句的局部變量,因此不需要事先定義,但在LOOP語句的范圍內(nèi)不能再使用其他與此循環(huán)變量同名的標識符。關鍵詞IN后用來確定循環(huán)次數(shù),循環(huán)變量從循環(huán)次數(shù)指定的初值開始,每執(zhí)行完一次就加1,直至達到循環(huán)次數(shù)指定的最大值為止。FOR/LOOP語句的一般語句格式如下:的信號在整個結(jié)構(gòu)體內(nèi)都可以使用,但在進程和子程序中聲明的變量[LOOP標號:]FOR循環(huán)變量IN循環(huán)次數(shù)范圍LOOP

順序語句;

ENDLOOP[LOOP標號];

(4)例3-17中的L11~L15對元件andn進行聲明,L17~L20是元件例化,其中使用參數(shù)傳遞映射語句GENERICMAP實現(xiàn)了對類屬參量n的賦值。以元件u1為例,n取值為2,即信號a含有兩個元素,LOOP語句實現(xiàn)兩次循環(huán),最終實現(xiàn)一個2輸入與門的邏輯。[LOOP標號:]FOR循環(huán)變量IN循環(huán)次數(shù)范3.8簡單時序電路的描述

以上所述示例都是組合邏輯電路,VHDL語言能夠進行時序邏輯電路的描述,且因為它行為建模的特點,描述時序電路更加方便。觸發(fā)器是最簡單、最具代表性的時序電路,它是數(shù)字系統(tǒng)設計中最基本的底層時序單元。觸發(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é)果可以看出,當時鐘信號clk上升沿到來時,輸出信號q隨輸入信號d的變化而變化,以實現(xiàn)D觸發(fā)器的功能。例3-18涉及的相關語法如下:

(1)?IF語句中的判斷表達式“clk'EVENTANDclk?=?'1'?”用于檢測時鐘信號clk的上升沿(L15),即只要有時鐘信號clk的上升沿到來,表達式將輸出TURE,執(zhí)行賦值語句“q1<=d”,從而實現(xiàn)D觸發(fā)器的功能。從仿真結(jié)果可以看出,當時鐘信號clk上升沿到來時,輸出信(2)關鍵詞EVENT是預定義的信號類屬性,用來獲得指定對象行為的信息,其格式一般是:<對象>‘EVENT。屬性EVENT表示如果信號在很短的時間內(nèi)發(fā)生變化,則返回TURE。L15表示:信號clk在一小段時間內(nèi)發(fā)生變化,且變化后clk取值為“1”,兩者都成立的情況下,可以推斷clk出現(xiàn)了一個上升沿,判斷表達式輸出為TURE。(2)關鍵詞EVENT是預定義的信號類屬性,用來獲得指定對(3)也可采用其他的方式來進行上升沿的檢測,如例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庫的標準程序包std_logic_1164中的預定義函數(shù),只能用于數(shù)據(jù)類型STD_LOGIC,指定信號的值必須是“0”到“1”的轉(zhuǎn)換,(3)也可采用其他的方式來進行上升沿的檢測,如例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是更為嚴格的上升沿的檢測方式,但考慮到多數(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ù)字電路來說,當輸入改變后仍能保持原值不變,就意味著使用了具有存儲功能的元件,必須引進時序元件(寄存器)來保存q1的原值,直到滿足IF語句的判斷條件后才能更新q1的值。然而必須注意,雖然在構(gòu)成時序電路方面,可以利用這種單分支條件語句所具有的獨特功能構(gòu)成時序電路,但在利用條件語句進行純組合電路設計時,如果沒有充分考慮到電路中所有可能出現(xiàn)的條件,即沒有列出所有的條件及其對應的處理方法就會綜合出設計者不希望得到的組合與時序電路的混合體。因此初學者在使用IF語句形式的時候要特別注意單分支IF語句的使用。

(4)例3-18的IF語句屬于單分支條件語句,對于不滿第3章VHDL語言入門

3.1VHDL語言概述3.2兩個簡單的組合電路示例3.3庫和程序包3.4實體描述3.5結(jié)構(gòu)體描述3.6配置3.7層次結(jié)構(gòu)的VHDL描述3.8簡單時序電路的描述第3章VHDL語言入門

3.1VHDL語言概述3.1VHDL語言概述

VHDL的主要目的是進行系統(tǒng)的描述、行為的建模與仿真。盡管所有的VHDL代碼都是可以仿真的,但并不是所有代碼都是可以綜合的,這取決于各EDA廠商綜合器對VHDL的支持程度。

與其他的硬件描述語言相比,VHDL具有更強的行為描述能力,從而決定了它成為數(shù)字系統(tǒng)設計領域最佳的硬件描述語言之一。強大的行為描述能力是使其避開具體的器件結(jié)構(gòu),從邏輯行為上成為描述和設計大規(guī)模電子系統(tǒng)的重要保證。3.1VHDL語言概述

VHDL的主要目的VHDL語言的優(yōu)勢如下:

(1)?VHDL有豐富的語句形式和庫函數(shù),使其在系統(tǒng)的設計早期就能從行為特性上查驗系統(tǒng)的功能可行性,并隨時可對設計進行仿真。

(2)?VHDL語句的行為描述能力和代碼結(jié)構(gòu)決定了它具有支持大規(guī)模設計的分解和已有設計的再利用功能,符合大規(guī)模系統(tǒng)所需的多人協(xié)同高效工作的要求。

(3)?VHDL對設計的描述具有相對獨立性,開發(fā)者可以不懂硬件的結(jié)構(gòu),也不必關心最終設計實現(xiàn)的目標器件是什么,便可進行相對獨立的設計。

(4)?VHDL與設計平臺無關,可移植性較好。VHDL語言的優(yōu)勢如下:

(1)?VHDL有豐富的(5)?VHDL是最早成為IEEE標準的硬件描述語言,使用廣泛,資料分享和查找非常方便,對初學者學習非常有幫助。

需要特別注意的是,VHDL與常規(guī)計算機高級程序設計語言有所不同,VHDL語句從根本上講是并發(fā)執(zhí)行的,只有在進程(Process)、函數(shù)(Function)和過程(Procedure)內(nèi)部的語句才是順序執(zhí)行的。

VHDL描述了電路設計的行為、功能、輸入以及輸出,其本質(zhì)是用程序語言的方式來描述硬件。圖3-1顯示了VHDL

溫馨提示

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

評論

0/150

提交評論