第7章VHDL语句顺序语句和并行语句是程序设计中两类基本描述语句。这些语句从多侧面完整地描述了数字系统的硬件结构和基本逻辑功能,其中包括通信的方式、信号的赋值、多层次的元件例化以及系统行为等。7.1顺序语句顺序语句的特点是:执行(指仿真执行)顺序与他们的书写顺序基本一致。顺序语句只能出现在进程和子程序中,子程序包括函数和过程。VHDL有六类基本顺序语句:赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句。7.1.1赋值语句信号赋值语句变量赋值语句赋值目标赋值符号赋值源变量赋值与信号赋值的区别:变量具有局部特征,它的有效性只局限于所定义的一个进程中,或一个子程序中,它是一个局部的、暂时性数据对象。对于它的赋值是立即发生的(假设进程已启动),即是一种时间延迟为零的赋值行为。变量赋值符号为:“:=”。信号具有全局特征,它不但可以作为一个设计实体内部各单元之间数据传输的载体,而且可通过信号与其他的实体进行通信。信号的赋值并不是立即发生的,它发生在一个进程结束时。信号赋值符号为:“<=”。7.1.2IF语句(1) IF条件句THEN顺序语句END IF ;(2)IF条件句THEN顺序语句ELSE顺序语句END IF ;(3)IF条件句THENIF条件句THEN1
1 第 7 章VHDL 语句 顺序语句和并行语句是程序设计中两类基本描述语句。这些语句从多侧面完 整地描述了数字系统的硬件结构和基本逻辑功能,其中包括通信的方式、信号的 赋值、多层次的元件例化以及系统行为等。 7.1 顺序语句 顺序语句的特点是:执行(指仿真执行)顺序与他们的书写顺序基本一致。 顺序语句只能出现在进程和子程序中,子程序包括函数和过程。 VHDL 有六类基本顺序语句:赋值语句、流程控制语句、等待语句、子程序 调用语句、返回语句、空操作语句。 7.1.1 赋值语句 信号赋值语句 变量赋值语句 赋值目标 赋值符号 赋值源 变量赋值与信号赋值的区别: 变量具有局部特征,它的有效性只局限于所定义的一个进程中,或一个子程 序中,它是一个局部的、暂时性数据对象。 对于它的赋值是立即发生的(假设进程已启动),即是一种时间延迟为零的 赋值行为。 变量赋值符号为:“:=”。 信号具有全局特征,它不但可以作为一个设计实体内部各单元之间数据传输 的载体,而且可通过信号与其他的实体进行通信。 信号的赋值并不是立即发生的,它发生在一个进程结束时。 信号赋值符号为:“<=”。 7.1.2 IF 语句 (1)IF 条件句 THEN 顺序语句 END IF ; (2)IF 条件句 THEN 顺序语句 ELSE 顺序语句 END IF ; (3)IF 条件句 THEN IF 条件句 THEN
END IFENDIF(4) IF条件句THEN顺序语句ELSEIF条件句THENELSE顺序语句ENDIF--任一分支的执行条件,是以上各分支所确定条件的与逻辑(相关条件同时成立)。即语句中顺序语句的执行条件具有向上相与的功能。注意:判别条件句的表达式结果的数据类型是Boolean表3-228线-3线优先编码器真值表入输输出dinodinldin2din3din4din5din6din7outoout1out20000xxxxxxx01100xxxxXx011010xxxxx01I1110xXXx0111100xxx【例3-32】8线一3线优先编码器LIBRARYIEEE;USEIEEE.STDLOGIC1164.ALL:ENTITY coder ISPORT(din:INSTDLOGIC_VECTOR(OTO7);Output:OUTSTDLOGIC_VECTOR(OTO2)END coder,ARCHITECTUREbehavOF coderISSIGNAL SINT : STD_LOGIC_VECTOR(4 DOWNTO O);BEGINPROCESS (din)2
2 . END IF END IF (4)IF 条件句 THEN 顺序语句 ELSE IF 条件句 THEN . ELSE 顺序语句 END IF -任一分支的执行条件,是以上各分支所确定条件的与逻辑(相关条件同时成 立)。即语句中顺序语句的执行条件具有向上相与的功能。 注意: 判别条件句的表达式结果的数据类型是 Boolean 表 3-2 8 线-3 线优先编码器真值表 【例 3-32】8 线-3 线优先编码器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY coder IS PORT ( din : IN STD_LOGIC_VECTOR(0 TO 7); output : OUT STD_LOGIC_VECTOR(0 TO 2) ); END coder; ARCHITECTURE behav OF coder IS SIGNAL SINT : STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN PROCESS (din) 输 入 输 出 din0 din1 din2 din3 din4 din5 din6 din7 out0 out1 out2 x x x x x x x 0 0 0 0 x x x x x x 0 1 1 0 0 x x x x x 0 1 1 0 1 0 x x x x 0 1 1 1 1 1 0 x x x 0 1 1 1 1 0 0 1
BEGINIF (din(7)=0') THEN output <="000" ;ELSIF (din(6)=0') THENoutput <="100";output <="010" ;ELSIF(din(5)=O)THENELSIF (din(4)=0') THENoutput<="110";output<="001";ELSIF(din(3)=0)THENoutput<="101";ELSIF(din(2)=0) THENELSIF (din(1)=0') THENoutput<="011";ELSE output<="Il1";ENDIF :ENDPROCESS ;END behav;7.1.3CASE语句CASE语句的结构如下:CASE表达式 ISWhen选择值=>顺序语句:When选择值=>顺序语句:ENDCASE;选择值可以有四种不同的表达方式:单个普通数值,如6。数值选择范围,如(2TO4),表示取值为2、3或4。并列数值,如35,表示取值为3或者5。混合方式,以上三种方式的混合。多条件选择值的一般表达式为:选择值【选择值】条件语句的选择值必须在表达式的取值范围内。除非所有条件语句中的选择值能完全覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须用“OTHERS”表示,它代表已给的所有条件句中未能列出的其他可能的取值。CASE语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件语句出现。CASE语句执行中必须选中且只能选中所列条件语句中的一条。这表明CASE语句中至少要包含一个条件语句。3
3 BEGIN IF (din(7)='0') THEN output <= "000" ; ELSIF (din(6)='0') THEN output <= "100" ; ELSIF (din(5)='0') THEN output <= "010" ; ELSIF (din(4)='0') THEN output <= "110" ; ELSIF (din(3)='0') THEN output <= "001" ; ELSIF (din(2)='0') THEN output <= "101" ; ELSIF (din(1)='0') THEN output <= "011" ; ELSE output <= "111" ; END IF ; END PROCESS ; END behav; 7.1.3 CASE 语句 CASE 语句的结构如下: CASE 表达式 IS When 选择值 => 顺序语句; When 选择值 => 顺序语句; . END CASE ; 选择值可以有四种不同的表达方式: 单个普通数值,如 6。 数值选择范围,如(2 TO 4),表示 取值为 2、3 或 4。 并列数值,如 3 5,表示取值为 3 或者 5。 混合方式,以上三种方式的混合。 多条件选择值的一般表达式为: 选择值 [ |选择值 ] 条件语句的选择值必须在表达式的取值范围内。 除非所有条件语句中的选择值能完全覆盖 CASE 语句中表达式的取值,否则 最末一个条件句中的选择必须用“OTHERS”表示,它代表已给的所有条件句中 未能列出的其他可能的取值。 CASE 语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件 语句出现。 CASE 语句执行中必须选中且只能选中所列条件语句中的一条。这表明 CASE 语句中至少要包含一个条件语句
【例7-1】四选一电路描述LIBRARYIEEE:USEIEEE.STDLOGIC 1164.ALL:ENTITY mux41ISPORT(s4, s3, s2, s1 :IN STD LOGIC;z4, z3, z2, zl :OUT STD_LOGIC),END mux41;ARCHITECTUREactivOFmux41ISSIGNALsel:INTEGERRANGE0TO15BEGINPROCESS(sel ,s4,s3,s2,s1)BEGINse<= 0 ;输入初始值IF (sl =1) THEN sel <= sel+1:ELSIF (s2 =1) THEN sel<= sel+2 ;ELSIF (s3=1)THENsel<=sel+4;ELSIF (s4=1)THENsel<=sel+8;ELSENULL,注意,这里使用了空操作语句END IF ;z1<=0';z2<=0;z3<=0;z4<=0;--输入初始值CASE sel IS=>zl<=“1,当sel=0时选中WHENOWHEN 13 => Z2<=1':--当sel为1或3时选中WHEN4To72=>z3<=I;-当sel为2、4、5、6或7时选中WHENOTHERS=>z4<=1';--当sel为8~15中任一值时选中ENDCASE;ENDPROCESS;ENDactiv:CASE语句使用中几种容易发生的错误:【例7-2】SIGNALvalue:INTEGERRANGE0TO15:SIGNAL out1 : STD LOGIC;CASEvalueIS缺少以WHEN引导的条件句END CASE;CASE value ISWHEN 0 => out1<='TI' ;--value2~15的值未包括进去WHEN1=>outl<='0';ENDCASE4
4 【例 7-1】四选一电路描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS PORT (s4,s3, s2,s1 : IN STD_LOGIC; z4,z3, z2,z1 : OUT STD_LOGIC); END mux41; ARCHITECTURE activ OF mux41 IS SIGNAL sel : INTEGER RANGE 0 TO 15; BEGIN PROCESS (sel ,s4,s3,s2,s1 ) BEGIN sel<= 0 ; - 输入初始值 IF (s1 ='1') THEN sel <= sel+1 ; ELSIF (s2 ='1') THEN sel <= sel+2 ; ELSIF (s3 ='1') THEN sel <= sel+4 ; ELSIF (s4 ='1') THEN sel <= sel+8 ; ELSE NULL; - 注意,这里使用了空操作语句 END IF ; z1<='0' ; z2<='0'; z3<='0'; z4<='0'; -输入初始值 CASE sel IS WHEN 0 => z1<=‘1’ ; - 当 sel=0 时选中 WHEN 1 3 => z2<='1' ; - 当 sel 为 1 或 3 时选中 WHEN 4 To 7 2 => z3<='1'; - 当 sel 为 2、4、5、6 或 7 时选中 WHEN OTHERS => z4<='1' ; - 当 sel 为 8~15 中任一值时选中 END CASE ; END PROCESS ; END activ ; CASE 语句使用中几种容易发生的错误: 【例 7-2】 SIGNAL value : INTEGER RANGE 0 TO 15; SIGNAL out1 : STD_LOGIC ; . CASE value IS - 缺少以 WHEN 引导的条件 句 END CASE; . CASE value IS WHEN 0 => out1<= '1' ; - value2~15 的值未包括进去 WHEN 1 => out1<= '0' ; END CASE
CASE value ISWHEN0TO10=>0ut<=1;-选择值中5~10的值有重叠WHEN5TO15=>0ut1<='0';END CASE;CASE语句和IF语句的比较:和多分支的IF语句相比,CASE语句组的程序可读性比较好。CASE语句的执行过程即条件性是独立的,排它的,不像IF语句那样有一个逐项条件顺序比较的过程。CASE语句中条件句的次序是不重要的,它的执行过程更接近于并行方式。综合后CASE语句和多分支的IF语句相比,要耗费更多的硬件资源。对于有的逻辑,CASE语句无法描述,只能用IF语句描述,这是因为IF-THEN-ELSIF语句具有条件相与的功能,而CASE语句只有条件相或的功能。例7-3是算术逻辑单元的VHDL描述,它在信号opcode的控制下可分别完成相加、相减、相等、不相等等操作,程序在CASE语句中混合了IF-THEN语句。【例7-3】算术逻辑单元描述LIBRARYIEEE;USEIEEE.STDLOGIC1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY alu ISPORT(a,b:INSTD_LOGIC_VECTOR(7DOWNTOO);opcode:IN STD_LOGIC_VECTOR (1DOWNTO O);result:OUTSTDLOGICVECTOR(7DOWNTOO));END alu,ARCHITECTUREbehaveOFaluISCONSTANTplusSTD LOGIC VECTOR(1DOWNTO0):=b"00"CONSTANTminusSTD _LOGIC_VECTOR (1 DOWNTO 0) := b"01";CONSTANT equalSTDLOGICVECTOR(1DOWNTO0):=b"10O":CONSTANT not_equal:STD LOGIC VECTOR (1DOWNTOO):=b"11";BEGINPROCESS (opcode,a,b)BEGINCASE opcodeISWHEN plus => result<=a+b,-a、b相加WHEN minus => result<=a -b;--a、b相减WHEN equal =>-a、b相等IF (a=b) THEN result<=x"01";ELSE result <= x"00";END IF;5
5 CASE value IS WHEN 0 TO 10 => out1<= '1'; - 选择值中 5~10 的值有重叠 WHEN 5 TO 15 => out1<= '0'; END CASE; CASE 语句和 IF 语句的比较: 和多分支的 IF 语句相比,CASE 语句组的程序可读性比较好。 CASE 语句的执行过程即条件性是独立的,排它的,不像 IF 语句那样有一 个逐项条件顺序比较的过程。 CASE 语句中条件句的次序是不重要的,它的执行过程更接近于并行方式。 综合后 CASE 语句和多分支的 IF 语句相比,要耗费更多的硬件资源。 对于有的逻辑, CASE 语句无法描述,只能用 IF 语句描述,这是因为 IF-THEN-ELSIF 语句具有条件相与的功能,而 CASE 语句只有条件相或的功能。 例 7-3 是算术逻辑单元的 VHDL 描述,它在信号 opcode 的控制下可分别完成 相加、相减、相等、不相等等操作,程序在 CASE 语句中混合了 IF-THEN 语句。 【例 7-3】算术逻辑单元描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY alu IS PORT( a, b : IN STD_LOGIC_VECTOR (7 DOWNTO 0); opcode: IN STD_LOGIC_VECTOR (1 DOWNTO 0); result: OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END alu; ARCHITECTURE behave OF alu IS CONSTANT plus : STD_LOGIC_VECTOR (1 DOWNTO 0) := b"00"; CONSTANT minus : STD_LOGIC_VECTOR (1 DOWNTO 0) := b"01"; CONSTANT equal : STD_LOGIC_VECTOR (1 DOWNTO 0) := b"10"; CONSTANT not_equal: STD_LOGIC_VECTOR (1 DOWNTO 0) := b"11"; BEGIN PROCESS (opcode,a,b) BEGIN CASE opcode IS WHEN plus => result <= a + b; - a、b 相加 WHEN minus => result <= a - b; - a、b 相减 WHEN equal => - a、b 相等 IF (a = b) THEN result <= x"01"; ELSE result <= x"00"; END IF;