硬件描述語言VHDL介紹_第1頁
硬件描述語言VHDL介紹_第2頁
硬件描述語言VHDL介紹_第3頁
硬件描述語言VHDL介紹_第4頁
硬件描述語言VHDL介紹_第5頁
已閱讀5頁,還剩111頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

硬件描述語言VHDL介紹寧波大學信息學院鄔楊波2008年11月1VHDL語言概述2VHDL的基本結(jié)構(gòu)3VHDL的基本語法和常用語句4常用邏輯電路的VHDL設(shè)計5有限狀態(tài)機的VHDL描述1VHDL語言概述VHDL的英文全稱是:VHSIC(VeryHighSpeedIntegratedCircuit)HARDWAREDescriptiongLanguage,意思就是超高速集成電路硬件描述語言。1.1VHDL的定義和功能實現(xiàn)系統(tǒng)的文檔化描述支持系統(tǒng)仿真支持系統(tǒng)綜合1.2VHDL的發(fā)展概況早在1980年,因為美國軍事工業(yè)需要描述電子系統(tǒng)的方法,美國國防部開始進行VHDL的開發(fā)。IBM,TexasInstruments也參與了該項目。1987年,由IEEE(InstituteofElectricalandElectronicsEngineers)將VHDL制定為標準,稱為IEEE1076-1987。第二個增強版本是在1993年制定的,稱為IEEE1076-1993新增的標準包(packages)增加了數(shù)據(jù)類型和時序的定義:

––IEEE1164(datatypes)––IEEE1076.3(numeric)––IEEE1076.4(timing)1.3VHDL語言的特點設(shè)計的靈活性VHDL具有功能強大的語言結(jié)構(gòu),即可以實現(xiàn)門級單元的描述,也可以用簡潔明確的代碼描述復雜控制邏輯的設(shè)計。同時,VHDL具有多層次的設(shè)計描述功能,支持設(shè)計庫和可重復使用的元件生成。硬件無關(guān)性VHDL在產(chǎn)生一個設(shè)計時并不需要預先選定一個用來實現(xiàn)設(shè)計的器件,也即系統(tǒng)設(shè)計與硬件結(jié)構(gòu)無關(guān)。對于同一個設(shè)計描述,可以采用多種不同器件來實現(xiàn)其功能。這樣就方便了工藝的轉(zhuǎn)換,也不會因工藝變化而使描述過時??梢浦残宰鳛镠DL的第一個國際標準,VHDL具有很強的可移植性,也就是VHDL設(shè)計的描述可以被不同的工具支持。我們可以將一個VHDL設(shè)計從一個模擬工具移植到另一個模擬工具,從一個綜合工具移植到另一個綜合工具。這也就意味著同一個設(shè)計可以在不同的設(shè)計項目中采用,提高了設(shè)計的利用率和系統(tǒng)設(shè)計的效率。1.4應用VHDL的設(shè)計流程VHDL具有極強的描述能力,能支持系統(tǒng)行為級、寄存器傳輸級和邏輯門電路級三個不同層次的設(shè)計,能夠完成從上層到下層(從抽象到具體)逐層描述的結(jié)構(gòu)化設(shè)計思想。面向可編程邏輯器件的VHDL設(shè)計電路主要的工作過程是:VHDL代碼編寫。用文本編輯器輸入設(shè)計的源文件。(2)編譯源文件。用編譯工具將文本文件編譯成代碼文件,并檢查語法錯誤。(3)功能仿真(前仿真)。應用VHDL仿真器對設(shè)計文件進行仿真,此時的仿真沒有延時只是對設(shè)計進行邏輯功能的驗證。(4)邏輯綜合、優(yōu)化和布局布線。

邏輯綜合所謂綜合就是用軟件工具將設(shè)計的VHDL描述轉(zhuǎn)化為底層的電路網(wǎng)表或一組邏輯方程的過程。邏輯綜合軟件會生成.edf(edif)的EDA工業(yè)標準文件。布局布線所謂布局布線就是用綜合后生成的.edf文件,再根據(jù)CPLD(或FPGA)器件的容量和結(jié)構(gòu),用自動布局布線工具進行電路設(shè)計。首先根據(jù)網(wǎng)表文件內(nèi)容和器件結(jié)構(gòu)確定邏輯門的位置,然后再根據(jù)網(wǎng)表提供的門連接關(guān)系,把各個門的輸入輸出連接起來,類似于設(shè)計PCB(印刷電路板)時的布局布線工作。最后生成一個供器件編程(或配置)的文件。根據(jù)布局布線后所生產(chǎn)文件,對設(shè)計進行仿真。這是與實際器件工作情況基本相同的仿真,用來確定設(shè)計在經(jīng)過布局、布線之后,是否仍能滿足設(shè)計要求。(5)時序仿真(后仿真)。(6)編程下載。2VHDL的基本結(jié)構(gòu)2.1VHDL的組成一個VHDL設(shè)計可以由若干個VHDL文件構(gòu)成,每個文件中可以包含一個或一個以上的設(shè)計實體。

設(shè)計實體是構(gòu)成一個設(shè)計的最重要的基本單元,其主要包含如下三個部分:庫和程序包(Package);實體(Entity);結(jié)構(gòu)體(Architecture)。庫-是程序包的集合,不同的庫有不同類型的程序包。程序包-用來定義結(jié)構(gòu)體和實體中要用到的數(shù)據(jù)類型、元件和子程序等。實體-定義了一個設(shè)計模塊的輸入和輸出端口,即模塊(或元件)的外部特征,描述了一個元件或一個模塊與其他部分(模塊)之間的連接關(guān)系,可以看作是輸入輸出信號和芯片管腳信息。一個設(shè)計可以有多個實體,只有處于最高層的實體稱為頂層實體,EDA工具的編譯和仿真都是對頂層實體進行的。處于低層的各個實體都可作為單個元件,被高層實體調(diào)用。結(jié)構(gòu)體-主要用來說明元件內(nèi)部的具體結(jié)構(gòu),即對元件內(nèi)部的邏輯功能進行說明,是程序設(shè)計的核心部分。1--庫和程序包部分2libraryieee;--打開ieee庫3useieee.std_logic_1164.all;--調(diào)用ieee庫中STD_LOGIC_1164程序包4--實體部分5ENTITYmux21

