版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、vhdl 設(shè)計初步物理科學(xué)與電子工程系參考資料v1 潘松,黃繼業(yè). eda技術(shù)實用教程. 北京,科學(xué)出版社. 2002v2潘松,黃繼業(yè). 現(xiàn)代dsp技術(shù). 西安,西安電子科技大學(xué)出版社. 2003v vhdl是非常高速集成電路硬件描述語言是非常高速集成電路硬件描述語言 ( (very high speed integrated circuit hardware description language)的英文縮寫。的英文縮寫。v語法和風(fēng)格語法和風(fēng)格:(1 1)類似與現(xiàn)代高級編程語言,如)類似與現(xiàn)代高級編程語言,如c語言。語言。(2)vhdl描述的是硬件,它包含許多硬件特有的結(jié)構(gòu)。描述的是硬件,
2、它包含許多硬件特有的結(jié)構(gòu)。 vhdl程序的基本結(jié)構(gòu)程序的基本結(jié)構(gòu)include “stdio.h”; include “math.h”;int 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 入門的最有效
3、的方法是通過具體電路實例引出對應(yīng)的vhdl 表述,通過這些有針對性的表述進(jìn)而學(xué)習(xí)相關(guān)的語句語法,再通過多個類似實例的學(xué)習(xí),逐步完備vhdl 的基本語法知識和提高電路的描述和設(shè)計能力。據(jù)此,全章通過數(shù)個簡單、完整而典型的vhdl 設(shè)計示例,使讀者初步了解用vhdl 表達(dá)和設(shè)計電路的方法,并對由此而引出的vhdl 語言現(xiàn)象和語句規(guī)則能逐步趨向系統(tǒng)的了解。 由于用硬件描述語言來對電子線路的表達(dá)和設(shè)計是eda 建模和實現(xiàn)技術(shù)中最基本和最重要的方法,其它的許多方法都是建筑在這一基礎(chǔ)之上的,如使用matlab/dsp builder的設(shè)計方案、圖形方式的狀態(tài)機(jī)輸入法、原理圖輸入法等等。因此vhdl 的學(xué)習(xí)
4、在eda技術(shù)的掌握中具有十分重要的地位。1 簡單組合電路的vhdl 描述 2選1 多路選擇器是典型的組合電路,本章以此電路的vhdl 表述與設(shè)計為例,引出相關(guān)的vhdl 結(jié)構(gòu)、語句表述、數(shù)據(jù)規(guī)則和語法特點,并加以詳細(xì)說明。1.1 多路選擇器的多路選擇器的vhdl 描述描述 2 選1 多路選擇器的電路模型,或元件圖如圖3-1 所示。例3-1 是其vhdl 的完整描述,即可使用vhdl 綜合器直接綜合出實現(xiàn)即定功能的邏輯電路,對應(yīng)的邏輯電路如圖3-2 所示,因而可以認(rèn)為是此多路選擇器的內(nèi)部電路結(jié)構(gòu)。v注意,電路的功能可以是唯一的,但其電路的結(jié)構(gòu)方式不是唯一的,它決定于綜合器的基本元件庫的來源、優(yōu)化
5、方向和約束的選擇、目標(biāo)器件(指fpga/cpld)的結(jié)構(gòu)特點等等。 圖中,a 和b 分別為兩個數(shù)據(jù)輸入端的端口名,s 為通道選擇控制信號輸入端的端口名,y為輸出端的端口名。“mux21a”是設(shè)計者為此器件取的名稱(好的名稱應(yīng)該體現(xiàn)器件的基本功能特點)。【例3-1】entity mux21a isport ( a, b : in bit; s : in bit; y : out bit );end entity mux21a;architecture one of mux21a isbegin y fb),當(dāng)s 為高電平時, y 輸出fb,而當(dāng)s 為低電平時,y 輸出fa。顯然,圖3-3 的波型
6、證實了vhdl 邏輯設(shè)計的正確性。v注意, 以上各例的實體和結(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”。但考慮到目前絕大多數(shù)常用的eda 工具中的vhdl 綜合器都兼容兩種vhdl 版本的語法規(guī)則,且許多最新的vhdl 方面的資料,仍然使用vhdl87版本語言規(guī)則,因此,出于實用的目的,對于以后出現(xiàn)的示例,不再特意指出vhd
7、l 兩種版本的語法差異處。但對于不同的eda 工具,仍需根據(jù)設(shè)計程序不同的vhdl 版本表述,在綜合前作相應(yīng)的設(shè)置。v【例3-2】見文件夾mux21a1 entity mux21a is port ( a, b : in bit; s : in bit; y : out bit ); end entity mux21a; architecture one of mux21a is signal d,e : bit; begin d = a and (not s) ; e = b and s ; y = d or e ; end architecture one ;【例3-3】見文件夾mux21
8、a2 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 process;v 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. 實體表達(dá) vhdl 完
9、整的、可綜合的程序結(jié)構(gòu)必須能完整地表達(dá)一片專用集成電路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 port ( p_name : port_m data_type; . p_namei : port_mi data_type ); end entity e_name; 上式中,entity、is、port 和end entity
10、 都是描述實體的關(guān)鍵詞,在實體描述中必須包含這些關(guān)鍵詞。在編輯中,關(guān)鍵詞不分大寫和小寫。實體名端口信號名端口模式數(shù)據(jù)類型 2. 實體名 例3-4 中的e_name 是實體名,是標(biāo)識符,具體取名由設(shè)計者自定。由于實體名實際上表達(dá)的應(yīng)該設(shè)計電路的器件名,所以最好根據(jù)相應(yīng)電路的功能來確定,如4 位二進(jìn)制計數(shù)器,實體名可取為counter4b;8 位二進(jìn)制加法器,實體名可取為adder8b,等等。但應(yīng)注意,不應(yīng)用數(shù)字或中文定義實體名,也不應(yīng)用與eda 工具庫中已定義好的元件名作為實體名,如or2、latch 等,且不能用數(shù)字起頭的實體名,如74lsxx。 3. 端口語句和端口信號名 描述電路的端口及其
11、端口信號必須用端口語句port( )引導(dǎo),并在語句結(jié)尾處加分號“;”。例3-4 中的p_name 是端口信號名,如例3-1 中的端口信號名分別是a、b、s 和y。4. 端口模式 在例3-4中的port_m表達(dá)端口模式,可綜合的端口模式有四種,它們分別是“in”、“out”、“inout”和“buffer”,用于定義端口上數(shù)據(jù)的流動方向和方式: in:輸入端口,定義的通道為單向只讀模式。規(guī)定數(shù)據(jù)只能由此端口被讀入實體。 out:輸出端口,定義的通道為單向輸出模式。規(guī)定數(shù)據(jù)只能通過此端口從實體向外流出,或者說可以將實體中的數(shù)據(jù)向此端口賦值。 inout:定義的通道確定為輸入輸出雙向端口。即從端口的
12、內(nèi)部看,可以對此端口進(jìn)行賦值,或通過此端口讀入外部的數(shù)據(jù)信息;而從端口的外部看,信號既可由此端口流出,也可向此端口輸入信號。如 ram 的數(shù)據(jù)口,單片機(jī)的i/o 口等。 buffer:緩沖端口,其功能與inout 類似,區(qū)別在于當(dāng)需要輸入數(shù)據(jù)時,只允許內(nèi)部回讀輸出的信號,即允許反饋。如計數(shù)器設(shè)計,可將計數(shù)器輸出的計數(shù)信號回讀,以作下一計數(shù)值的初值。與inout 模式相比,buffer 回讀的信號不是由外部輸入的,而是由內(nèi)部產(chǎn)生,向外輸出的信號。 5. 數(shù)據(jù)類型 例3-4 中的data_type 是數(shù)據(jù)類型名。例3-1 中,端口信號a、b、s 和y 的數(shù)據(jù)類型都定義為bit。由于vhdl 中任何
13、一種數(shù)據(jù)對象的應(yīng)用都必須嚴(yán)格限定其取值范圍和數(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 中,邏輯位0 和1 的表達(dá)必須加單引號,否則vhdl 綜合器將0 和1 解釋為整數(shù)數(shù)據(jù)類型integer。 bit 數(shù)據(jù)類型可以參與邏輯運算或算術(shù)運算,其結(jié)果仍是位的數(shù)據(jù)類型。vhdl 綜合器用一個二進(jìn)制位表示bit。將例3-1 中的端
14、口信號a、b、s 和y 的數(shù)據(jù)類型都定義為bit表示:a、b、s 和y 的取值范圍,或者說數(shù)據(jù)范圍都被限定在邏輯位1和0的二值范圍內(nèi)。6. 結(jié)構(gòu)體表達(dá) 結(jié)構(gòu)體的一般表達(dá)如例3-5 所示?!纠?-5】 architecture arch_name of e_name is 說明語句 begin (功能描述語句) end architecture arch_name ; 上式中,architecture、of、is、begin 和end architecture 都是描述結(jié)構(gòu)體的關(guān)鍵詞,在描述中必須包含它們。arch_name 是結(jié)構(gòu)體名,是標(biāo)識符。 說明語句包括在結(jié)構(gòu)體中,用以說明和定義數(shù)據(jù)對象
15、、數(shù)據(jù)類型、元件調(diào)用聲明等等。說明語句并非是必須的,(功能描述語句)則不同,結(jié)構(gòu)體中必須給出相應(yīng)的電路功能描述語句,可以是并行語句,順序語句或它們的混合。 一般地,一個可綜合的,完整的vhdl 程序有比較固定的結(jié)構(gòu)。設(shè)計實體中,一般首先出現(xiàn)的是各類庫及其程序包的使用聲明,包括未以顯式表達(dá)的工作庫work 庫的使用聲明,然后是實體描述,最后是結(jié)構(gòu)體描述,而在結(jié)構(gòu)體中可以含有不同的邏輯表達(dá)語句結(jié)構(gòu)。如前所述,在此把一個完整的可綜合的vhdl 程序設(shè)計構(gòu)建為設(shè)計實體(獨立的電路功能結(jié)構(gòu)),而其程序代碼常被稱為vhdl 的rtl 描述。7. 賦值符號和數(shù)據(jù)比較符號 例3-1 中的表達(dá)式y(tǒng)= a 表示輸
16、入端口a 的數(shù)據(jù)向輸出端口y 傳輸;但也可以解釋為信號a 向信號y 賦值。在vhdl 仿真中賦值操作y= a并非立即發(fā)生的,而是要經(jīng)歷一個模擬器的最小分辨時間后,才將a 的值賦予y 。在此不妨將 看成是實際電路存在的固有延時量。vhdl 要求賦值符“=”兩邊的信號的數(shù)據(jù)類型必須一致。 例3-1 中,條件判斷語句when_else 通過測定表式 s=0 的比較結(jié)果,以確定由哪一端口向y 賦值。條件語句when_else 的判定依據(jù)是表式 s=0 輸出的結(jié)果。表式中的等號“=”沒有賦值的含義,只是一種數(shù)據(jù)比較符號。其表式輸出結(jié)果的數(shù)據(jù)類型是布爾數(shù)據(jù)類型boolean。boolean 類型的取值分別
17、是:true(真)和false(偽)。即當(dāng)s 為高電平時,表式 s=0 輸出“false”;當(dāng)s 為低電平時,表式 s =0 輸出“true”。在vhdl 綜合器或仿真器中分別用1和0表達(dá)true 和false。布爾數(shù)據(jù)不是數(shù)值,只能用于邏輯操作或條件判斷。 用于條件語句的判斷表達(dá)式可以是一個值,也可以是更復(fù)雜的邏輯或運算表達(dá)式,如: if a then . - 注意,a 的數(shù)據(jù)類型必須是boolean if (s1=0)and(s2=1)or(cb+1) then .8. 邏輯操作符 例3-2 中出現(xiàn)的文字and、or 和not 是邏輯操作符號。vhdl 共有7 種基本邏輯操作符,它們是an
18、d(與)、or(或)、nand(與非)、nor(或非)、xor(異或)、xnor(同或)和not(取反)。信號在這些操作符的作用下可構(gòu)成組合邏輯。邏輯操作符所要求的操作數(shù)(操作對象)的數(shù)據(jù)類型有3 種,即bit、boolean 和std_logic。 注意,與其他hdl 用某種符號表達(dá)邏輯操作符不同,vhdl 中直接用對應(yīng)的英語文字表達(dá)邏輯操作符號,這更明確顯示了vhdl 作為硬件行為描述語言的特征。9. 條件語句 例3-3 利用if_then_else 表達(dá)的vhdl 順序語句的方式,同樣描述了一個多路選擇器的電路行為。其結(jié)構(gòu)體中的if 語句的執(zhí)行順序類似于軟件語言,首先判斷如果s 為低電平
19、,則執(zhí)行y=a 語句,否則(當(dāng)s 為高電平),則執(zhí)行語句y=b。由此可見vhdl 的順序語句同樣能描述并行運行的組合電路。注意,if 語句必須以語句“end if;”結(jié)束。10. when_else 條件信號賦值語句 例3-1 中出現(xiàn)的是條件信號賦值語句,這是一種并行賦值語句,其表達(dá)方式如下: 賦值目標(biāo) = 表達(dá)式 when 賦值條件 else 表達(dá)式 when 賦值條件 else . 表達(dá)式 ; 在結(jié)構(gòu)體中的條件信號賦值語句的功能與在進(jìn)程中的if 語句相同,在執(zhí)行條件信號語句時,每一“賦值條件”是按書寫的先后關(guān)系逐項測定的,一旦發(fā)現(xiàn)(賦值條件= true),立即將“表達(dá)式”的值賦給“賦值目標(biāo)
20、”信號。 注意,由于條件測試的順序性,條件信號賦值語句中的第一子句具有最高賦值優(yōu)先級,第二句其次,如此類推。例如在以下程序中,如果當(dāng)p1 和p2 同時為1時,z 獲得的賦值是a 而不可能是b 。還應(yīng)該注意,相對于在同一結(jié)構(gòu)體中的其它語句,此類賦值語句作為一個完整的語句,屬于并行語句。 z = a when p1 = 1 else b when p2 = 1 else c ;11. 進(jìn)程語句和順序語句 由例3-3 可見,順序語句“if_then_else_end if;”是放在由“process. end process”引導(dǎo)的語句中的。由process 引導(dǎo)的語句稱為進(jìn)程語句。在vhdl 中,
21、所有合法的順序描述語句都必須放在進(jìn)程語句中。 process 旁的(a,b,s)稱為進(jìn)程的敏感信號表,通常要求將進(jìn)程中所有的輸入信號都放在敏感信號表中。例如,例3-3 中的輸入信號是a、b 和s,所以將它們?nèi)苛腥朊舾行盘柋碇小S捎趐rocess 語句的執(zhí)行依賴于敏感信號的變化(或稱發(fā)生事件),當(dāng)某一敏感信號(如a)從原來的1跳變到0,或者從原來的0跳變到1時,就將啟動此進(jìn)程語句,于是此process 至end process 引導(dǎo)的語句(包括其中的順序語句)被執(zhí)行一遍,然后返回進(jìn)程的起始端,進(jìn)入等待狀態(tài),直到下一次敏感信號表中某一信號或某些信號發(fā)生事件才再次進(jìn)入“啟動運行”狀態(tài)。 在一個結(jié)構(gòu)
22、體中可以包含任意個進(jìn)程語句,所有的進(jìn)程語句都是并行語句,而由任一進(jìn)程process 引導(dǎo)的語句(包含在其中的語句)結(jié)構(gòu)屬于順序語句。12. 文件取名和存盤 如果用quartusii 提供的vhdl 文本編輯器編輯vhdl 代碼文件,在保存文件時,必須賦給一個正確的文件名。一般地,文件名可以由設(shè)計者任意給定,但文件后綴擴(kuò)展名必須是“.vhd”,如adder_f.vhd。但考慮到某些eda 軟件的限制和vhdl 程序的特點,以及調(diào)用的方便性,因此建議程序的文件名盡可能與該程序的實體名一致,如例3-1 的文件名應(yīng)該是:mux21a.vhd。原則上文件名不分大小寫,但推薦使用小寫,特別是后綴。3.2
23、簡單時序電路的vhdl 描述 與其他硬件描述語言相比,在時序電路的描述上,vhdl 具有許多獨特之處。最明顯的是vhdl 主要通過對時序器件功能和邏輯行為的描述,而非結(jié)構(gòu)上的描述使得計算機(jī)綜合出符合要求的時序電路,從而充分體現(xiàn)了vhdl 電路系統(tǒng)行為描述的強(qiáng)大功能。以下將對一個典型的時序元件d 觸發(fā)器的vhdl 描述進(jìn)行詳細(xì)分析,從而得出時序電路描述的一般規(guī)律和設(shè)計方法。3.2.1 d 觸發(fā)器 最簡單、最常用,并最具代表性的時序電路是d 觸發(fā)器,它是現(xiàn)代數(shù)字系統(tǒng)設(shè)計中最基本的時序單元和底層元件。d 觸發(fā)器的描述包含了vhdl 對時序電路的最基本和典型的表達(dá)方式,同時也包含了vhdl 中許多最具
24、特色的語言現(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 clk = 1。 除此之外,雖然例3-3 描述的是組合電路,而例3-6 描述的是時序電路,如果不詳細(xì)分析其中的表述含義,二例在語句結(jié)構(gòu)和語言應(yīng)用上沒有明顯的差異,也不存在如其他硬件描述語言(如abel、ahdl)那樣包含用于表示時序或組合邏輯的特征語句,更沒
25、有與特定的軟件或硬件相關(guān)的特征屬性語句。這也充分表明了vhdl 電路描述與設(shè)計平臺和硬件實現(xiàn)對象無關(guān)性的優(yōu)秀特點?!纠?-6】 library ieee ; use ieee.std_logic_1164.all ; entity dff1 is port (clk : in std_logic ; d : in std_logic ; q : out std_logic ); end ; architecture bhv of dff1 is signal q1 : std_logic ; -類似于在芯片內(nèi)部定義一個數(shù)據(jù)的暫存節(jié)點 begin process (clk,q1) begin i
26、f clkevent and clk = 1 then q1 = d ; end if; end process ; q = q1 ; -將內(nèi)部的暫存數(shù)據(jù)向端口輸出(雙橫線-是注釋符號) end bhv3.2.2 d 觸發(fā)器vhdl 描述的語言現(xiàn)象說明 以下對例3-6 中出現(xiàn)的新的語句語言現(xiàn)象作出說明。 1. 標(biāo)準(zhǔn)邏輯位數(shù)據(jù)類型std_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)然也包含了bi
27、t 類型。試比較以下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 種數(shù)據(jù)的含義是:u表示未初始化的;x表示強(qiáng)未知的;0表示強(qiáng)邏輯0;1表示強(qiáng)邏輯1;z表示高阻態(tài);w 表示弱未知的;l表示弱邏輯0;h表示弱邏輯1;-表示忽略。 它們完整地概括了數(shù)字系統(tǒng)中所有可能的數(shù)據(jù)表現(xiàn)形式,所以例3-6 中的clk、d 和q 比例3-1 中
28、的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 到5 種值,即x (或/和)、0、1和z,其他類型通常不可綜合。 注意,此例中給出的std_logic 數(shù)據(jù)類型的定義主要是借以學(xué)習(xí)一種新的語法現(xiàn)象,而非d 觸發(fā)器等時序電路必須使用此類數(shù)據(jù)類型。2. 設(shè)計庫和標(biāo)準(zhǔn)程序包 有許多數(shù)據(jù)類型的說明,及類似的函數(shù)是預(yù)先
29、放在vhdl 綜合器附帶的設(shè)計庫和程序包中的。如bit 數(shù)據(jù)類型的定義是包含在vhdl 標(biāo)準(zhǔn)程序包standard 中的,而程序包standard 包含于vhdl 標(biāo)準(zhǔn)庫std 中。一般,為了使用bit 數(shù)據(jù)類型,應(yīng)該在例3-1的程序上面增加如下3 句說明語句: library work ; library std ; use std.standard.all ; 第2 句中的library 是關(guān)鍵詞,library std 表示打開std 庫;第3 句的use 和all 是關(guān)鍵詞,全句表示允許使用std 庫中standard 程序包中的所有內(nèi)容(.all),如類型定義、函數(shù)、過程、常量等。
30、此外,由于要求vhdl 設(shè)計文件保存在某一文件夾,如d:myfile 中,并指定為工程project 的文件所在的目錄,vhdl 工具就將此路徑指定的文件夾默認(rèn)工作庫(worklibrary),于是在vhdl 程序前面還應(yīng)該增加 “l(fā)ibrary work;”語句,vhdl 工具才能調(diào)用此路徑中相關(guān)的元件和程序包。 但是,由于vhdl 標(biāo)準(zhǔn)中規(guī)定標(biāo)準(zhǔn)庫std 和工作庫work 都是默認(rèn)打開的,因此就可以像例3-1 那樣,不必將上述庫和程序包的使用語句以顯式表達(dá)在vhdl 程序中。除非如例3-6 那樣,需要使用一些特殊的程序包。 使用庫和程序包的一般定義表式是: library ; use .a
31、ll ; std_logic 數(shù)據(jù)類型定義在被稱為std_logic_1164 的程序包中,此包由ieee 定義,而且此程序包所在的程序庫的庫名被取名為ieee。由于ieee 庫不屬于vhdl 標(biāo)準(zhǔn)庫,所以在使用其庫中內(nèi)容前,必須事先給予聲明。即如例3-6 最上的兩句語句: library ieee ; use ieee.std_logic_1164.all ; 正是出于需要定義端口信號的數(shù)據(jù)類型為std_logic的目的,當(dāng)然也可以定義為bit類型或其他數(shù)據(jù)類型,但一般應(yīng)用中推薦定義std_logic 類型。3. 信號定義和數(shù)據(jù)對象 例3-6 中的語句“signal q1:std_logic
32、;”表示在描述的器件dff1 內(nèi)部定義標(biāo)識符q1 的數(shù)據(jù)對象為信號signal,其數(shù)據(jù)類型為std_logic。由于q1 被定義為器件的內(nèi)部節(jié)點信號,數(shù)據(jù)的進(jìn)出不像端口信號那樣受限制,所以不必定義其端口模式(如in、out 等)。定義q1 的目的是為了在設(shè)計更大的電路時使用由此引入的時序電路的信號,這是一種常用的時序電路設(shè)計的方式。事實上,如果在例3-6 中不作q1 的定義,其結(jié)構(gòu)體(如將其中的賦值語句q1 = d 改為q = d)同樣能綜合出相同的結(jié)果,但不推薦這種設(shè)計方式。 語句“signal q1:std_logic;”中的signal 是定義某標(biāo)識符為信號的關(guān)鍵詞。 在vhdl 中,數(shù)
33、據(jù)對象(data objects)類似于一種容器,它接受不同數(shù)據(jù)類型的賦值。數(shù)據(jù)對象有3 類,即信號(signal)、變量(variable)和常量(constant)。在vhdl中,被定義的標(biāo)識符必須確定為某類數(shù)據(jù)對象,同時還必須被定義為某種數(shù)據(jù)類型。如例3-6 中的q1,對它規(guī)定的數(shù)據(jù)對象是信號,而數(shù)據(jù)類型是std_logic,前者規(guī)定了q1 的行為方式和功能特點,后者限定了q1 的取值范圍。vhdl 規(guī)定,q1 作為信號,它可以如同一根連線那樣在整個結(jié)構(gòu)體中傳遞信息,也可以根據(jù)程序的功能描述構(gòu)成一個時序元件;但q1 傳遞或存儲的數(shù)據(jù)的類型只能包含在std_logic 的定義中。 需要注意
34、的是,語句“signal q1:std_logic;”僅規(guī)定了q1 的屬性特征,而其功能定位需要由結(jié)構(gòu)體中的語句描述具體確定。如果將q1 比喻為一瓶葡萄酒,則其特定形狀的酒瓶就是其數(shù)據(jù)對象,瓶中的葡萄酒(而非其他酒)就是其數(shù)據(jù)類型,而這瓶酒的用處(功能)只能由擁有這酒的人來確定,即結(jié)構(gòu)體中的具體描述。4. 上升沿檢測表式和信號屬性函數(shù)event 例3-6 中的條件語句的判斷表式“clkevent and clk=1”是用于檢測時鐘信號clk 的上升沿的,即如果檢測到clk 的上升沿,此表達(dá)式將輸出“true”。 關(guān)鍵詞event 是信號屬性函數(shù),用來獲得信號行為信息的函數(shù)稱為信號屬性函數(shù)。vh
35、dl 通過以下表式來測定某信號的跳變情況: event 短語“clockevent”就是對clock 標(biāo)識符的信號在當(dāng)前的一個極小的時間段內(nèi)發(fā)生事件的情況進(jìn)行檢測。所謂發(fā)生事件,就是clock 在其數(shù)據(jù)類型的取值范圍內(nèi)發(fā)生變化,從一種取值轉(zhuǎn)變到另一種取值(或電平方式)。如果clock 的數(shù)據(jù)類型定義為std_logic,則在 時間段內(nèi),clock 從其數(shù)據(jù)類型允許的9 種值中的任何一個值向另一值跳變,如由0變成1、由1變成0或由z變成0,都認(rèn)為發(fā)生了事件,于是此表式將輸出一個布爾值true,否則為false。 如果將以上短語clockevent 改成語句:clockevent and cloc
36、k=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)。因此,以上的表達(dá)式就可以用來對信號clock的上升沿進(jìn)行檢測,于是語句clockevent and clock =1就成了邊沿測試語句。5. 不完整條件語句與時序電路 現(xiàn)在來分析例3-6 中對d 觸發(fā)器功能的描述。 首先考察時鐘信號clk 上升沿出現(xiàn)的情況(即滿足if 語句條
37、件的情況)。當(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 輸出。至此,是否可以認(rèn)為,clk 上升沿測定語句clkevent andclk=1就成為綜合器構(gòu)建時序電路的必要條件呢?回答顯然是否定的。 其次再考察如果clk 沒有發(fā)生變化,或者說clk沒有出現(xiàn)上升沿方式的跳變時if 語句的行為。這時由于if 語句不滿足條件,即條件表式給出“fal
38、se”,于是將跳過賦值表式q1=d,不執(zhí)行此賦值表式而結(jié)束if 語句。由于在此,if 語句中沒有利用通常的else語句明確指出當(dāng)if 語句不滿足條件時作何操作。顯然這是一種不完整的條件語句(即在條件語句中,沒有將所有可能發(fā)生的條件給出對應(yīng)的處理方式)。對于這種語言現(xiàn)象,vhdl綜合器理解為,對于不滿足條件,跳過賦值語句q1=d 不予執(zhí)行,即意味著保持q1 的原值不變(保持前一次時鐘上升沿后q1 被更新的值)。對于數(shù)字電路來說,試圖保持一個值不變,就意味著具有存儲功能的元件的使用,就是必須引進(jìn)時序元件來保存q1 中的原值,直到滿足if 語句的判斷條件后才能更新q1 中的值。 顯然,時序電路構(gòu)建的
39、關(guān)鍵在于利用這種不完整的條件語句的描述。這種構(gòu)成時序電路的方式是vhdl 描述時序電路最重要的途徑。通常,完整的條件語句只能構(gòu)成組合邏輯電路,如例3-3 中,if_then_else 語句指明了s 為1和0全部可能的條件下的賦值操作,從而產(chǎn)生了多路選擇器組合電路模塊。 然而必須注意,雖然在構(gòu)成時序電路方面,可以利用不完整的條件語句所具有的獨特功能構(gòu)成時序電路,但在利用條件語句進(jìn)行純組合電路設(shè)計時,如果沒有充分考慮電路中所有可能出現(xiàn)的問題,即沒有列全所有的條件及其對應(yīng)的處理方法,將導(dǎo)致不完整的條件語句的出現(xiàn),從而產(chǎn)生設(shè)計者不希望的組合與時序電路的混合體。在此,不妨比較例3-7和例3-8 的綜合結(jié)
40、果??梢哉J(rèn)為例3-7 的原意是要設(shè)計一個純組合電路的比較器,但是由于在條件語句中漏掉了給出當(dāng)a1b1 時q1 作何操作的表述,結(jié)果導(dǎo)致了一個不完整的條件語句。這時,綜合器將對例3-7 的條件表述解釋為:當(dāng)條件a1b1 時對q1 不作任何賦值操作,即在此情況下保持q1 的原值,這便意味著必須為q1 配置一個寄存器,以便保存它的原值。圖3-5 所示的電路圖即為例3-7 的綜合結(jié)果。不難發(fā)現(xiàn)綜合器已為比較結(jié)果配置了一個寄存器。通常在仿真時,對這類電路的測試,很難發(fā)現(xiàn)在電路中已被插入了不必要的時序元件,這樣浪費了邏輯資源,降低了電路的工作速度,影響了電路的可靠性。因此,設(shè)計者應(yīng)該盡量避免此類電路的出現(xiàn)
41、。 例3-8 是對例3-7 的改進(jìn),其中的“else q1 b1 then q1 = 1 ; elsif a1 b1 then q1 b1 then q1 = 1 ; else q1 = 0 ; end if; end process ; end ;圖3-6 例3-8的電路圖(synplify綜合)圖3-5 例3-7的電路圖(synplify綜合)3.2.3 實現(xiàn)時序電路的不同表述 例3-6 通過利用表式“clkevent and clk=1”來檢測clk 的上升沿,從而實現(xiàn)了邊沿觸發(fā)寄存器的設(shè)計。事實上,vhdl 還有其他多種實現(xiàn)時序元件的方式。 嚴(yán)格地說,如果信號clk 的數(shù)據(jù)類型是std
42、_logic,則它可能的取值有9 種,而clkevent 為真的條件是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_
43、value=0為true,表示clk 在 時刻前為0。 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 庫中標(biāo)準(zhǔn)程序包std_logic_1164 內(nèi)的預(yù)定義函數(shù),這條語句只能用于標(biāo)準(zhǔn)邏輯位數(shù)據(jù)類型std_logic 的信號。因此必須打開ieee 庫和程序包std_logic_1164,然后定義相關(guān)的信號(如clk)的數(shù)據(jù)類型為標(biāo)準(zhǔn)邏輯位
44、數(shù)據(jù)類型std_logic。在此clk 的數(shù)據(jù)類型必須是std_logic。 測下降沿可用的語句有:falling edge( )、clkevent and (clk=0) 、 clk=0 and clklast_value=1 等?!纠?-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=
45、0 -同例3-9 then q = d ; end 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 ; e
46、nd if; end process ; q = q1 ; -在此,賦值語句可以放在進(jìn)程外,作為并行賦值語句end ; 例3-12 則是利用了一條wait until 語句實現(xiàn)時序電路設(shè)計的,含義是如果clk 當(dāng)前的值不是1,就等待并保持q 的原值不變,直到clk 變?yōu)?時才對q 進(jìn)行賦值更新。vhdl要求,當(dāng)進(jìn)程語句中使用wait 語句后,就不必列出敏感信號。 例3-13 描述的d 觸發(fā)器的clk邊沿檢測是由process 語句和if 語句相結(jié)合實現(xiàn)的。其原理是:當(dāng)clk 為0時,process 語句處于等待狀態(tài),直到發(fā)生一次由0到1的跳變才啟動進(jìn)程語句,而在執(zhí)行if 語句時,又滿足了clk
47、 為1的條件,于是對q 進(jìn)行賦值更新,而此前,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僅在低電平時保持?jǐn)?shù)據(jù)不變。 由例3-14 的語句分析可知,當(dāng)clk為1不變時,輸入數(shù)據(jù)d 的任何變化
48、都會啟動進(jìn)程process,從而實現(xiàn)輸出信號q 的更新,而當(dāng)clk 原來為0時,即使由于d 的變化啟動了process,但由于不滿足if 語句的條件,q 仍然必須處于數(shù)據(jù)原值保存的狀態(tài)。顯然,例3-14 提供了一個電平型觸發(fā)的時序元件(鎖存器)的設(shè)計方法。 但需要指出,此類功能只有maxplusii、quartusii 等eda 工具中含有,許多其他vhdl綜合器不承認(rèn)這類語法表述,它們都要求將進(jìn)程中的所有輸入信號都列進(jìn)敏感信號表中,否則給予警告信息。因此,對于這種綜合器,無法利用此類表述實現(xiàn)電平型觸發(fā)的時序元件,顯然,具體情況需要根據(jù)設(shè)計者使用的eda 軟件的功能具體確定。在一般情況下,不推
49、薦使用例3-14 的表達(dá)方式產(chǎn)生時序電路。 由例3-9 至例3-14 可見,時序電路的建立只能利用進(jìn)程中的順序語句來建立。此外,考慮到多數(shù)綜合器并不理會邊沿檢測語句中的信號的std_logic 數(shù)據(jù)類型,因此最常用和通用的邊沿檢測表式仍然是clkevent and clk=1?!纠?-12】. process begin wait until clk = 1 ; -利用wait語句 q = d ; end process;【例3-13】. process (clk) begin if clk = 1 then q = d ; -利用進(jìn)程的啟動特性產(chǎn)生對clk的邊沿檢測 end if; end
50、process ;【例3-14】. process (clk,d) begin if clk = 1 -電平觸發(fā)型寄存器 then q = d ; end if; end process ;quartus ii使用步驟v編輯vhdl文件v建立相關(guān)工程v編譯排錯v設(shè)置波形仿真文件v仿真vhdl實例:2選1數(shù)據(jù)選擇器的設(shè)計v首先,打開quartus ii軟件:vhdl實例:2選1數(shù)據(jù)選擇器的設(shè)計v在file菜單中選擇new,打開新建對話框:1.注意,我們使用的是vhdl語言,所以這里首先要選擇新建vhdl file2.然后點擊okvhdl實例:2選1數(shù)據(jù)選擇器的設(shè)計v在出現(xiàn)的名字為vhdl1.vh
51、d的文件里面可以編輯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.選擇一個文件夾,注意:大家一定要一個項目建立一個文件夾,不要
52、把好多個項目放在一個文件夾下面,那樣會很亂。2.輸入項目的名稱,一般項目名稱和文件夾名稱相同即可。默認(rèn)情況項目名稱和上面建立的文件夾名稱相同。3.輸入頂層設(shè)計實體的名稱,。默認(rèn)情況項目名稱和上面建立的文件夾名稱相同。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.注意,建立工程之后,這里有這樣的圖標(biāo)出現(xiàn)。2.點擊該圖標(biāo)進(jìn)行編譯vhdl實例:2選1數(shù)據(jù)選擇器的設(shè)計該窗口顯示編譯狀態(tài),如果有錯誤會給出錯誤的大致情況。顯示編譯進(jìn)度。vhdl實例:2選1數(shù)據(jù)選擇器的設(shè)計編譯完成后,給出編譯的總體情況。編譯報告vhdl實例:2選1數(shù)據(jù)選擇器的設(shè)計仿真:仿真:點擊file/new,彈出新建對話框:選擇other files標(biāo)簽 建
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度建筑工程安全施工合同管理規(guī)范范本2篇
- 貨車司機(jī)雇傭合同
- 電力運行維護(hù)合同模板
- 產(chǎn)品代銷合同范本
- 網(wǎng)站設(shè)計制作合同書
- 二零二五年工業(yè)地產(chǎn)項目房地產(chǎn)收購合同3篇
- 機(jī)電測試系統(tǒng)課程設(shè)計
- 北京師范大學(xué)珠海分?!冬F(xiàn)代工程研究方法論》2023-2024學(xué)年第一學(xué)期期末試卷
- 北京師范大學(xué)-香港浸會大學(xué)聯(lián)合國際學(xué)院《體能訓(xùn)練》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度二手房買賣合同含違約責(zé)任規(guī)定3篇
- 2024版影視制作公司與演員經(jīng)紀(jì)公司合作協(xié)議3篇
- 2024年上海市初三語文二模試題匯編之記敘文閱讀
- 2024年度上海市嘉定區(qū)工業(yè)廠房買賣合同2篇
- 2023-2024學(xué)年廣東省廣州市海珠區(qū)九年級(上)期末化學(xué)試卷(含答案)
- 自動控制理論(哈爾濱工程大學(xué))知到智慧樹章節(jié)測試課后答案2024年秋哈爾濱工程大學(xué)
- 雙減背景下基于核心素養(yǎng)小學(xué)語文閱讀提升實踐研究結(jié)題報告
- 心電圖使用 課件
- 建筑起重機(jī)械安裝拆卸工程的專項施工方案
- 機(jī)關(guān)培訓(xùn)課件教學(xué)課件
- 《自貢市醫(yī)療服務(wù)項目價格匯編(2023版)》
- 磁力聚星星選達(dá)人認(rèn)證考試-初階
評論
0/150
提交評論