VHDL語言入門教程.ppt
《VHDL語言入門教程.ppt》由會員分享,可在線閱讀,更多相關(guān)《VHDL語言入門教程.ppt(112頁珍藏版)》請在裝配圖網(wǎng)上搜索。
3 VHDL語言,VHDL: VHSIC Hardware Description Language.,,3.1 VHDL語言基礎(chǔ) 3.2 VHDL基本結(jié)構(gòu) 3.3 VHDL語句 3.4 狀態(tài)機在VHDL中的實現(xiàn) 3.5 常用電路VHDL程序 3.6 VHDL仿真 3.7 VHDL綜合,HDL----Hardware Description Language 一種用于描述數(shù)字電路的功能或行為的語言。目的是提為電路設(shè)計效率,縮短設(shè)計周期,減小設(shè)計成本,可在芯片制造前進(jìn)行有效的仿真和錯誤檢測。,優(yōu)點: HDL設(shè)計的電路能獲得非常抽象級的描述。如基于RTL(Register Transfer Level)描述的IC,可用于不同的工藝。 HDL設(shè)計的電路,在設(shè)計的前期,就可以完成電路的功能級的驗證。 HDL設(shè)計的電路類似于計算機編程。,常用的HDL語言:VHDL 、Verilog HDL,VHDL是美國國防部在20世紀(jì)80年代初為實現(xiàn)其高速集成電路硬件VHSIC計劃提出的描述語言; IEEE從1986年開始致力于VHDL標(biāo)準(zhǔn)化工作,融合了其它ASIC芯片制造商開發(fā)的硬件描述語言的優(yōu)點,于93年形成了標(biāo)準(zhǔn)版本(IEEE.std_1164)。 1995年,我國國家技術(shù)監(jiān)督局推薦VHDL做為電子設(shè)計自動化硬件描述語言的國家標(biāo)準(zhǔn)。,,VHDL 概述:,覆蓋面廣,系統(tǒng)硬件描述能力強,是一個多層次的硬件描述語言; VHDL語言具有良好的可讀性,既可以被計算機接受,也容易被人們所理解; VHDL語言可以與工藝無關(guān)編程; VHDL語言已做為一種IEEE的工業(yè)標(biāo)準(zhǔn),便于使用、交流和推廣。,,VHDL優(yōu)點:,設(shè)計的最終實現(xiàn)取決于針對目標(biāo)器件的編程器,工具的不同會導(dǎo)致綜合質(zhì)量不一樣。,3.1.1 標(biāo)識符(Identifiers),要求: 首字符必須是字母 末字符不能為下劃線 不允許出現(xiàn)兩個連續(xù)的下劃線 不區(qū)分大小寫 VHDL定義的保留字(關(guān)鍵字),不能用作標(biāo)識符 標(biāo)識符字符最長可以是32個字符。,注釋由兩個連續(xù)的虛線(--)引導(dǎo)。,3.1 VHDL語言基礎(chǔ),標(biāo)識符用來定義常數(shù)、變量、信號、端口、子程序或參數(shù)的名字, 由字母(A~Z,a~z)、數(shù)字(0~9)和下劃線(_)字符組成。,例如:ABS, ACCESS,AFTER,ALL,AND,ARCHITECTURE,ARRAY,ATTRIBUTE,BEGIN,BODY,BUFFER,BUS,CASE ,COMPONENT,CONSTANT,DISCONNECT,DOWNTO,ELSE,ELSIF,END,ENTITY,EXIT,F(xiàn)ILE,F(xiàn)OR,F(xiàn)UNCTION,GENERIC,GROUP,IF,INPURE,IN,INOUT,IS,LABEL,LIBRARY,LINKAGE,LOOP,MAP,MOD,NAND,NEW,NEXT,NOR ,NOT,NULL,OF,ON,OPEN ,OR ,OTHERS,OUT,PACKAGE,POUT,PROCEDURE ,PROCESS,PURE,RANGE ,RECODE,REM,REPORT,RETURN,ROL,ROR,SELECT,SHARED,SIGNAL,SLA,SLL,SRA,SUBTYPE,THEN,TRANSPORT,TO,TYPE ,UNAFFECTED,UNITS,UNTIL,USE,VARIABLE,WAIT,WHEN,WHILE,WITH,XOR ,XNOR,關(guān)鍵字(保留字):,關(guān)鍵字(keyword)是VHDL中具有特別含義的單詞,只能做為固定的用途,用戶不能用其做為標(biāo)識符。,3.1.2 數(shù)據(jù)對象(Date Objects),常量Constant,Constant bus_width: integer := 8; --定義總線寬度為常數(shù)8,數(shù)據(jù)對象包括常量、變量、信號和文件四種類型。,常量是對某一常量名賦予一個固定的值,而且只能賦值一次。通常賦值在程序開始前進(jìn)行,該值的數(shù)據(jù)類型則在說明語句中指明。,Constant 常數(shù)名:數(shù)據(jù)類型:=表達(dá)式,Constant Vcc:real:=5.0; --定義Vcc的數(shù)據(jù)類型是實數(shù),賦值為5.0V,常量所賦的值應(yīng)和定義的數(shù)據(jù)類型一致;,常量在程序包、實體、構(gòu)造體或進(jìn)程的說明性區(qū)域內(nèi)必須加以說明。定義在程序包內(nèi)的常量可供所含的任何實體、構(gòu)造體所引用,定義在實體說明內(nèi)的常量只能在該實體內(nèi)可見,定義在進(jìn)程說明性區(qū)域中的常量只能在該進(jìn)程內(nèi)可見。,Variable 變量名:數(shù)據(jù)類型 :=初始值;,Variable count: integer 0 to 255:=20 ; -- 定義count整數(shù)變量,變化 范圍0~255,初始值為20。,變量Variable,變量只能在進(jìn)程語句、函數(shù)語句和過程語句結(jié)構(gòu)中使用。變量的賦值是直接的,非預(yù)設(shè)的,分配給變量的值立即成為當(dāng)前值,變量不能表達(dá)“連線”或存儲元件,不能設(shè)置傳輸延遲量。,變量賦值語句: 目標(biāo)變量名 := 表達(dá)式;,變量定義語句:,x:=10.0; -- 實數(shù)變量賦值為10.0 Y:=1.5+x; -- 運算表達(dá)式賦值,注意表達(dá)式必須與目標(biāo)變量的數(shù)據(jù)類型相同 A(3 to 6):=(“1101”); --位矢量賦值,Signal 信號名: 數(shù)據(jù)類型 :=初始值,Signal clock:bit :=‘0’; --定義時鐘信號類型,初始值為0,信號Signal,信號表示邏輯門的輸入或輸出,類似于連接線,也可以表達(dá)存儲元件的狀態(tài)。信號通常在構(gòu)造體、程序包和實體中說明。,信號定義語句:,Signal count:BIT_VECTOR(3 DOWNTO 0); --定義count為4位位矢量,信號賦值語句: 目標(biāo)信號名 = 表達(dá)式;,x=9; Z=x after 5 ns; -- 在5ns后將x的值賦予z,3.1.2 數(shù)據(jù)類型,布爾:(Boolean),位: ( Bit ) TYPE BIT IS (‘0’,’1’); --取值為0和1,用于邏輯運算,位矢量: ( Bit_Vector ) TYPE BIT_VECTOR IS ARRAY (Natural range) OF BIT; -- 基于Bit類型的數(shù) 組,用于邏輯運算 SIGNAL a:Bit_Vector(0 TO 7); SIGNAL a:Bit_Vector ( 7 DOWNTO 0),VHDL的預(yù)定義數(shù)據(jù)類型,在VHDL標(biāo)準(zhǔn)程序包STANDARD中定義好,實際使用過程中,已自動包含進(jìn)VHDL源文件中,不需要通過USE語句顯式調(diào)用。,TYPE BOOLEAN IS (FALSE, TRUE); -- 取值為FALSE和TRUE,不是數(shù)值,不 能運算,一般用于關(guān)系運算符,整數(shù):(Integer) 取值范圍 -(231-1) ~(231-1),可用32位有符號的二進(jìn)制數(shù)表示 variable a:integer range -63 to 63 在實際應(yīng)用中,VHDL仿真器將Integer做為有符號數(shù)處理,而VHDL綜合器將Integer做為無符號數(shù)處理; 要求用RANGE子句為所定義的數(shù)限定范圍,以便根據(jù)范圍來決定表示此信號或變量的二進(jìn)制數(shù)的位數(shù)。,字符:(Character) TYPE CHARACTER IS (NUL, SOH,STX, …, ‘ ’, ‘!’,…); --通常用‘’引起 來,區(qū)分大小寫;,字符串:(String) VARIABLE string_var: STRING (1 TO 7); string_var:=“A B C D” ; -- 通常用“”引起來,區(qū)分大小寫;,實數(shù):(Real) 取值范圍 -1.0E38 ~+1.0E38,僅用于仿真不可綜合 1.0 --十進(jìn)制浮點數(shù) 8#43.6#e+4 --八進(jìn)制浮點數(shù) 43.6E-4 --十進(jìn)制浮點數(shù),時間:(Time) 物理量數(shù)據(jù),完整的包括整數(shù)和單位兩個部分,用至少一個空格隔開,僅用于仿真不可綜合; fs,ps,ns,us,ms,sec,min,hr,錯誤等級(Severity Level) : 表示系統(tǒng)狀態(tài),僅用于仿真不可綜合; TYPE severity_level IS (NOTE、WARNING、ERROR、FAILURE);,IEEE預(yù)定義標(biāo)準(zhǔn)邏輯位與矢量,標(biāo)準(zhǔn)邏輯位(Std_Logic),標(biāo)準(zhǔn)邏輯位矢量( Std_Logic_vector),基于Std_Logic類型的數(shù)組;,使用Std_Logic和 Std_Logic_Vector要調(diào)用IEEE庫中的Std_Logic_1164 程序包;就綜合而言,能夠在數(shù)字器件中實現(xiàn)的是“-、0、1、Z”四種狀態(tài)。 在條件語句中,必須要全面考慮Std_Logic的所有可能取值情況,否則綜合器可能會插入不希望的鎖存器。,U:Uninitialized; X:Forcing Unkown; 0: Forcing 0 1: Forcing 1 Z:High Impedance W:Weak Unknown L: Weak 0 H: Weak 1 —:Don’t care,枚舉:type states is (idle,decision,read,write); type boolean is (false,true); type bit is (‘0’,‘1’);,數(shù)組:type value_type is array (127 downto 0) of integer; type matrix_type is array (0 to 15, 0 to 31) of std_logic;,用戶自定義,TYPE 數(shù)據(jù)類型名 IS 數(shù)據(jù)類型定義 OF 基本數(shù)據(jù)類型 或 TYPE 數(shù)據(jù)類型名 IS 數(shù)據(jù)類型定義,SUBTYPE 子類型名 IS 基本數(shù)據(jù)類型定義 RANGE 約束范圍,subtype digit is integer range 0 to 9;,3.1.3 數(shù)據(jù)類型轉(zhuǎn)換,VHDL為強定義類型語言,不同類型的數(shù)據(jù)不能進(jìn)行運算和直接賦值。,類型標(biāo)記法,Variable A: integer; Variable B: real; A= integer (B); B=real (A);,函數(shù)法,Conv_interger (A);--由std_logic轉(zhuǎn)換為integer型,在std_logic_unsigned包。,常數(shù)轉(zhuǎn)換法 / 常量轉(zhuǎn)換法,Type conv_table is array(std_logic) of bit; Constant table: conv_table:=(‘0’|’L’=’0’, ‘1’|’H’=’1’, others=’0’); Signal a: bit; signal b: std_logic; A=table(b); -- 將std_logic型轉(zhuǎn)換為bit型,具有轉(zhuǎn)換表性質(zhì)的常數(shù),在“STD_LOGIC_1164”、“STD_LOGIC_ARITH”和 “STD_LOGIC_UNSIGNED”的程序包中提供的數(shù)據(jù)類型變換函數(shù)。,屬性,屬性提供的是關(guān)于信號、類型等的指定特性。,‘event:若屬性對象有事件發(fā)生,則生成布爾值“true”,常用來檢查時鐘邊沿是否有效。,上升沿:Clock’ EVENT AND Clock=‘1’,’range:生成一個限制性數(shù)組對象的范圍,’left:生成數(shù)據(jù)類型或數(shù)據(jù)子類型的左邊界值;,’right , ’high, ’low, ’length,’range: “0 to n” ; ’reverse_range:“n downto 0”,運算符,算術(shù)運算符:+, -, *, / , MOD, REM ,SLL ,SRL ,SLA, SRA ,ROL ,ROR ,**,ABS,關(guān)系運算符:=, /=, , =,邏輯運算符:AND,OR,NAND,NOR,XNOR,NOT,XOR,賦值運算符:=,:=,關(guān)聯(lián)運算符:=,其他運算符:+, -,&,并置操作符 ?,SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0) ; SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ; . a = '1'?'0'?d(1)?'1' ; -- 元素與元素并置,并置后的數(shù)組長度為4 . IF a ? d = “101011“ THEN . –- 在IF條件句中可以使用并置符,運算符優(yōu)先級別,邏輯、算術(shù)運算符( NOT, **,ABS),乘法運算符(/ , MOD, REM, * ),正負(fù)運算符:+, -,,加減、并置運算符:+, -, &,關(guān)系運算符:=, /=, , =,邏輯運算符:AND,OR,NAND,NOR,XNOR,NOT,XOR,,移位運算符的左邊為一維數(shù)組,其類型必須是BIT或BOOLEAN,右邊必須是整數(shù)移位次數(shù)為整數(shù)的絕對值。,移位運算符操作示意圖,“1100”SLL1 =“1000” “1100”SRL1 =“0110” “1100”SLA1 =“1000” “1100”SRA1 =“1110” “1100”ROL1 =“1001” “1100”ROR1 =“0110”,SLL:將位向量左移,右邊移空位補零; SRL:將位向量右移,左邊移空位補零; SLA:將位向量左移,右邊第一位的數(shù)值保持原值不變; SRA:將位向量右移,左邊第一位的數(shù)值保持原值不變; ROL和ROR:自循環(huán)左右移位。,取余運算(a REM b)的符號與a相同,其絕對值小于b的絕對值。 例如:(-5)REM 2=(-1) 5 REM 2=(1),取模運算(a MOD b)的符號與b相同,其絕對值小于b的絕對值。 例如:(-5)MOD 2=1 5 MOD (- 2)=(-1),3.2 VHDL基本結(jié)構(gòu),實體(Entity):描述所設(shè)計的系統(tǒng)的外部接口信號,定義電路設(shè)計中所有的輸入和輸出端口; 結(jié)構(gòu)體 (Architecture):描述系統(tǒng)內(nèi)部的結(jié)構(gòu)和行為; 包集合 (Package):存放各設(shè)計模塊能共享的數(shù)據(jù)類型、常數(shù)和子程序等; 配置 (Configuration):指定實體所對應(yīng)的結(jié)構(gòu)體; 庫 (Library):存放已經(jīng)編譯的實體、結(jié)構(gòu)體、包集合和配置。,LIBRARY IEEE; -- 庫、程序包的說明調(diào)用 USE IEEE.Std_Logic_1164.ALL; ENTITY FreDevider IS -- 實體聲明 PORT (Clock: IN Std_logic; Clkout: OUT Std_logic ); END; ARCHITECTURE Behavior OF FreDevider IS -- 結(jié)構(gòu)體定義 SIGNAL Clk:Std_Logic; BEGIN PROCESS(Clock) BEGIN IF rising_edge(Clock) THEN Clk=NOT Clk; END IF; END PROCESS; Clkout=Clk; END;,VHDL的基本設(shè)計單元結(jié)構(gòu):程序包說明、實體說明和結(jié)構(gòu)體說明三部分。,,,3.2.1 實體(Entity),ENTITY 實體名 IS [ GENERIC(常數(shù)名:數(shù)據(jù)類型:設(shè)定值)] PORT ( 端口名1:端口方向 端口類型; 端口名2:端口方向 端口類型; . . 端口名n:端口方向 端口類型 ); END [實體名];,實體描述了設(shè)計單元的輸入輸出接口信號或引腳,是設(shè)計實體經(jīng)封裝后對外的一個通信界面。,ENTITY FreDevider IS PORT (Clock: IN Std_logic; Clokout: OUT Std_logic ); END;,實體名,最后一條端口聲明語句無分號,端口方向,端口類型,端口名,實體名由設(shè)計者自由命名,用來表示被設(shè)計電路芯片的名稱,但是必須與VHDL程序的文件名稱相同。要與文件名一致;,例如: GENERIC(wide:integer:=32); --說明寬度為32 GENERIC(tmp:integer:=1ns); --說明延時1 ns,類屬說明,類屬為設(shè)計實體與外界通信的靜態(tài)信息提供通道,用來規(guī)定端口的大小、實體中子元件的數(shù)目和實體的定時特性等。,格式: GENERIC(常數(shù)名:數(shù)據(jù)類型:設(shè)定值; ∶ 常數(shù)名:數(shù)據(jù)類型:設(shè)定值);,端口方向:IN, OUT,INOUT,BUFFER,,“OUT”和“BUFFER”都可定義輸出端口;,若實體內(nèi)部需要反饋輸出信號,則輸出端口必須被設(shè)置為“BUFFER”,而不能為“OUT”。,同方向、同類型的端口可放在同一個說明語句中。,ENTITY Full_adder IS PORT( a, b, c: IN BIT; sum, carry: OUT BIT ); END Full_adder;,3.2.2 結(jié)構(gòu)體 (Architecture),ARCHITECTURE 結(jié)構(gòu)體名 OF 實體名 IS [聲明語句] BEGIN 功能描述語句 END [結(jié)構(gòu)體名];,用于聲明該結(jié)構(gòu)體將用到的信號、數(shù)據(jù)類型、常數(shù)、子程序和元件等。聲明的內(nèi)容是局部的。,具體描述結(jié)構(gòu)體的功能和行為。,結(jié)構(gòu)體定義了設(shè)計單元具體的功能,描述了該基本設(shè)計單元的行為、元件和內(nèi)部的連接關(guān)系。,一個實體可對應(yīng)多個結(jié)構(gòu)體,每個結(jié)構(gòu)體代表該實體功能的不同實現(xiàn)方案或不同實現(xiàn)方式。同一時刻只有一個結(jié)構(gòu)體起作用,通過CONFIGURATION決定用哪個結(jié)構(gòu)體進(jìn)行仿真或綜合。 在結(jié)構(gòu)體描述中,具體給出了輸入、輸出信號之間的邏輯關(guān)系。,ARCHITECTURE Behavior OF FreDevider IS -- 結(jié)構(gòu)體定義 SIGNAL Clk:Std_Logic; --信號聲明 BEGIN PROCESS(Clock) BEGIN IF rising_edge(Clock) THEN Clk=NOT Clk; END IF; END PROCESS; Clkout=Clk; END;,3.2.3 庫、程序包的調(diào)用,LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL;,LIBRARY 庫名;,USE 庫名.程序包名.項目名;,調(diào)用此程序包中所有的資源,LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; USE IEEE.Std_Logic_Arith.ALL; USE IEEE.Std_Logic_Unsigned.ALL;,3.3 VHDL語句,3.3.1 并行語句,在結(jié)構(gòu)體中的執(zhí)行是同時進(jìn)行,執(zhí)行順序與書寫順序無關(guān)。,并行信號賦值語句,簡單賦值語句,目標(biāo)信號名 = 表達(dá)式,目標(biāo)信號的數(shù)據(jù)類型與右邊表達(dá)式一致,ARCHITECTURE Behavior OF FreDevider IS SIGNAL Clk:Std_Logic; BEGIN PROCESS(Clock) BEGIN IF rising_edge(Clock) THEN Clk=NOT Clk; END IF; END PROCESS; Clkout=Clk;,選擇信號賦值語句,WITH 選擇表達(dá)式 SELECT 賦值目標(biāo)信號 = 表達(dá)式1 WHEN 選擇值1, 表達(dá)式2 WHEN 選擇值1, 表達(dá)式n WHEN OTHERS;,選擇值要覆蓋所有可能情況,若不能一一指定,用OTHERS為其他情況找個出口; 選擇值必須互斥,不能出現(xiàn)條件重復(fù)或重疊的情況。,,LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; ENTITY MUX IS PORT ( Data0,Data1,Data2,Data3:IN Std_Logic_VECTOR(7 DOWNTO 0); Sel:IN Std_Logic_Vector(1 DOWNTO 0); DOUT:OUT Std_Logic_Vector(7 DOWNTO 0) ); END; ARCHITECTURE DataFlow OF MUX IS BEGIN WITH Sel SELECT DOUT= Data0 WHEN “00”, Data1 WHEN “01”, Data2 WHEN “10”, Data3 WHEN “11”, “00000000” WHEN OTHERS; END;,4X1多路選擇器,條件信號賦值語句,賦值目標(biāo)信號 = 表達(dá)式1 WHEN 賦值條件1 ELSE 表達(dá)式2 WHEN 賦值條件2 ELSE 表達(dá)式n WHEN 賦值條件n ELSE 表達(dá)式;,,各賦值語句有優(yōu)先級的差別,按書寫順序從高到低排列;,各賦值條件可以重疊。,LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; ENTITY Priority_Encoder IS PORT ( I:IN Std_Logic_VECTOR(7 DOWNTO 0); A:OUT Std_Logic_Vector(2 DOWNTO 0) ); END; ARCHITECTURE DataFlow OF Priority_Encoder IS BEGIN A=“111” WHEN I(7)=‘1’ ELSE “110” WHEN I(6)=‘1’ ELSE “101” WHEN I(5)=‘1’ ELSE “100” WHEN I(4)=‘1’ ELSE “011” WHEN I(3)=‘1’ ELSE “010” WHEN I(2)=‘1’ ELSE “001” WHEN I(1)=‘1’ ELSE “000” WHEN I(0)=‘1’ ELSE “111”; END;,進(jìn)程語句,進(jìn)程本身是并行語句,但內(nèi)部是順序語句; 進(jìn)程只有在特定的時刻(敏感信號發(fā)生變化)才會被激活。,[進(jìn)程標(biāo)號:] PROCESS (敏感信號參數(shù)表) [聲明區(qū)]; BEGIN 順序語句 END PROCESS [進(jìn)程標(biāo)號];,在進(jìn)程中起作用的局部變量,一個進(jìn)程可以有多個敏感信號,任一敏感信號發(fā)生變化都會激活進(jìn)程,進(jìn)程語句定義順序語句模塊,用于將從外部獲得的信號值,或內(nèi)部的運算數(shù)據(jù)向其他的信號進(jìn)行賦值。,進(jìn)程的工作原理,當(dāng)某個敏感信號的值發(fā)生變化時,每個進(jìn)程語句立即完成進(jìn)程內(nèi)順序語句所定義的功能行為。,執(zhí)行過程終止,順序語句所定義的功能行為的結(jié)果可以賦值給信號,并通過信號被其他的進(jìn)程讀取或賦值。,進(jìn)程與時鐘,在每個上升沿啟動一次進(jìn)程(執(zhí)行進(jìn)程內(nèi)所有的語句)。,上升沿描述:Clock’ EVENT AND Clock=‘1’ 下降沿描述:Clock’ EVENT AND Clock=‘0’,上升沿描述: rising_edge (Clock) 下降沿描述: falling_edge (Clock),LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; ENTITY FreDevider IS PORT ( Clock: IN Std_logic; Clkout: OUT Std_logic); END; ARCHITECTURE Behavior OF FreDevider IS SIGNAL Clk: Std_Logic; BEGIN PROCESS (Clock) --將時鐘作為進(jìn)程的敏感信號 BEGIN IF rising_edge (Clock) THEN Clk=NOT Clk; --在時鐘上升沿執(zhí)行Clk=NOT Clk END IF; END PROCESS; Clkout=Clk; END;,LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; ENTITY Counter IS PORT ( RESET:IN Std_Logic; --異步復(fù)位信號 Clock: IN Std_logic; --時鐘信號 NUM: BUFFER Integer RANGE 0 TO 3); --計數(shù)器輸出值 END; ARCHITECTURE Behavior OF Counter IS BEGIN PROCESS (RESET, Clock) --將復(fù)位、時鐘作為進(jìn)程的敏感信號 BEGIN IF RESET=‘1’ THEN Num=0; --復(fù)位時Num清0 ELSIF rising_edge (Clock) THEN IF Num=3 THEN Num=0; --如果Num=3就清0 ELSE Num=Num+1; -- 否則自加1 END IF; END IF; END PROCESS; END;,仿真波形:,LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; USE IEEE.Std_Logic_unsigned.ALL; ENTITY Counter IS PORT ( clr :IN Std_Logic; inl: in std_logic_vector(3 downto 0); outl: out std_logic_vector(3 downto 0) --計數(shù)器輸出值 ); END; ARCHITECTURE Behavior OF Counter IS BEGIN PROCESS (clr, inl) --進(jìn)程的敏感信號 BEGIN IF (clr=‘1’ or inl=“1001”) THEN outl=“0000”; ELSE outl=inl+1; END IF; END PROCESS; END;,重載符號,在庫IEEE.Std_Logic_unsigned中預(yù)先聲明,LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; USE IEEE.Std_Logic_unsigned.ALL; ENTITY Counter IS PORT ( clr,clk:IN Std_Logic; cnt: buffer std_logic_vector(3 downto 0) --計數(shù)器輸出值 ); END; ARCHITECTURE Behavior OF Counter IS BEGIN PROCESS BEGIN Wait until clk’event and clk=‘1’; IF (clr=‘1’ or cnt=9) THEN cnt=“0000”; ELSE cnt=cnt+1; END IF; END PROCESS; END;,Wait語句,信號賦值有寄存功能,引入時序器件,進(jìn)程的啟動,當(dāng)process的敏感信號參數(shù)表重沒有列出任何敏感信號時,進(jìn)程通過wait語句啟動。,ARCHITECTURE Behavior OF state IS BEGIN PROCESS --敏感信號列表為空 BEGIN wait until Clock; --等待clock激活進(jìn)程 IF ( drive=‘1’) THEN CASE output IS WHEN s1 = output output output output = s1; END CASE; END IF; END PROCESS; END;,進(jìn)程注意事項:,進(jìn)程本身是并行語句,但內(nèi)部為順序語句; 進(jìn)程在敏感信號發(fā)生變化時被激活,在使用了敏感表的進(jìn)程中不能含wait語句; 在同一進(jìn)程中對同一信號多次賦值,只有最后一次生效; 在不同進(jìn)程中,不可對同一信號進(jìn)行賦值; 一個進(jìn)程不可同時對時鐘上、下沿敏感。 進(jìn)程中的信號賦值是在進(jìn)程掛起時生效的,而變量賦值是即時生效。 相對于結(jié)構(gòu)體而言,信號具有全局性,是進(jìn)程間進(jìn)行并行聯(lián)系的重要途徑。 進(jìn)程為綜合器支持,且其建模方式直接影響仿真和綜合結(jié)果,綜合后對應(yīng)于進(jìn)程的硬件結(jié)構(gòu)對進(jìn)程中所有可讀入信號都是敏感的。,SIGNAL A,B: Integer RANGE 0 TO 7; : PROCESS (Clock) BEGIN IF rising_edge (Clock) THEN : B=A+1; B=B+1; : END IF; END PROCESS;,PROCESS (Clock) BEGIN IF rising_edge (Clock) THEN : ELSIF falling_edge (Clock) THEN; : END IF; END PROCESS;,元件例化語句,元件例化引入一種連接關(guān)系,將預(yù)先設(shè)計好的實體定義為元件,并將此元件與當(dāng)前設(shè)計實體中的端口相連接,從而為當(dāng)前設(shè)計實體引入一個新的低一級的設(shè)計層次。,Component 元件名 port (端口名表); End component 元件名; 例化名:元件名 port map ( [元件端口名=]連接端口名 , …);,要插在電路系統(tǒng)板上的芯片,較大的電路系統(tǒng),電路板上準(zhǔn)備接受芯片的插座,元件例化語句,列出對外通信的各端口名,當(dāng)前系統(tǒng)與準(zhǔn)備接入的元件對應(yīng)端口相連的通信端口。,名字關(guān)聯(lián)方式:port map語句中位置可以任意; 位置關(guān)聯(lián)方式:端口名和關(guān)聯(lián)連接符號可省去,連接端口名的排列方式與所需例化的元件端口定義中的端口名相對應(yīng)。,1位二進(jìn)制全加器,內(nèi)部端口,外部端口,外部端口,內(nèi)部端口,端口連線,3.3.2 順序語句,順序語句僅出現(xiàn)在進(jìn)程和子程序中。 順序語句綜合后,映射為實際的門電路,系統(tǒng)一上電,門電路開始工作。電路可實現(xiàn)邏輯上的順序執(zhí)行,實際上所有門電路是并行工作的。,賦值語句 流程控制語句 空操作語句 等待語句 子程序調(diào)用語句 返回語句,賦值語句,ENTITY TEST_Signal IS PORT ( Reset, Clock: IN Std_logic; NumA, NumB: OUT Integer RANGE 0 TO 255 ); END; ARCHITECTURE TEST OF TEST_Signal IS SIGNAL A, B: Integer RANGE 0 TO 255; BEGIN PROCESS (RESET,Clock) VARIABLE C: Integer RANGE 0 TO 255;,BEGIN IF RESET=‘1’ THEN A=0; B=2;C:=0; ELSEIF rising_edge(Clock) THEN C:=C+1;A=C+1;B=A+2; END IF; END PROCESS; Num A=A; NumB=B; END;,流程控制語句,IF語句:,IF 條件式 THEN 順序語句 END IF;,IF 條件式 THEN 順序語句 ELSE 順序語句 END IF;,有優(yōu)先級,用IF語句描述組合邏輯電路時,務(wù)必涵蓋所有的情況,否則綜合后將引入鎖存器!,ENTITY Encoder IS PORT ( En: IN Std_logic; I: IN Std_logic_Vetor(7 DOWNTO 0); A: OUT Std_logic_Vetor(2 DOWNTO 0); Idle: OUT Std_logic ); END; ARCHITECTURE Behavior OF Encoder IS BEGIN PROCESS (En, I) BEGIN IF En=‘1’ THEN IF I(7)=‘1’ THEN A=“111”; Idle=‘0’; ELSIF IF I(6)=‘1’ THEN A=“110”; Idle=‘0’; ELSIF IF I(5)=‘1’ THEN A=“101”; Idle=‘0’;,ELSIF IF I(4)=‘1’ THEN A=“100”; Idle=‘0’; ELSIF IF I(3)=‘1’ THEN A=“011”; Idle=‘0’; ELSIF IF I(2)=‘1’ THEN A=“010”; Idle=‘0’; ELSIF IF I(1)=‘1’ THEN A=“001”; Idle=‘0’; ELSIF IF I(0)=‘1’ THEN A=“000”; Idle=‘0’; ELSE A=“000”; Idle=‘1’; END IF; END PROCESS; END;,引入ELSE,否則綜合器將引入鎖存器。,ENTITY COMP_BAD IS PORT( a1 : IN BIT; 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 ;,不完整條件語句與時序電路,綜合結(jié)果:,ENTITY COMP_GOOD IS PORT(a1 : IN BIT; b1 : IN BIT; q1 : 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 ;,完整條件語句,CASE語句,選擇值不可重復(fù)或重疊; 當(dāng)CASE語句的選擇值無法覆蓋所有的情況時,要用OTHERS指定未能列出的其他所有情況的輸出值;,LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; ENTITY MUX IS PORT ( Data0,Data1,Data2,Data3:IN Std_Logic_VECTOR(7 DOWNTO 0); Sel:IN Std_Logic_Vector(1 DOWNTO 0); DOUT:OUT Std_Logic_Vector(7 DOWNTO 0) ); END; ARCHITECTURE DataFlow OF MUX IS BEGIN CASE Sel IS WHEN “00”= DOUT DOUT DOUT DOUT DOUT=“00000000” ; END CASE; END PROCESS; END;,LOOP語句,[LOOP 標(biāo)號:] FOR 循環(huán)變量 IN 循環(huán)次數(shù)范圍 LOOP 順序語句 END LOOP [LOOP 標(biāo)號];,臨時變量,僅在此LOOP中有效,無需事先定義。,….TO…. ….DOWNTO… 從初值開始,每執(zhí)行完一次后遞增(遞減),直到終值為止。,Sum:=0; FOR i IN 0 TO 9 LOOP Sum:=Sum+i; END LOOP;,循環(huán)次數(shù)只能用具體數(shù)值表達(dá),否則不可綜合,NEXT語句,NEXT語句主要用在LOOP語句執(zhí)行中有條件或無條件轉(zhuǎn)向控制,跳向LOOP語句的起點。,NEXT [循環(huán)標(biāo)號] [WHEN 條件];,NEXT ;--無條件終止當(dāng)前循環(huán),跳回到本次循環(huán)LOOP語句處,開始下一次循環(huán)。,NEXT LOOP 標(biāo)號;--當(dāng)有多重LOOP語句嵌套時,跳轉(zhuǎn)到指定標(biāo)號LOOP語句處,重新開始執(zhí)行循環(huán)操作。,NEXT LOOP 標(biāo)號 WHEN 條件表達(dá)式;--條件表達(dá)式為TRUE,執(zhí)行NEXT語句,進(jìn)入跳轉(zhuǎn)操作,否則向下執(zhí)行。,EXIT語句,EXIT語句主要用在LOOP語句執(zhí)行中有條件或無條件內(nèi)部轉(zhuǎn)向控制,跳向LOOP語句的終點,用于退出循環(huán)。當(dāng)程序需要處理保護(hù)、出錯和警告狀態(tài)時,語句能提供一個快捷、簡便的方法。,EXIT [循環(huán)標(biāo)號] [WHEN 條件];,EXIT ;--無條件從當(dāng)前循環(huán)中退出。,EXIT LOOP 標(biāo)號;--程序執(zhí)行退出動作無條件從循環(huán)標(biāo)號所標(biāo)明的循環(huán)中退出。,EXIT LOOP 標(biāo)號 WHEN 條件表達(dá)式;--條件表達(dá)式為TRUE,程序從當(dāng)前循環(huán)中退出。,NULL語句,NULL為空操作語句,一般用于CASE中,表示在某些情況下對輸出不作任何改變,隱含鎖存信號。不能用于純組合邏輯電路。,WAIT語句,在進(jìn)程或過程中執(zhí)行到WAIT語句時,程序?qū)⒈粧炱穑⒃O(shè)置好再次執(zhí)行的條件。,WAIT [ON 信號表][UNTIL 條件表達(dá)式][FOR 時間表達(dá)式];,WAIT ;--未設(shè)置停止掛起的條件,表示永遠(yuǎn)掛起。,WAIT ON 信號表;--敏感信號等待語句,敏感信號的變化將結(jié)束掛起,再次啟動進(jìn)程。,WAIT UNTIL 條件表達(dá)式;--條件表達(dá)式為中所含的信號發(fā)生變化,且滿足WAIT語句所設(shè)條件,則結(jié)束掛起,再次啟動進(jìn)程。,WAIT FOR 時間表達(dá)式;--超時等待語句,從執(zhí)行當(dāng)前的WAIT語句開始,在此時間段內(nèi),進(jìn)程處于掛起狀態(tài),超過這一時間段后,程序自動恢復(fù)執(zhí)行。,Configuration 配置名 of 實體名 is 配置說明 End 配置名;,3.3.3 配置語句,配置主要為頂層設(shè)計實體指定結(jié)構(gòu)體,或為參與例化的元件實體指定所希望的結(jié)構(gòu)體 ,以層次方式來對元件例化做結(jié)構(gòu)配置。,Configuration 配置名 of 實體名 is 配置說明 End 配置名;,為頂層設(shè)計實體指定結(jié)構(gòu)體,Entity nand is port ( a, b: in std_logic; c: out std_logic ); End entity nand; Architecture one of nand is begin c=not (a and b); End architecture one;,Architecture two of nand is begin c=‘1’ when (a=‘0’) and (b=‘0’) else ‘1’ when (a=‘0’) and (b=‘1’) else ‘1’ when (a=‘1’) and (b=‘0’) else ‘0’ when (a=‘1’) and (b=‘1’) else ‘0’; End architecture two;,Configuration second of nand is for two end for; End second; Configuration first of nand is for one end for; End first;,用實體nand構(gòu)成更高層次設(shè)計實體中的元件,由配置語句指定元件實體nand使用哪個結(jié)構(gòu)體。,LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL; Entity rs is port ( r, s: in std_logic; q,qf: out std_logic ); End entity rs; Architecture rsf of rs is Component nand PORT( a, b: IN Std_Logic; c: out std_logic); End Component; BEGIN u1:nand PORT MAP (a=s, b=qf, c=q); u2:nand PORT MAP ( a=q, b=r, c=qf); END rsf;,Configuration sel of rs is for rsf for u1,u2:nand use entity work.nand (two); end for; end for; End sel;,為參與例化的元件實體指定所希望的結(jié)構(gòu)體 ,以層次方式來對元件例化做結(jié)構(gòu)配置。,3.4 狀態(tài)機在VHDL中的實現(xiàn),3.4.1 Moore 狀態(tài)機的VHDL描述,輸出僅取決于其所處的狀態(tài)。,LIBRARY IEEE; USE IEEE.Std_ Logic_1164.ALL; ENTITY Moore IS PORT ( Reset, Clock, DIN :IN Std_Logic; DOUT:OUT Std_Logic_Vetor(2 DOWNTO 0)); END; ARCHITECTURE Mooremachine OF Moore IS TYPE State_type IS (S0,S1,S2,S3); --定義State_type為枚舉型數(shù)據(jù)類型 SIGNAL State:State_type; BEGIN Change_State: PROCESS (Reset, Clock) --時序邏輯進(jìn)程 BEGIN IF Reset=‘1’ THEN State=S0;,ELSEIF rising_edge(Clock) THEN CASE State IS WHEN S0=〉IF DIN=‘1’ THEN StateDOUT DOUT DOUT DOUT =“111”; END CASE; END PROCESS; END;,仿真波形圖:,時鐘同步Moore狀態(tài)機結(jié)構(gòu)圖:,LIBRARY IEEE; USE IEEE.Std_ Logic_1164.ALL; ENTITY Moore IS PORT ( Reset,Clock, DIN :in Std_Logic; DOUT:out Std_Logic_Vetor(2 DOWNTO 0) ); END; ARCHITECTURE Mooremachine OF Moore IS TYPE State_type IS (S0,S1,S2,S3); SIGNAL PresentState, NextState :State_type; --定義狀態(tài)轉(zhuǎn)換信號 BEGIN State_Reg: PROCESS (Reset, Clock) --狀態(tài)寄存器 BEGIN IF Reset=‘1’ THEN --異步復(fù)位 PresentState=S0; ELSEIF rising_edge(Clock) THEN PresentState=NextState; --時鐘上升沿,轉(zhuǎn)換至下一狀態(tài) END IF; END PROCESS;,Change_State:PROCESS (PresentState,DIN) --組合邏輯進(jìn)程 BEGIN CASE Present State IS WHEN S0=〉if DIN=‘1’ then NextState=S1; else NextState=S0; end if; DOUT =“001”; WHEN S1=〉if DIN=‘1’ then NextState=S2; else NextState=S1; end if ; DOUT =“011”; WHEN S2=〉if DIN=‘1’ then NextState=S3; else NextState=S2; end if ; DOUT =“101”; WHEN S3=〉if DIN=‘1’ then NextState=S0; else NextState=S1; end if ; DOUT =“111”; END CASE; END PROCESS; END;,仿真波形圖:,3.4.2 Mealy 狀態(tài)機的VHDL描述: 輸出由當(dāng)前狀態(tài)與輸入共同決定。,LIBRARY IEEE; USE IEEE.Std_ Logic_1164.ALL; ENTITY MealyMachine IS PORT ( Reset ,Clock,DIN:IN Std_Logic; DOUT:OUT Std_Logic_Vetor(2 DOWNTO 0)); END; ARCHITECTURE Statemachine OF MealyMachine IS TYPE State_type IS (S0,S1,S2,S3); SIGNAL State:State_type; BEGIN Change_State: PROCESS (Reset,Clock) BEGIN IF Reset=‘1’ THEN State=S0;,ELSIF rising_edge(Clock) THEN CASE State IS WHEN S0=〉IF DIN=‘1’ THEN StateIF DIN=‘0’ THEN DOUT IF DIN=‘0’ THEN DOUT IF DIN=‘0’ THEN DOUT IF DIN=‘0’ THEN DOUT =“110”; ELSE DOUT=“111”;END IF; END CASE; END PROCESS; END;,3.4.3 狀態(tài)機的容錯設(shè)計,主要針對未定義狀態(tài)(剩余狀態(tài)),單獨設(shè)計一個狀態(tài)(ERROR),用以處理狀態(tài)機出錯的情況, 用 WHEN OTHERS=State=Error; 使?fàn)顟B(tài)機從未定義的狀態(tài)跳轉(zhuǎn)到處理出錯情況的狀態(tài);,直接回復(fù)到其他已設(shè)定的狀態(tài)。,3.4.4 狀態(tài)機設(shè)計與寄存器,對于所有可能的輸入條件,當(dāng)進(jìn)程中的輸出信號如果沒有被完全地與之對應(yīng)指定,此信號將自動被指定,即在未列出的條件下保持原值,這意味著引入了寄存器。,在狀態(tài)機中,如果存在一個或更多的狀態(tài)沒有被明確指定轉(zhuǎn)換方式,或者對于狀態(tài)機中的狀態(tài)值沒有規(guī)定所有的輸出值,就可能引入寄存器。,計數(shù)器:,3.5 常用電路的VHDL程序,比較器:,奇數(shù)倍分頻:,8位奇偶校驗電路,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY p_check IS PORT (a: IN STD_LOGIC_VECTOR (7 DOWNTO 0); y: OUT STD_LOGIC); END p_check; ARCHITECTURE opt OF p_check IS SIGNAL tmp: STD_LOGIC; BEGIN PROCESS (a) BEGIN tmp='0'; FOR n IN 0 TO 7 LOOP --此循環(huán)語 句作為進(jìn)程語句中的順序語句使用 tmp = tmp XOR a(n); END LOOP; y = tmp ENDPROCESS;- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- VHDL 語言 入門教程
鏈接地址:http://m.appdesigncorp.com/p-1898753.html