ENTITY DEMO IS PORT( I0,I1,I2,I3: INSTD_LOGIC; CH0,CH1: INSTD_LOGIC; OUTPUT: OUTSTD_LOGIC; ); END DEMO; ARCHITECTURE BEHAVE OF DEMO IS SIGNAL SEL:STD_LOGIC_VECTOR(1DOWNTO0); BEGIN SEL<=CH1&CH0; OUTPUT<=I0 WHEN SEL="00"ELSE I1 WHEN SEL="01"ELSE I2 WHEN SEL="10"ELSE I3 WHEN SEL="11"ELSE '0'; END BEHAVE;
PACKAGE PACK IS PROCEDURE SUM( A:INSTD_LOGIC_VECTOR(3DOWNTO0);B:OUTSTD_LOGIC); END PACK;
PACKAGEBODY PACK IS PROCEDURE SUM( A:INSTD_LOGIC_VECTOR(3DOWNTO0);B:OUTSTD_LOGIC) IS BEGIN IF A="0100"OR A<"0100"THEN B<='0'; ELSE B<='1'; ENDIF; ENDPROCEDURE SUM; END PACK;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
--函数 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE PACK IS FUNCTION SUM(A:STD_LOGIC_VECTOR(3DOWNTO0);B:STD_LOGIC)RETURNSTD_LOGIC; ENDPACKAGE; PACKAGEBODY PACK IS FUNCTION SUM(A:STD_LOGIC_VECTOR(3DOWNTO0);B:STD_LOGIC)RETURNSTD_LOGICIS BEGIN IF A="0100"OR A<"0100"THEN B<='0'; ELSE B<='1'; ENDIF; RETURN B; ENDFUNCTION SUM; END PACK;
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY D_FF IS PORT( D,CLK_S:INSTD_LOGIC; Q:OUTSTD_LOGIC; NQ:OUTSTD_LOGIC ); ENDENTITY D_FF; ARCHITECTURE A_RS_FF OF D_FF IS BEGIN BIN_P_RS_FF:PROCESS(CLK_S) BEGIN IF CLK_S'EVENTAND CLK_S='1'THEN Q<=D;NQ<=NOT D; ENDIF; ENDPROCESS; ENDARCHITECTURE A_RS_FF;
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY demo12 IS PORT( CLK:INSTD_LOGIC; Q:OUTSTD_LOGIC_VECTOR(5DOWNTO0) ); END demo12; ARCHITECTURE BEHAVE OF demo12 IS COMPONENT D_FF IS PORT( D,CLK_S:INSTD_LOGIC; Q:OUTSTD_LOGIC; NQ:OUTSTD_LOGIC ); ENDCOMPONENT; SIGNAL S:STD_LOGIC_VECTOR(5DOWNTO0); BEGIN U0:D_FF PORTMAP(S(0),CLK,Q(0),S(0)); U1:D_FF PORTMAP(S(1),S(0),Q(1),S(1)); U2:D_FF PORTMAP(S(2),S(1),Q(2),S(2)); U3:D_FF PORTMAP(S(3),S(2),Q(3),S(3)); U4:D_FF PORTMAP(S(4),S(3),Q(4),S(4)); U5:D_FF PORTMAP(S(5),S(4),Q(5),S(5)); END BEHAVE;
-- 库、程序包的说明调用 Library IEEE; use IEEE.Std_Logic_1164.ALL; -- 实体声明 Entity FreDevider is port ( Clock: INStd_logic; Clkout: OUTStd_logic ); END; -- 结构体定义 Architecture Behavior Of FreDevider is signal Clk:Std_Logic; -- 中间临时变量 begin process(Clock)--进程 begin IF rising_edge(Clock) THEN Clk <= NOT Clk; ENDIF; ENDprocess; Clkout <= Clk; END
--两位相等比较器 entity equ2 is port(a,b:instd_logic_vector(1downto0); equ:outstd_logic); end equ2; --结构体结构描述:用元件例化,即网表形式来实现; architecture netlist of equ2 is -- nor 或非component nor2 port(a,b :instd_logic; c :outstd_logic); endcomponent; component xor2-- xor 异或 port(a,b :instd_logic; c :outstd_logic); endcomponent; signal x: std_logic_vector(1downto0); begin U1:xor2 portmap(a(0),b(0),x(0)); U2:xor2 portmap(a(1),b(1),x(1)); U3:nor2 portmap(x(0),x(1),equ); end netlist; --结构体数据流描述:用布尔方程来实现: architecture equation of equ2 is begin equ<=(a(0) xor b(0)) nor(a(1) xor b(1)); end equation; --结构体行为描述:用顺序语句来实现: architecture con_behave of equ2 is begin process(a,b) begin if a=b then equ<='1'; else equ<='0'; endif; end procerss; end con_behave; --结构体行为描述:用并行语句来实现: architecture seq_behave of equ2 is begin equ<='1'when a=b else'0'; end sqq_behave;
块语句
1 2 3 4 5
块结构名: BLOCK 端口说明 类属说明 BEGIN 并行语句 ENDBLOCK 块结构名;
进程语句
1 2 3 4 5 6
进程名: PROCESS(敏感信号表) IS 进程说明 BEGIN 顺序描述语句 ENDPROCESS 进程名; --进程名字可省略
PROCEDURE 过程名(参数1;参数2;——) IS 定义语句; BEGIN 顺序处理语句; END 过程名;
子程序–函数Function
1 2 3 4 5 6 7
FUNCTION 函数名(参数1;参数2;——) RETURN 数据类型 IS 定义语句; BEGIN 顺序处理语句; RETURN 返回变量名;
学习基本语法
标识符
标识符用来定义常数、变量、信号、端口、子程序或者参数的名字
首字符必须是字母
末字符不能为下划线
不允许出现两个连续的下划线
不区分大小写
VHDL定义的保留字(关键字),不能用作标识符
标识符字符最长可以是32个字符
注释由两个连续的下划线(–)引导
关键字(不能作为标识符)
数据对象
信号SIGNAL
变量VARIABLE
常量CONSTAT
1 2 3 4 5 6 7
--举例信号 SIGNAL brdy: BIT; SIGNAL output : INTEGER:=2; 目标信号名<=表达式 --为全局变量,在程序包说明、实体说明、结构体描述中使用,用于声明内部信号,而非外部信号(外部信号为IN、OUT、INOUT、BUFFER),其在元件之间起互联作用,可以赋值给外部信号。
用户自定义数据类型 VHDL允许用户自行定义新的数据类型,如枚举类型(ENUMERATION TYPE)、整数类型(INTEGERTYPE)、数组类型(ARRAYTYPE)、记录类型(RECORDTYPE)、时间类型(TIMETYPE)、实数类型(REAL TYPE)等。用户自定义数据类型是用类型定义语句TYPE和子类型定义语句SUBTYPE实现的。 用户自定义数据类型的一般格式: TYPE 数据类型名 IS 数据类型定义 [OF 基本数据类型]; TYPE digit ISINTEGERRANGE0TO9; TYPE current IS REAL RANGE -1E4TO1E4; TYPE word ISARRAY (INTEGER1TO8) OFSTD_LOGIC; (关键词OF后的基本数据类型是指数据类型定义中所定义的元素的基本数据类型,一般都是取已有的预定义数据类型,如BIT、STD_LOGIC或INTEGER等。)
ARCHITECTURE NAME OF NAME2 IS 说明语句; BEGIN 并行语句; ENDARCHITECTURE NAME;
并行信号赋值语句(CONCURRENT SIGNAL ASSIGNMENTS)
条件/选择信号赋值语句(CONDITIONAL/SELECTED SIGNAL ASSIGNMENTS)
进程语句(PROCESS STATEMENTS)
块语句(BLOCK STATEMENTS)
元件例化语句(COMPONENT INSTANTIATIONS)
生成语句(GENERATE STATEMENTS)
并行过程调用语句(CONCURRENT PROCEDURE CALLS)
并行信号赋值语句
1 2 3 4 5 6 7
<signal_name> <= <expression>;
Example: q <= input1 or input2; q <= input1 and input2; -- 最终执行 q <= input1 and input2;
条件信号赋值语句
1 2 3 4 5 6 7 8 9 10
SIGNAL_NAME <= <SIGNAL/VALUE> WHEN <CONDITION1> else <SIGNAL/VALUE> WHEN <CONDITION2> else <SIGNAL/VALUE> WHEN <CONDITION3> else <SIGNAL/VALUE> WHEN <CONDITION4> else <SIGNAL/VALUE> WHEN <CONDITION5> else …… <SIGNAL/VALUE> WHEN <CONDITIONN> else <SIGNAL/VALUE> ;
选择信号赋值语句
1 2 3 4 5
WITH <EXPRESSION> SELECT <SIGNAL_NAME> <= <SIGNAL/VALUE> WHEN <CONDITION1>, <SIGNAL/VALUE> WHEN <CONDITION2>, <SIGNAL/VALUE> WHENOTHERS;
WAITUNTIL CONDITION; --举例说明 architecture arc2 of process_wait is begin process begin waituntil clk'eventand clk = '1'; q<=d; endprocess; endarchitecture; WAITON SENSITIVITY LIST; WAITON (A,B,C);--敏感表,任意一个发生变化才会执行
进程内部,对同一信号多次赋值,只最后一次起作用,即最靠近end process;的
1 2 3 4 5 6 7 8
process(a,b,s) begin --final results: s<=a+b y<=a+b+1 y<=s+1; s<=a; s<=a+b; endprocess;
进程内部,对同一变量多次赋值,立即执行。
1 2 3 4 5 6 7 8 9
process(a,b) variable ss: std_logic_vector(3downto0); begin ss:=a; y<=ss+1; ss:=a+b; endprocess; --结果:由于y<=ss+1写在ss:=a之后,所以将a+1的值赋给y
ENTITY SHIFT4 IS PORT( SHFT_LFT:INSTD_LOGIC;--允许位 D_IN: INSTD_LOGIC_VECTOR(3DOWNTO0);--输入4位 Q_OUT: OUTSTD_LOGIC_VECTOR(7DOWNTO0)--输出8位 ); END SHIFT4;
ARCHITECTURE LOGIC OF SHIFT4 IS BEGIN PROCESS(D_IN,SHFT_LFT) VARIABLE SHFT_VAR:STD_LOGIC_VECTOR(7DOWNTO0);--进程说明语句部分定义变量 BEGIN SHFT_VAR(7DOWNTO4):="0000";--变量上4位为0 SHFT_VAR(3DOWNTO0):=D_IN; --变量下4位为输入 IF SHFT_LFT='1'THEN--如果允许 FOR I IN7DOWNTO4LOOP--下4位被搬移到上4位 SHFT_VAR(I):=SHFT_VAR(I-4); ENDLOOP; SHFT_VAR(3DOWNTO0):="0000";--下4位归0 ELSE SHFT_VAR:=SHFT_VAR;--如果不被允许,不搬移,输入在下4位 ENDIF; Q_OUT<=SHFT_VAR;--变量被搬移到输出 ENDPROCESS; END LOGIC;
--过程 PROCEDURE RE(SIGNAL S,R:INSTD_LOGIC SIGNAL Q:INOUTSTD_LOGIC) IS BEGIN IF(S='1'andr='1')THEN REPORT"FORBIDDEN STATE:S AND R ARE QUUAL TO '1'"; RETURN; ELSE Q <= S AND R AFTER5NS; ENDIF; ENDPROCEDURE RS; --函数 FUNCTION OPT(A,B,OPR:STD_LOGIC) RETURNSTD_LOGICIS BEGIN IF(OPR='1')THENRETURN (A AND B); ELSERETURN (A OR B); ENDIF; ENDFUNCTION OPT;
NULL语句
空操作
1 2
NULL;
代码
二输入与非门
1 2 3 4 5 6 7 8 9 10 11
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY demo4 IS PORT (a,b: INSTD_LOGIC; y: OUTSTD_LOGIC); END demo4; ARCHITECTURE NAND2PP OF demo4 IS BEGIN y<= a NAND b; END NAND2PP;
二输入或非门
1 2 3 4 5 6 7 8 9 10 11
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY demo5 IS PORT(a,b: INSTD_LOGIC; y: OUTSTD_LOGIC); END demo5; ARCHITECTURE HUOFEIMEN OF demo5 IS BEGIN y <= a NOR b; END HUOFEIMEN;
各个门
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
--同时实现一个与门、或门、与非门、或非门、异或门及反相器的逻辑 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY demo6 IS PORT( a,b: INSTD_LOGIC; YAND,YOR,YNAND,YNOR,YXOR,YN: OUTSTD_LOGIC ); END demo6; ARCHITECTURE LUAN OF demo6 IS BEGIN YAND <= a AND b; YNAND <= a NAND b; YOR <= a OR b; YNOR <= a NOR b; YXOR <= a XOR b; YN <= NOT a; END LUAN;
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY demo7 IS PORT ( A,B,C: INSTD_LOGIC; Y : OUTSTD_LOGIC_VECTOR(7DOWNTO0) ); END demo7; ARCHITECTURE KEWU OF demo7 IS SIGNAL ABC: STD_LOGIC_VECTOR(2DOWNTO0); BEGIN ABC <= A&B&C; PROCESS(ABC) BEGIN CASE ABC IS 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"; WHENOTHERS=>Y<="XXXXXXXX"; ENDCASE; ENDPROCESS; END KEWU;
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164,ALL; USE IEEE.STD_LOGIC_UNSIGNED,ALL;
ENTITY DECODER3TO8 IS PORT( INPUT: INSTD_LOGIC_VECTOR(2DOWNTO0); OUTPUT: OUTSTD_LOGIC_VECTOR(7DOWNTO0) ); END DECODER3TO8;
ARCHITECTURE BEHAVE OF DECODER3TO8 IS BEGIN PROCESS(INPUT) BEGIN OUTPUT<=(OTHERS=>'0'); OUTPUT(CONV_INTEGER(INPUT))<='1'; ENDPROCESS; END BEHAVE; --在STD_LOGIC_UNSIGNED中,CONV_INTEGER()是把STD_LOGIC转换成INTEGER --在STD_LOGIC_ARITH中, CONV_INTEGER()是把UNSIGNED,SIGNED转换成INTEGER --例如,假设INPUT是010,直接转化成了INTEGER数字2
异步复位(清零)
1 2 3 4 5 6 7 8 9
PROCESS(CLK,RESET,A) BEGIN IF CLK'EVENTAND CLK='1'THEN Q <=A+1; ELSIF RESET='1'THEN Q <='0'; ENDIF ENDPROCESS;
同步复位(清零)
1 2 3 4 5 6 7 8 9 10 11
PROCESS(CJK,RESET,A) BEGIN IF CLK'EVENTAND CLK='1'THEN IF RESET='1'THEN Q <= '0'; ELSE Q <=A+1; ENDIF; ENDIF; ENDPROCESS;
ENTITY REG8 IS PORT( D: INSTD_LOGIC_VECTOR(7DOWNTO0); RESETN,CLOCK: INSTD_LOGIC; Q:OUTSTD_LOGIC_VECTOR(7DOWNTO0) ); END REG8; ARCHITECTURE BEHAVIORAL OF REG8 IS BEGIN PROCESS(RESETN,CLOCK) BEGIN IF(RESETN='0') THEN Q <="00000000"; ELSIF (CLOCK'EVENTAND CLOCK='1') THEN Q <= D; ENDIF; ENDPROCESS; END BEHAVIORAL;
ENTITY REGN IS GENERIC (N:INTEGER:=16); PORT( D: INSTD_LOGIC_VECTOR(N-1DOWNTO0); RESET,CLOCK: INSTD_LOGIC; Q: OUTSTD_LOGIC_VECTOR(N-1DOWNTO0); ); ARCHITECTURE BEHAVIORAL OF REGN IS BEGIN PROCESS(RESET,CLOCK) BEGIN IF(RESET='0') THEN Q <= (OTEHRS => '0'); --给Q的所有位赋0,方便用于多位信号的赋值操作 ELSIF (CLOCK'EVENTAND CLOCK='1') THEN Q <= D; ENDIF; ENDPROCESS; END BEHAVIORAL;
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSGNED.ALL;
ENTITY COUNT_A IS PORT( CLK,RST.UPDN: INSTD_LOGIC; Q: OUTSTD_LOGIC_VECTOR(15DOWNTO0) ); END COUNT_A; ARCHITECTURE LOGIC OF COUNT_A IS BEGIN PROCESS(RESET,CLOCK) VARIABLE TMP_Q:STD_LOGIC_VECTOR(15DOWNTO0); BEGIN IF(RST='0') THEN Q<=(OTHERS=>'0');--异步复位 ELSIF(CLOCK'EVENTAND CLOCK='1') IF UPDN='1'THEN TMP_Q:=TMP_Q+1; ELSE TMP_Q=TMP_Q-1; ENDIF; Q<=TMP_Q; ENDIF; ENDPROCESS; END LOGIC;
ENTITY DEMO1 IS PORT( INPUT: INSTD_LOGIC_VECTOR(3DOWNTO0); SW: INSTD_LOGIC_VECTOR(1DOWNTO0); OUTPUT: OUTSTD_LOGIC ); END DEMO1;
ARCHITECTURE BEHAVE OF DEMO1 IS BEGIN PROCESS(INPUT,SW) BEGIN CASE SW IS WHEN"00" => OUTPUT<=INPUT(0); WHEN"01" => OUTPUT<=INPUT(1); WHEN"10" => OUTPUT<=INPUT(2); WHEN"11" => OUTPUT<=INPUT(3); WHENOTHERS=>OUTPUT<='X';--x是强未知,这句话是必须的,因为STD_LOGIC的类型很多 ENDCASE; ENDPROCESS; END BEHAVE;
二选一电路(IF)
1 2 3 4 5 6 7 8
IF (P1='1') THEN----p1p2:"10""11" Z<=A; ELSIF (P2='1') THEN----p1p2:"01" Z<=B; ELSE----p1p2:"00" Z<=C;
ENTITY DEMO1 IF PORT( INPUT: INSTD_LOGIC_VECTOR(7DOWNTO0); OUTPUT: OUTSTD_LOGIC ); END DEMO1; ARCHITECTURE BEHAVE OF DEMO1 IS VARIABLE X:STD_LOGIC; BEGIN PROCESS(INPUT) BEGIN X:='0'; FOR I IN7DOWNTO0LOOP X:=X XOR INPUT(I); ENDLOOP; OUTPUT<=X; ENDPROCESS; END BEHAVE;
NEXT举例
1 2 3 4 5 6 7
LOOP1:FOR I IN7DOWNTO0LOOP A(I)<='0'; NEXTWHEN(A=B); A(I)<='1'; END LOOP1; ---成立则跳过此次循环剩下的语句,进行下次循环
ENTITY DEMO1 IS PORT( INPUT1: INSTD_LOGIC_VECTOR(3DOWNTO0); INPUT2: INSTD_LOGIC_VECTOR(3DOWNTO0); OUTPUT: OUTSTD_LOGIC--0相等,1不相等 ); ARCHITECTURE BEHAVE OF DEMO1 IS VARIABLE Y:STD_LOGIC; BEGIN PROCESS(INPUT1,INPUT2) Y:='0'; BEGIN FOR I IN3DOWNTO0LOOP Y:='1';--假设不相等 EXITWHEN(INPUT1(I)/=INPUT2(I)); Y:='0';--没有跳出,说明目前还是相等的 ENDLOOP; OUTPUT<=Y; ENDPROCESS; END BEHAVE;
entity demo10 is port ( A, B, Cin : instd_logic; Sum, Cout : outstd_logic ); endentity demo10;
architecture Behavioral of demo10 is component Half_Adder port ( X, Y : instd_logic; S, C : outstd_logic ); endcomponent;
signal S1, S2, C1, C2 : std_logic; begin -- First Half Adder Half1: Half_Adder portmap(A, B, S1, C1); -- Second Half Adder with Carry In from the first Half Adder Half2: Half_Adder portmap(S1, Cin, Sum, C2); -- OR gate for Cout Cout <= C1 or C2; endarchitecture Behavioral;
-- Half Adder library ieee; use ieee.std_logic_1164.all;
entity Half_Adder is port ( X, Y : instd_logic; S, C : outstd_logic ); endentity Half_Adder;
architecture Behavioral of Half_Adder is begin S <= X xor Y; -- Sum C <= X and Y; -- Carry endarchitecture Behavioral; --下面自己写的 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY BAN IS PORT( A,B:INSTD_LOGIC; S,Y:OUTSTD_LOGIC ); END BAN; ARCHITECTURE BEHAVE1 OF BAN IS BEGIN S<=A OR B; Y<=A AND B; END BEHAVE1;
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY demo12 IS PORT( A,B,C:INSTD_LOGIC; S,Y:OUTSTD_LOGIC ); END demo12; ARCHITECTURE BEHAVE OF demo12 IS COMPONENT BAN IS PORT( A,B:INSTD_LOGIC; S,Y:OUTSTD_LOGIC ); ENDCOMPONENT; SIGNAL T1,T2,T3:STD_LOGIC; BEGIN U1:BAN PORTMAP(A,B,T1,T2); U2:BAN PORTMAP(T1,C,S,T3); Y<=T2 OR T3; END BEHAVE;
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ND2 IS PORT( A,B:INSTD_LOGIC; C:OUTSTD_LOGIC ); END ND2; ARCHITECTURE BEHAVE1 OF ND2 IS BEGIN C<=A NAND B; END BEHAVE1;
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY demo12 IS PORT( A,B,C,D:INSTD_LOGIC; OUTPUT:OUTSTD_LOGIC ); END demo12; ARCHITECTURE BEHAVE OF demo12 IS COMPONENT ND2 IS PORT( A,B:INSTD_LOGIC; C:OUTSTD_LOGIC ); ENDCOMPONENT; SIGNAL OUT1,OUT2:STD_LOGIC; BEGIN U1:ND2 PORTMAP(A,B,OUT1); U2:ND2 PORTMAP(C,D,OUT2); U3:ND2 PORTMAP(OUT1,OUT2,OUTPUT); END BEHAVE; --元件例化语句属于并行语句,不能放在进程里面