1,否则此信号维持原值。 例2:用IF语句描述图示硬件电路。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; 此处的库、程序包使用 说明是否必要 ENTITY EXAMPLE IS PORT (A,B,C: IN BOOLEAN;OUTPUT:OUT BOOLEAN); A OUTPUT B 对应的硬件电路 END ARCHITECTURE ART; 例3: 由两个2选1多路选择器构成的电路逻辑描述如图所示, 其中,当P1和P2为高电平时下端的通道接通。 P1 P2 S B B S B C A Z A AHale Waihona Puke MUX21MUX21 SIGNA A,B,C,P1,P2,Z: BIT; ... IF (P1=‘1’) THEN 例:WHILE COUNTER <=100 LOOP IF COUNTER>50 THEN REPORT "THE COUNTER IS OVER 50"; END IF; … END LOOP; END IF; END LOOP; --当I=1时返回LOOP语句继续比较 #金 四、REPORT语句 语句格式: [标号] REPORT “输出字符串” [SEVERIY 出错级别] REPORT语句不增加硬件的任何功能,仿真时可用该语句提 高可读性。 REPORT语句等价于断言语句。 出错级别默认为NOTE。 4. EXIT- LOOP语句 EXIT [LOOP 标号] [WHEN 条件表达式]; EXIT语句用来结束LOOP语句。分四种控制: ① 单独EXIT时,无条件结束LOOP语句的执行。 ② EXIT [LOOP 标号],跳转到指定的LOOP标号处。 ③ EXIT [WHEN 条件],条件值=TRUE,跳出LOOP语句;条件 END CASE; END PROCESS; END ARCHITECTURE ART; S1 S2 D C B A ‘X’--强未知的 S2 S1 D C Z B A 注意:本例的第五个条件名是必需的,因为对于定义 STD_LOGIC_VECTOR数据类型的S,在VHDL综合过程中,它 可能的选择值除了00、01、10和11外,还可以有其他定义于 STD_LOGIC的选择值。 择值比较,相同执行对应的顺序语句,否则执行OTHERS 后 的顺序语句或结束语句END CASE。 语句中的选择值必须列举穷尽,又不能重复。 选择值不能列举穷尽时,语句WHEN OTHERS =>顺序语句; 通常不能缺省。 例1:用CASE语句描述4选1多路选择器。 LIBRARY IEEE; BEGIN L1: WHILE N<=8 LOOP --这里的“<=”是小于等于的意思 OUTPUTX(N)<=INPUTX(N+8); N:=N+1; END LOOP L1; END PROCESS SHIFT1; 说明:在WHILE-LOOP语句的顺序语句中增加了一条循环次数 的计算语句,用于循环语句的控制。在循环执行中,当N的值等 于9时将跳出循环。 ELSIF(SR (3)=‘0’) THEN SC <="001"; ELSIF(SR (2)=‘0’) THEN SC <="101"; ELSIF(SR (1)=‘0’) THEN SC <="011"; ELSE SC <="111"; END IF; END PROCESS; END ARCHITECTURE ART; PROCESS(A) IS BEGIN TMP <=‘0’; FOR N IN 0 TO 7 LOOP TMP <=TMP XOR A(N); END LOOP; Y<= TMP; 结果: END PROCESS; Y=‘0’— A含偶数个‘1’, END ARCHITECTURE ART; Y=‘1’— A含奇数个‘1’。 开始处;条件值=FALSE,不执行NEXT,继续向下执行。 ④ 全不缺省时,条件值=TRUE,跳到指定的LOOP标号处(注意: 并不一定是本循环语句的LOOP标号);条件值=FALSE,不 执行NEXT,继续向下执行。 例1: 例2: … L1: FOR CNT IN 1 TO 8 LOOP S1:A(CNT):=‘0’; NEXT WHEN (B=C); S2 :A(CNT+8):=‘0’; 循环变量的值在每一次的循环中都会发生变化。 循环次数范围表示循环变量在循环过程中的取值范围,显然 FOR模式的循环次数是明确的。 例1: 利用LOOP语句中的循环变量简化同类顺序语句的表达式 的使用。 SIGNA A,B,C: STD_LOGIC_VECTOR(1 TO 3); … FOR N IN 1 TO 3 LOOP A(N)<=B(N) AND C(N); END LOOP; SC:OUT STD_LOGIC_VECTOR(0 TO 2)); END ENTITY CODER; ARCHITECTURE ART OF CODER IS BEGIN PROCESS(SR) IS BEGIN IF(SR(7)=‘0’) THEN SC<="000"; --(SR(7)=‘0’) 2. WHILE-LOOP语句: [标号]:WHILE 循环控制条件 LOOP 顺序语句 END LOOP [标号]; 循环控制条件为真执行顺序语句;为假结束循环。显然 WHILE模式的循环次数是未知的。 例: WHILE-LOOP语句的使用。 SHIFT1: PROCESS(INPUTX) IS VARIABLE N: POSITIVE:=1; 顺序语句与并行语句的双重特性,放在进程、块、子程序之内 是顺序语句,被放在进程、块、子程序之外是并行语句。 一、IF语句 语句结构: IF 条件句 THEN 顺序语句; {ELSIF 条件句 THEN 顺序语句}; [ELSE 顺序语句]; END IF; IF语句是一种条件语句,根据语句中所设置的一种或多种 条件,有选择地执行指定的顺序语句。 END ENTITY EXAMPLE; ARCHITECTURE ART OF EXAMPLE IS BEGIN PROCESS(A,B,C) IS VARIABLE N: BOOLEAN; BEGIN C IF A THEN N:=B; ELSE N:=C; END IF; OUTPUT <=N; END PROCESS; 条件值是布尔型(TRUE或FALSE)。 条件=TRUE,执行THEN后顺序语句,条件全为FALSE时, 才会执行ELSE后顺序语句或结束语句END IF。 根据大括号和方括号部分可选情况,共有三种结构。 例1: IF (A>B)THEN OUTPUT<=‘1 ’; END IF; 说明:若条件(A>B)检测结果为TRUE,则向信号OUTPUT赋值 --设初始值 FOR I IN 1 DOWNTO 0 LOOP IF (A(I)=‘1’ AND B(I)=‘0’) THEN A_LESS _B<=FALSE; EXIT; ELSIF (A(I)=‘0’ AND B(I)=‘1’) THEN A_LESS _B<=TRUE; --A<B EXIT; ELSE NULL; ELSIF(SR(6)=‘0’) THEN SC <="100"; --(SR(7)=‘1’) AND (SR(6)=‘0’) ELSIF(SR (5)=‘0’) THEN SC <="010"; --(SR (7)=‘1’)AND(SR (6)=‘1’)AND(SR (5)=‘0’) ELSIF(SR (4)=‘0’) THEN SC <="110"; SIGNA S :STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN S<=S1 & S2; PROCESS(S,A,B,C,D) IS BEGIN 并置运算符号 CASE S IS WHEN "00"=>Z<=A; WHEN "01"=>Z<=B; WHEN "10"=>Z<=C; WHEN "11"=>Z<=D; WHEN OTHERS =>Z<='X'; 第3章 VHDL语法基础 3.1 顺序语句 3.2 并行语句 3.1 顺序语句 VHDL有两种类型语句:顺序语句和并行语句(并发语句)。 顺序语句的执行(指仿真执行)顺序是与它们的书写顺序基本 一致的。 并行语句的执行是同步进行的,或者说是并行运行的,其执行 方式与书写的顺序无关。 顺序语句又分两种情况:一种是真正的顺序语句。另一种具有 值=FALSE,继续LOOP循环。 ④ 全不缺省时,条件值=TRUE,跳出LOOP语句;条件值 =FALSE,跳到指定的LOOP标号处。 例: SIGNAL A,B:STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL A_LESS_B:BOOLEAN; … A_LESS_B<=FLASE; ENTITY P_CHECK IS PORT (A:IN STD_LOGIC_VECTOR(7 DOWNTO 0); Y:OUT STD_LOGIC); END ENTITY P_CHECK; ARCHITECTURE ART OF P_CHECK IS SIGNAL TMP: STD_LOGIC; BEGIN 说明:本例设计的是一个优先级编码器电路,因SR(7)先测试, 所以优先级最高。 二、CASE 语句 语句结构: CASE 表达式 IS WHEN 选择值 =>顺序语句; WHEN 选择值 =>顺序语句; … [ WHEN OTHERS =>顺序语句;] END CASE; 符号=>相当于THEN。 执行时,首先计算表达式的值,然后将该值与WHEN中的选 3. NEXT- LOOP语句 NEXT [LOOP 标号] [WHEN 条件表达式]; NEXT语句是对LOOP语句作有条件或无条件的转向控制。分 四种控制: ① 单独NEXT时,跳到本循环LOOP语句开始处。 ② NEXT [LOOP 标号],跳转到指定的LOOP标号处。 ③ NEXT [WHEN 条件],条件值=TRUE,跳到本循环LOOP语句 S1 USE IEEE.STD_LOGIC_1164.ALL; S2 ENTITY MUX41 IS D PORT(S1,S2: IN STD_LOGIC; C A,B,C,D:IN STD_LOGIC; Z: OUT STD_LOGIC); B END ENTITY MUX41; A S2 S1 D C Z B A ARCHITECTURE ART OF MUX41 IS Z<=A; --执行条件是(P1=‘1’) ELSIF (P2=‘0’) THEN Z<=B; --执行条件是(P1=‘0’)AND (P2=‘0’) ELSE Z<=C; --执行条件是(P1=‘0’)AND (P2=‘1’) END IF; 例4: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY CODER IS PORT ( SR:IN STD_LOGIC_VECTOR(0 TO 7); END LOOP L1; … L1: FOR CNT IN 1 TO 8 LOOP S1:A(CNT):=‘0’; K:=0; L2:LOOP S2:B(k):=‘0’; NEXT L1 WHEN (E>F); S3:B(k+8):=‘0’; K:=K+1; END LOOP L2; END LOOP L1; … 说明:此段程序等效于顺序执行以下三个信号赋值操作。 A(1)<=B(1) AND C(1); A(2)<=B(2) AND C(2); A(3)<=B(3) AND C(3); 例2: FOR-LOOP语句的使用(8位奇偶校验逻辑电路)。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; 如果使用BIT_VECTOR数据类型, WHEN OTHERS句 子就不必了。 注:书上的设计描述方法与此处不同。 三、LOOP语句 LOOP语句就是循环语句,它可以使所包含的一组顺序语句 被循环执行,其执行次数可由设定的循环参数决定,循环的 方式由NEXT和EXIT语句来控制。 1. FOR-LOOP语句: [标号]:FOR 循环变量 IN 循环次数范围 LOOP 顺序语句 END LOOP [标号];