IS--實體名為mux216PORT(s:INstd_logic;--端口說明7x1,x2:INstd_logic;--定義端口類型和數(shù)據(jù)類型8y:OUTstd_logic--此處無‘;’號9);10ENDmux21;--實體結(jié)束11--結(jié)構(gòu)體部分12ARCHITECTUREbehave

OFmux21

IS--結(jié)構(gòu)體名為behave13BEGIN14y<=x1WHENs=’0’ELSEx2;--邏輯功能描述15ENDbehave;--結(jié)構(gòu)體結(jié)束2.2VHDL的實體

實體中定義了該設(shè)計所需的輸入/輸出信號,信號的輸入/輸出類型被稱為端口模式,同時實體中還定義他們的數(shù)據(jù)類型。ENTITY

實體名ISPORT(信號名{,信號名}:端口模式

數(shù)據(jù)類型;……信號名{,信號名}:端口模式

數(shù)據(jù)類型);END實體名;實體名代表該電路的元件名稱,所以最好根據(jù)電路功能來定義。例如:對于2選1數(shù)據(jù)選擇器,實體名可以定義為mux21,這樣容易分析程序。信號名{,信號名}:端口模式

數(shù)據(jù)類型;端口說明用來對實體中輸入和輸出端口進行描述。實體與外界交流的信息必須通過端口輸入或輸出,端口的功能相當于元件的一個管腳。實體中的每一個輸入、輸出信號都被稱為一個端口,一個端口就是一個數(shù)據(jù)對象。

端口信號名是設(shè)計者為實體的每一個對外通道所取的名字。端口模式是指這些通道上的信號傳輸方向,共有四種傳輸方向。端口模式說明IN單向輸入模式,將信號信息通過該端口讀入實體OUT單向輸出模式,信號通過該端口從實體輸出INOUT雙向輸入輸出模式,既可以輸入端口,還可以輸出端口BUFFER緩沖輸出模式,具有回讀功能的輸出模式,可以輸入端口,也可以輸出端口數(shù)據(jù)類型指的是端口信號的類型。表6-2常用端口數(shù)據(jù)類型關(guān)鍵字說明BIT二進制位類型,取值只能是0、1,由STANDARD程序包定義BIT_VECTOR位向量類型,表示一組二進制數(shù),常用來描述地址總線、數(shù)據(jù)總線等端口STD_LOGIC工業(yè)標準的邏輯類型,取值0、1、X、Z等,由STD_LOGIC_1164程序包定義STD_LOGIC_VECTOR工業(yè)標準的邏輯向量類型,是STD_LOGIC的組合INTEGER整數(shù)類型,可用作循環(huán)的指針或常數(shù),通常不用作I/O信號2.3VHDL的結(jié)構(gòu)體結(jié)構(gòu)體是VHDL設(shè)計中最主要部分,它描述設(shè)計實體的內(nèi)部結(jié)構(gòu)或行為,定義了設(shè)計實體具體的功能。結(jié)構(gòu)體用三種方式對設(shè)計實體進行描述,分別是:行為描述(基本設(shè)計單元的數(shù)學模型描述)寄存器傳輸描述(數(shù)據(jù)流描述)結(jié)構(gòu)描述(邏輯元件連接描述)一個完整的、能被綜合實現(xiàn)的VHDL設(shè)計必須有一個實體和對應的結(jié)構(gòu)體,一個實體中可以有一個結(jié)構(gòu)體,也可以有多個結(jié)構(gòu)體,但各個結(jié)構(gòu)體不應有重名,結(jié)構(gòu)體之間沒有順序上的差別。結(jié)構(gòu)體的格式如下:ARCHITECTURE

結(jié)構(gòu)體名

OF

實體名

IS[結(jié)構(gòu)體說明部分;]BEGIN功能描述語句;END結(jié)構(gòu)體名;結(jié)構(gòu)體名是對本結(jié)構(gòu)體的命名,它是該結(jié)構(gòu)體的唯一名稱,OF后面緊跟的實體名表明了該結(jié)構(gòu)體所對應的是哪一個實體,用IS來結(jié)束結(jié)構(gòu)體的命名,結(jié)構(gòu)體的名稱可以由設(shè)計人員自由命名。

