1、图5.1 结构体中并行语句间的关系生成语句元件例化语句进程语句并行信号赋值语句并行过程调用语句块语句条件信号赋值语句END ARCHITECTUREARCHITECTURE信号信号信号信号信号信号标识符、数组元素目标的赋值语句示例如下:SIGNAL s1,s2:STD_LOGIC;SIGNAL array 1:STD_LOGIC_VECTOR(0 TO 3);PROCESS(s1)VARIABLE v1,v2:STD_LOGIC;BEGINV1:=0;V2:=1;S1=s1 AND s2;S2=s1 OR s2;array 1(0)=V1;array 1(1)=V2;array 1(2)=S1
2、;array 1(3)=S2;END PROCESS;例5.1 四位并行加法器的数据流描述。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL ENTITY ADD4 IS PORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);CIN :IN STD_LOGIC;SUM :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT:OUT STD_LOGIC);END ADD4;ARCHITEC
3、TURE ADD4_concurnt OF ADD4 IS-定义包含有进位的SUM信号SIGNAL SUMINT:STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINSUMINT=(0&A)+(0&B)+(0000&CIN)AFTER 10 ns;COUT=SUMINT(4)AFTER 15 ns;SUM=SUMINT(3 DOWNTO 0)AFTER 15 ns;END ADD4_concurnt;例5.2 3选1多路选择器的行为描述。例5.2 3选1多路选择器的行为描述。LIBRARY IEEE;USE IEEE.STD_LOGIC 1164.ALL;ENTITY mux3
4、1 ISPORT(a,b,c :IN STD_LOGIC;en1,en2 :IN STD_LOGIC;z :OUT STD_LOGIC);END mux31;ARCHITECTURE behavioral OF mux31 ISBEGINZ=a WHEN en2=1 ELSE b WHEN en1=1 ELSE c;END behavioral;例5.3 简易的指令译码器设计。例5.3 简易的指令译码器设计。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DECODER ISPORT(A,B,C :IN STD_LOGIC;data1,data2
5、:IN STD_LOGIC;data_out :OUT STD_LOGIC);END DECODER;ARCHITECTURE behavioral OF DECODER ISSIGNAL instruction:STD_LOGIC_VECTOR(0 TO 2);BEGINInstruction=A&B&C;WITH instruction SELECTdata_out=NOT data1 WHEN 000,data1 AND data2 WHEN 001,data1 OR data2 WHEN 010,data1 NAND data2 WHEN 011,data1 NOR data2 WHE
6、N 100,data1 XOR data2 WHEN 101,data1 XNOR data2 WHEN 110,Z WHEN OTHERS;END behavioral;第一种形式:IF 条件 THEN-顺序语句;ELSE-顺序语句;END IF;第二种形式:IF 条件 THEN-顺序语句;END IF;第三种形式:IF 条件 THEN-顺序语句;ELSIF 条件 THEN-顺序语句;ELSE-顺序语句;END IF;第四种形式:IF 条件 THEN-顺序语句;ELSIF 条件 THEN-顺序语句;END IF;例5.4 采用两种不同IF语句结构实现同一结构和功能的数据选择器。ENTITY
7、if_statement ISPORT(A,B,C,X:IN BIT_VECTOR(3 DOWNTO 0);Z:OUT BIT_VECTOR(3 DOWNTO 0);END if_statement;ARCHITECTURE example1 OF if_statement ISBEGINPROCESS(A,B,C,X)BEGINZ=A;IF(X=1111)THENZ1000)THENZ=C;END IF;END PROCESS;END example1;例5.4 采用两种不同IF语句结构实现同一结构和功能的数据选择器。ARCHITECTURE example2 OF if_statement
8、 ISBEGINPROCESS(A,B,C,X)BEGIN IF(X=1111)THENZ1000)THENZ=C;ELSEZ=A;END IF;END PROCESS;END example2;A3.0B3.0OUTA3.0B3.0OUTSELABOUT0MUX21SELABOUT0MUX21B3.0C3.0Z3.0Equal04 hF Z3.0Z7.4LessThan04 h8 A3.0X3.0图5.4 例5.4 的RTL图例5.5 利用IF语句的多分支嵌套实现四选一多路选择器。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY MUX_41 I
9、SPORT(S1,S0,A,B,C,D:IN STD_LOGIC;Z:OUT STD_LOGIC);END MUX_41;ARCHITECTURE BEHAV_MUX41 OF MUX_41 ISBEGINP1:PROCESS(S1,S0,A,B,C,D)BEGIN IF S1=0 AND S0=0 THENZ=A;ELSIF S1=0 AND S0=1 THENZ=B;ELSIF S1=1 AND S0=0 THENZ=C;ELSEZ=D;END IF;END PROCESS P1;END BEHAV_MUX41;例5.6 利用IF语句的多分支嵌套实现四选一多路选择器的错误示例。P1:PRO
10、CESS(S1,S0,A,B,C,D)BEGIN IF S1=0 AND S0=0 THENZ=A;ELSIF S1=0 AND S0=1 THENZ=B;ELSIF S1=1 AND S0=0 THENZ=C;ELSIF S1=1 AND S0=1 THENZ 顺序语句;WHEN 选择值_2|选择值_3=顺序语句;WHEN 选择值_4 TO选择值_N=顺序语句;WHEN OTHERS=顺序语句;END CASE;选择值可以有四种不同的表达方式:单个普通数值,如选择值_1;并列数值,如选择值_2|选择值_3,表示取值为选择值_2或者选择值_3;数值选择范围,如选择值_4 TO 选择值_N,表示
11、取值可以是该范围中的任意一个;混合方式,以上三种方式的混合。例5.7 CASE 语句描述的8线-3线编码器。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY encoder_83 ISPORT(s:IN STD_LOGIC_VECTOR(7 DOWNTO 0);z:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);END encoder_83;ARCHITECTURE behavioral OF encoder_83 ISBEGINPROCESS(s)BEGINCASE s ISWHEN 11111110=z z z z z z z
12、 z z Z Z Z Z Z Z Z Z=0;END CASE;END PROCESS;END example;FOR LOOP的语句格式如下:LOOP 标号:FOR 循环变量 IN 循环次数范围 LOOP顺序语句END LOOP LOOP 标号;WHILE LOOP的语句格式如下:LOOP标号:WHILE 循环控制条件 LOOP顺序语句END LOOP LOOP 标号;例5.10 FOR LOOP语句使用示例。ENTITY for_loop ISPORT(A:IN INTEGER RANGE 0 TO 3;Z:OUT BIT_VECTOR(3 DOWNTO 0);END for_loop;A
13、RCHITECTURE example OF for_loop ISBEGINPROCESS(A)BEGINZ=0000;FOR i IN 0 TO 3 LOOPIF(A=i)THENZ(i)=1;END IF;END LOOP;END PROCESS;END example;例5.11 利用LOOP语句将向量转化为整数输出。ENTITY conv_int ISPORT(vect:IN BIT_VECTOR(7 DOWNTO 0);result:OUT INTEGER);END conv_int;ARCHITECTURE A OF conv_int ISBEGIN PROCESS(vect)V
14、ARIABLE tmp:INTEGER;BEGINtmp:=0;FOR i IN 7 DOWNTO 0 LOOPIF(vect(i)=1)THENtmp:=tmp+2*i;END IF;END LOOP;result=vect low)LOOPIF(vect(i)=1)THEN tmp:=tmp+2*i;END IF;i:=i-1;-修改循环变量END LOOP;result=tmp;END PROCESS;END B;NEXT的语句四种形式:NEXT;NEXT LOOP标号;NEXT WHEN 条件表达式;NEXT LOOP标号 WHEN 条件表达式;EXIT语句四种形式:EXIT;EXIT
15、 LOOP标号;EXIT WHEN 条件表达式;EXIT LOOP标号 WHEN 条件表达式;例5.12 NULL语句的应用示例。ENTITY EX_WAIT ISPORT(CNTL:IN INTEGER RANGE 0 TO 31;A,B:IN STD_LOGIC_VECTOR(7 DOWNTO 0);Z:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END EX_WAIT;ARCHITECTURE arch_wait OF EX_WAIT ISBEGINP_WAIT:PROCESS(CNTL)BEGIN Z Z NULL;END CASE;END PROCESS P_W
16、AIT;END arch_wait;例5.13 利用WAIT语句描述的D触发器模块。ENTITY FF ISPORT(D,CLK:IN BIT;Q:OUT BIT);END FF;ARCHITECTURE BEH_1 OF FF ISBEGINPROCESSBEGINWAIT UNTIL CLK=1;Q=D;END PROCESS;END BEH_1;例5.14 进程中敏感信号参数表和IF语句的使用。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY comp_list ISPORT(A,B,SEL:IN STD_LOGIC;Z:OUT STD_LO
17、GIC);END comp_list;ARCHITECTURE RTL OF comp_list ISBEGINPROCESS(A,B,SEL)BEGINIF SEL=1 THENZ=A;ELSE Z=9)THENcount=0;ELSE count=count+1;END IF;END IF;END PROCESS;Q=count;END A;例5.16 带异步复位、置位端的D触发器描述。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ASYNC_FF ISPORT(D,CLK,SET,RST:IN STD_LOGIC;Q:OUT STD_LO
18、GIC);END ASYNC_FF;ARCHITECTURE A OF ASYNC_FF ISBEGINPROCESS(CLK,RST,SET)BEGINIF(RST=1)THEN Q=0;ELSIF SET=1 THEN Q=1;ELSIF(CLK EVENT AND CLK=1)THEN Q=D;END IF;END PROCESS;END A;END counter;例5.17 移位寄存器的描述。-基本移位寄存器的描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY basic_shift_register ISGENERIC(num_sta
19、ges:NATURAL:=16);PORT(clk:IN STD_LOGIC;enable:IN STD_LOGIC;sr_in:IN STD_LOGIC;sr_out:OUT STD_LOGIC);END ENTITY;例5.17 移位寄存器的描述。ARCHITECTURE rtl OF basic_shift_register IS-为基本移位寄存器构造一个数组类型TYPE sr_length IS ARRAY(num_stages-1)DOWNTO 0)OF STD_LOGIC;-声明移位寄存器内部信号SIGNAL sr:sr_length;BEGINPROCESS(clk)BEGIN
20、IF(clk EVENT and clk=1)THEN IF(enable=1)THEN -左移一位,且最高位数据丢失 sr(num_stages-1)DOWNTO 1)=sr(num_stages-2)DOWNTO 0);sr(0)=sr_in;-装载最低位的新数据 END IF;END IF;END PROCESS;-在最高位数据丢失前将其输出sr_out=sr(num_stages-1);END rtl;例5.17 移位寄存器的描述。类属说明语句的一般书写格式如下:GENERIC(常数名:数据类型:设定值;常数名:数据类型:设定值 );图5.8 例5.17的时序仿真图例5.18 二进制加
21、法/减法计数器的描述。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.NUMERIC_STD.ALL;ENTITY binary_up_down_counter IS GENERIC(min_count :NATURAL:=0;max_count :NATURAL:=255);PORT(clk :IN STD_LOGIC;reset :IN STD_LOGIC;enable :IN STD_LOGIC;updown :IN STD_LOGIC;q :OUT INTEGER RANGE min_count TO max_count);END E
22、NTITY;例5.18 二进制加法/减法计数器的描述。ARCHITECTURE rtl OF binary_up_down_counter ISSIGNAL direction:INTEGER;-定义计数方向信号BEGINProc1:PROCESS(updown)BEGINIF(updown=1)THEN direction=1;ELSEdirection=-1;END IF;END PROCESS Proc1;Proc2:PROCESS(clk)VARIABLE cnt:INTEGER RANGE min_count TO max_count;BEGIN IF(clk EVENT and c
23、lk=1)THENIF reset=1 THENcnt:=0;-计数器复位ELSIF enable=1 THEN cnt:=cnt+direction;-加法/减法计数END IF;END IF;q clk,reset=reset,enable=enable,q=out_q);END inst;例5.22 16进制加法计数器的描述例5.22的时序仿真图CONFIGURATION 配置名 OF 实体名 ISFOR 选配结构体名配置说明END FOR;END 配置名;例5.23 一位全加器中配置语句的使用。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTIT
24、Y fulladder_cfg ISPORT(a,b,ci:IN STD_LOGIC;S,co:OUT STD_LOGIC);END fulladder_cfg;例5.23 一位全加器中配置语句的使用。ARCHITECTURE behavioral OF fulladder_cfg IS -以下是一位全加器结构体行为描述BEGIN S=1 WHEN(a=0 AND b=1 AND ci=0)ELSE 1 WHEN(a=1 AND b=0 AND ci=0)ELSE 1 WHEN(a=0 AND b=0 AND ci=1)ELSE 1 WHEN(a=1 AND b=1 AND ci=1)ELSE
25、 0;co=1 WHEN(a=1 AND b=1 AND ci=0)ELSE 1 WHEN(a=0 AND b=1 AND ci=1)ELSE 1 WHEN(a=1 AND b=0 AND ci=1)ELSE 1 WHEN(a=1 AND b=1 AND ci=1)ELSE 0;END behavioral;ARCHITECTURE Dataflow OF fulladder_cfg IS -以下是一位全加器结构体数据流描述BEGINS=a XOR b XOR ci;co ain(0),b=bin(0),ci=cin,s=sum(0),co=carry(1);u2:fulladder_cfg
26、PORT MAP(a=ain(1),b=bin(1),ci=carry(1),s=sum(1),co=carry(2);u3:fulladder_cfg PORT MAP(a=ain(2),b=bin(2),ci=carry(2),s=sum(2),co=carry(3);u4:fulladder_cfg PORT MAP(a=ain(3),b=bin(3),ci=carry(3),s=sum(3),co=count);END inst;例5.24 四位串行加法器的结构描述。-以下是一位全加器的结构体配置CONFIGURATION sel OF fulladder_4 ISFOR instFO
27、R u1,u2:fulladder_cfgUSE ENTITY WORK.fulladder_cfg(behavioral);END FOR;FOR OTHERS:fulladder_cfg -本例中为u3、u4USE ENTITY WORK.fulladder_cfg(Dataflow);END FOR;END FOR;END sel;abciScoabciScoabciScoabciScofulladder_cfg:u4countsum3.0fulladder_cfg:u3fulladder_cfg:u2cinain3.0bin3.0fulladder_cfg:u1图5.13 例5.24的
28、RTL图生成语句的语句格式有如下两种形式:标号:FOR 循环变量 取值范围 GENERATE说明语句BEGIN并行语句END GENERATE 标号;标号:IF 条件 GENERATE说明语句BEGIN并行语句END GENERATE 标号;例5.25 带异步复位、置位端的4位D触发器的描述。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;-4位D触发器的实体描述ENTITY ASYNC_FF_4 IS PORT(D,SET :IN STD_LOGIC_VECTOR(3 DOWNTO 0);CLK,RST:IN STD_LOGIC;Q:OUT STD_LOGI
29、C_VECTOR(3 DOWNTO 0);END ASYNC_FF_4;-4位D触发器的结构体描述ARCHITECTURE GENER OF ASYNC_FF_4 IS COMPONENT ASYNC_FF -需要确定ASYNC_FF已在work库中PORT(D,CLK,SET,RST:IN STD_LOGIC;Q:OUT STD_LOGIC);END COMPONENT;例5.25 带异步复位、置位端的4位D触发器的描述。BEGINlable:FOR i IN 3 DOWNTO 0 GENERATE BEGIN U1:ASYNC_FF PORT MAP(D=D(i),CLK=CLK,SET=
30、SET(i),RST=RST,Q=Q(i);END GENERATE lable;END GENER;块语句应用只是一种将结构体中的并行描述语句进行组合的方法,它的主要目的是改善并行语句及其结构的可读性。块标号:BLOCK接口说明类属说明BEGIN并行语句END BLOCK 块标号;例5.27 块语句应用示例1。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY block_test ISPORT(a,b:IN STD_LOGIC;s,c:OUT STD_LOGIC);END;ARCHITECTURE example OF block_test ISBEGINrr1:BLOCK -块定义PORT(a1,b1:IN STD_LOGIC;-块中的端口定义 s1:OUT STD_LOGIC;c1:OUT STD_LOGIC);PORT MAP(a1=a,b1=b,s1=s,c1=c);-端口映射说明BEGINp1:PROCESS(a1,b1)-使用的是块定义的局部变量BEGINs1=a1 XOR b1;END PROCESS p1;p2:PROCESS(a1,b1)BEGINc1=a1 AND b1;END PROCESS p2;END BLOCK rr1;END ARCHITECTURE example;