《VHDL設(shè)計初步》PPT課件_第1頁
《VHDL設(shè)計初步》PPT課件_第2頁
《VHDL設(shè)計初步》PPT課件_第3頁
《VHDL設(shè)計初步》PPT課件_第4頁
《VHDL設(shè)計初步》PPT課件_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、VHDL 設(shè)計初步,物理科學(xué)與電子工程系,參考資料,1 潘松,黃繼業(yè). EDA技術(shù)實用教程. 北京,科學(xué)出版社. 2002 2潘松,黃繼業(yè). 現(xiàn)代DSP技術(shù). 西安,西安電子科技大學(xué)出版社. 2003,VHDL是非常高速集成電路硬件描述語言 (Very High speed Integrated Circuit Hardware Description Language)的英文縮寫。 語法和風(fēng)格: (1)類似與現(xiàn)代高級編程語言,如C語言。 (2)VHDL描述的是硬件,它包含許多硬件特有的結(jié)構(gòu)。,VHDL程序的基本結(jié)構(gòu),Include “stdio.h”; Include “math.h”; i

2、nt main(void) int a,b,c; a=8; b=9; c=a+b; return c; ,Library IEEE; Use IEEE.STD_LOGIC_1164.all; Entity and2 is Port( a, b : in bit; c : out bit); End and2; Architecture a1 of and2 is Begin c = a and b; End a1;,VHDL程序,C程序,VHDL 入門的最有效的方法是通過具體電路實例引出對應(yīng)的VHDL 表述,通過這些有針對性的表述進而學(xué)習(xí)相關(guān)的語句語法,再通過多個類似實例的學(xué)習(xí),逐步完備VHD

3、L 的基本語法知識和提高電路的描述和設(shè)計能力。據(jù)此,全章通過數(shù)個簡單、完整而典型的VHDL 設(shè)計示例,使讀者初步了解用VHDL 表達和設(shè)計電路的方法,并對由此而引出的VHDL 語言現(xiàn)象和語句規(guī)則能逐步趨向系統(tǒng)的了解。 由于用硬件描述語言來對電子線路的表達和設(shè)計是EDA 建模和實現(xiàn)技術(shù)中最基本和最重要的方法,其它的許多方法都是建筑在這一基礎(chǔ)之上的,如使用MATLAB/DSP Builder的設(shè)計方案、圖形方式的狀態(tài)機輸入法、原理圖輸入法等等。因此VHDL 的學(xué)習(xí)在EDA技術(shù)的掌握中具有十分重要的地位。,1 簡單組合電路的VHDL 描述,2選1 多路選擇器是典型的組合電路,本章以此電路的VHDL

4、表述與設(shè)計為例,引出相關(guān)的VHDL 結(jié)構(gòu)、語句表述、數(shù)據(jù)規(guī)則和語法特點,并加以詳細說明。,1.1 多路選擇器的VHDL 描述 2 選1 多路選擇器的電路模型,或元件圖如圖3-1 所示。例3-1 是其VHDL 的完整描述,即可使用VHDL 綜合器直接綜合出實現(xiàn)即定功能的邏輯電路,對應(yīng)的邏輯電路如圖3-2 所示,因而可以認為是此多路選擇器的內(nèi)部電路結(jié)構(gòu)。,注意,電路的功能可以是唯一的,但其電路的結(jié)構(gòu)方式不是唯一的,它決定于綜合器的基本元件庫的來源、優(yōu)化方向和約束的選擇、目標器件(指FPGA/CPLD)的結(jié)構(gòu)特點等等。 圖中,a 和b 分別為兩個數(shù)據(jù)輸入端的端口名,s 為通道選擇控制信號輸入端的端口

5、名,y為輸出端的端口名?!癿ux21a”是設(shè)計者為此器件取的名稱(好的名稱應(yīng)該體現(xiàn)器件的基本功能特點)。,【例3-1】 ENTITY mux21a IS PORT ( a, b : IN BIT; s : IN BIT; y : OUT BIT ); END ENTITY mux21a; ARCHITECTURE one OF mux21a IS BEGIN y = a WHEN s = 0 ELSE b ; END ARCHITECTURE one ; 由例3-1 可見,此電路的VHDL 描述由兩大部分組成:,以關(guān)鍵詞ENTITY 引導(dǎo),END ENTITY mux21a 結(jié)尾的語句部分,稱

6、為實體。VHDL 的實體描述了電路器件的外部情況及各信號端口的基本性質(zhì),如信號流動的方向,流動在其上的信號結(jié)構(gòu)方式和數(shù)據(jù)類型等。圖3-1 可以認為是實體的圖形表達。 以關(guān)鍵詞ARCHITECTURE 引導(dǎo),END ARCHITECTURE one 結(jié)尾的語句部分,稱為結(jié)構(gòu)體。結(jié)構(gòu)體負責(zé)描述電路器件的內(nèi)部邏輯功能和電路結(jié)構(gòu)。圖3-2 是此結(jié)構(gòu)體的某種可能的電路原理圖表達。 在VHDL 結(jié)構(gòu)體中用于描述邏輯功能和電路結(jié)構(gòu)的語句分為順序語句和并行語句兩部分。順序語句的執(zhí)行方式類似于普通軟件語言的程序執(zhí)行方式,是按照語句的前后排列方式逐條順序執(zhí)行的。而在結(jié)構(gòu)體中的并行語句,無論有多少行語句,都是同時執(zhí)

7、行的,與語句的前后次序無關(guān)(姑且暫時這樣認為,以后將給予詳細說明)。,例3-1 中的邏輯描述是用WHEN_ELSE 結(jié)構(gòu)的并行語句表達的。它的含義是,當(dāng)滿足條件s =0,即s 為低電平時,a 輸入端的信號傳送至y ,否則(即s 為高電平時)b 輸入端的信號傳送至y。 也可以用其他的語句形式來描述以上相同的邏輯行為。例3-2 中的功能描述語句都用了并行語句,是用布爾方程的表達式來描述的。其中的“AND”、“OR”、“NOT”分別是“與”“或”、“非”的邏輯操作符號。 例3-3 則給出了用順序語句IF_THEN_ELSE 表達的功能描述。以上3 例用不同的表達方式描述了相同的邏輯功能,其電路功能可

