5.2 流程控制语句
流程控制语句有IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句等5种。
5.2.1 IF语句
IF语句有下列3种格式。
『格式1』:门闩控制语句。
IF条件语句THEN
…顺序语句;…
END IF;
当程序执行到该IF语句时,就要判断IF语句所指定的条件是否成立。如果条件成立,则IF语句所包含的顺序处理语句将被执行;如果条件不成立,程序将跳过IF语句所包含的顺序处理语句,而向下执行IF语句的后继语句。这里的条件起到门闩控制作用。
『格式2』:2选1控制语句。
IF条件语句THEN
…顺序语句;…
ELSE
…顺序语句;…
END IF;
当IF条件成立时,程序执行THEN和ELSE之间的顺序语句部分;当IF语句的条件得不到满足时,程序执行ELSE和END IF之间的顺序处理语句。也就是说,依据IF所指定的条件是否满足,程序可以有两条不同的执行路径。
『格式3』:IF语句的多选择控制语句。
IF条件语句THEN
…顺序语句;…
ELSIF条件语句THEN
…顺序语句;…
ELSE
…顺序语句;…
END IF;
在这种多选择控制的IF语句中,设置了多个条件。当满足所设置的多个条件之一时,就执行该条件后的顺序处理语句。如果所有设置的条件都不满足,则执行ELSE和END IF之间的顺序处理语句。
IF语句中至少应有一个条件语句,条件语句必须由BOOLEAN表达式构成。IF语句根据条件语句产生的判断结果——TRUE或FALSE,有条件地选择执行其后面的顺序语句。
【例5.2.1】 4位带确认的全加器。
4位带确认的全加器由a[3...0]、b[3...0]作为两个加数输入信号,当按下确认按钮“OK”时,进行加法运算,sum[4...0]为和输出信号,其逻辑图如图5.2.1所示。
图5.2.1 4位带确认的全加器的逻辑图
4位带确认的全加器的VHDL描述如下。
4位带确认的全加器的仿真波形如图5.2.2所示。
图5.2.2 4位带确认的全加器的仿真波形
【例5.2.2】 2选1数据选择器。
2选1数据选择器的逻辑图如图5.2.3所示,其中a、b是数据输入信号,s是选择控制信号,y是输出信号。2选1数据选择器的功能如表5.2.1所示。当选择信号s=0时,y=a;当选择信号s=1时,y=b。
图5.2.3 2选1数据选择器的逻辑图
表5.2.1 2选1数据选择器的功能表
2选1数据选择器的VHDL描述如下。
【例5.2.3】 8-3线优先编码器。
8-3线优先编码器的功能如表5.2.2所示。
表5.2.2 8-3线优先编码器的功能表
8-3线优先编码器的VHDL语言描述如下。
【例5.2.4】 十进制循环加法计数器。
十进制循环加法计数器是指当时钟信号clk的上升沿来到时,计数器的状态加1,如果计数器的原态是9,则计数器返回到0的计数器。
十进制循环加法计数器的VHDL描述如下。
十进制循环加法计数器的仿真波形如图5.2.4所示。
图5.2.4 十进制循环加法计数器的仿真波形
5.2.2 CASE语句
CASE语句是根据表达式的值,从多项顺序语句中选择满足条件的一项来执行的语句。CASE语句的格式如下。
WHEN选择可以有以下4种表达方式。
(1)单个普通数值,即形如WHEN选择值顺序语句。
(2)并列数值,即形如WHEN值/值/值顺序处理语句。
(3)数值选择范围,即形如WHEN值TO值顺序语句。
(4)WHEN OTHERS顺序处理语句。
执行CASE语句时,首先计算表达式的值,然后执行在条件语句中找到的选择值与其值相同的语句,并执行该顺序语句。当表达式的值与所有的条件句的选择值都不相同时,则执行OTHERS后面的顺序语句。注意:条件句中的“”不是操作符,而是相当于“then”的作用。
在使用CASE语句时有以下三点需要注意。
(1)CASE语句中的所有选择条件必须被枚举,不允许在WHEN语句中有相同的选择,否则编译将会给出语法出错的信息。
(2)所有WHEN后面的选择值在CASE语句中必须是表达式的所有取值,不能有所遗漏。如果CASE语句中的表达式包含多个值,一一列举十分烦琐,可以使用OTHERS来表示所有具有相同操作的选择。
(3)CASE语句中的WHEN语句可以颠倒次序而不会发生错误,但保留字OTHERS必须放在最后面。
【例5.2.5】 用CASE语句描述二输入与非门。
图5.2.5所示的为二输入与非门的逻辑图,其中a、b是输入信号,y是输出信号,输出与输入的逻辑关系表达式为
表5.2.3所示为二输入与非门的真值表。
图5.2.5 二输入与非门的逻辑图
表5.2.3 二输入与非门的真值表
二输入与非门用CASE语句的VHDL描述如下。
【例5.2.6】 用CASE语句描述4选1数据选择器。
4选1数据选择器的逻辑图如图5.2.6所示,其真值表如表5.2.4所列。数据选择器在控制信号s1和s2的控制下,从输入数据信号a、b、c、d中选择一个并传送到输出。
图5.2.6 4选1数据选择器的逻辑图
表5.2.4 4选1数据选择器的真值表
4选1数据选择器用CASE语句的VHDL描述如下。
【例5.2.7】 用CASE语句描述3-8线译码器。
3-8线译码器通过3个输入信号a(2downto 0)的不同组合,从8个输出端口y(7 downto 0)中选择一个作为有效输出端口,其功能如表5.2.5所示。
表5.2.5 3-8线译码器的功能表
3-8线译码器的VHDL描述如下。
【例5.2.8】 用CASE语句描述一个七段码的共阴。
七段码的共阴的VHDL描述如下。
5.2.3 LOOP语句
LOOP语句是循环语句,它使一组顺序语句重复执行,执行的次数由设定的循环参数确定。LOOP语句有三种使用方式,LOOP语句可以用“标号”给语句定位,也可以不使用“标号”来定位。
1.FOR_LOOP语句
FOR_LOOP语句的语法格式如下。
FOR_LOOP循环语句适用于循环次数已定的程序,语句中的循环变量是一个临时变量,属于LOOP语句的局部变量,不必事先声明。这个变量只能作为赋值源,而不能被赋值,它由LOOP语句自动声明。
在FOR_LOOP循环语句中,关键字IN用来指定循环范围。循环范围有两种表示方式:“初值TO终值”和“初值DOWNTO终值”。
FOR_LOOP循环从循环变量的初值开始,到终值结束,每执行一次循环,循环变量自动递增或递减1。因此,循环次数=|终值-初值|+1。
【例5.2.9】 8位奇偶校验器的描述。
该8位奇偶校验器用a表示输入信号,它的长度为8b。在程序中,FOR_LOOP语句输入a的值,逐位进行模2加法运算(异或运算),用循环变量控制模2加法的次数,使循环体执行8次。
该程序实现8位奇偶校验器的奇校验功能,当电路检测到输入1的个数为奇数个时,输出y=1;若为偶数,则输出y=0。其VHDL描述如下。
8位奇偶校验器的仿真波形如图5.2.7所示。
图5.2.7 8位奇偶校验器的仿真波形
【例5.2.10】 一个二进制数转换为十进制数的描述。
一个二进制数转换为十进制数的VHDL描述如下。
2.WHILE_LOOP语句
WHILE_LOOP语句的语法格式如下。
WHILE_LOOP循环语句并没有给出循环次数,没有自动递增循环变量的功能,它的循环次数由循环控制条件控制。循环控制条件可以是任何布尔表达式,如a=b、a>0等。当条件为TRUE时,执行循环体;当条件为FALSE时,跳出循环,执行循环体后面的语句。
【例5.2.11】 用WHILE_LOOP语句实现【例5.2.9】的奇偶校验器的VHDL描述。
3.LOOP语句
LOOP语句的语法格式如下。
单个LOOP语句是最简单的LOOP语句循环方式,这种循环语句需要引入其他控制语句(如EXIT、NEXT等)才能确定,否则为无限循环。
例如:
5.2.4 NEXT语句
NEXT语句主要用在LOOP语句内部控制循环,其语法如下。
NEXT[标号][WHEN条件表达式];
NEXT语句的格式有以下3种。
『格式1』:
NEXT
当LOOP内的顺序语句执行到NEXT语句时,无条件结束本次循环,跳回到循环体的开始位置,执行下一次循环。
『格式2』:
NEXT LOOP标号
该语句的功能是,结束本次循环,跳转到“标号”指定的位置循环。
『格式3』:
NEXT[标号]WHEN条件表达式
这种语句的功能是,当“条件表达式”的值为TRUE时,结束本次循环,否则继续循环。
【例5.2.12】 下面为使用NEXT语句的VHDL描述。
5.2.5 EXIT语句
EXIT语句也是用来控制LOOP的内部循环,进行有条件或无条件的跳转控制,其语法如下。
EXIT[标号][WHEN条件];
EXIT语句的格式有以下3种。
『格式1』:
EXIT
无条件跳出循环,执行END LOOP下面的顺序语句。
『格式2』:
EXIT标号
无条件跳出循环,转到“标号”规定的位置执行顺序语句。
『格式3』:
EXIT[LOOP标号]WHEN条件表达式
当“条件表达式”的值为“TRUE”时,才跳出循环,否则继续执行循环。
EXIT语句与NEXT语句的区别是:EXIT是从整个循环中跳出而结束循环;而NEXT语句是用来结束循环执行过程的某一次循环,并重新执行下一次循环。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。