結(jié)構(gòu)體說明部分用來對結(jié)構(gòu)體內(nèi)部所使用的信號、常數(shù)、元件、函數(shù)和過程加以說明。功能描述語句具體描述結(jié)構(gòu)體(電路)的行為(功能)及其連接關(guān)系。2.4VHDL的庫和程序包1、VHDL的庫庫是專門用于存放預先編譯好的程序包的地方,其功能相當于共享資源的倉庫,所有已完成的設(shè)計資源只有存入某個“庫”內(nèi)才可以被其他實體共享。庫語句格式:LIBRARY庫名;例如在上述數(shù)據(jù)選擇器設(shè)計中開始部分有:libraryieee;useieee.std_logic_1164.all;2、常用的庫有IEEE庫、STD庫和WORK庫。(1)IEEE庫:是VHDL設(shè)計中最常用的資源庫包含程序包有:STD_LOGIC_1164STD_LOGIC_UNSIGNEDSTD_LOGIC_SIGNEDNUMERIC_BITNUMERIC_STD其中最重要和最常用的是STD_LOGIC_1164程序包。(2)STD庫:是VHDL的標準庫,VHDL在編譯過程中會自動調(diào)用這個庫,所以使用時不需要用語句另外說明。(3)WORK庫:是用戶在進行VHDL設(shè)計時的現(xiàn)行工作庫,用戶的設(shè)計成果將自動保存在這個庫中,是用戶自己的倉庫,同STD庫一樣,使用該庫不需要任何說明。該庫默認就設(shè)置在用戶工作目錄下。3、VHDL的程序包程序包是用VHDL語言編寫的一段程序,可以供其他設(shè)計單元調(diào)用和共享,相當于公用的“工具箱”,各種數(shù)據(jù)類型、子程序等一旦放入了程序包,就成為共享的“工具”。調(diào)用程序包的通用模式為:USE庫名.程序包名.ALL;常用預定義程序包有以下四個:(1)STD_LOGIC_1164程序包(2)STD_LOGIC_ARITH程序包(1)STD_LOGIC_1164程序包STD_LOGIC_1164程序包定義了一些數(shù)據(jù)類型、子類型和函數(shù)。數(shù)據(jù)類型包括:STD_ULOGICSTD_ULOGIC_VECTORSTD_LOGICSTD_LOGIC_VECTOR用的最多最廣的是STD_LOGIC和STD_LOGIC_VECTOR數(shù)據(jù)類型。該程序包預先在IEEE庫中編譯,是IEEE庫中最常用的標準程序包,其數(shù)據(jù)類型能夠滿足工業(yè)標準,非常適合CPLD(或FPGA)器件的邏輯設(shè)計結(jié)構(gòu)。(2)STD_LOGIC_ARITH程序包該程序包是美國Synopsys公司的程序包,預先編譯在IEEE庫中。主要是在STD_LOGIC_1164程序包的基礎(chǔ)上擴展了UNSIGNED(無符號)、SIGNED(符號)和SMALL_INT(短整型)三個數(shù)據(jù)類型,并定義了相關(guān)的算術(shù)運算符和轉(zhuǎn)換函數(shù)。(3)STD_LOGIC_SIGNED程序包主要定義有符號數(shù)的運算,重載后可用于INTEGER(整數(shù))、STD_LOGIC(標準邏輯位)和STD_LOGIC_VECTOR(標準邏輯位向量)之間的混合運算,并且定義了STD_LOGIC_VECTOR到INTEGER的轉(zhuǎn)換函數(shù)。(4)STD_LOGIC_UNSIGNED程序包該程序包用來定義無符號數(shù)的運算,其他功能與STD_LOGIC_SIGNED相似。3

VHDL的基本語法和常用語句3.1標識符、數(shù)據(jù)對象、數(shù)據(jù)類型及屬性(1)標識符VHDL中的標識符可以是常數(shù)、變量、信號、端口、子程序或參數(shù)的名字?;镜臉俗R符由字母(A…Z;a…z)、數(shù)字和下劃線字符組成,且具有如下特征:第一個字符必須是字母;最后一個字符不能是下劃線;不允許連續(xù)2個下劃線;VHDL中的保留字不能用于標識符。在標識符中大寫字母和小寫字母是等效的。

數(shù)據(jù)對象包含專門類型的值,VHDL中常用的數(shù)據(jù)對象為常數(shù)、信號和變量。在使用前,必須給予說明。常數(shù)(constant)常數(shù)是指那些在設(shè)計描述中不會發(fā)生變化的值。常數(shù)必須在程序包、實體、結(jié)構(gòu)體或進程的說明性區(qū)域中加以說明。定義在程序包中的常數(shù)可由所含的任何實體和結(jié)構(gòu)體引用。定義在實體內(nèi)的常數(shù)僅僅在該實體內(nèi)可見。定義在進程說明性區(qū)域中常數(shù)僅僅在該進程內(nèi)可見。(2)數(shù)據(jù)對象其中:

CONSTANT是常數(shù)定義的關(guān)鍵詞,

mode是常數(shù)名,

integer表示常數(shù)mode的數(shù)據(jù)類型是整數(shù),

:=是常數(shù)的賦值號,常數(shù)在定義時就賦予初值。常數(shù)所賦得值應與定義的數(shù)據(jù)類型一致。常數(shù)定義一般格式:CONSTANT常數(shù)名:數(shù)據(jù)類型:=表達式;例:CONSTANTmode:integer:=15;信號(signal)信號是描述硬件系統(tǒng)的基本數(shù)據(jù)對象,它類似于連接線。信號可以實現(xiàn)設(shè)計實體內(nèi)部元件之間的互連,可以表示內(nèi)部元件的輸入輸出;也能夠表示存儲元件的狀態(tài)。信號通常在構(gòu)造體、包集合和實體中說明。信號說明格式為:SIGNAL信號名:數(shù)據(jù)類型;信號賦值語句的語法格式如下:目標信號<=表達式;賦值語句右方的表達式必須是一個與目標信號有相同數(shù)據(jù)類型的數(shù)值變量(Variable)變量是一個局部量,只能用于進程語句、函數(shù)語句和過程語句,并且必須在進程或子程序的說明性區(qū)域加以說明。一個進程中說明的變量的作用范圍就是這個進程。要將一個變量的值用于該進程之外,必須將變量的值賦給一個相同類型的信號。在仿真過程中它不象信號那樣,到了規(guī)定的仿真時間才進行賦值,變量的賦值是立即生效的。變量說明語句的格式如下:Variable變量名:數(shù)據(jù)類型:=表達式;變量賦值語句的語法格式如下:目標變量:=表達式;VHDL要求設(shè)計實體中的每一個常數(shù)、信號、變量等必須具有確定的數(shù)據(jù)類型。只有具有相同數(shù)據(jù)類型的數(shù)據(jù)對象之間才能相互傳遞和作用.VHDL主要數(shù)據(jù)類型數(shù)據(jù)類型標量類型枚

舉整

數(shù)實

數(shù)物

理復合類型數(shù)

組記