8、以從圖3-3 的時序波形(QuartusII 仿真波形)中看出,分別向a 和b 端輸入兩個不同頻率的信號fa 和fb(fa fb),當(dāng)s 為高電平時, y 輸出fb,而當(dāng)s 為低電平時,y 輸出fa。顯然,圖3-3 的波型證實了VHDL 邏輯設(shè)計的正確性。,注意, 以上各例的實體和結(jié)構(gòu)體分別是以“ END ENTITY xxx ” 和“ END ARCHITECTURE xx ”語句結(jié)尾的,這是符合VHDL 的IEEE STD 1076_1993 版的語法要求的。若根據(jù)VHDL87 版本,即IEEE STD 1076_1987 的語法要求,這兩條結(jié)尾語句只需寫成“END;”或“END xx”。

9、但考慮到目前絕大多數(shù)常用的EDA 工具中的VHDL 綜合器都兼容兩種VHDL 版本的語法規(guī)則,且許多最新的VHDL 方面的資料,仍然使用VHDL87版本語言規(guī)則,因此,出于實用的目的,對于以后出現(xiàn)的示例,不再特意指出VHDL 兩種版本的語法差異處。但對于不同的EDA 工具,仍需根據(jù)設(shè)計程序不同的VHDL 版本表述,在綜合前作相應(yīng)的設(shè)置。,【例3-2】見文件夾Mux21a1 ENTITY mux21a IS PORT ( a, b : IN BIT; s : IN BIT; y : OUT BIT ); END ENTITY mux21a; ARCHITECTURE one OF mux21a

10、IS SIGNAL d,e : BIT; BEGIN d = a AND (NOT S) ; e = b AND s ; y = d OR e ; END ARCHITECTURE one ;,【例3-3】見文件夾Mux21a2 ENTITY mux21a IS PORT ( a, b, s: IN BIT; y : OUT BIT ); END ENTITY mux21a; ARCHITECTURE one OF mux21a IS BEGIN PROCESS (a,b,s) BEGIN IF s = 0 THEN y = a ; ELSE y = b ; END IF; END PROCE

11、SS; END ARCHITECTURE one ;,圖3-3 mux21a功能時序波形,3.1.2 相關(guān)語句結(jié)構(gòu)和語法說明 以下將對例3-1 至例3-3 中出現(xiàn)的相關(guān)語句結(jié)構(gòu)和語法含義作出說明: 1. 實體表達 VHDL 完整的、可綜合的程序結(jié)構(gòu)必須能完整地表達一片專用集成電路ASIC 器件的端口結(jié)構(gòu)和電路功能,即無論是一片74LS138 還是一片CPU,都必須包含實體和結(jié)構(gòu)體兩個最基本的語言結(jié)構(gòu)。這里將含有完整程序結(jié)構(gòu)(包含實體和結(jié)構(gòu)體)的VHDL 表述稱為設(shè)計實體。如前所述,實體描述的是電路器件的端口構(gòu)成和信號屬性,它的最簡表式如下:,【例3-4】 ENTITY e_name IS PO

12、RT ( p_name : port_m data_type; . p_namei : port_mi data_type ); END ENTITY e_name; 上式中,ENTITY、IS、PORT 和END ENTITY 都是描述實體的關(guān)鍵詞,在實體描述中必須包含這些關(guān)鍵詞。在編輯中,關(guān)鍵詞不分大寫和小寫。,實體名,端口信號名,端口模式,數(shù)據(jù)類型,2. 實體名 例3-4 中的e_name 是實體名,是標識符,具體取名由設(shè)計者自定。由于實體名實際上表達的應(yīng)該設(shè)計電路的器件名,所以最好根據(jù)相應(yīng)電路的功能來確定,如4 位二進制計數(shù)器,實體名可取為counter4b;8 位二進制加法器,實體名

13、可取為adder8b,等等。但應(yīng)注意,不應(yīng)用數(shù)字或中文定義實體名,也不應(yīng)用與EDA 工具庫中已定義好的元件名作為實體名,如or2、latch 等,且不能用數(shù)字起頭的實體名,如74LSxx。 3. 端口語句和端口信號名 描述電路的端口及其端口信號必須用端口語句PORT( )引導(dǎo),并在語句結(jié)尾處加分號“;”。例3-4 中的p_name 是端口信號名,如例3-1 中的端口信號名分別是a、b、s 和y。,4. 端口模式 在例3-4中的port_m表達端口模式,可綜合的端口模式有四種,它們分別是“IN”、“OUT”、“INOUT”和“BUFFER”,用于定義端口上數(shù)據(jù)的流動方向和方式: IN:輸入端口,

14、定義的通道為單向只讀模式。規(guī)定數(shù)據(jù)只能由此端口被讀入實體。 OUT:輸出端口,定義的通道為單向輸出模式。規(guī)定數(shù)據(jù)只能通過此端口從實體向外流出,或者說可以將實體中的數(shù)據(jù)向此端口賦值。 INOUT:定義的通道確定為輸入輸出雙向端口。即從端口的內(nèi)部看,可以對此端口進行賦值,或通過此端口讀入外部的數(shù)據(jù)信息;而從端口的外部看,信號既可由此端口流出,也可向此端口輸入信號。如 RAM 的數(shù)據(jù)口,單片機的I/O 口等。 BUFFER:緩沖端口,其功能與INOUT 類似,區(qū)別在于當(dāng)需要輸入數(shù)據(jù)時,只允許內(nèi)部回讀輸出的信號,即允許反饋。如計數(shù)器設(shè)計,可將計數(shù)器輸出的計數(shù)信號回讀,以作下一計數(shù)值的初值。與INOUT

