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相近的关键词UNAFFECTED

      UNAFFECTED 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;
    

posted on 2024-12-17 23:17  无术师  阅读(520)  评论(0)    收藏  举报