首页 理论教育 优化转向控制语句的控制方式

优化转向控制语句的控制方式

时间:2023-06-29 理论教育 版权反馈
【摘要】:转向控制语句通过条件控制开关决定执行哪些语句。转向控制语句共有5种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。例4.10是最简单的IF语句的应用举例。例4.12 用第三种IF语句来设计8线-3线优先编码器。例4.13是一个用CASE语句描述的4选1多路选择器的VHDL程序。s0和s1有4种组合值,可以用CASE语句实现其功能。循环次数范围规定了LOOP语句中的顺序语句被执行的次数。例4.14 用FOR LOOP语句实现8位奇偶校验器。

优化转向控制语句的控制方式

转向控制语句通过条件控制开关决定执行哪些语句。转向控制语句共有5种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。

1.IF语句

IF语句是一种条件语句,它根据语句中所设置的一种或几种条件,有选择地执行指定的顺序语句,IF语句的语句结构有以下3种:

格式1为

978-7-111-41567-1-Chapter04-58.jpg

格式2为

978-7-111-41567-1-Chapter04-59.jpg

格式3为

978-7-111-41567-1-Chapter04-60.jpg

IF语句中至少应有一个条件句,条件句必须由布尔表达式构成。IF语句根据条件句产生的判断结果TRUE或FALSE,有条件地选择执行其后的顺序语句。例4.10是最简单的IF语句的应用举例。

例4.10

978-7-111-41567-1-Chapter04-61.jpg

若条件句Q=‘0’的检测结果为TRUE,则执行下一条语句output<=aorb;否则此信号维持原值。

例4.11用第二种IF语句来描述如图4-6所示的硬件电路。

978-7-111-41567-1-Chapter04-62.jpg

图4-6 例4.11的硬件实现电路图

978-7-111-41567-1-Chapter04-63.jpg

978-7-111-41567-1-Chapter04-64.jpg

在本例的结构体中用了一个进程来描述图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线优先编码器的真值表

978-7-111-41567-1-Chapter04-65.jpg

注:表中的“X”为任意,类似VHDL中的“-”值。

语句如下:

978-7-111-41567-1-Chapter04-66.jpg

978-7-111-41567-1-Chapter04-67.jpg

2.CASE语句

CASE语句根据条件表达式的值,直接选择满足多项顺序语句中的一项执行,故适合用于两路或多路分支判断结构。CASE语句的结构如下:

978-7-111-41567-1-Chapter04-68.jpg

当执行到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语句实现其功能。

978-7-111-41567-1-Chapter04-69.jpg

图4-74 选1多路选择器

表4-44 选1多路选择器的真值表

978-7-111-41567-1-Chapter04-70.jpg(www.xing528.com)

例4.13

978-7-111-41567-1-Chapter04-71.jpg

注意,例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语句格式如下:

978-7-111-41567-1-Chapter04-72.jpg

FOR后的循环变量是一个隐式定义,由循环体自动声明,不必事先定义。也就是说该变量不能在循环体外定义,只是在循环体内可见,而且是只读的,只能作为赋值源,不能被赋值。使用时应当注意,在LOOP语句范围内不要再使用其他与循环变量同名的标识符。

循环次数范围规定了LOOP语句中的顺序语句被执行的次数。循环变量从循环次数范围的初值开始,每执行完一次顺序语句后递增1,直至达到循环次数范围指定的最大值。

例4.14 用FOR LOOP语句实现8位奇偶校验器。

本例用b表示输入信号,它的长度为8位。用FORLOOP语句对b的值逐位进行模2加(即异或XOR)运算,循环量m控制模2加的次数。循环范围为0~7,共8次。

978-7-111-41567-1-Chapter04-73.jpg

2)WHILELOOP语句格式如下:

978-7-111-41567-1-Chapter04-74.jpg

与FOR LOOP语句不同的是,WHILE LOOP语句并没有给出循环次数的范围,没有自动递增循环量的功能,只是给出了循环执行顺序语句的条件。这里的循环控制条件可以是任何布尔表达式。当条件为TRUE时,继续循环;为FALSE时,跳出循环,执行“END LOOP”后的语句。

例4.15 用WHILE LOOP语句来实现例4.14的8位奇偶校验器。

978-7-111-41567-1-Chapter04-75.jpg

VHDL综合器支持WHILE语句的条件是:LOOP的结束条件值必须是在综合时就可以决定。综合器不支持无法确定循环次数的LOOP语句。

4.NEXT语句

NEXT语句主要用在LOOP语句执行中有条件的或无条件的转向控制,跳出本次循环。它的语句格式有以下3种:

978-7-111-41567-1-Chapter04-76.jpg

关于第一种语句格式,当LOOP内的顺序语句执行到NEXT语句时,即刻无条件终止当前的循环,跳回到本次循环LOOP语句处,开始下一次循环。

关于第二种语句格式,即在NEXT旁加“LOOP标号”后的语句功能,与求知加“LOOP标号”的功能是基本相同的,只是当有多重LOOP语句嵌套时,该语句可以跳转到指定标号的LOOP语句处,重新开始执行循环操作。

关于第三种语句格式,分句“WHEN条件表达式”是执行NEXT语句的条件,如果条件表达式的值为TRUE,则执行NEXT语句,进入跳转操作,否则继续向下执行。但当只有单层LOOP循环语句时,关键词NEXT与WHEN之间的“LOOP标号”可以如例4.16那样省去。

例4.16

978-7-111-41567-1-Chapter04-77.jpg

例4.16中,当程序执行到NEXT语句时,如果条件判断式(b=c)的结果为TRUE,将执行NEXT语句,并返回到L1,使n加1后执行S1开始的赋值语句;否则将执行S2开始的赋值语句。

在多重循环中,NEXT语句必须如例4.17所示那样,加上跳转标号。

例4.17

978-7-111-41567-1-Chapter04-78.jpg

当e>f为TRUE时,执行语句NEXTLX,跳转到LX,使n加1,从S1处开始执行语句;若为FALSE,则执行S3后使m加1。

5.EXIT语句

EXIT语句也是LOOP语句的内部循环控制语句,功能与NEXT语句十分相似,其语句格式也有3种。

978-7-111-41567-1-Chapter04-79.jpg

这里每一种语句格式与前述的NEXT语句的格式和操作功能非常相似,唯一的区别是NEXT语句的跳转方向是LOOP标号指定的LOOP语句处,当没有LOOP标号时,转跳到当前LOOP语句的循环起始点,而EXIT语句的跳转方向是LOOP标号指定的循环语句结束处,即完全跳出指定的循环外的语句。也就是说NEXT语句是跳向LOOP语句的起始点,而EX-IT语句则是跳向LOOP语句的终点。

下例是一个两元素位矢量值比较程序。在程序中,当发现比较值a和b不相同时,由EXIT语句跳出循环比较程序,并报告比较结果。

例4.18

978-7-111-41567-1-Chapter04-80.jpg

NULL为空操作语句,是为了满足ELSE的转换。此程序先比较a和b的高位,高位是1者为大,输出判断结果TRUE或FALSE后中断比较程序;当高位相等时,继续比较低位,这里假设a不等于b。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