15、 模式相比,BUFFER 回讀的信號不是由外部輸入的,而是由內(nèi)部產(chǎn)生,向外輸出的信號。,5. 數(shù)據(jù)類型 例3-4 中的data_type 是數(shù)據(jù)類型名。例3-1 中,端口信號a、b、s 和y 的數(shù)據(jù)類型都定義為BIT。由于VHDL 中任何一種數(shù)據(jù)對象的應(yīng)用都必須嚴格限定其取值范圍和數(shù)值類型,即對其傳輸或存儲的數(shù)據(jù)的類型要作明確的界定,因此,在VHDL 設(shè)計中,必須預(yù)先定義好要使用的數(shù)據(jù)類型,這對于大規(guī)模電路描述的排錯是十分有益的。相關(guān)的數(shù)據(jù)類型有INTEGER 類型、BOOLEAN 類型、STD_LOGIC 類型和BIT 類型等。 BIT 數(shù)據(jù)類型的信號規(guī)定的取值范圍是邏輯位1和0。在VHDL

16、 中,邏輯位0 和1 的表達必須加單引號,否則VHDL 綜合器將0 和1 解釋為整數(shù)數(shù)據(jù)類型INTEGER。 BIT 數(shù)據(jù)類型可以參與邏輯運算或算術(shù)運算,其結(jié)果仍是位的數(shù)據(jù)類型。VHDL 綜合器用一個二進制位表示BIT。將例3-1 中的端口信號a、b、s 和y 的數(shù)據(jù)類型都定義為BIT表示:a、b、s 和y 的取值范圍,或者說數(shù)據(jù)范圍都被限定在邏輯位1和0的二值范圍內(nèi)。,6. 結(jié)構(gòu)體表達 結(jié)構(gòu)體的一般表達如例3-5 所示。 【例3-5】 ARCHITECTURE arch_name OF e_name IS 說明語句 BEGIN (功能描述語句) END ARCHITECTURE arch_n

17、ame ; 上式中,ARCHITECTURE、OF、IS、BEGIN 和END ARCHITECTURE 都是描述結(jié)構(gòu)體的關(guān)鍵詞,在描述中必須包含它們。arch_name 是結(jié)構(gòu)體名,是標識符。,說明語句包括在結(jié)構(gòu)體中,用以說明和定義數(shù)據(jù)對象、數(shù)據(jù)類型、元件調(diào)用聲明等等。說明語句并非是必須的,(功能描述語句)則不同,結(jié)構(gòu)體中必須給出相應(yīng)的電路功能描述語句,可以是并行語句,順序語句或它們的混合。 一般地,一個可綜合的,完整的VHDL 程序有比較固定的結(jié)構(gòu)。設(shè)計實體中,一般首先出現(xiàn)的是各類庫及其程序包的使用聲明,包括未以顯式表達的工作庫WORK 庫的使用聲明,然后是實體描述,最后是結(jié)構(gòu)體描述,而在

18、結(jié)構(gòu)體中可以含有不同的邏輯表達語句結(jié)構(gòu)。如前所述,在此把一個完整的可綜合的VHDL 程序設(shè)計構(gòu)建為設(shè)計實體(獨立的電路功能結(jié)構(gòu)),而其程序代碼常被稱為VHDL 的RTL 描述。,7. 賦值符號和數(shù)據(jù)比較符號 例3-1 中的表達式y(tǒng)= a 表示輸入端口a 的數(shù)據(jù)向輸出端口y 傳輸;但也可以解釋為信號a 向信號y 賦值。在VHDL 仿真中賦值操作y= a并非立即發(fā)生的,而是要經(jīng)歷一個模擬器的最小分辨時間后,才將a 的值賦予y 。在此不妨將 看成是實際電路存在的固有延時量。VHDL 要求賦值符“=”兩邊的信號的數(shù)據(jù)類型必須一致。 例3-1 中,條件判斷語句WHEN_ELSE 通過測定表式 s=0 的

19、比較結(jié)果,以確定由哪一端口向y 賦值。條件語句WHEN_ELSE 的判定依據(jù)是表式 s=0 輸出的結(jié)果。表式中的等號“=”沒有賦值的含義,只是一種數(shù)據(jù)比較符號。其表式輸出結(jié)果的數(shù)據(jù)類型是布爾數(shù)據(jù)類型BOOLEAN。BOOLEAN 類型的取值分別是:true(真)和false(偽)。即當(dāng)s,為高電平時,表式 s=0 輸出“false”;當(dāng)s 為低電平時,表式 s =0 輸出“true”。在VHDL 綜合器或仿真器中分別用1和0表達true 和false。布爾數(shù)據(jù)不是數(shù)值,只能用于邏輯操作或條件判斷。 用于條件語句的判斷表達式可以是一個值,也可以是更復(fù)雜的邏輯或運算表達式,如: IF a THEN

20、 . - 注意,a 的數(shù)據(jù)類型必須是boolean IF (s1=0)AND(s2=1)OR(cb+1) THEN .,8. 邏輯操作符 例3-2 中出現(xiàn)的文字AND、OR 和NOT 是邏輯操作符號。VHDL 共有7 種基本邏輯操作符,它們是AND(與)、OR(或)、NAND(與非)、NOR(或非)、XOR(異或)、XNOR(同或)和NOT(取反)。信號在這些操作符的作用下可構(gòu)成組合邏輯。邏輯操作符所要求的操作數(shù)(操作對象)的數(shù)據(jù)類型有3 種,即BIT、BOOLEAN 和STD_LOGIC。 注意,與其他HDL 用某種符號表達邏輯操作符不同,VHDL 中直接用對應(yīng)的英語文字表達邏輯操作符號,這

