1
5.4 顺序语句
顺序语句和并行语句是VHDL中的两大基本描述语句系列。顺序语句的特点:
语句的执行和书写顺序相同。
顺序语句只能应用在进程和子程序中。
VHDL中常用的几种顺序描述语句:
简单信号赋值语句(signal assignment)
变量赋值语句(variable assignment)
wait语句
if 语句
case 语句
loop语句
next语句
exit语句
null 语句
return 语句
断言(assert)语句
2
5.4.1 wait语句
进程在仿真运行中总处于两种状态:执行或者挂起。
对不同的结束挂起条件的设置,wait语句有以下四种不
同的语句格式:
WAIT; -- 第一种语句格式
WAIT ON 信号表; -- 第二种语句格式
WAIT UNTIL 条件表达式; -- 第三种语句格式
WAIT FOR 时间表达式; -- 第四种语句格式, 超时等待语句
当执行到wait语句时,运行程序将被挂起,直到满足此
语句设置的结束挂起条件后,将重新开始执行进程中的程序。
3
第一种表示永远挂起
第二种称为敏感信号等待语句,信号表中列出的信号是等待语
句的敏感信号,敏感信号的变化将结束挂起,重新启动进程。
WAIT; -- 第一种语句格式
WAIT ON 信号表; -- 第二种语句格式
WAIT UNTIL 条件表达式; -- 第三种语句格式
WAIT FOR 时间表达式; -- 第四种语句格式, 超时等待语句
第三种称为条件等待语句,被此语句结束挂起的进程需顺序
满足如下两个条件,才能脱离挂起状态。
(1)在条件表达式中所含的信号发生了变化;
(2)此信号改变后,且满足wait语句所设的条件。
第四种称为超时等待语句,时间表达式说明需要等待的时间
4
下面程序中的两种表达方式是等效的,进程的启动条件
是enable出现一个上跳沿。
(b)WAIT_ON 结构
loop
wait on enable;
exit when enable ='1';
end loop;
(a)WAIT_UNTIL 结构
...
Wait until enable ='1';
...
下面是WAIT_UNTIL语句的常用表达方式:
WAIT UNTIL 信号 = Value ; -- (1)
WAIT UNTIL 信号’EVENT AND 信号 = Value; --
(2)
5
WAIT语句最常用的都是用于指定时钟输入,下面语句所设的进程启动条件都是时钟上跳沿,所以它们对应的硬件结构是一样的:
WAIT UNTIL clock = '1';
WAIT UNTIL clock’EVENT AND clock = '1';【程序】...
PROCESS
BEGIN
WAIT UNTIL clk = '1';
ave <= a;
WAIT UNTIL clk = '1';
ave <= ave + a;
WAIT UNTIL clk = '1';
ave <= ave + a;
WAIT UNTIL clk = '1';
ave <= (ave + a)/4 ;
END PROCESS ;
6
5.4.2 if语句
if语句是一种条件语句,其基本结构有四种:
1.if 条件句 then 顺序语句;
end if;
2.if 条件句 then 顺序语句;
else 顺序语句;
end if;
3.if 条件句 then
if 条件句 then
…
end if;
end if;
4.if 条件句 then 顺序语句;
elsif 条件句 then 顺序语句;
…
else 顺序语句;
end if;
7
IF语句举例 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY con IS
PORT (a, b, c: IN BOOLEAN;
output: OUT BOOLEAN);
END con;
ARCHITECTURE example OF con IS
BEGIN
PROCESS (a, b, c)
VARIABLE n: BOOLEAN;
BEGIN
IF a THEN n := b;
ELSE n := c;
END IF;
output <= n;
END PROCESS;
END example;
8
【程序】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY coder ISPORT ( din : IN STD_LOGIC_VECTOR(0 TO 7);
output : OUT STD_LOGIC_VECTOR(2 DOWNTO 0) );END coder;ARCHITECTURE behav OF coder ISBEGIN
PROCESS (din)BEGIN
IF (din(7)='0') THEN output <= "000" ; ELSIF (din(6)='0') THEN output <= "001" ; ELSIF (din(5)='0') THEN output <= "010" ; ELSIF (din(4)='0') THEN output <= "011" ; ELSIF (din(3)='0') THEN output <= "100" ;ELSIF (din(2)='0') THEN output <= "101" ;ELSIF (din(1)='0') THEN output <= "110" ;ELSE output <= "111" ;
END IF;END PROCESS;END behav;
--优先编码器描述
9
5.4.3 case语句
CASE 表达式 ISWhen 选择值 => 顺序语句;When 选择值 => 顺序语句;...
END CASE ;
选择值可以有四种不同的表达方式:
单个普通数值,如6。
数值选择范围,如(2 TO 4),表示取值为2、3或4。
并列数值,如35,表示取值为3或者5。
混合方式,以上三种方式的混合。
使用CASE语句需注意:
1.条件句中的选择值必须在表达式的取值范围内;
2.所有条件句中的选择值应完全覆盖case语句中表达式的取值。
3.每一条件句的选择值只能出现一次。
4.case语句中至少要包含一个条件句。
CASE语句结构:
10
【程序】 --半加器描述(1)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS
PORT ( a, b : IN STD_LOGIC; co, so : OUT STD_LOGIC);
END ENTITY h_adder; ARCHITECTURE fh1 OF h_adder is
SIGNAL abc : STD_LOGIC_VECTOR(1 DOWNTO 0) ;BEGIN
abc <= a & b ; PROCESS(abc)BEGIN
CASE abc ISWHEN "00" => so<='0'; co<='0' ;WHEN "01" => so<='1'; co<='0' ;WHEN "10" => so<='1'; co<='0' ;WHEN "11" => so<='0'; co<='1' ;WHEN OTHERS => NULL ;
END CASE;END PROCESS;
END ARCHITECTURE fh1 ;
11
5.4.4 LOOP语句
LOOP语句就是循环语句,使所包含的一组顺序语句被循环执行,
循环次数可由设定的参数决定。一般用来描述片逻辑及迭代电路的行为。
常用的书写格式有三种:
1. FOR循环变量
[标号:] FOR 循环变量 IN 离散范围 LOOP
顺序语句
END LOOP [标号];
格式:
FOR后的循环变量是一个临时变量,属LOOP语句的局部变量,不必事先定义;每次循环中,循环变量都要在离散范围内变化。
LOOP循环的次数最好以常数表示,否则,在LOOP体内的逻辑可以重复任何可能的次数。
说明:
12
sum:for i in 1 to 9 loop
summ:=i+summ;
end loop sum; 功能:1~9的累加计算
SIGNAL 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;
【程序2】
【程序1】
此段程序等效于顺序执行以下三个信号赋值操作:
a(1) <= b(1) AND c(1); a(2) <= b(2) AND c(2);
a(3) <= b(3) AND c(3);
13
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;
ENTITY p_check ISPORT ( a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
y : OUT STD_LOGIC );END p_check;
ARCHITECTURE opt OF p_check ISBEGINPROCESS(a) variable tmp :STD_LOGIC ;BEGINtmp <='0';FOR n IN 0 TO 7 LOOP
tmp <= tmp XOR a(n);END LOOP ;y <= tmp;
END PROCESS;END opt;
8位奇偶校验电路
【程序3】
14
2. While条件
[标号:] WHILE 循环控制条件 LOOP
顺序处理语句
END LOOP [标号];
格式:
与FOR_LOOP语句不同的是:WHILE_LOOP语句并没有给出循环次数范围,没有自动递增循环变量的功能,而是给出了循环执行顺序语句的条件。
这里的循环控制条件可以是任何布尔表达式,当条件为TRUE时继续循环,否则跳出循环。
例: i:=1;
summ:=0;
bcdsumm: while (i<10) loop
summ:=i+summ;
i:=i+1;
end loop bcdsumm;
sum:for i in 1 to 9 loop
summ:=i+summ;
end loop sum;
15
3. 单个LOOP语句
这种循环方式是一种最简单的语句形式,它的循环方式需
引入其他控制方式(如next语句、exit语句)后才能确定。
格式: [标号:] LOOP
顺序语句
END LOOP [ 标号 ];
16
5.4.5 NEXT语句
next语句用于loop语句跳出本次循环的描述,格式为:
next [标号][when条件];
标号和when条件语句可以缺省:
NEXT; --第一种语句格式
NEXT LOOP标号; --第二种语句格式
NEXT LOOP标号 WHEN 条件表达式; --第三种语句格式
第一种语句:执行到NEXT时,无条件中止当前循环,返回循环起点,开始下次循环。
第二种语句:执行到NEXT时,无条件中止当前循环,返回LOOP标号处,开始下次循环。
第三种语句: WHEN 条件表达式是执行NEXT语句的条件,条件表达式的值为真时,执行NEXT语句,进入跳转操作,否则继续向下执行。
17
【程序】
……
PROCESS
BEGIN
rst_loop : LOOP
WAIT UNTIL ' clock’EVENT AND clock ='1; --等待时钟信号
NEXT rst_loop WHEN (rst='1'); --检测复位信号rst
x <= a ; --无复位信号,执行赋值操作
WAIT UNTIL clock’EVENT AND clock ='1'; --等待时钟信号
NEXT rst_loop WHEN (rst='1'); --检测复位信号rst
y <= b ; --无复位信号,执行赋值操作
END LOOP rst_loop ;
END PROCESS;
……
该程序描述的是一个具有同步复位功能的电路
18
5.4.6 EXIT语句
EXIT; --第一种语句格式
EXIT LOOP标号; --第二种语句格式
EXIT LOOP标号WHEN条件表达式; --第三种语句格式
两者的区别:
NEXT语句跳转到LOOP标号指定的LOOP处----即跳到LOOP语
句的起点。
EXIT语句跳转到LOOP循环语句的结束处-----即跳出循环。
下例是使用EXIT控制的循环语句,注意和NEXT语句的区别。
EXIT语句与NEXT语句十分相似,都是LOOP语句的内部循环控制语句
,其格式如下:EXIT[标号][WHEN条件];
标号和WHEN条件语句可以缺省:
19
【程序】
SIGNAL a, b : STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL a_less_then_b : Boolean;
... ... ... ... ... ... ... ...
a_less_then_b <= FALSE ; --设初始值
FOR i IN 1 DOWNTO 0 LOOP
IF (a(i)= '1' AND b(i)='0') THEN
a_less_then_b <= FALSE ; -- a > b
EXIT ;
ELSIF (a(i)='0' AND b(i)='1') THEN
a_less_then_b <= TRUE ; -- a < b
EXIT;
ELSE NULL; --为空操作语句
END IF;
END LOOP; --当 i=1时返回LOOP语句继续比较
... ... ... ... ... ... ... ...
20
5.4.7 null语句
空操作语句的语句格式如下:
NULL;
在下例的CASE语句中,NULL用于排除一些不用的条件。
case muxval iswhen 0 => q<=i0;when 1 => q<=i1;when 2 => q<=i2;when 3 => q<=i3;when others => null;
end case;
null语句表示一个空操作,不发生任何行为,目的只是使得程序执行到下一句。
21
5.4.8 顺序断言(ASSERT)语句
断言语句主要用于程序仿真、调试时使用,在综合时忽略。
其格式为:
ASSERT 条件 [REPORT 输出信息] [SEVERITY 级别]
当执行ASSERT语句时,如果条件为真,则继续向下执行;
如果条件为假,则输出错误信息和错误严重程度的级别,在
REPORT后面跟的是设计者所写的字符串,通常是说明错误的
原因,并且用双引号“”将字符串括起来。在VHDL中,错误
的严重程度可分为4个级别,并跟在SEVERITY后面,按严重程
度由重到轻分别是:NOTE、WARNING、ERROR、
FAILURE。
22
VHDL 小节VHDL结构: 实体、结构体、库、程序包、配置
VHDL语法规则:
文字规则:标识符、数字、字符和字符串、位串、注释
数据对象:常量、变量、信号、文件
数据类型:VHDL预定义、IEEE预定义、用户自定义(枚举类型)
运算符:逻辑运算符、算数运算符、关系运算符、并置运算符
VHDL语句:
并行语句:进程语句、块语句、并行信号赋值语句、并行过程调用
语句、并行断言语句、类属语句、元件例化语句、生成语句
顺序语句: 简单信号赋值语句、变量赋值语句、 wait语句、 if 语句、
case 语句、 loop语句、 next语句、 exit语句、 null 语句、顺序断言
(assert)语句