錄存取型文件型(3)數(shù)據(jù)類型VHDL的數(shù)據(jù)類型按照定義方式可以分為預定義數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型兩大類。預定義數(shù)據(jù)類型是VHDL最常用,最基本的數(shù)據(jù)類型。VHDL預定義數(shù)據(jù)類型VHDL的預定義數(shù)據(jù)類型都在VHDL的標準程序包STANDARD中定義。布爾量(Boolean)一個布爾量具有兩個狀態(tài):“真”或“假”。布爾量不屬于數(shù)值,因此不能用于運算,它只能通過關(guān)系運算符獲得。其定義如下:TYPEBooleanIS(FALSE,TRUE);位(Bit)一個bit類型的量其值只能是1或0,其定義如下:TYPEbitIS(‘0’,‘1’);位矢量(Bit_Vector)位矢量是用雙引號括起來的一組位數(shù)據(jù),其在VHDL標準中被定義。使用位矢量必須注明位寬。例如:SIGNALa:Bit_Vector(7downto0);a<=“1000_0100”;信號a被定義為一個具有8位位寬的矢量,最左位為a(7),最右位為a(0)。整數(shù)類型(integer)VHDL語言預定義的標準數(shù)據(jù)類型,整數(shù)類型的數(shù)代表正整數(shù)、負整數(shù)和零,表示的范圍-(231-1)~(231-1),它與算術(shù)整數(shù)相似,可進行“+”,“-”,“*”,“/”等算術(shù)運算。定義一個整數(shù)類型的信號或變量在其取值范圍上應由約束.Variabley:integerrange0to15;Signalx:integerrange0to7;例如:例中的關(guān)鍵詞range…to…就是給出了變量y和信號x的取值范圍。IEEE預定義標準邏輯位與矢量。標準邏輯位(STD_LOGIC)這是一個對于綜合而言非常重要的標準數(shù)據(jù)類型,定義在IEEE庫的std_logic_1164程序包中。根據(jù)定義使得STD_LOGIC數(shù)據(jù)可以具有如下的9種不同的值:‘U’--未定義‘0’--0‘Z’--高阻,字母Z用大寫表示‘L’--弱信號0‘X’--強未知‘1’--1‘W’--弱未知‘H--弱信號1‘-’--可忽略標準邏輯矢量(STD_LOGIC_VECTOR)用雙引號括起來的一組標準邏輯位數(shù)據(jù),定義在IEEE庫的std_logic_1164程序包中,同樣使用標準邏輯矢量必須注明位寬。SIGNALa:STD_LOGIC_VECTOR(0to7);a<=“1000_0100”;例如:注意在使用該類型數(shù)據(jù)時,在程序中必須寫出庫說明語句和使用程序包集合的說明語句。Libraryieee;Useieee.std_logic_1164.all;(4)屬性屬性提供的是有關(guān)于實體、結(jié)構(gòu)體、類型、信號等要素的指定特征,有些預先定義的值類、信號類和范圍類屬性,對于綜合是十分有用的,如:值類屬性、信號類屬性、范圍類屬性。值類屬性值類屬性分為’left,’right,’low,’high,’length。其中用符號“’”隔開對象名及其屬性。left表示類型最左邊的值;right表示類型最右邊的值;low表示類型中最小的值;high表示類型中最大的值;length表示限定型數(shù)組中元素的個數(shù)。信號類屬性介紹一個對綜合及模擬都很有用的信號類屬性:’event。它的值為布爾型,如果剛好有事件發(fā)生在該屬性所附著的信號上(即信號有變化),則其取值為Ture,否則為False。用它可決定時鐘邊沿是否有效。即時鐘是否發(fā)生。例:時鐘邊沿表示若有如下定義:signalclk:instd_logic;clk=‘1’andclk’event和clk’eventandclk=‘1’表示時鐘的上升沿。即時鐘變化了,且其值為1,因此表示上升沿。clk=‘0’andclk’event和clk’eventandclk=‘0’表示時鐘的下降沿。即時鐘變化了,且其值為0,因此表示下降沿。3.2VHDL的操作符

在VHDL語言中共用4類操作符,可以分別進行邏輯運算(Logic)關(guān)系運算(Relational)算術(shù)運算(Arithmetic)并置運算(Concatenation)對于VHDL中的操作符與操作數(shù)間的運算需特別注意一下兩點:嚴格遵循在基本操作符間操作數(shù)是相同數(shù)據(jù)類型的規(guī)則。嚴格遵循操作數(shù)的數(shù)據(jù)類型必須與操作符所要求的數(shù)據(jù)類型完全一致的規(guī)則。類型操作符功能操作數(shù)數(shù)據(jù)類型算術(shù)操作符+加整數(shù)-減整數(shù)*乘整數(shù)和實數(shù)/除整數(shù)和實數(shù)MOD取模整數(shù)REM取余整數(shù)SLL邏輯左移BIT或布爾型一維數(shù)組SRL邏輯右移BIT或布爾型一維數(shù)組SLA算術(shù)左移BIT或布爾型一維數(shù)組SRA算術(shù)右移BIT或布爾型一維數(shù)組ROL邏輯循環(huán)左移BIT或布爾型一維數(shù)組ROR邏輯循環(huán)右移BIT或布爾型一維數(shù)組**乘方整數(shù)ABS取絕對值整數(shù)(1)算術(shù)操作符(2)關(guān)系操作符

關(guān)系操作符=等于任何數(shù)據(jù)類型/=不等于任何數(shù)據(jù)類型<小于枚舉與整數(shù),及對應的一維數(shù)組>大于枚舉與整數(shù),及對應的一維數(shù)組<=小于等于枚舉與整數(shù),及對應的一維數(shù)組>=大于等于枚舉與整數(shù),及對應的一維數(shù)組(3)邏輯操作符

邏輯操作符AND與BIT,BOOLEAN,STD_LOGICOR或BIT,BOOLEAN,STD_LOGICNAND與非BIT,BOOLEAN,STD_LOGICNOR或非BIT,BOOLEAN,STD_LOGICXOR異或BIT,BOOLEAN,STD_LOGICNXOR同或BIT,BOOLEAN,STD_LOGICNOT非BIT,BOOLEAN,STD_LOGIC并置操作符用于將兩個對象或矢量連接成維數(shù)更大的矢量。例如,將4個位用并置操作符連接起來就可以構(gòu)成一個具有4位長度的位矢量;兩個4位的位矢量用“&”連接起來就可以構(gòu)成8位長度的位矢量。(4)并置操作符&(5)VHDL操作符的優(yōu)先級