21、更明確顯示了VHDL 作為硬件行為描述語言的特征。,9. 條件語句 例3-3 利用IF_THEN_ELSE 表達的VHDL 順序語句的方式,同樣描述了一個多路選擇器的電路行為。其結(jié)構(gòu)體中的IF 語句的執(zhí)行順序類似于軟件語言,首先判斷如果s 為低電平,則執(zhí)行y=a 語句,否則(當(dāng)s 為高電平),則執(zhí)行語句y=b。由此可見VHDL 的順序語句同樣能描述并行運行的組合電路。注意,IF 語句必須以語句“END IF;”結(jié)束。 10. WHEN_ELSE 條件信號賦值語句 例3-1 中出現(xiàn)的是條件信號賦值語句,這是一種并行賦值語句,其表達方式如下: 賦值目標 = 表達式 WHEN 賦值條件 ELSE 表

22、達式 WHEN 賦值條件 ELSE . 表達式 ;,在結(jié)構(gòu)體中的條件信號賦值語句的功能與在進程中的IF 語句相同,在執(zhí)行條件信號語句時,每一“賦值條件”是按書寫的先后關(guān)系逐項測定的,一旦發(fā)現(xiàn)(賦值條件= true),立即將“表達式”的值賦給“賦值目標”信號。 注意,由于條件測試的順序性,條件信號賦值語句中的第一子句具有最高賦值優(yōu)先級,第二句其次,如此類推。例如在以下程序中,如果當(dāng)p1 和p2 同時為1時,z 獲得的賦值是a 而不可能是b 。還應(yīng)該注意,相對于在同一結(jié)構(gòu)體中的其它語句,此類賦值語句作為一個完整的語句,屬于并行語句。 z = a WHEN p1 = 1 ELSE b WHEN p2

23、 = 1 ELSE c ;,11. 進程語句和順序語句 由例3-3 可見,順序語句“IF_THEN_ELSE_END IF;”是放在由“PROCESS. END PROCESS”引導(dǎo)的語句中的。由PROCESS 引導(dǎo)的語句稱為進程語句。在VHDL 中,所有合法的順序描述語句都必須放在進程語句中。 PROCESS 旁的(a,b,s)稱為進程的敏感信號表,通常要求將進程中所有的輸入信號都放在敏感信號表中。例如,例3-3 中的輸入信號是a、b 和s,所以將它們?nèi)苛腥朊舾行盘柋碇小S捎赑ROCESS 語句的執(zhí)行依賴于敏感信號的變化(或稱發(fā)生事件),當(dāng)某一敏感信號(如a)從原來的1跳變到0,或者從原來

24、的0跳變到1時,就將啟動此進程語句,于是此PROCESS 至END PROCESS 引導(dǎo)的語句(包括其中的順序語句)被執(zhí)行一遍,然后返回進程的起始端,進入等待狀態(tài),直到下一次敏感信號表中某一信號或某些信號發(fā)生事件才再次進入“啟動運行”狀態(tài)。 在一個結(jié)構(gòu)體中可以包含任意個進程語句,所有的進程語句都是并行語句,而由任一進程PROCESS 引導(dǎo)的語句(包含在其中的語句)結(jié)構(gòu)屬于順序語句。,12. 文件取名和存盤 如果用QuartusII 提供的VHDL 文本編輯器編輯VHDL 代碼文件,在保存文件時,必須賦給一個正確的文件名。一般地,文件名可以由設(shè)計者任意給定,但文件后綴擴展名必須是“.vhd”,如

25、adder_f.vhd。但考慮到某些EDA 軟件的限制和VHDL 程序的特點,以及調(diào)用的方便性,因此建議程序的文件名盡可能與該程序的實體名一致,如例3-1 的文件名應(yīng)該是:mux21a.vhd。原則上文件名不分大小寫,但推薦使用小寫,特別是后綴。,3.2 簡單時序電路的VHDL 描述,與其他硬件描述語言相比,在時序電路的描述上,VHDL 具有許多獨特之處。最明顯的是VHDL 主要通過對時序器件功能和邏輯行為的描述,而非結(jié)構(gòu)上的描述使得計算機綜合出符合要求的時序電路,從而充分體現(xiàn)了VHDL 電路系統(tǒng)行為描述的強大功能。以下將對一個典型的時序元件D 觸發(fā)器的VHDL 描述進行詳細分析,從而得出時序

26、電路描述的一般規(guī)律和設(shè)計方法。,3.2.1 D 觸發(fā)器 最簡單、最常用,并最具代表性的時序電路是D 觸發(fā)器,它是現(xiàn)代數(shù)字系統(tǒng)設(shè)計中最基本的時序單元和底層元件。D 觸發(fā)器的描述包含了VHDL 對時序電路的最基本和典型的表達方式,同時也包含了VHDL 中許多最具特色的語言現(xiàn)象。例3-6 是對D 觸發(fā)器元件圖3-4 的描述。從VHDL 的描述上看,與例3-3 相比,例3-6 多了4 個部分: (1) 由LIBRARY 引導(dǎo)的庫的說明部分。 (2) 使用了另一種數(shù)據(jù)類型:STD_LOGIC。 (3) 定義了一個內(nèi)部節(jié)點信號:SIGNAL。 (4) 使用了一種新的條件判斷表式:CLKEVENT AND

27、CLK = 1。,除此之外,雖然例3-3 描述的是組合電路,而例3-6 描述的是時序電路,如果不詳細分析其中的表述含義,二例在語句結(jié)構(gòu)和語言應(yīng)用上沒有明顯的差異,也不存在如其他硬件描述語言(如ABEL、AHDL)那樣包含用于表示時序或組合邏輯的特征語句,更沒有與特定的軟件或硬件相關(guān)的特征屬性語句。這也充分表明了VHDL 電路描述與設(shè)計平臺和硬件實現(xiàn)對象無關(guān)性的優(yōu)秀特點。,【例3-6】 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF1 IS PORT (CLK : IN STD_LOGIC ; D : IN STD_LOGIC ;

28、Q : OUT STD_LOGIC ); END ; ARCHITECTURE bhv OF DFF1 IS SIGNAL Q1 : STD_LOGIC ; -類似于在芯片內(nèi)部定義一個數(shù)據(jù)的暫存節(jié)點 BEGIN PROCESS (CLK,Q1) BEGIN IF CLKEVENT AND CLK = 1 THEN Q1 = D ; END IF; END PROCESS ; Q = Q1 ; -將內(nèi)部的暫存數(shù)據(jù)向端口輸出(雙橫線-是注釋符號) END bhv,3.2.2 D 觸發(fā)器VHDL 描述的語言現(xiàn)象說明 以下對例3-6 中出現(xiàn)的新的語句語言現(xiàn)象作出說明。 1. 標準邏輯位數(shù)據(jù)類型STD_

