VHDL的顺序行为


VHDL的顺序行为

 
  顺序语句在进程语句内部,顺序行为语句可分为两大类:一是条件控制类,二是循环控制类。   

IF语句 CASE 语句   FOR语句   WHILE..LOOP语句   EXIT语句 断言语句

IF语句

IF语句的一般形式为:

IF  < 条件>  THEN
  < 语句> ;
ELSIF < 条件>  THEN
  < 语句> ;
ELSIF < 条件>  THEN
  < 语句> ;
ELSE
  < 语句> ;
END IF;

  IF语句的一般形式是以关键字IF开头和关键字END IF结尾,END IF应分开写并且分开读。
  关键字ELEIF和ELSE是可选句,ELSIF可以多次使用,而ELSE仅可使用一次。
  < 条件>部分是一个布尔表达式,即是一种算出是真或是假的表达式,当条件为真时去执行接下来的语句部分;如果条件为假就去执行接下来可选的顺序语句ELSIF或ELSE。

例21:用VHDL设计一家用告警系统的控制逻辑,它有来自的三个输入信号smoke、door、water和准备传输到告警设备的三个输出触发信号fire_alarm、burg_alarm、water_alarm以及使能信号en和alarm_en。VHDL程序描述如下:

LIBRARY  ieee;
    USE ieee.std_log_1164.all;
    ENTITY  alarm  IS
         PORT(smoke,door,water:IN std_logic;
                     en,alarm_en :IN std_logic;
                    fire_alarm,burg_alarm,water_alarm:OUT std_logic);
    END  alarm;
   ARCHITECTURE  alarm_arc  OF  alarm  IS
        BEGIN
             PROCESS(smoke,door,water,en,alarm_en)
                BEGIN
                   IF ((smoke= ‘1’) AND (en= ‘0’))  THEN
                       fire_alarm <=  ‘1’;
                  ELSE
                      fire_alarm <=  ‘0’;
                  END IF;
                  IF ((door= ‘1’) AND ((en= ‘0’) AND (alarm_en= ‘0’)))  THEN
                     burg_alarm <=  ‘1’;
                  ELSE
                     burg_alarm <=  ‘0’;
                 END IF;
                 IF ((water= ‘1’) AND (en= ‘0’)) THEN
                      water_alarm <=  ‘1’;
                 ELSE
                     water_alarm <=  ‘0’;
                END IF;
            END  PROCESS;
 END  alarm_arc;

程序中用了三个分开的IF语句描述其功能,它们都没有ELSIF关键字,可以看出每个IF语句描述了一个输出端口。第一个IF语句是检测有没有烟雾报警情况,有烟雾火警灾情发生立即产生报警信号,触发fire_alarm。第二和第三IF语句检测不同的报警信号,和第一句相仿。

此模块的输入端口有两个使能信号,en使所有的输入都能到达输出,而用alarm_en端口,只对防盗告警系统使能。需要指出的是这种功能很容易用逻辑方程描述,如前面的并行行为程序的例子。但是有时IF语句的形式是更可读、更容易理解。图8-11给出了报警控制逻辑图。

 


CASE 语句

CASE语句的一般形式:
     CASE < 表达式>   IS
        WHEN   < 值>  =>  < 语句> ;
    WHEN   < 值> | < 值> =>  < 语句> ;
        WHEN   < 离散范围>  =>  < 语句> ;
    WHEN   OTHERS  =>  < 语句> ;
    END  CASE;

CASE语句是VHDL提供的另一种形式的控制语句,每当单个表达式的值在多个起作用的项中选择时,用此语句是较合适的,它根据所给表达式的值或域,选择“=>”后面的执行语句。

用CASE语句应该注意三个问题:

一是关键字WHEN的数量不作限制,但不容许两个语句用一个值;

二是CASE语句中WHEN后面的所有值合起来是表达式的值域;

三是WHEN的次序可以任意排定,但OTHERS必须在最后面,而且一个CASE 语句仅有一个OTHERS行。


FOR语句                              

FOR循环语句的一般形式为:

< 循环标号> :FOR < 循环变量>  IN  < 范围>  LOOP
                                           < 语句> ;
                                  END  LOOP  < 循环标号> ;

下面举一两位数乘方电路来说明循环FOR语句的用法:

例22:

FOR  I  IN  1  TO  3  LOOP
                         a(i):= i*i;
                    END  LOOP;

此例中循环语句变量为I,循环范围为“1  TO  3”,语句部分是乘方。

  • WHILE..LOOP语句

WHILE..LOOP循环语句的一般形式为:

< 循环标号> :WHILE  < 条件>  LOOP
                                                < 语句> ;
                END  LOOP  < 循环标号> ;

循环的条件是布尔表达式,在每次执行循环前检查条件为真时执行循环,为假时结束循环。

例23:

WHILE  ( X< 10)  LOOP
                            X:= X+1;
                   END  LOOP;

例题中语句部分执行的操作是加1,而表达式是X< 10。当X< 10为真时,执行语句部分X:= X+1,直到X等于10,表达式为假结束循环。


EXIT语句                            

上述两例是在不满足条件表达式或完成了循环的范围时退出循环,另一种退出循环是有严重错误发生时,EXIT语句允许提前退出正在执行的循环语句,去执行紧跟在循环语句后面的语句,下例解释这种情况。

例24:

PROCESS (a)
           VARIABLE  int:INTEGER;
        BEGIN
            int:= a;
            FOR I IN 0 TO 255   LOOP
            IF (int <=  0) THEN
            EXIT;
            ELSE
               int:= int-1;
                  q(i) <= 3.1416/REAL(int*i);
            END IF;
          END  LOOP;
          Y <=  q;
       END  PROCESS;
              ┇

在进程语句内部,假定int的值总是大于零。如果int的值是负或为0,则会得到一个错误的条件并且不能完成计算。此时,IF语句中的条件表达式为真,执行EXIT语句终止循环,去执行循环语句外面的另一条赋值语句Y <=  q。循环语句还可以嵌套在另一个循环语句内部,使用EXIT语句,可以跳到较外的一个循环语句,也可以跳到循环最外部的程序,跳到哪里,视EXIT后面的标号而定,如:

EXIT  < 标号> ;


断言语句                         

用断言语句对描述中的模型添加限制条件,报告一条文本的字符串。断言语句检查一个布尔表达式为真或为假,当条件为真,该语句任何事都不做;如果为假,断言语句将设计者规定的字符串输出到标准的输出终端,另外,还可以规定输出的严重级别,级别共分四种:注意(note)、告警(warning)、出错(error)和失败(failure)。按严重级别分类断言语句是设计者分析自己设计的电路的好办法,而且按断言语句的报告找到描述语言出错的位置。断言语句不构造硬件,主要用于模块的预期处理,所以和综合设计的硬件系统无关。

断言语句的一般形式如下:

ASSERT  < 条件>

REPORT  < 输出信息>

SEVERITY  < 严重级别> ;

当条件为假时,系统的输出设备上将输出REPORT后面设计者规定的字符串信息和SEVERITY后面的严重级别。断言语句是非常有用的,它类似于C和Pascal语言中的陷井,当一些重要的限制未得到满足,或者发现不能处理的错误时,就会终止模拟分析过程,提供错误条件的性质和有用信息。下面讨论用VHDL语言设计RS和断言语句在程序中的作用。