運算符優(yōu)

級NOT,ABS,**最高優(yōu)先級↑∣︱∣∣最低優(yōu)先級*,/,MOD,REM+(正號),-(負號)+,-,&SLL,SRL,SLA,SRA,ROL,ROR=,/=,<,>,<=,>=AND,OR,NAND,NOR,XOR,NXOR,NOT3.3VHDL的常用語句VHDL描述語句分為順序語句(sequential)和并行語句(concurrent)。

順序語句總是處于進程和子程序的內(nèi)部,并且從仿真角度看順序語句按書寫的先后次序依次執(zhí)行。并行語句總是處于進程和子程序的外部。所有并行語句都是并行執(zhí)行,與它們出現(xiàn)的先后次序無關(guān)。(1)進程(process)進程語句是VHDL中用的最多的一種并行語句,用于描述順序事件且包含在結(jié)構(gòu)體中。在一個結(jié)構(gòu)體中可以包含多個進程語句,進程語句之間是并行關(guān)系的。[進程標號:]PROCESS(信號1,信號2,…….)--進程標號是可選項;括號內(nèi)是敏感信號進程說明部分--聲明用于該進程的常數(shù),元件,子程序,變量BEGIN--開始進程…--此處用順序語句描述電路的功能,所用語句包括順序語句;--變量賦值語句(:=),信號賦值語句(<=)…--IF語句、CASE語句、LOOP語句等ENDPROCESS[進程標號:]--結(jié)束進程(2)順序語句第一種:

IF條件THEN順序語句;

ENDIF;IF語句第二種:

IF語句的二選擇控制,其書寫格式為:

IF條件THEN

順序語句;

ELSE

順序語句;

ENDIF;第三種:

IF語句的多選擇控制又稱IF語句的嵌套,其書寫格式為:

IF條件THEN

順序語句;

ELSIF條件THEN

順序語句;

ELSIF條件THEN

順序語句;……ELSE

順序語句;ENDIF;【例2】用IF語句的第一種形式描述一個D觸發(fā)器。LIBRARY

ieee;USE

ieee.std_logic_1164.all;ENTITY

mydff

IS

port(clk,d:

IN

std_logic;

q:

OUT

std_logic);END

mydff;ARCHITECTURE

behave

OF

mydffIS

BEGIN

PROCESS(clk)BEGIN

IF

clk’eventandclk=’1’

THEN

q<=d;

ENDIF;

ENDPROCESS;END

behave;第一種形式的IF語句是不完整條件語句,這種語句綜合器理解為,對于不滿足條件將跳過順序語句不執(zhí)行,電路將保持原來的狀態(tài)不變。對于例2,如果沒有時鐘上升沿到來q將保持原來的值不變。這就意味著具有存儲功能元件的使用?!纠?】第二種形式的IF語句。描述的組合電路:2選1數(shù)據(jù)選擇器。LIBRARY

ieee;USE

ieee.std_logic_1164.all;ENTITY

mux21

ISPORT

(s:IN

std_logic;x1,x2:IN

std_logic;y:OUT

std_logic);END

mux21;ARCHITECTURE

behave

OF

mux21

ISBEGINPROCESS(s,x1,x2)BEGINIFs=’0’THEN

y<=x1;ELSE

y<=x2;ENDIF;ENDPROCESS;END

behave;【例4】用嵌套IF語句描述的優(yōu)先編碼器。library

ieee;use

ieee.std_logic_1164.all;ENTITY

encoder4_2

ISPORT

(x1,x2,x3,x4:IN

std_logic;y:OUT

std_logic_vector(1downto0));END

encoder4_2;ARCHITECTURE

behave

OF

encoder4_2

ISBEGINPROCESS(x1,x2,x3,x4)BEGINIFx4=’0’THEN

y<=“11”;ELSIFx3=’0’THEN

y<=“10”;ELSIFx2=’0’THEN

y<=“01”;ELSIFx1=’0’THENy<=“00”;ELSE

y<=“00”;ENDIF;ENDPROCESS;END

behave;此實例反映了IF語句的一個重要的特性,即隱含的優(yōu)先級,出現(xiàn)的越早的條件優(yōu)先級越高。CASE語句CASE語句是另一種常用的順序語句,它用于規(guī)定一組根據(jù)給定選擇信號的值而執(zhí)行的語句,常用來描寫總線行為、編碼器和譯碼器的結(jié)構(gòu)。其書寫格式為:CASE

表達式

ISWHEN

條件表達式=>順序語句;…;順序語句;WHEN

條件表達式=>順序語句;…;順序語句;…WHEN

OTHERS=>順序語句;ENDCASE;當執(zhí)行CASE語句時,首先計算“表達式”的值,然后根據(jù)WHEN條件句中與之相同的“條件表達式”,執(zhí)行對應的“順序語句”,最后結(jié)束CASE語句。條件句中的“=>”不是操作符,它的含義只相當于“THEN”作用。CASE語句在使用中應注意以下幾點:WHEN條件句中的選擇值必須在CASE“表達式”的取值范圍內(nèi)。除非所有條件句的選擇值能完整覆蓋CASE語句“表達式”的取值,否則最末一個條件句必須是“WHENOTHERS=>順序語句;”,關(guān)鍵詞“OTHERS”表示以上所列的所有條件句中未能列出的其它可能取值。“OTHERS”在整個CASE語句中只能出現(xiàn)一次,且只能作為最后一種條件取值。CASE語句中的條件表達式的值只能出現(xiàn)一次,不允許有相同值的條件表達式出現(xiàn)。CASE語句執(zhí)行中必須選中,且只能選中所列條件語句中的一條?!纠?】3-8譯碼器LIBRARYieee;USEieee.std_logic_1164.all;ENTITYdecoder3_8ISPORT(a,b,c,g1,g2a,g2b:instd_logic;y:outstd_logic_vector(7downto0));ENDdecoder3_8;ARCHITECTUREbehave38OFdecoder38ISsignalindata:std_logic_vector(2downto0);BEGINindata<=c&b&a;PROCESS(indata,g1,g2a,g2b)BEGIN