29、LOGIC 從例3-6 可見,D 觸發(fā)器的3 個信號端口CLK、D 和Q 的數(shù)據(jù)類型都被定義為STD_LOGIC(例3-1 中,端口信號的數(shù)據(jù)類型被定義為BIT)。就數(shù)字系統(tǒng)設(shè)計來說,類型 STD_LOGIC 比BIT 包含的內(nèi)容豐富和完整得多,當(dāng)然也包含了BIT 類型。試比較以下STD_LOGIC 和BIT 兩種數(shù)據(jù)類型的程序包定義表式(其中TYPE 是數(shù)據(jù)類型定義語句)。 BIT 數(shù)據(jù)類型定義: TYPE BIT IS(0,1); -只有兩種取值 STD_LOGIC 數(shù)據(jù)類型定義: TYPE STD_LOGIC IS (U,X,0,1,Z,W,L,H,-);,STD_LOGIC 所定義的9

30、 種數(shù)據(jù)的含義是:U表示未初始化的;X表示強未知的;0表示強邏輯0;1表示強邏輯1;Z表示高阻態(tài);W 表示弱未知的;L表示弱邏輯0;H表示弱邏輯1;-表示忽略。 它們完整地概括了數(shù)字系統(tǒng)中所有可能的數(shù)據(jù)表現(xiàn)形式,所以例3-6 中的CLK、D 和Q 比例3-1 中的a、b、s 具有更寬的取值范圍,因而其描述和實際電路有更好的適應(yīng)性。 在仿真和綜合中,將信號或其他數(shù)據(jù)對象定義為STD_LOGIC 數(shù)據(jù)類型是非常重要的,它可以使設(shè)計者精確地模擬一些未知的和具有高阻態(tài)的線路情況。對于綜合器,高阻態(tài)Z和-忽略態(tài)(有的綜合器用X)可用于三態(tài)的描述。STD_LOGIC 型數(shù)據(jù)在數(shù)字器件中實現(xiàn)的只有其中的4

31、到5 種值,即X (或/和)、0、1和Z,其他類型通常不可綜合。 注意,此例中給出的STD_LOGIC 數(shù)據(jù)類型的定義主要是借以學(xué)習(xí)一種新的語法現(xiàn)象,而非D 觸發(fā)器等時序電路必須使用此類數(shù)據(jù)類型。,2. 設(shè)計庫和標準程序包 有許多數(shù)據(jù)類型的說明,及類似的函數(shù)是預(yù)先放在VHDL 綜合器附帶的設(shè)計庫和程序包中的。如BIT 數(shù)據(jù)類型的定義是包含在VHDL 標準程序包STANDARD 中的,而程序包STANDARD 包含于VHDL 標準庫STD 中。一般,為了使用BIT 數(shù)據(jù)類型,應(yīng)該在例3-1的程序上面增加如下3 句說明語句: LIBRARY WORK ; LIBRARY STD ; USE STD

32、.STANDARD.ALL ; 第2 句中的LIBRARY 是關(guān)鍵詞,LIBRARY STD 表示打開STD 庫;第3 句的USE 和ALL 是關(guān)鍵詞,全句表示允許使用STD 庫中STANDARD 程序包中的所有內(nèi)容(.ALL),如類型定義、函數(shù)、過程、常量等。 此外,由于要求VHDL 設(shè)計文件保存在某一文件夾,如d:myfile 中,并指定為工程PROJECT 的文件所在的目錄,VHDL 工具就將此路徑指定的文件夾默認工作庫(WORKLIBRARY),于是在VHDL 程序前面還應(yīng)該增加,“LIBRARY WORK;”語句,VHDL 工具才能調(diào)用此路徑中相關(guān)的元件和程序包。 但是,由于VHDL

33、 標準中規(guī)定標準庫STD 和工作庫WORK 都是默認打開的,因此就可以像例3-1 那樣,不必將上述庫和程序包的使用語句以顯式表達在VHDL 程序中。除非如例3-6 那樣,需要使用一些特殊的程序包。 使用庫和程序包的一般定義表式是: LIBRARY ; USE .ALL ; STD_LOGIC 數(shù)據(jù)類型定義在被稱為STD_LOGIC_1164 的程序包中,此包由IEEE 定義,而且此程序包所在的程序庫的庫名被取名為IEEE。由于IEEE 庫不屬于VHDL 標準庫,所以在使用其庫中內(nèi)容前,必須事先給予聲明。即如例3-6 最上的兩句語句: LIBRARY IEEE ; USE IEEE.STD_LO

34、GIC_1164.ALL ;,正是出于需要定義端口信號的數(shù)據(jù)類型為STD_LOGIC的目的,當(dāng)然也可以定義為BIT類型或其他數(shù)據(jù)類型,但一般應(yīng)用中推薦定義STD_LOGIC 類型。 3. 信號定義和數(shù)據(jù)對象 例3-6 中的語句“SIGNAL Q1:STD_LOGIC;”表示在描述的器件DFF1 內(nèi)部定義標識符Q1 的數(shù)據(jù)對象為信號SIGNAL,其數(shù)據(jù)類型為STD_LOGIC。由于Q1 被定義為器件的內(nèi)部節(jié)點信號,數(shù)據(jù)的進出不像端口信號那樣受限制,所以不必定義其端口模式(如IN、OUT 等)。定義Q1 的目的是為了在設(shè)計更大的電路時使用由此引入的時序電路的信號,這是一種常用的時序電路設(shè)計的方式。

