上次我们了解了VHDL语言的并行语句,现在我们来学习VHDL的顺序语句。
顺序语句与并行语句共同构成了VHDL的描述语言,是VHDL作为硬件描述语句的一个特点。顺序语句只在仿真时间上是相对并行语句而言的,实际硬件的运行不一定是顺序执行的。
VHDL语言支持的并行语句主要有以下几种:
- 赋值语句
- wait语句
- after语句
- if语句
- case语句
- null语句
- loop语句
- exit语句
- next语句
- assertion/report语句
- return语句
顺序语句在VHDL程序中的位置
顺序语句只出现在进程、过程和函数中,举例如下:
--在进程中出现的位置
process(敏感信号列表)
--声明部分
begin
顺序语句1;
顺序语句2;
...
顺序语句n;
end process;
--在过程中出现的位置
procedure 过程名(参数列表)is
--声明部分
begin
顺序语句1;
顺序语句2;
...
顺序语句n;
end process;
--在函数中的位置
function 函数名(参数列表)return 返回值类型 is
--声明部分
begin
顺序语句1;
顺序语句2;
...
顺序语句n;
return 返回值
end 函数名;
顺序语句的并行执行
顺序语句是VHDL描述语言重要组成部分,但是不能从字面意义上面理解为顺序语句在硬件上就是一条一条地顺序执行,应该从硬件的角度理解顺序语句只是一种描述方式,不要在意顺序性。
一、顺序赋值语句
顺序赋值语句出现在进程、过程和函数中的赋值语句。由于进程、过程和函数中可以出现变量处理,所以顺序赋值语句不仅可以给信号赋值,还可以给变量赋值,它们的赋值格式如下:
信号<=表达式;
变量名:<=表达式;
信号与变量在赋值更新上有区别,信号赋值更新至少有delta延时,而变量的赋值更新是立即执行的。
二、wait语句
wait语句的功能是把一个进程挂起,直到满足等待的条件成立才开始该进程的执行。wait语句一般有以下3种基本形式:
- wait on(敏感信号列表)
- wait until(判断条件表达式)
- wait for(时间)
1、wait on语句
wait on(敏感信号列表)用于挂起进程,直到敏感信号列表中的信号发生变化时再次启动进程。使用格式如下:
*
process
begin
顺序语句1;
顺序语句2;
...
顺序语句n;
wait on(敏感信号列表);
end process;*
2、wait until语句
wait until(判断条件表达式)功能是当判断条件式信号发生变化且判断条件表达式的值为真时,wait until(判断条件表达式)所在的进程或过程将重新执行,直到wait until(判断条件表达式)所在的进程或是过程将被挂起。wait until(判断条件表达式)的基本格式如下:
*process
begin
顺序语句1;
顺序语句2;
...
顺序语句n;
wait until 判断条件表达式;
end process;*
3、wait for语句
wait for时间t语句功能是把进程挂起时间t,之后再启动进程。wait for语句一般用VHDL测试文件,综合工具一般不支持。格式如下:
*process
begin
顺序语句1;
顺序语句2;
...
顺序语句n;
wait for 时间t;
end process;*
三、after语句
after语句是信号赋值延时语句,一般只在仿真或仿真测试时使用,基本格式如下:
信号<=表达式 after 时间;
举例如下:
data<=da or db after 10ns;//功能是da与db取或后延时10ns赋给data。
四、if语句
if语句是顺序语句中最常用的语句之一,功能是通过对分支条件的判断来决定执行哪个分支的顺序语句。一般有以下3种形式:
- 单分支if语句
- 两分支if语句
- 多分支if语句
1、单分支if语句
如果if的判断条件为真,则执行下面的相关语句;否则,不做任何操作。格式如下:
if 条件判断表达式 then
顺序语句;
end if;
2、两分支if语句
如果if的判断条件为真,则执行分支1的相关语句;否则执行分支2的相关语句。所以,两分支if语句可以看成一个二选一选择器。基本格式如下:
if 条件判断表达式 then
顺序语句1;
else
顺序语句2;
end if;
两分支if语句不会产生锁存器。
3、多分支if语句
如果第一个条件判断为真,则执行分支1语句;否则,如果判断第二个条件判断为真,则执行分支2的语句。以此类推,如果所有条件为假,如果有else分支,则执行else分支的语句;如果没有,则不做任何操作。基本格式如下:
--有else分支
if 条件判断表达式1 then
顺序语句1;
elseif 条件判断表达式2 then
顺序语句2;
...
elseif 条件判断表达式n then
顺序语句n;
else
顺序语句n+1;
end if;
--或是没有else 分支
if 条件判断表达式1 then
顺序语句1;
elseif 条件判断表达式2 then
顺序语句2;
...
elseif 条件判断表达式n then
顺序语句n;
end if
五、case语句
功能是通过对分支条件得到判断来决定执行哪个分支的顺序语句。一般形式如下:
case 判断表达式 is
when 选择项 1=>
顺序语句1;
when 选择项 2=>
顺序语句2;
...
when 选择项 n=>
顺序语句n+1;
when others=>
顺序语句n+1;
end case;
当执行case语句时,首先要计算表达式的值,如果表达式的值与选择项1相等,则执行顺序语句1;否则,如果表达式的值与选择项2相等,则执行顺序语句;依次比较,如果所有选择项都与判断表达式的值不相等,则执行others分支下的顺序语句n+1。选择项可以是一个值,也可以是多个值“|”相连,也可以是用to约束的一个范围,但选择项不能有重复。
有关case选择项有以下几点说明:
- 选择项取值必须在判断表达式的取值范围内
- 各个选择项不能有重复
- 如果选择项不能列举完判断表达式的所有情况,最后必须加others选择项
六、null语句
null语句语法意义在于不做任何操作,也没对应的综合结果。只是显示说明在某些情况下不做任何操作,在一定程序上能提高VHDL程序的可读性,一般格式如下:
null;
七、loop语句
loop语句功能是循环执行一条或多条顺序语句,主要有3种基本形式:
- for循环形式
- while循环形式
- 条件跳出形式
1、for/loop语句
一般格式如下:
for 循环变量 in 循环变量的范围 loop
顺序语句;
end loop;
2、while/loop语句
while循环形式一般格式如下:
标号:while 循环的条件 loop
顺序语句;
end loop 标号;
while循环形式的loop语句在循环条件为假时跳出循环。
八、exit语句
exit语句格式有3种:
1、exit //第一种
2、exit loop 标号 //第二种
3、exit loop 标号 when条件表达式 //第三种
条件跳出形式一般格式如下:
标号:loop
顺序语句;
exit when 跳出循环条件;
end loop 标号;
九、next语句
主要用在loop语句执行中进行有条件的或无条件的转向控制,基本格式有以下三种:
- next (当loop内的顺序语句执行到next语句时,则无条件终止当前的循环并跳回到本次循环loop语句处开始下一次循环)
- next loop 标号 (在next旁边加loop标号后的语句功能与未加loop标号的功能相同,只是有多重loop语句嵌套时,前者可跳转到指定标号的loop语句处重新开始执行循环操作)
- next loop 标号 when条件表达式(分句“when条件表达式”是执行语句的条件,如果条件表达式的值为true,则执行next语句进入跳转操作;否则,继续向下执行)
10、return 语句
只能在函数中使用,用于返回函数的返回值,基本格式如下:
return 表达式;
表达式就是函数的返回值;