IF(g1='1'andg2a='0'andg2b='0')THEN

CASEindataIS

WHEN"000"=>y<="11111110";

WHEN"001"=>y<="11111101";

WHEN"010"=>y<="11111011";

WHEN"011"=>y<="11110111";

WHEN"100"=>y<="11101111";

WHEN"101"=>y<="11011111";

WHEN"110"=>y<="10111111";

WHEN"111"=>y<="01111111";

WHEN

OTHERS=>y<="XXXXXXXX";

ENDCASE;

ELSE

y<="11111111";

ENDIF;ENDPROCESS;ENDbehave3_8;NULL語句NULL語句是空操作語句,它不完成任何操作。NULL語句常用于CASE語句,為滿足所有可能的條件,利用NULL來表示所余的不用條件下的操作行為。CASEopcodeIS

WHEN“001”=>temp:=regaANDregb;WHEN“101”=>temp:=regaORregb;WHEN“110”=>temp:=NOTrega;WHENOTHERS=>NULL;ENDCASE;(3)并行語句在VHDL中,并行語句有多種語句格式,各種并行語句在結(jié)構(gòu)體中的執(zhí)行是同步進行的,換句話說,并行語句在執(zhí)行順序的地位上是平等的,其執(zhí)行順序與書寫順序無關(guān)。結(jié)構(gòu)體中可綜合的并行語句主要有七種:并行信號賦值語句;進程語句;塊語句;條件信號賦值語句;元件例化語句;生成語句;并行過程語句。簡單信號賦值語句簡單信號賦值語句是VHDL并行語句結(jié)構(gòu)中最為基本的語句結(jié)構(gòu),其語法格式如下:賦值目標<=表達式;式中賦值目標的數(shù)據(jù)對象必須是信號,他的數(shù)據(jù)類型必須與賦值符號右邊表達式的數(shù)據(jù)類型一致條件信號賦值語句WHEN-ELSE條件信號賦值語句就是對某一個信號根據(jù)給定條件賦值。其語法格式如下:賦值目標<=表達式1WHEN

賦值條件1ELSE

表達式2WHEN

賦值條件2ELSE…

表達式n;

條件信號賦值語句根據(jù)條件的判斷來賦值。在執(zhí)行該語句時,每一賦值條件是按書寫的先后次序逐行測定,一旦發(fā)現(xiàn)賦值條件為true,則立即將相應表達式的值賦給賦值目標?!哂袃?yōu)先級。

條件信號賦值語句的賦值條件允許有重疊現(xiàn)象。最后一個表達式可以不跟賦值條件,表示當以上的條件都不滿足時,則將此表達式賦予目標信號。使用時注意ELSE后沒有分號,整個語句只在最后一個表達式后有分號?!纠?】4選1數(shù)據(jù)選擇器的條件信號賦值語句描述。LIBRARYieee;USE

ieee.std_logic_1164.all;ENTITY

mux41

ISPORT(s:IN

std_logic_vector(1downto0);x1,x2,x3,x4:IN

std_logic;y:OUT

std_logic);END

mux41;ARCHITECTURE

behave

OF

mux41

ISBEGINy<=x1WHENs=”00”ELSEx2WHENs=”01”ELSE

x3WHENs=”10”ELSEx4;END

behave;選擇信號賦值語句WITH-SELECT-WHEN選擇信號賦值語句根據(jù)選定信號的值對另外某個信號賦值,其語法格式如下:WITH

選擇信號

SELECT

賦值目標信號<=表達式1WHEN

選擇信號的值1,表達式2WHEN

選擇信號的值2,…表達式nWHEN

選擇信號的值n;選擇信號賦值語句的選擇信號是該語句的敏感信號。選擇信號賦值語句在功能特點:對子句的選擇值的測試具有同期性,即選擇信號值的前后次序不影響其綜合后的結(jié)果;對選擇信號的可能取值要全覆蓋;各子句間不允許有條件重疊現(xiàn)象;【例7】4選1數(shù)據(jù)選擇器的選擇信號賦值語句描述。LIBRARYieee;USE

ieee.std_logic_1164.all;ENTITY

mux41

ISPORT(s:IN

std_logic_vector(1downto0);x1,x2,x3,x4:IN

std_logic;y:OUT

std_logic);END

mux41;ARCHITECTURE

behave

OF

mux41

ISBEGINWITHsSELECTy<=x1WHEN“00”,x2WHEN“01”,

x3WHEN“10”,x4WHENOTHERS;END

behave;常用邏輯電路的VHDL設(shè)計

4.1常用組合電路設(shè)計

數(shù)字邏輯電路中常用的組合電路包括:編碼器、譯碼器、數(shù)據(jù)選擇器、數(shù)值比較器、加法器、三態(tài)緩沖器等。其中編碼器、譯碼器、數(shù)據(jù)選擇器在前面的小節(jié)中已經(jīng)介紹,以下我們對其他的組合電路給出具體的描述。(1)三態(tài)緩沖器LIBRARYieee;USEieee.std_logic_1164.all;ENTITYtriIS

PORT

(din,en

:INstd_logic;

dout

:OUTstd_logic);ENDtri;ARCHITECTUREbehaveOFtriISBEGINtri_gate:PROCESS(din,en)

BEGIN

IF(en='1')THEN

dout<=din;

ELSE

dout<='Z';

ENDIF;

ENDPROCESS;ENDbehave;(2)三態(tài)單向總線

LIBRARYieee;USEieee.std_logic_1164.all;ENTITYtri_busIS

PORT

(en

:INstd_logic;Din:INstd_logic_vector(7downto0);

dout

:OUTstd_logic_vector(7downto0));ENDtri_bus;ARCHITECTUREbehaveOFtri_busISBEGINPROCESS(din,en)