35、事實上,如果在例3-6 中不作Q1 的定義,其結(jié)構(gòu)體(如將其中的賦值語句Q1 = D 改為Q = D)同樣能綜合出相同的結(jié)果,但不推薦這種設(shè)計方式。,語句“SIGNAL Q1:STD_LOGIC;”中的SIGNAL 是定義某標識符為信號的關(guān)鍵詞。 在VHDL 中,數(shù)據(jù)對象(Data Objects)類似于一種容器,它接受不同數(shù)據(jù)類型的賦值。數(shù)據(jù)對象有3 類,即信號(SIGNAL)、變量(VARIABLE)和常量(CONSTANT)。在VHDL中,被定義的標識符必須確定為某類數(shù)據(jù)對象,同時還必須被定義為某種數(shù)據(jù)類型。如例3-6 中的Q1,對它規(guī)定的數(shù)據(jù)對象是信號,而數(shù)據(jù)類型是STD_LOGIC,

36、前者規(guī)定了Q1 的行為方式和功能特點,后者限定了Q1 的取值范圍。VHDL 規(guī)定,Q1 作為信號,它可以如同一根連線那樣在整個結(jié)構(gòu)體中傳遞信息,也可以根據(jù)程序的功能描述構(gòu)成一個時序元件;但Q1 傳遞或存儲的數(shù)據(jù)的類型只能包含在STD_LOGIC 的定義中。 需要注意的是,語句“SIGNAL Q1:STD_LOGIC;”僅規(guī)定了Q1 的屬性特征,而其功能定位需要由結(jié)構(gòu)體中的語句描述具體確定。如果將Q1 比喻為一瓶葡萄酒,則其特定形狀的酒瓶就是其數(shù)據(jù)對象,瓶中的葡萄酒(而非其他酒)就是其數(shù)據(jù)類型,而這瓶酒的用處(功能)只能由擁有這酒的人來確定,即結(jié)構(gòu)體中的具體描述。,4. 上升沿檢測表式和信號屬性

37、函數(shù)EVENT 例3-6 中的條件語句的判斷表式“CLKEVENT AND CLK=1”是用于檢測時鐘信號CLK 的上升沿的,即如果檢測到CLK 的上升沿,此表達式將輸出“true”。 關(guān)鍵詞EVENT 是信號屬性函數(shù),用來獲得信號行為信息的函數(shù)稱為信號屬性函數(shù)。VHDL 通過以下表式來測定某信號的跳變情況: EVENT 短語“clockEVENT”就是對clock 標識符的信號在當(dāng)前的一個極小的時間段內(nèi)發(fā)生事件的情況進行檢測。所謂發(fā)生事件,就是clock 在其數(shù)據(jù)類型的取值范圍內(nèi)發(fā)生變化,從一種取值轉(zhuǎn)變到另一種取值(或電平方式)。如果clock 的數(shù)據(jù)類型定義為STD_LOGIC,則在 時間

38、段內(nèi),clock 從其數(shù)據(jù)類型允許的9 種值中的任何一個值向另一值跳變,如由0變成1、由1變成0或由Z變成0,都認為發(fā)生了事件,于是此表式將輸出一個布爾值true,否則為false。 如果將以上短語clockEVENT 改成語句:clockEVENT AND clock=1,則表示一旦“clockEVENT”在,時間內(nèi)測得clock 有一個跳變,而此小時間段之后又測得clock 為高電平1,即滿足此語句右側(cè)的clock =1的條件,于是兩者相與(AND)后返回值為true,由此便可以從當(dāng)前的clock =1推斷在此前的 時間段內(nèi),clock必為0 (設(shè)clock 的數(shù)據(jù)類型是BIT)。因此,以

39、上的表達式就可以用來對信號clock的上升沿進行檢測,于是語句clockEVENT AND clock =1就成了邊沿測試語句。 5. 不完整條件語句與時序電路 現(xiàn)在來分析例3-6 中對D 觸發(fā)器功能的描述。 首先考察時鐘信號CLK 上升沿出現(xiàn)的情況(即滿足IF 語句條件的情況)。當(dāng)CLK 發(fā)生變化時,PROCESS 語句被啟動,IF 語句將測定條件表式“CLKEVENT AND CLK=1”是否滿足條件,如果CLK 的確出現(xiàn)了上升沿,則滿足條件表式對是上升沿檢測,于是執(zhí)行語句Q1=D,即將D 的數(shù)據(jù)向內(nèi)部信號Q1 賦值,即更新Q1,并結(jié)束IF 語句,最后將Q1的值向端口信號Q 輸出。至此,是

40、否可以認為,CLK 上升沿測定語句CLKEVENT ANDCLK=1就成為綜合器構(gòu)建時序電路的必要條件呢?回答顯然是否定的。,其次再考察如果CLK 沒有發(fā)生變化,或者說CLK沒有出現(xiàn)上升沿方式的跳變時IF 語句的行為。這時由于IF 語句不滿足條件,即條件表式給出“FALSE”,于是將跳過賦值表式Q1=D,不執(zhí)行此賦值表式而結(jié)束IF 語句。由于在此,IF 語句中沒有利用通常的ELSE語句明確指出當(dāng)IF 語句不滿足條件時作何操作。顯然這是一種不完整的條件語句(即在條件語句中,沒有將所有可能發(fā)生的條件給出對應(yīng)的處理方式)。對于這種語言現(xiàn)象,VHDL綜合器理解為,對于不滿足條件,跳過賦值語句Q1=D

41、不予執(zhí)行,即意味著保持Q1 的原值不變(保持前一次時鐘上升沿后Q1 被更新的值)。對于數(shù)字電路來說,試圖保持一個值不變,就意味著具有存儲功能的元件的使用,就是必須引進時序元件來保存Q1 中的原值,直到滿足IF 語句的判斷條件后才能更新Q1 中的值。 顯然,時序電路構(gòu)建的關(guān)鍵在于利用這種不完整的條件語句的描述。這種構(gòu)成時序電路的方式是VHDL 描述時序電路最重要的途徑。通常,完整的條件語句只能構(gòu)成組合邏輯電路,如例3-3 中,IF_THEN_ELSE 語句指明了s 為1和0全部可能的條件下的賦值操作,從而產(chǎn)生了多路選擇器組合電路模塊。,然而必須注意,雖然在構(gòu)成時序電路方面,可以利用不完整的條件語

