VHDL的基础语句
条件语句
-
根据条件的变化,得到不同的结果
-
条件语句可以只是一个值(能参与逻辑判断的数据类型),也可以是复杂的表达式,用逻辑操作符连接
-
可以按执行方式分为两大类:
- 顺序语句(使用时需要放到进程语句中):IF语句;CASE语句
- 并行语句:WHEN语句
IF条件语句
-
IF语句的格式
IF 判断条件 THEN 执行语句; ELSIF 判断条件 THEN 执行语句; ELSE 执行语句; END IF; -
使用IF实现计时器
通过IF语句的嵌套,可以实现逻辑,以计时器电路为例:
BEGIN PROCESS(clk,rst,en,load) BEGIN IF rst='0' THEN QU<=(OTHERS=>'0');--复位低电平有效,输出清零 ELSIF clk'EVENT AND clk='1' THEN --如果是时钟上升沿 IF en='1' THEN --如果计数器使能 IF (load='0') THEN QU<= data; --如果收到重置信号 ELSE IF QU<9 THEN QU <= QU+1; tcu<='0';--如果计数小于9计数值加1 ELSE QU <=(OTHERS=>'0'); tcu<='1';--计数已经是9就把计数值清零并产生进位 END IF; END IF; END IF; END IF; END PROCESS; END ARCHITECTURE;
CASE语句
-
CASE语句格式
CASE 判断条件 IS WHEN 选择值1 => 执行顺序语句1; ……顺序语句;--这里的=>不是操作符,它相当于IF语句的THEN WHEN 选择值2 => 执行顺序语句2; ……顺序语句; WHEN OTHERS => 执行顺序语句3; ……顺序语句; END CASE; -
关于选择值
-
WHEN中的选择值必须在CASE判断条件表达式的取值范围内 -
每个选择值只能出现一次
-
选择值可以有多种表达方式:
-
单个普通数值
-
数值的选择范围,如(2 TO 4)取值就为2,3,4
特别注意每个选择值只能出现一次的条件,不要让选择值范围出现重叠
-
并列数值,如3|5,表示取值可以是3也可以是5
-
-
-
关于WHEN OTHERS
-
除非选择值能涵盖所有取值,否则必须加上
WHEN OTHERS -
如果对于未涵盖的其他条件没有相关操作,可以写
WHEN OTHERS => NULL;但是最好写顺序语句,这样才能综合出纯组合电路(否则需要一个锁存器才能实现NULL语句)
-
WHEN OTHERS只能出现一次,而且必须处在最后一个条件
-
-
CASE与IF语句的比较
- 显然,CASE对每个条件的描述更为清晰
- CASE语句中条件的次序不重要,各个语句并行,不像IF有逐个判断的过程
- 对于相同的逻辑功能,CASE语句会比IF语句占用更多的硬件资源
- 有些逻辑只能用IF描述,因为CASE语句缺乏条件相与功能以及自动包含逻辑值“-”的功能,只能条件相或
WHEN语句
-
WHEN语句与IF和CASE不同,它是并行语句
-
条件信号赋值语句
赋值目标 <= 表达式 WHEN 赋值条件 ELSE 表达式 WHEN 赋值条件 ELSE …… 表达式;每个赋值条件按书写先后顺序决定,第一子句有最高优先级,一旦发现条件为TURE,立刻给将表达式的值赋给赋值目标;如果没有符合条件的,就赋值最后一个表达式(只有最后的表达式有分号)
z <= a WHEN p1 ='1' ELSE b WHEN p2 ='1' ELSE c; --当p1和p2都是1时,z会被赋值a -
选择信号赋值语句
WITH 选择表达式 SELECT 赋值目标信号 <= 表达式 WHEN 选择值, 表达式 WHEN 选择值, …… 表达式 WHEN 选择值;--最后一句才用分号作用是在根据不同特定条件下为目标信号赋不同的值
-
虽然是并行语句,但是和CASE语句很类似
同样由敏感信号的值决定操作
条件的次序同样不重要,不像条件信号赋值语句那样有从上自下的判断过程
-
同样不允许选择条件重叠与条件涵盖不全
在条件不能涵盖所有情况时,需要在末尾加与NULL相近的关键词
UNAFFECTEDUNAFFECTED WHEN OTHERS;--写在最末行
-
循环语句
- 作用是使包含的一组顺序语句被循环执行,其执行次数由设定的循环参数决定
- 在VHDL设计中要谨慎使用循环语句,因为C语言中的循环是以时间为代价换空间,而VHDL的每一次循环却要产生一套硬件模块,极其耗费硬件资源
- LOOP语句有两种常用的表达方法:单个LOOP和FOR_LOOP
单个LOOP语句
-
LOOP语句格式
LOOP标号: LOOP 顺序语句 END LOOP LOOP标号 -
EXIT语句跳出循环
一般用于决定跳出循环的条件
L2 : LOOP a:= a+1; EXIT L2 WHEN a>10;--当a>10时跳出循环 END LOOP L2;其有三种格式:
EXIT;--用于跳出当前LOOP EXIT LOOP标号;--和不加标号功能相同,如果有多个LOOP嵌套则需使用 EXIT LOOP标号 WHEN 条件;--当满足某个条件时跳出循环,只有一层LOOP时可以省略标号 -
NEXT语句
其和EXIT语句很相似,功能上的区别是EXIT跳到循环的末尾(跳出循环),NEXT则是跳到循环的开头(重新循环)
NEXT;--无条件停止当前循环,开始下一次循环 NEXT LOOP标号;--与上一句功能相同,用于有多个LOOP嵌套的情况 NEXT LOOP标号 WHEN 条件表达式;--满足某个条件时跳转,只有一层LOOP时可以省略标号
FOR LOOP
-
FOR LOOP语句格式
LOOP标号: FOR 循环变量, IN 循环次数范围 LOOP 顺序语句 END LOOP LOOP标号 -
关于循环变量
-
循环变量是一个临时变量,不需要事先定义
-
属于LOOP的局部变量,因此其中语句不应该再使用与之同名的标识符
-
循环变量从循环次数范围的初值开始,每执行一次递增1,直到范围最大值
-
循环次数范围应该以常数表示,否则循环变量将重复任何可能的逻辑值导致硬件消耗过大
-
WAIT语句
WAIT的基本格式
-
在顺序语句中,当执行到WAIT语句时,运行程序将被挂起,其有四种格式
WAIT;--表示永远挂起 WAIT ON 敏感信号表;--信号表中的敏感信号变化将会结束挂起 --但是,已经列出敏感量的进程中不能使用任何形式的WAIT语句,因此要使用此形式,PROCESS语句后不能有敏感信号表 WAIT UNTIL 条件表达式;--条件等待语句,相较上一句,其不仅要求表达式中的信号发生改变,还要求信号变化符合条件 WAIT FOR 时间表达式;--等待一段时间,类似信号赋值的AFTER
WAIT UNTIL格式使用
-
WAIT ON增加符合条件表达式的限制就成了WAIT UNTIL,它们可以实现一样的功能,但是只有WAIT UNTIL格式能够被综合,其他语句只能在仿真中运行
WAIT UNTIL en='1'; --这一句与下面的功能一致 LOOP WAIT ON EN; EXIT WHEN EN ='1'; END LOOP; -
wait until语句有三种表达方式
WAIT UNTIL 信号=value; WAIT UNTIL 信号'EVENT AND 信号=value; WAIT UNTIL NOT 信号'STABLE AND 信号=value;
本文来自博客园,作者:无术师,转载请注明原文链接:https://www.cnblogs.com/artlessist/p/18613650
本文使用知识共享4.0协议许可 CC BY-NC-SA 4.0
特别说明版权归属的文章以及不归属于本人的转载内容(如引用的文章与图片)除外
浙公网安备 33010602011771号