BEGIN

IF(en='1')THEN

dout<=din;

ELSE

dout<=“ZZZZ_ZZZZ”;

ENDIF;

ENDPROCESS;ENDbehave;(3)一位全加器LIBRARYieee;USEieee.std_logic_1164.all;ENTITYfadder_1IS

PORT

(ci,a,b

:INstd_logic;

s,co

:OUTstd_logic);ENDfadder_1;ARCHITECTUREbehaveOFfadder_1ISBEGINs<=aXORbXORci;

co<=(aANDb)OR((aORB)ANDci);ENDbehave;(4)8位二進制全加器LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;ENTITYfadder_8IS

PORT

(ci

:INstd_logic;a,b

:INstd_logic_vector(7downto0);

s:OUTstd_logic_vector(8downto0));ENDfadder_8;ARCHITECTUREbehaveOFfadder_8ISSIGNALhalfadd

:std_logic_vector(8downto0);BEGINhalfadd<=‘0’&a+‘0’&b;s<=halfaddWHENci=’0’ELSEhalfadd+1;ENDbehave;(4)一位BCD碼加法器LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;ENTITYbcdadderIS

PORT

(ci:INstd_logic;a,b

:INstd_logic_vector(3downto0);

s

:OUTstd_logic_vector(4downto0));ENDbcdadder;ARCHITECTUREbehaveOFbcdadderISSIGNALbinadd

:std_logic_vector(4downto0);BEGINbinadd<=‘0’&a+‘0’&b+“0000”&ci;PROCESS(binadd)BEGIN

IFbinadd>9THENs<=binadd+6;

ELSEs<=binadd;

ENDIF;ENDPROCESS;ENDbehave;(6)數(shù)據(jù)比較器LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;ENTITYcompareIS

PORT(a,b

:INstd_logic_vector(3downto0);

aequb,agreatb,alessb:OUTstd_logic);ENDcompare;ARCHITECTUREbehaveOFbcdadderISBEGINaequb<=‘1’WHENa=bELSE‘0’;agreatb<=‘1’WHENa>bELSE‘0’;alessb<=‘1’WHENa<bELSE‘0’;ENDbehave;(7)七段顯示譯碼器LIBRARYieee;USEieee.std_logic_1164.all;ENTITYdis_7IS

PORT

(data

:INstd_logic_vector(3downto0);

led7:OUTstd_logic_vector(6downto0););ENDdis_7;ARCHITECTUREoneOFdis_7ISBEGIN

PROCESS(data)

BEGINCASEdataIS

WHEN"0000"=>led7<="1111110";

WHEN"0001"=>led7<="0110000";

WHEN"0010"=>led7<="1101101";

WHEN"0011"=>led7<="1111001";

WHEN"0100"=>led7<="0110011";

WHEN"0101"=>led7<="1011011";

WHEN"0110"=>led7<="1011111";

WHEN"0111"=>led7<="1110000";

WHEN"1000"=>led7<="1111111";

WHEN"1001"=>led7<="1111011";

WHEN"1010"=>led7<="1110111";

WHEN"1011"=>led7<="0011111";

WHEN"1100"=>led7<="1001110";

WHEN"1101"=>led7<="0111101";

WHEN"1110"=>led7<="1001111";

WHEN"1111"=>led7<="1000111";

WHENOTHERS=>NULL;

ENDCASE;

ENDPROCESS;ENDbehave;4.2時序電路時鐘信號和復位信號的描述方法

(1)時鐘信號的描述方法clk’eventandclk=‘1’表示時鐘的上升沿。clk’eventandclk=‘0’表示時鐘的下降沿。PROCESS(clock_signal)BEGINIF(clock_edge_condition)THEN

signal_out<=signal_in;

其它語句

ENDIF;ENDPROCESS;使用時注意在一個進程中只能有一個時鐘信號。(2)復位(置位)信號的描述方法同步復位(置位)描述方法:PROCESS(clock_signal)BEGINIF(clock_edge_condition)THENIF(reset_condition)THEN

signal_out<=reset_value;

ELSE

signal_out<=signal_in;

其它語句ENDIF;

ENDIF;ENDPROCESS;異步復位(置位)描述方法:PROCESS(clock_signal,reset_signal)BEGINIF(reset_condition)THEN

signal_out<=reset_value;ELSIF(clock_edge_condition)THEN

signal_out<=signal_in;

其它語句

ENDIF;ENDPROCESS;使用異步復位(置位)時注意以下幾點:進程敏感信號表中時鐘信號和復位(置位)信號應同時存在;用IF語句描述復位(置位)信號;用ELSIF描述時鐘信號。4.3常用觸發(fā)器設(shè)計

(1)異步復位D觸發(fā)器設(shè)計

LIBRARYieee;USEieee.std_logic_1164.all;ENTITYmydffISPORT(clk,d,reset:INstd_logic;

q:outstd_logic);ENDmydff;ARCHITECTUREbehaveOFmydffISBEGINPROCESS(clk,reset)BEGINIF(reset='0')THEN

q<='0';

