转向控制语句通过条件控制开关决定执行哪些语句。转向控制语句共有5种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。
1.IF语句
IF语句是一种条件语句,它根据语句中所设置的一种或几种条件,有选择地执行指定的顺序语句,IF语句的语句结构有以下3种:
格式1为
格式2为
格式3为
IF语句中至少应有一个条件句,条件句必须由布尔表达式构成。IF语句根据条件句产生的判断结果TRUE或FALSE,有条件地选择执行其后的顺序语句。例4.10是最简单的IF语句的应用举例。
例4.10
若条件句Q=‘0’的检测结果为TRUE,则执行下一条语句output<=aorb;否则此信号维持原值。
例4.11用第二种IF语句来描述如图4-6所示的硬件电路。
图4-6 例4.11的硬件实现电路图
在本例的结构体中用了一个进程来描述图4-6所示的硬件电路,其中,输入信号x1、x2、x3是进程的敏感信号。进程中的IF语句的条件是信号x2,它属于BOOLEAN类型,其值只有TRUE或FALSE。如果x2为TRUE时,执行“n:=x3”语句;若x2为FALSE时,执行“n:=x1”语句。
例4.12 用第三种IF语句来设计8线-3线优先编码器。8线-3线优先编码器的真值表见表4-3。
表4-38 线-3线优先编码器的真值表
注:表中的“X”为任意,类似VHDL中的“-”值。
语句如下:
2.CASE语句
CASE语句根据条件表达式的值,直接选择满足多项顺序语句中的一项执行,故适合用于两路或多路分支判断结构。CASE语句的结构如下:
当执行到CASE语句时,首先计算表达式的值,然后根据条件句中与之相同的选择值,执行对应的顺序语句,最后结束CASE语句。表达式可以是一个整数类型或枚举类型的值,也可以是由这些数据类型的值构成的数组(请注意,条件句中的“=>”不是操作符,它只相当于“THEN”的作用)。
选择值可以有4种不同的表达方式:①单个普通数值,如4;②数值选择范围,如(2TO4),表示取值2、3或4;③并列数值,如3|5,表示取值为3或者5;④混合方式,以上3种方式的混合。
使用CASE语句需注意以下几点:
1)条件句中的选择值必须在表达式的取值范围内。
2)除非所有条件句中的选择值能完整的覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须用“OTHERS”表示。它代表已给的所有条件句中未能列出的其他可能的取值,这样可以避免综合器插入不必要的寄存器。这一点对于定义为STD_LOGIC和STD_LOGIC_VECTOR数据类型的值尤为重要,因为这些数据对象的取值除了1和0以外,还可能有其他的取值,如高阻态Z、不定态X等。
3)CASE语句中每一条件句的选择只能出现一次,不能有相同选择值的条件句出现。
4)CASE语句执行中必须选中,且只能选中所列条件语句中的一条。这表明CASE语句中至少要包含一个条件语句。
例4.13是一个用CASE语句描述的4选1多路选择器的VHDL程序。此例的逻辑图如图4-7所示,其真值表见表4-4。在表4-4中,数据选择器在控制输入信号s0、s1的控制下,使输入信号d、c、b和a中的一个被选中传送到输出。s0和s1有4种组合值,可以用CASE语句实现其功能。
图4-74 选1多路选择器
表4-44 选1多路选择器的真值表
(www.xing528.com)
例4.13
注意,例4.13中的第5个条件句是必需的,因为对于定义为STD_LOGIC_VECTOR数据类型的s,在VHDL综合过程中,它可能的选择值除了00、01、10、11外,还可以有其他的定义于STD_LOGIC的选择值。
与IF语句相比,CASE语句组的程序可读性比较好,这是因为它把条件中所有可能出现的情况全部列出来了,可执行条件一目了然。而且CASE语句的执行过程不像IF语句那样有一个逐项条件顺序比较的过程。CASE语句中条件句的次序是不重要的,它的执行过程更接近于并行方式。一般情况下,综合后,对相同的逻辑功能,CASE语句比IF语句的描述耗用更多的硬件资源,而且有的逻辑CASE语句无法描述,只能用IF语句来描述。这是因为IF-THEN-ELSIF语句具有条件相与的功能和自动将逻辑值“-”包括进去的功能(逻辑值“-”有利于逻辑化简),而CASE语句只有条件相或的功能。
3.LOOP语句
LOOP语句就是循环语句,它可以使所包含的一组顺序语句被循环执行,其执行次数可由设定的循环参数决定,循环的方式又分为FOR LOOP和WHILE LOOP两种。格式中用“标号”来给语句定位,但也可以不使用,用方括号将“标号”括起来,表示它为任选项,主要是增强程序的可读性,尤其是当使用循环嵌套或循环体的顺序语句很长的时候。
1)FOR LOOP语句格式如下:
FOR后的循环变量是一个隐式定义,由循环体自动声明,不必事先定义。也就是说该变量不能在循环体外定义,只是在循环体内可见,而且是只读的,只能作为赋值源,不能被赋值。使用时应当注意,在LOOP语句范围内不要再使用其他与循环变量同名的标识符。
循环次数范围规定了LOOP语句中的顺序语句被执行的次数。循环变量从循环次数范围的初值开始,每执行完一次顺序语句后递增1,直至达到循环次数范围指定的最大值。
例4.14 用FOR LOOP语句实现8位奇偶校验器。
本例用b表示输入信号,它的长度为8位。用FORLOOP语句对b的值逐位进行模2加(即异或XOR)运算,循环量m控制模2加的次数。循环范围为0~7,共8次。
2)WHILELOOP语句格式如下:
与FOR LOOP语句不同的是,WHILE LOOP语句并没有给出循环次数的范围,没有自动递增循环量的功能,只是给出了循环执行顺序语句的条件。这里的循环控制条件可以是任何布尔表达式。当条件为TRUE时,继续循环;为FALSE时,跳出循环,执行“END LOOP”后的语句。
例4.15 用WHILE LOOP语句来实现例4.14的8位奇偶校验器。
VHDL综合器支持WHILE语句的条件是:LOOP的结束条件值必须是在综合时就可以决定。综合器不支持无法确定循环次数的LOOP语句。
4.NEXT语句
NEXT语句主要用在LOOP语句执行中有条件的或无条件的转向控制,跳出本次循环。它的语句格式有以下3种:
关于第一种语句格式,当LOOP内的顺序语句执行到NEXT语句时,即刻无条件终止当前的循环,跳回到本次循环LOOP语句处,开始下一次循环。
关于第二种语句格式,即在NEXT旁加“LOOP标号”后的语句功能,与求知加“LOOP标号”的功能是基本相同的,只是当有多重LOOP语句嵌套时,该语句可以跳转到指定标号的LOOP语句处,重新开始执行循环操作。
关于第三种语句格式,分句“WHEN条件表达式”是执行NEXT语句的条件,如果条件表达式的值为TRUE,则执行NEXT语句,进入跳转操作,否则继续向下执行。但当只有单层LOOP循环语句时,关键词NEXT与WHEN之间的“LOOP标号”可以如例4.16那样省去。
例4.16
例4.16中,当程序执行到NEXT语句时,如果条件判断式(b=c)的结果为TRUE,将执行NEXT语句,并返回到L1,使n加1后执行S1开始的赋值语句;否则将执行S2开始的赋值语句。
在多重循环中,NEXT语句必须如例4.17所示那样,加上跳转标号。
例4.17
当e>f为TRUE时,执行语句NEXTLX,跳转到LX,使n加1,从S1处开始执行语句;若为FALSE,则执行S3后使m加1。
5.EXIT语句
EXIT语句也是LOOP语句的内部循环控制语句,功能与NEXT语句十分相似,其语句格式也有3种。
这里每一种语句格式与前述的NEXT语句的格式和操作功能非常相似,唯一的区别是NEXT语句的跳转方向是LOOP标号指定的LOOP语句处,当没有LOOP标号时,转跳到当前LOOP语句的循环起始点,而EXIT语句的跳转方向是LOOP标号指定的循环语句结束处,即完全跳出指定的循环外的语句。也就是说NEXT语句是跳向LOOP语句的起始点,而EX-IT语句则是跳向LOOP语句的终点。
下例是一个两元素位矢量值比较程序。在程序中,当发现比较值a和b不相同时,由EXIT语句跳出循环比较程序,并报告比较结果。
例4.18
NULL为空操作语句,是为了满足ELSE的转换。此程序先比较a和b的高位,高位是1者为大,输出判断结果TRUE或FALSE后中断比较程序;当高位相等时,继续比较低位,这里假设a不等于b。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。