VHDL語言入門教程.ppt
《VHDL語言入門教程.ppt》由會員分享,可在線閱讀,更多相關《VHDL語言入門教程.ppt(112頁珍藏版)》請在裝配圖網上搜索。
3 VHDL語言,VHDL: VHSIC Hardware Description Language.,,3.1 VHDL語言基礎 3.2 VHDL基本結構 3.3 VHDL語句 3.4 狀態(tài)機在VHDL中的實現(xiàn) 3.5 常用電路VHDL程序 3.6 VHDL仿真 3.7 VHDL綜合,HDL----Hardware Description Language 一種用于描述數字電路的功能或行為的語言。目的是提為電路設計效率,縮短設計周期,減小設計成本,可在芯片制造前進行有效的仿真和錯誤檢測。,優(yōu)點: HDL設計的電路能獲得非常抽象級的描述。如基于RTL(Register Transfer Level)描述的IC,可用于不同的工藝。 HDL設計的電路,在設計的前期,就可以完成電路的功能級的驗證。 HDL設計的電路類似于計算機編程。,常用的HDL語言:VHDL 、Verilog HDL,VHDL是美國國防部在20世紀80年代初為實現(xiàn)其高速集成電路硬件VHSIC計劃提出的描述語言; IEEE從1986年開始致力于VHDL標準化工作,融合了其它ASIC芯片制造商開發(fā)的硬件描述語言的優(yōu)點,于93年形成了標準版本(IEEE.std_1164)。 1995年,我國國家技術監(jiān)督局推薦VHDL做為電子設計自動化硬件描述語言的國家標準。,,VHDL 概述:,覆蓋面廣,系統(tǒng)硬件描述能力強,是一個多層次的硬件描述語言; VHDL語言具有良好的可讀性,既可以被計算機接受,也容易被人們所理解; VHDL語言可以與工藝無關編程; VHDL語言已做為一種IEEE的工業(yè)標準,便于使用、交流和推廣。,,VHDL優(yōu)點:,設計的最終實現(xiàn)取決于針對目標器件的編程器,工具的不同會導致綜合質量不一樣。,3.1.1 標識符(Identifiers),要求: 首字符必須是字母 末字符不能為下劃線 不允許出現(xiàn)兩個連續(xù)的下劃線 不區(qū)分大小寫 VHDL定義的保留字(關鍵字),不能用作標識符 標識符字符最長可以是32個字符。,注釋由兩個連續(xù)的虛線(--)引導。,3.1 VHDL語言基礎,標識符用來定義常數、變量、信號、端口、子程序或參數的名字, 由字母(A~Z,a~z)、數字(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,關鍵字(保留字):,關鍵字(keyword)是VHDL中具有特別含義的單詞,只能做為固定的用途,用戶不能用其做為標識符。,3.1.2 數據對象(Date Objects),常量Constant,Constant bus_width: integer := 8; --定義總線寬度為常數8,數據對象包括常量、變量、信號和文件四種類型。,常量是對某一常量名賦予一個固定的值,而且只能賦值一次。通常賦值在程序開始前進行,該值的數據類型則在說明語句中指明。,Constant 常數名:數據類型:=表達式,Constant Vcc:real:=5.0; --定義Vcc的數據類型是實數,賦值為5.0V,常量所賦的值應和定義的數據類型一致;,常量在程序包、實體、構造體或進程的說明性區(qū)域內必須加以說明。定義在程序包內的常量可供所含的任何實體、構造體所引用,定義在實體說明內的常量只能在該實體內可見,定義在進程說明性區(qū)域中的常量只能在該進程內可見。,Variable 變量名:數據類型 :=初始值;,Variable count: integer 0 to 255:=20 ; -- 定義count整數變量,變化 范圍0~255,初始值為20。,變量Variable,變量只能在進程語句、函數語句和過程語句結構中使用。變量的賦值是直接的,非預設的,分配給變量的值立即成為當前值,變量不能表達“連線”或存儲元件,不能設置傳輸延遲量。,變量賦值語句: 目標變量名 := 表達式;,變量定義語句:,x:=10.0; -- 實數變量賦值為10.0 Y:=1.5+x; -- 運算表達式賦值,注意表達式必須與目標變量的數據類型相同 A(3 to 6):=(“1101”); --位矢量賦值,Signal 信號名: 數據類型 :=初始值,Signal clock:bit :=‘0’; --定義時鐘信號類型,初始值為0,信號Signal,信號表示邏輯門的輸入或輸出,類似于連接線,也可以表達存儲元件的狀態(tài)。信號通常在構造體、程序包和實體中說明。,信號定義語句:,Signal count:BIT_VECTOR(3 DOWNTO 0); --定義count為4位位矢量,信號賦值語句: 目標信號名 = 表達式;,x=9; Z=x after 5 ns; -- 在5ns后將x的值賦予z,3.1.2 數據類型,布爾:(Boolean),位: ( Bit ) TYPE BIT IS (‘0’,’1’); --取值為0和1,用于邏輯運算,位矢量: ( Bit_Vector ) TYPE BIT_VECTOR IS ARRAY (Natural range) OF BIT; -- 基于Bit類型的數 組,用于邏輯運算 SIGNAL a:Bit_Vector(0 TO 7); SIGNAL a:Bit_Vector ( 7 DOWNTO 0),VHDL的預定義數據類型,在VHDL標準程序包STANDARD中定義好,實際使用過程中,已自動包含進VHDL源文件中,不需要通過USE語句顯式調用。,TYPE BOOLEAN IS (FALSE, TRUE); -- 取值為FALSE和TRUE,不是數值,不 能運算,一般用于關系運算符,整數:(Integer) 取值范圍 -(231-1) ~(231-1),可用32位有符號的二進制數表示 variable a:integer range -63 to 63 在實際應用中,VHDL仿真器將Integer做為有符號數處理,而VHDL綜合器將Integer做為無符號數處理; 要求用RANGE子句為所定義的數限定范圍,以便根據范圍來決定表示此信號或變量的二進制數的位數。,字符:(Character) TYPE CHARACTER IS (NUL, SOH,STX, …, ‘ ’, ‘!’,…); --通常用‘’引起 來,區(qū)分大小寫;,字符串:(String) VARIABLE string_var: STRING (1 TO 7); string_var:=“A B C D” ; -- 通常用“”引起來,區(qū)分大小寫;,實數:(Real) 取值范圍 -1.0E38 ~+1.0E38,僅用于仿真不可綜合 1.0 --十進制浮點數 8#43.6#e+4 --八進制浮點數 43.6E-4 --十進制浮點數,時間:(Time) 物理量數據,完整的包括整數和單位兩個部分,用至少一個空格隔開,僅用于仿真不可綜合; fs,ps,ns,us,ms,sec,min,hr,錯誤等級(Severity Level) : 表示系統(tǒng)狀態(tài),僅用于仿真不可綜合; TYPE severity_level IS (NOTE、WARNING、ERROR、FAILURE);,IEEE預定義標準邏輯位與矢量,標準邏輯位(Std_Logic),標準邏輯位矢量( Std_Logic_vector),基于Std_Logic類型的數組;,使用Std_Logic和 Std_Logic_Vector要調用IEEE庫中的Std_Logic_1164 程序包;就綜合而言,能夠在數字器件中實現(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’);,數組: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 數據類型名 IS 數據類型定義 OF 基本數據類型 或 TYPE 數據類型名 IS 數據類型定義,SUBTYPE 子類型名 IS 基本數據類型定義 RANGE 約束范圍,subtype digit is integer range 0 to 9;,3.1.3 數據類型轉換,VHDL為強定義類型語言,不同類型的數據不能進行運算和直接賦值。,類型標記法,Variable A: integer; Variable B: real; A= integer (B); B=real (A);,函數法,Conv_interger (A);--由std_logic轉換為integer型,在std_logic_unsigned包。,常數轉換法 / 常量轉換法,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型轉換為bit型,具有轉換表性質的常數,在“STD_LOGIC_1164”、“STD_LOGIC_ARITH”和 “STD_LOGIC_UNSIGNED”的程序包中提供的數據類型變換函數。,屬性,屬性提供的是關于信號、類型等的指定特性。,‘event:若屬性對象有事件發(fā)生,則生成布爾值“true”,常用來檢查時鐘邊沿是否有效。,上升沿:Clock’ EVENT AND Clock=‘1’,’range:生成一個限制性數組對象的范圍,’left:生成數據類型或數據子類型的左邊界值;,’right , ’high, ’low, ’length,’range: “0 to n” ; ’reverse_range:“n downto 0”,運算符,算術運算符:+, -, *, / , MOD, REM ,SLL ,SRL ,SLA, SRA ,ROL ,ROR ,**,ABS,關系運算符:=, /=, , =,邏輯運算符:AND,OR,NAND,NOR,XNOR,NOT,XOR,賦值運算符:=,:=,關聯(lián)運算符:=,其他運算符:+, -,&,并置操作符 ?,SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0) ; SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ; . a = '1'?'0'?d(1)?'1' ; -- 元素與元素并置,并置后的數組長度為4 . IF a ? d = “101011“ THEN . –- 在IF條件句中可以使用并置符,運算符優(yōu)先級別,邏輯、算術運算符( NOT, **,ABS),乘法運算符(/ , MOD, REM, * ),正負運算符:+, -,,加減、并置運算符:+, -, &,關系運算符:=, /=, , =,邏輯運算符:AND,OR,NAND,NOR,XNOR,NOT,XOR,,移位運算符的左邊為一維數組,其類型必須是BIT或BOOLEAN,右邊必須是整數移位次數為整數的絕對值。,移位運算符操作示意圖,“1100”SLL1 =“1000” “1100”SRL1 =“0110” “1100”SLA1 =“1000” “1100”SRA1 =“1110” “1100”ROL1 =“1001” “1100”ROR1 =“0110”,SLL:將位向量左移,右邊移空位補零; SRL:將位向量右移,左邊移空位補零; SLA:將位向量左移,右邊第一位的數值保持原值不變; SRA:將位向量右移,左邊第一位的數值保持原值不變; 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基本結構,實體(Entity):描述所設計的系統(tǒng)的外部接口信號,定義電路設計中所有的輸入和輸出端口; 結構體 (Architecture):描述系統(tǒng)內部的結構和行為; 包集合 (Package):存放各設計模塊能共享的數據類型、常數和子程序等; 配置 (Configuration):指定實體所對應的結構體; 庫 (Library):存放已經編譯的實體、結構體、包集合和配置。,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) BEGIN IF rising_edge(Clock) THEN Clk=NOT Clk; END IF; END PROCESS; Clkout=Clk; END;,VHDL的基本設計單元結構:程序包說明、實體說明和結構體說明三部分。,,,3.2.1 實體(Entity),ENTITY 實體名 IS [ GENERIC(常數名:數據類型:設定值)] PORT ( 端口名1:端口方向 端口類型; 端口名2:端口方向 端口類型; . . 端口名n:端口方向 端口類型 ); END [實體名];,實體描述了設計單元的輸入輸出接口信號或引腳,是設計實體經封裝后對外的一個通信界面。,ENTITY FreDevider IS PORT (Clock: IN Std_logic; Clokout: OUT Std_logic ); END;,實體名,最后一條端口聲明語句無分號,端口方向,端口類型,端口名,實體名由設計者自由命名,用來表示被設計電路芯片的名稱,但是必須與VHDL程序的文件名稱相同。要與文件名一致;,例如: GENERIC(wide:integer:=32); --說明寬度為32 GENERIC(tmp:integer:=1ns); --說明延時1 ns,類屬說明,類屬為設計實體與外界通信的靜態(tài)信息提供通道,用來規(guī)定端口的大小、實體中子元件的數目和實體的定時特性等。,格式: GENERIC(常數名:數據類型:設定值; ∶ 常數名:數據類型:設定值);,端口方向:IN, OUT,INOUT,BUFFER,,“OUT”和“BUFFER”都可定義輸出端口;,若實體內部需要反饋輸出信號,則輸出端口必須被設置為“BUFFER”,而不能為“OUT”。,同方向、同類型的端口可放在同一個說明語句中。,ENTITY Full_adder IS PORT( a, b, c: IN BIT; sum, carry: OUT BIT ); END Full_adder;,3.2.2 結構體 (Architecture),ARCHITECTURE 結構體名 OF 實體名 IS [聲明語句] BEGIN 功能描述語句 END [結構體名];,用于聲明該結構體將用到的信號、數據類型、常數、子程序和元件等。聲明的內容是局部的。,具體描述結構體的功能和行為。,結構體定義了設計單元具體的功能,描述了該基本設計單元的行為、元件和內部的連接關系。,一個實體可對應多個結構體,每個結構體代表該實體功能的不同實現(xiàn)方案或不同實現(xiàn)方式。同一時刻只有一個結構體起作用,通過CONFIGURATION決定用哪個結構體進行仿真或綜合。 在結構體描述中,具體給出了輸入、輸出信號之間的邏輯關系。,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; END;,3.2.3 庫、程序包的調用,LIBRARY IEEE; USE IEEE.Std_Logic_1164.ALL;,LIBRARY 庫名;,USE 庫名.程序包名.項目名;,調用此程序包中所有的資源,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 并行語句,在結構體中的執(zhí)行是同時進行,執(zhí)行順序與書寫順序無關。,并行信號賦值語句,簡單賦值語句,目標信號名 = 表達式,目標信號的數據類型與右邊表達式一致,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 選擇表達式 SELECT 賦值目標信號 = 表達式1 WHEN 選擇值1, 表達式2 WHEN 選擇值1, 表達式n WHEN OTHERS;,選擇值要覆蓋所有可能情況,若不能一一指定,用OTHERS為其他情況找個出口; 選擇值必須互斥,不能出現(xiàn)條件重復或重疊的情況。,,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多路選擇器,條件信號賦值語句,賦值目標信號 = 表達式1 WHEN 賦值條件1 ELSE 表達式2 WHEN 賦值條件2 ELSE 表達式n WHEN 賦值條件n ELSE 表達式;,,各賦值語句有優(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;,進程語句,進程本身是并行語句,但內部是順序語句; 進程只有在特定的時刻(敏感信號發(fā)生變化)才會被激活。,[進程標號:] PROCESS (敏感信號參數表) [聲明區(qū)]; BEGIN 順序語句 END PROCESS [進程標號];,在進程中起作用的局部變量,一個進程可以有多個敏感信號,任一敏感信號發(fā)生變化都會激活進程,進程語句定義順序語句模塊,用于將從外部獲得的信號值,或內部的運算數據向其他的信號進行賦值。,進程的工作原理,當某個敏感信號的值發(fā)生變化時,每個進程語句立即完成進程內順序語句所定義的功能行為。,執(zhí)行過程終止,順序語句所定義的功能行為的結果可以賦值給信號,并通過信號被其他的進程讀取或賦值。,進程與時鐘,在每個上升沿啟動一次進程(執(zhí)行進程內所有的語句)。,上升沿描述: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) --將時鐘作為進程的敏感信號 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; --異步復位信號 Clock: IN Std_logic; --時鐘信號 NUM: BUFFER Integer RANGE 0 TO 3); --計數器輸出值 END; ARCHITECTURE Behavior OF Counter IS BEGIN PROCESS (RESET, Clock) --將復位、時鐘作為進程的敏感信號 BEGIN IF RESET=‘1’ THEN Num=0; --復位時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) --計數器輸出值 ); END; ARCHITECTURE Behavior OF Counter IS BEGIN PROCESS (clr, inl) --進程的敏感信號 BEGIN IF (clr=‘1’ or inl=“1001”) THEN outl=“0000”; ELSE outl=inl+1; END IF; END PROCESS; END;,重載符號,在庫IEEE.Std_Logic_unsigned中預先聲明,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) --計數器輸出值 ); 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語句,信號賦值有寄存功能,引入時序器件,進程的啟動,當process的敏感信號參數表重沒有列出任何敏感信號時,進程通過wait語句啟動。,ARCHITECTURE Behavior OF state IS BEGIN PROCESS --敏感信號列表為空 BEGIN wait until Clock; --等待clock激活進程 IF ( drive=‘1’) THEN CASE output IS WHEN s1 = output output output output = s1; END CASE; END IF; END PROCESS; END;,進程注意事項:,進程本身是并行語句,但內部為順序語句; 進程在敏感信號發(fā)生變化時被激活,在使用了敏感表的進程中不能含wait語句; 在同一進程中對同一信號多次賦值,只有最后一次生效; 在不同進程中,不可對同一信號進行賦值; 一個進程不可同時對時鐘上、下沿敏感。 進程中的信號賦值是在進程掛起時生效的,而變量賦值是即時生效。 相對于結構體而言,信號具有全局性,是進程間進行并行聯(liá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;,元件例化語句,元件例化引入一種連接關系,將預先設計好的實體定義為元件,并將此元件與當前設計實體中的端口相連接,從而為當前設計實體引入一個新的低一級的設計層次。,Component 元件名 port (端口名表); End component 元件名; 例化名:元件名 port map ( [元件端口名=]連接端口名 , …);,要插在電路系統(tǒng)板上的芯片,較大的電路系統(tǒng),電路板上準備接受芯片的插座,元件例化語句,列出對外通信的各端口名,當前系統(tǒng)與準備接入的元件對應端口相連的通信端口。,名字關聯(lián)方式:port map語句中位置可以任意; 位置關聯(lián)方式:端口名和關聯(lián)連接符號可省去,連接端口名的排列方式與所需例化的元件端口定義中的端口名相對應。,1位二進制全加器,內部端口,外部端口,外部端口,內部端口,端口連線,3.3.2 順序語句,順序語句僅出現(xiàn)在進程和子程序中。 順序語句綜合后,映射為實際的門電路,系統(tǒng)一上電,門電路開始工作。電路可實現(xiàn)邏輯上的順序執(zhí)行,實際上所有門電路是并行工作的。,賦值語句 流程控制語句 空操作語句 等待語句 子程序調用語句 返回語句,賦值語句,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語句描述組合邏輯電路時,務必涵蓋所有的情況,否則綜合后將引入鎖存器!,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’ ; -- 未提及當a1=b1時,q1作何操作 END IF; END PROCESS ; END ;,不完整條件語句與時序電路,綜合結果:,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語句,選擇值不可重復或重疊; 當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 標號:] FOR 循環(huán)變量 IN 循環(huán)次數范圍 LOOP 順序語句 END LOOP [LOOP 標號];,臨時變量,僅在此LOOP中有效,無需事先定義。,….TO…. ….DOWNTO… 從初值開始,每執(zhí)行完一次后遞增(遞減),直到終值為止。,Sum:=0; FOR i IN 0 TO 9 LOOP Sum:=Sum+i; END LOOP;,循環(huán)次數只能用具體數值表達,否則不可綜合,NEXT語句,NEXT語句主要用在LOOP語句執(zhí)行中有條件或無條件轉向控制,跳向LOOP語句的起點。,NEXT [循環(huán)標號] [WHEN 條件];,NEXT ;--無條件終止當前循環(huán),跳回到本次循環(huán)LOOP語句處,開始下一次循環(huán)。,NEXT LOOP 標號;--當有多重LOOP語句嵌套時,跳轉到指定標號LOOP語句處,重新開始執(zhí)行循環(huán)操作。,NEXT LOOP 標號 WHEN 條件表達式;--條件表達式為TRUE,執(zhí)行NEXT語句,進入跳轉操作,否則向下執(zhí)行。,EXIT語句,EXIT語句主要用在LOOP語句執(zhí)行中有條件或無條件內部轉向控制,跳向LOOP語句的終點,用于退出循環(huán)。當程序需要處理保護、出錯和警告狀態(tài)時,語句能提供一個快捷、簡便的方法。,EXIT [循環(huán)標號] [WHEN 條件];,EXIT ;--無條件從當前循環(huán)中退出。,EXIT LOOP 標號;--程序執(zhí)行退出動作無條件從循環(huán)標號所標明的循環(huán)中退出。,EXIT LOOP 標號 WHEN 條件表達式;--條件表達式為TRUE,程序從當前循環(huán)中退出。,NULL語句,NULL為空操作語句,一般用于CASE中,表示在某些情況下對輸出不作任何改變,隱含鎖存信號。不能用于純組合邏輯電路。,WAIT語句,在進程或過程中執(zhí)行到WAIT語句時,程序將被掛起,并設置好再次執(zhí)行的條件。,WAIT [ON 信號表][UNTIL 條件表達式][FOR 時間表達式];,WAIT ;--未設置停止掛起的條件,表示永遠掛起。,WAIT ON 信號表;--敏感信號等待語句,敏感信號的變化將結束掛起,再次啟動進程。,WAIT UNTIL 條件表達式;--條件表達式為中所含的信號發(fā)生變化,且滿足WAIT語句所設條件,則結束掛起,再次啟動進程。,WAIT FOR 時間表達式;--超時等待語句,從執(zhí)行當前的WAIT語句開始,在此時間段內,進程處于掛起狀態(tài),超過這一時間段后,程序自動恢復執(zhí)行。,Configuration 配置名 of 實體名 is 配置說明 End 配置名;,3.3.3 配置語句,配置主要為頂層設計實體指定結構體,或為參與例化的元件實體指定所希望的結構體 ,以層次方式來對元件例化做結構配置。,Configuration 配置名 of 實體名 is 配置說明 End 配置名;,為頂層設計實體指定結構體,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構成更高層次設計實體中的元件,由配置語句指定元件實體nand使用哪個結構體。,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;,為參與例化的元件實體指定所希望的結構體 ,以層次方式來對元件例化做結構配置。,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為枚舉型數據類型 SIGNAL State:State_type; BEGIN Change_State: PROCESS (Reset, Clock) --時序邏輯進程 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)機結構圖:,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)轉換信號 BEGIN State_Reg: PROCESS (Reset, Clock) --狀態(tài)寄存器 BEGIN IF Reset=‘1’ THEN --異步復位 PresentState=S0; ELSEIF rising_edge(Clock) THEN PresentState=NextState; --時鐘上升沿,轉換至下一狀態(tài) END IF; END PROCESS;,Change_State:PROCESS (PresentState,DIN) --組合邏輯進程 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描述: 輸出由當前狀態(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)機的容錯設計,主要針對未定義狀態(tài)(剩余狀態(tài)),單獨設計一個狀態(tài)(ERROR),用以處理狀態(tài)機出錯的情況, 用 WHEN OTHERS=State=Error; 使狀態(tài)機從未定義的狀態(tài)跳轉到處理出錯情況的狀態(tài);,直接回復到其他已設定的狀態(tài)。,3.4.4 狀態(tài)機設計與寄存器,對于所有可能的輸入條件,當進程中的輸出信號如果沒有被完全地與之對應指定,此信號將自動被指定,即在未列出的條件下保持原值,這意味著引入了寄存器。,在狀態(tài)機中,如果存在一個或更多的狀態(tài)沒有被明確指定轉換方式,或者對于狀態(tài)機中的狀態(tài)值沒有規(guī)定所有的輸出值,就可能引入寄存器。,計數器:,3.5 常用電路的VHDL程序,比較器:,奇數倍分頻:,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)語 句作為進程語句中的順序語句使用 tmp = tmp XOR a(n); END LOOP; y = tmp ENDPROCESS;- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- VHDL 語言 入門教程
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.jqnhouse.com/p-1898753.html