42、句所具有的獨特功能構(gòu)成時序電路,但在利用條件語句進行純組合電路設(shè)計時,如果沒有充分考慮電路中所有可能出現(xiàn)的問題,即沒有列全所有的條件及其對應(yīng)的處理方法,將導(dǎo)致不完整的條件語句的出現(xiàn),從而產(chǎn)生設(shè)計者不希望的組合與時序電路的混合體。在此,不妨比較例3-7和例3-8 的綜合結(jié)果。可以認為例3-7 的原意是要設(shè)計一個純組合電路的比較器,但是由于在條件語句中漏掉了給出當(dāng)a1b1 時q1 作何操作的表述,結(jié)果導(dǎo)致了一個不完整的條件語句。這時,綜合器將對例3-7 的條件表述解釋為:當(dāng)條件a1b1 時對q1 不作任何賦值操作,即在此情況下保持q1 的原值,這便意味著必須為q1 配置一個寄存器,以便保存它的原值

43、。圖3-5 所示的電路圖即為例3-7 的綜合結(jié)果。不難發(fā)現(xiàn)綜合器已為比較結(jié)果配置了一個寄存器。通常在仿真時,對這類電路的測試,很難發(fā)現(xiàn)在電路中已被插入了不必要的時序元件,這樣浪費了邏輯資源,降低了電路的工作速度,影響了電路的可靠性。因此,設(shè)計者應(yīng)該盡量避免此類電路的出現(xiàn)。,例3-8 是對例3-7 的改進,其中的“ELSE q1=0”語句即已交代了當(dāng)a1 小于等于b1情況下,q1 作何賦值行為,從而能產(chǎn)生圖3-6 所示的簡潔的組合電路。 現(xiàn)在已不難發(fā)現(xiàn),引入時序電路結(jié)構(gòu)的必要條件和關(guān)鍵所在并非是邊沿檢測表述“clockEVENT AND clock=1”的應(yīng)用或是其他什么語句結(jié)構(gòu),而是不完整的任

44、何形式的條件語句的出現(xiàn),且不局限于IF 語句。,【例3-7】 ENTITY COMP_BAD IS PORT( a1,b1 : IN BIT; q1 : OUT BIT ); END ; ARCHITECTURE one OF COMP_BAD IS BEGIN PROCESS (a1,b1) BEGIN IF a1 b1 THEN q1 = 1 ; ELSIF a1 b1 THEN q1 = 0 ;- 未提及當(dāng)a1=b1時,q1作何操作 END IF; END PROCESS ; END ;,【例3-8】 ENTITY COMP_GOOD IS PORT( a1,b1 : IN BIT; q

45、1 : OUT BIT ); END ; ARCHITECTURE one OF COMP_GOOD IS BEGIN PROCESS (a1,b1) BEGIN IF a1 b1 THEN q1 = 1 ; ELSE q1 = 0 ; END IF; END PROCESS ; END ;,3.2.3 實現(xiàn)時序電路的不同表述 例3-6 通過利用表式“CLKEVENT AND CLK=1”來檢測CLK 的上升沿,從而實現(xiàn)了邊沿觸發(fā)寄存器的設(shè)計。事實上,VHDL 還有其他多種實現(xiàn)時序元件的方式。 嚴格地說,如果信號CLK 的數(shù)據(jù)類型是STD_LOGIC,則它可能的取值有9 種,而CLKEVENT

46、 為真的條件是CLK 在9 種數(shù)據(jù)中的任何兩種間的跳變,因而當(dāng)表式: CLKEVENT AND CLK=1 為真時,并不能推定CLK 在 時刻前是0 (例如,它可以從Z變到1),從而即使CLK 有“事件”發(fā)生也不能肯定CLK 發(fā)生了一次由0到1的上升沿的跳變。為了確保此CLK 發(fā)生的是一次上升沿的跳變,例3-9 采用了如下的條件判斷表式: CLKEVENT AND (CLK=1) AND (CLKLAST_VALUE=0),與EVENT 一樣,LAST_VALUE 也屬于預(yù)定義的信號屬性函數(shù),它表示最近一次事件發(fā)生前的值。CLKLAST_VALUE=0為TRUE,表示CLK 在 時刻前為0。

47、CLKEVENT AND CLK=1和CLKLAST_VALUE=0相與為真的話,則保證了CLK在 時刻內(nèi)的跳變是從0變到1的。例3-9、3-10、3-11 都有相同的用意,只是例3-11 調(diào)用了一個測定CLK 上升沿的函數(shù)rising edge( )。 rising edge( )是VHDL 在IEEE 庫中標準程序包STD_LOGIC_1164 內(nèi)的預(yù)定義函數(shù),這條語句只能用于標準邏輯位數(shù)據(jù)類型STD_LOGIC 的信號。因此必須打開IEEE 庫和程序包STD_LOGIC_1164,然后定義相關(guān)的信號(如CLK)的數(shù)據(jù)類型為標準邏輯位數(shù)據(jù)類型STD_LOGIC。在此CLK 的數(shù)據(jù)類型必須是

48、STD_LOGIC。 測下降沿可用的語句有:falling edge( )、CLKEVENT AND (CLK=0) 、 CLK=0 AND CLKLAST_VALUE=1 等。,【例3-9】 . PROCESS (CLK) BEGIN IF CLKEVENT AND (CLK=1) AND (CLKLAST_VALUE=0) THEN Q = D ; -確保CLK的變化是一次上升沿的跳變 END IF; END PROCESS ; 【例3-10】 . PROCESS (CLK) BEGIN IF CLK=1 AND CLKLAST_VALUE=0 -同例3-9 THEN Q = D ; EN

