4.1.2 转向控制语句
转向控制语句通过条件控制开关决定是否执行一条或几条语句,或重复执行一条或几条语句,或跳过一条或几条语句。转向控制语句共有五种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。
1)IF语句
IF语句是一种条件语句,它根据语句中所设置的一种或多种条件,有选择地执行指定的顺序语句,其语句结构有以下三种:
(1)IF条件句Then
(2)IF条件句Then
(3)IF条件句Then
IF语句中至少应有一个条件句,条件句必须由布尔表达式构成。IF语句根据条件句产生的判断结果TRUE或FALSE,有条件地选择执行其后的顺序语句。如果某个条件句的布尔值为真(TRUE),则执行该条件句后的关键词THEN后面的顺序语句,否则结束该条件的执行,或执行ELSIF或ELSE后面的顺序语句后结束该条件句的执行,直到执行到最外层的END IF语句,才完成全部IF语句的执行。
第(1)种条件语句的执行情况是,当执行到此句时,首先检测关键词IF后的条件表达式的布尔值是否为真,如果条件为真,于是将顺序执行条件句中列出的各条语句,直到END IF,即完成全部IF语句的执行。如果条件检测为假,则跳出以下的顺序语句不予执行,直接结束IF语句的执行。这种语句形式是一种非完整性条件语句,通常用于产生时序电路。
【例4.1】
第(2)种IF语句当所测条件为false时,并不直接跳到END IF结束条件句的执行,而是转向ELSE以下的另一段顺序语句进行执行。所以第(2)种IF语句具有条件分支的功能,就是通过测定所设条件的真假以决定执行哪一组顺序语句,在执行完其中一组语句后,再结束IF语句的执行。这是一种完整性条件语句,它给出了条件语句所有可能的条件,通常用于产生组合电路。
【例4.2】
第(3)种IF语句可以实现不同类型电路的描述。该语句通过关键词ELSIF设定多个判定条件,以使顺序语句的执行分支可以超过两个。这一类型的语句有一个重要特点,就是其任一分支顺序语句的执行条件是以上各分支所确定条件的相与,即语句中顺序语句的执行条件具有向上相与的功能。
【例4.3】
这个例子中用到了进程语句PROCESS(input,sel),以后例子中也将用到PROCESS语句,在此先简单的介绍下进程语句。PROCESS旁的(input,sel)称为进程的敏感信号表,由于PROCESS语句的执行依赖于敏感信号的变化,当某一敏感信号(如sel)从原来的“00”跳变为“01”,就将启动此进程语句,而在执行一遍整个进程的顺序语句后,便返回进程的起始端,进入等待状态,直到下一次敏感信号表中某一信号的跳变才进入“启动-运行”状态,即再执行一次PROCESS至END PROCESS引导的语句。
2)CASE语句
CASE语句根据满足的条件直接选择多项顺序语句中的一项执行。
CASE语句的结构如下:
当执行到CASE语句时,首先计算表达式的值,然后根据条件句中与之相同的选择值,执行对应的顺序语句,最后结束CASE语句。表达式可以是一个整数类型或枚举类型的值,也可以是由这些数据类型的值构成的数组(请注意,条件句中的“=>”不是操作符,它只相当于“THEN”的作用)。
选择值可以有四种不同的表达方式:
(1)单个普通数值,如5;
(2)数值选择范围,如(1TO 3),表示取值1、2或3;
(3)并列数值,如2 | 5,表示取值为2或者5;
(4)混合方式,以上三种方式的混合。
使用CASE语句需注意以下几点:
(1)条件句中的选择值必须在表达式的取值范围内。
(2)CASE语句中每一条件句的选择只能出现一次,不能有相同选择值的条件语句出现。
(3)CASE语句执行中必须选中,且只能选中所列条件语句中的一条。这表明CASE语句中至少要包含一个条件语句。
(4)除非所有条件句中的选择值能完整覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须用“OTHERS”表示。它代表已给的所有条件句中未能列出的其他可能的取值,这样可以避免综合器插入不必要的寄存器。
【例4.4】用CASE语句描述4选1多路选择器。
由例4.4得出以下结论:
(1)IF语句是有序的,先处理最起始、最优先的条件,后处理次优先的条件;
(2)CASE语句是无序的,所有表达式值都并行处理;
(3)CASE语句中的条件表达式的值必须枚举穷尽,还不能重复,不能穷尽的条件表达式的值用OTHERS表示;
(4)含有任意项输入的条件表达式,对应用于任意项输出,而不能有确定输出。
此列中PROCESS(s1,s2,a,b,c,d)的敏感信号s1,s2,a,b,c,d中某一个信号发生跳变,就将启动此进程语句。
例4.5描述的4选1选择器是用IF语句和CASE语句共同完成的。这不是一个多路选择器,它是根据4位输入码来确定4位输出中哪一位输出为1。
【例4.5】
此例中的IF_THEN_ELSIF语句所起的作用是数据类型转换器的作用,即把输入的s4、s3、s2、s1的4位二进制输入值转化为能与sel对应的整数值,以便可以在条件句中进行比较。
3)LOOP语句
LOOP语句与其他高级语句中的循环语句一样,使程序进行有规则的循环,循环的次数受迭代算法控制。在VHDL中它可以使所包含的一组顺序语句被循环执行,其执行次数可由设定的循环参数决定。
LOOP语句的书写格式一般有两种:FOR-LOOP语句、WHILE-LOOP语句。
(1)FOR-LOOP语句
这种LOOP语句的书写格式如下:
FOR后的“循环变量”是一个临时变量,属LOOP语句的局部变量,不必实现定义。“循环次数范围”规定LOOP语句中的顺序语句被执行的次数。循环变量从循环次数范围的初始值开始,每执行一次顺序处理语句后递增1,直至循环次数范围指定的最大值。
【例4.6】 8位奇偶校验器的VHDL描述。
(2)WHILE-LOOP语句
这种LOOP语句的书写格式如下:
在WHILE循环中,如果条件为“真”,则进行循环;如果条件为“假”,则结束循环。
例4.6的8位奇偶校验器,如果用WHILE条件的LOOP语句来描述,即可写为如例4.7所示的程序。
【例4.7】
比较例4.6和例4.7可知,FOR-LOOP语句和WHILE-LOOP语句可以互相替换,但WHILE-LOOP语句中必须对循环变量进行定义、初始化和递增循环变量的操作,而FOR-LOOP语句不需要。
另外,一般的综合工具可以对FOR LOOP循环语句进行综合;而对WHILE LOOP循环语句来说,只有一些高级的综合工具才能对它进行综合,所以,一般使用FOR LOOP循环语句,而很少使用WHILE LOOP循环语句。
4)NEXT语句
NEXT语句主要用在LOOP语句执行中有条件的或无条件的转向控制。它的语句格式有以下三种:
(1)NEXT;
(2)NEXT LOOP标号;
(3)NEXT LOOP标号WHEN条件表达式。
对于第一种语句格式,当LOOP内的顺序语句执行到NEXT语句时,即刻无条件终止当前的循环,跳回到本次循环LOOP语句处,开始下一次循环。
对于第二种语句格式,功能与第一种语句基本相同,只有当有多重LOOP语句嵌套时,第二种格式可以跳转到指定标号的LOOP语句开始处,重新开始执行循环操作。
对于第三种语句格式,若WHEN子句出现并且条件表达式的值为TRUE,则执行NEXT语句,进入跳转操作,否则继续向下执行。
【例4.8】
本例中,当程序执行到NEXT语句时,如果条件判断式(b=c)的结果为TRUE,将执行NEXT语句,并返回到L1,使cnt_value加1后执行s1开始赋值语句,否则将执行s2开始的赋值语句。
【例4.9】
当e>f为TRUE时执行语句NEXT L_X,跳转到L_X,使cnt_value加1,从s1处开始执行语句;若为FALSE,则执行s3后使k加1。
5)EXIT语句
EXIT语句也是LOOP语句的内部循环控制语句,其语句格式也有三种:
(1)EXIT;
(2)EXIT LOOP标号;
(3)EXIT LOOP标号WHEN条件表达式。
这里,每一种语句格式与前述的NEXT语句的格式和操作功能非常相似,惟一的区别是NEXT语句是跳向LOOP语句的起始点,而EXIT语句则是跳向LOOP语句的终点。
【例4.10】
NULL为空操作语句,是为了满足ELSE的转换。此程序先比较a和b的高位,高位是1者为大,输出判断结果TRUE或FALSE后中断比较程序;当高位相等时,继续比较低位,这里假设a不等于b。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。