ELSIF(clk'eventandclk='1')THEN

q<=d;

ENDIF;ENDPROCESS;ENDbehave;(2)異步復位/置位D觸發(fā)器設(shè)計LIBRARYieee;USEieee.std_logic_1164.all;ENTITYmydffISPORT(clk,d,reset,set:instd_logic;

q:outstd_logic);ENDmydff;ARCHITECTUREbehaveOFmydffISBEGINPROCESS(clk,reset,set)BEGIN

IF(set='0')THEN

q<='1';

ELSIF(reset='0')THEN

q<='0';

ELSIF(clk'eventandclk='1')THEN

q<=d;

ENDIF;ENDPROCESS;ENDbehave;(3)同步復位/置位D觸發(fā)器設(shè)計LIBRARYieee;USEieee.std_logic_1164.all;ENTITYmydffISPORT(clk,d,reset,set:instd_logic;

q:outstd_logic);ENDmydff;ARCHITECTUREbehaveOFmydffISBEGINPROCESS(clk)BEGIN

IF(clk'eventandclk='1')THEN

IF(reset='0')THEN

q<='0';

ELSIF(set='0')THEN

q<='1';ELSEq<=d;

ENDIF;ENDIF;ENDPROCESS;ENDbehave;4.4常用寄存器設(shè)計

(1)8位異步清零的通用寄存器LIBRARYieee;USEieee.std_logic_1164.all;ENTITYreg8ISPORT(clk,clr:INstd_logic;d:INstd_logic_vector(7downto0);

q:OUTstd_logic_vector(7downto0));ENDreg8;ARCHITECTUREbehaveOFreg8ISBEGINPROCESS(clk,clr)BEGINIF(clr='0')THEN

q<='0000_0000';

ELSIF(clk'eventandclk='1')THEN

q<=d;

ENDIF;ENDPROCESS;ENDbehave;(2)8位串入串出移位寄存器LIBRARYieee;USEieee.std_logic_1164.all;ENTIYTshift8IS

PORT

(a,clk:INstd_logic;

B:OUTstd_logic);ENDshift8;ARCHITECTUREshift_behaveOFshift8ISsignaldf1,df2,df3,df4,df5,df6,df7:std_logic;BEGINPROCESS(clk)BEGINIF(clk'eventandclk='1')THEN

df1<=a;

df2<=df1;

df3<=df2;

df4<=df3;

df5<=df4;

df6<=df5;

df7<=df6;

B<=df7;

ENDIF;ENDPROCESS;ENDshift_behave;(3)8位串入并出移位寄存器LIBRARYieee;USEieee.std_logic_1164.all;ENTIYTSP_shift8ISPORT(a,clk:INstd_logic;

b:BUFFERstd_logic_vector(7downto0));ENDSP_shift8;ARCHITECTUREbehaveOFSP_shift8ISBEGINPROCESS(clk)BEGINIF(clk'eventandclk='1')THEN

b(0)<=a;b(7downto1)<=b(6downto0);

ENDIF;ENDPROCESS;ENDbehave;(4)異步置數(shù)的8位并入串出移位寄存器LIBRARYieee;USEieee.std_logic_1164.all;ENTITYPI_SO_shift8ISPORT(clk,load:INstd_logic;a:INstd_logic_vector(7downto0);

b:OUTstd_logic);ENDPI_SO_shift8;ARCHITECTUREbehaveOFPI_SO_shift8ISSignalsftreg:std_logic_vector(7downto0);BEGINPROCESS(clk,load)BEGINIF(load='1')THENsftreg<=a;ELSIF(clk'eventandclk='1')THEN

b<=sftreg(7);sftreg(7downto1)<=sftreg(6downto0);sftreg(0)<=‘1’;

ENDIF;ENDPROCESS;ENDbehave;(5)8位同步置數(shù)的循環(huán)移位寄存器LIBRARYieee;USEieee.std_logic_1164.all;ENTITYcyc_shift8ISPORT(clk,load:INstd_logic;a:INstd_logic_vector(7downto0);

b:BUFFERstd_logic_vector(7downto0));ENDcyc_shift8;ARCHITECTUREbehaveOFcyc_shift8ISBEGINPROCESS(clk)BEGINIF(clk'eventandclk='1')THENIF(load='1')THENb<=a;ELSEb(7downto1)<=b(6downto0);b(0)<=b(7);

ENDIF;ENDIF;ENDPROCESS;ENDbehave;(6)同步清零左移/右移寄存器LIBRARYieee;USEieee.std_logic_1164.all;ENTITYmlti_shiftISPORT(clk,rst:INstd_logic;sl_in,sr_in:INstd_logic;mode:INstd_logic_vector(1downto0);a:INstd_logic_vector(7downto0);

b:BUFFERstd_logic_vector(7downto0));ENDmlti_shift;ARCHITECTUREbehaveOFmlti_shiftISBEGINPROCESS(clk)BEGINIF(clk'eventandclk='1')THENIF(rst='1')THENb<=“0000-_0000”;ELSECASEmodeISWHEN“01”=>b<=sr-in&b(7downto1);WHEN“10”=>b<=b(6downto0)&sl-in;WHEN“11”=>b<=a;WHENOTHERS=>NULLENDCASE;

ENDIF;ENDIF;ENDPROCESS;ENDbehave;4.5常用計數(shù)器設(shè)計

(1)4位異步清零/同步置數(shù)二進制計數(shù)器

LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;ENTITYcnt_4bISPORT(clk,clr:INstd_logic;load:INstd_logic;data:INstd_logic_vector(3downto0);co:OUTstd_logic;

count:BUFFERstd_logic_vector(3downto0));ENDcnt_4b;ARCHITECTUREbehaveOFcnt_4bISBEGIN

co<=‘1’WHENcount=“1111”ELSEco<=‘0’;PROCESS(clk,clr)BEGINIF(clr='1')THENcount<=(others=>’0’);ELSIF(clk'eventandclk='1')THENIF(load='1')THENcount<=data;ELSEcount<=count+1;

ENDIF;ENDIF;ENDPROCESS;ENDbehave;(2)具有使能端的異步清零/同步置數(shù)十進制計數(shù)器

LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;ENTITYcnt10ISPORT(clk,clr:INstd_logic;load,en:INstd_logic;data:INstd_logic_vector(3downto0);co:OUTstd_logic;

count:BUFFERstd_logic_vector(3downto0));ENDcnt10;ARCHITECTUREbehaveOFcnt10ISBEGINco<=‘1’WHENcount=“1001”ELSEco<=‘0’;PROCESS(clk,clr)BEGINIF(clr='1')THENcount<=(others=>’0’);ELSIF(clk'eventandclk='1')THENIF(load='1')THENcount<=data;ELSIF(en='1')THENIFcount=“1001”THENcount<=“0000”ELSEcount<=count+1;

溫馨提示

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

最新文檔

評論

0/150

提交評論