49、D IF; END PROCESS ;,【例3-11】 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF3 IS PORT (CLK,D : IN STD_LOGIC ; Q : OUT STD_LOGIC ); END ; ARCHITECTURE bhv OF DFF3 IS SIGNAL Q1 : STD_LOGIC; BEGIN PROCESS (CLK) BEGIN IF rising_edge(CLK) - 必須打開STD_LOGIC_1164程序包 THEN Q1 = D ; END IF; END PROCESS ;

50、 Q = Q1 ; -在此,賦值語句可以放在進程外,作為并行賦值語句 END ;,例3-12 則是利用了一條wait until 語句實現(xiàn)時序電路設(shè)計的,含義是如果CLK 當(dāng)前的值不是1,就等待并保持Q 的原值不變,直到CLK 變?yōu)?時才對Q 進行賦值更新。VHDL要求,當(dāng)進程語句中使用wait 語句后,就不必列出敏感信號。 例3-13 描述的D 觸發(fā)器的CLK邊沿檢測是由PROCESS 語句和IF 語句相結(jié)合實現(xiàn)的。其原理是:當(dāng)CLK 為0時,PROCESS 語句處于等待狀態(tài),直到發(fā)生一次由0到1的跳變才啟動進程語句,而在執(zhí)行IF 語句時,又滿足了CLK 為1的條件,于是對Q 進行賦值更新,

51、而此前,Q 一直保持原值不變,直到下一次上跳時鐘邊沿的到來。因此例3-9 至例3-13描述的都是相同的D 觸發(fā)器,其電路的仿真測試波形如圖3-7 所示。由波形可見,Q 的變化僅發(fā)生于CLK 的上升后。 與例3-13 相比,例3-14 僅在敏感信號表中多加了電路輸入信號D,但綜合后的電路功能卻發(fā)生了很大的變化。由時序圖3-8 可見,它表現(xiàn)的是電平式觸發(fā)的鎖存器功能,與圖3-7 表現(xiàn)的波形有很大的區(qū)別。在CLK 處于高電平時,輸出Q 隨D 的變化而變化,而CLK僅在低電平時保持數(shù)據(jù)不變。,由例3-14 的語句分析可知,當(dāng)CLK為1不變時,輸入數(shù)據(jù)D 的任何變化都會啟動進程PROCESS,從而實現(xiàn)輸

52、出信號Q 的更新,而當(dāng)CLK 原來為0時,即使由于D 的變化啟動了PROCESS,但由于不滿足IF 語句的條件,Q 仍然必須處于數(shù)據(jù)原值保存的狀態(tài)。顯然,例3-14 提供了一個電平型觸發(fā)的時序元件(鎖存器)的設(shè)計方法。 但需要指出,此類功能只有MaxplusII、QuartusII 等EDA 工具中含有,許多其他VHDL綜合器不承認這類語法表述,它們都要求將進程中的所有輸入信號都列進敏感信號表中,否則給予警告信息。因此,對于這種綜合器,無法利用此類表述實現(xiàn)電平型觸發(fā)的時序元件,顯然,具體情況需要根據(jù)設(shè)計者使用的EDA 軟件的功能具體確定。在一般情況下,不推薦使用例3-14 的表達方式產(chǎn)生時序電

53、路。 由例3-9 至例3-14 可見,時序電路的建立只能利用進程中的順序語句來建立。此外,考慮到多數(shù)綜合器并不理會邊沿檢測語句中的信號的STD_LOGIC 數(shù)據(jù)類型,因此最常用和通用的邊沿檢測表式仍然是CLKEVENT AND CLK=1。,【例3-12】 . PROCESS BEGIN wait until CLK = 1 ; -利用wait語句 Q = D ; END PROCESS; 【例3-13】 . PROCESS (CLK) BEGIN IF CLK = 1 THEN Q = D ; -利用進程的啟動特性產(chǎn)生對CLK的邊沿檢測 END IF; END PROCESS ;,【例3-1

54、4】 . PROCESS (CLK,D) BEGIN IF CLK = 1 -電平觸發(fā)型寄存器 THEN Q = D ; END IF; END PROCESS ;,Quartus II使用步驟,編輯VHDL文件 建立相關(guān)工程 編譯排錯 設(shè)置波形仿真文件 仿真,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,首先,打開Quartus II軟件:,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,在File菜單中選擇New,打開新建對話框:,1.注意,我們使用的是VHDL語言,所以這里首先要選擇新建VHDL File,2.然后點擊OK,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,在出現(xiàn)的名字為VHDL1.vhd的文件里面可

55、以編輯VHDL文件:,1.在這里可以編輯VHDL語言描述的電路,2.然后點擊保存,保存到你所指定的文件夾中,例如E:/QuartusProject/MUX21A。注意,所有的關(guān)于本次設(shè)計的文件都要放到這個文件夾中,包括以后的一些文件!。,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,1.在這里填入文件名稱,注意文件名稱必須要和你VHDL文件中的實體名稱相同!,2. 點擊“保存”后,彈出該對話框,說你是否要給這個文件建立一個工程,點擊“是”。我們必須要建立一個工程。,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,1.選擇一個文件夾,注意:大家一定要一個項目建立一個文件夾,不

56、要把好多個項目放在一個文件夾下面,那樣會很亂。,2.輸入項目的名稱,一般項目名稱和文件夾名稱相同即可。默認情況項目名稱和上面建立的文件夾名稱相同。,3.輸入頂層設(shè)計實體的名稱,。默認情況項目名稱和上面建立的文件夾名稱相同。,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,1.點擊Add All。,這就是加入的文件,即名字為max21a.vhd的文件。,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,1.選擇器件系列。,2.選擇具體器件型號。,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,1.注意,建立工程之后,這里有這樣的圖標出現(xiàn)。,2.點擊該圖標進行編譯,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,該窗口顯示編譯狀態(tài),如果有錯誤會給出錯誤的大致情況。,顯示編譯進度。,VHDL實例:2選1數(shù)據(jù)選擇器的設(shè)計,編譯完成后,給出編譯的總體情況

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論