VHDL的基本描述语句
VHDL的基本描述语句有并行语句(Concurrent Statements)和顺序语句(Sequential Statements)两大类(如表8-3所示)。在系统设计中,这些基本描述语句从不同侧面完整地描述了数字系统的硬件结构和基本逻辑功能。
表8-3VHDL的并行语句和顺序语句
并行语句用于表示算法模块间的连接关系,相互之间无次序关系,它们是并行执行的,与书写顺序无关。VHDL的结构体由若干相互联系的并行描述语句组成,如图8-3所示。
并行描述语句在结构体中的语法格式如下:
ARCHITECTURE 结构体名OF 实体名IS
{说明语句}
BEGIN
{并行语句}
END ARCHITECTURE 结构体名;
并行描述语句主要有:并行信号赋值语句(Concurrent Signal Assignments)、进程语句(Process Statements)、块语句(Block Statements) 、元件例化语句(Component Instantiations)、生成语
句(Generate Statements) 及并行过程调用语句(Concurrent Procedure Calls)等六种。其中,进程语句和块语句是两种最主要、最常用的并行描述语句。
本节介绍这六种并行描述语句及其功能。
一、进程语句(TOP)
进程PROCESS语句本身是并行描述语句,但却包含一系列顺序描述语句。所以,设计中各个进程是并行执行,而各进程内的顺序描述语句却是按顺序执行。
进程与其他部分的通信,是通过从进程外的信号或端口中读取或者写入值来完成。进程语句的语法格式如下:
[进程名称:]PROCESS [(敏感表)]
{进程声明}
BEGIN
{顺序语句}
END PROCESS [进程名称];
其中,进程声明是对子程序、类型、常量和变量等的说明;敏感表(Sensitivity_list)是所有敏感信号(包括端口)的列表;敏感表的语法格式为:
信号名称{,信号名称}
所谓进程对信号敏感,是指当信号发生变化时,能够触发进程中语句的执行。这种敏感方式有两种:显式敏感表形式和WAIT语句形式。如果进程包含wait或者ifevent语句,必定包含时序组件。此时,IEEE VHDL不允许有敏感表存在。所以,进程语句也为时序算法提供一种自然的手段。
二、块语句(TOP)
块BLOCK语句把几个并行语句打包成结构体的子模块,成为结构体中的一个单独块区域。块语句由一系列并行描述语句构成。块语句的语法格式如下:
[块名称:]BLOCK [(表达式)]
{块声明}
BEGIN
{并行语句}
END BLOCK [块名称];
其中,表达式是块的保护(Guard)条件;块声明是对子程序、类型、常量、信号和组件等的说明。
三、并行信号赋值语句(TOP)
并行信号赋值语句与包含顺序赋值语句的进程等价。并行信号赋值语句为被赋值的信号定义了新的驱动源。并行信号赋值语句有:简单信号赋值语句、条件信号赋值语句和选择信号赋值语句三种。
简单信号赋值语句是VHDL 并行语句结构的最基本的单元。它的语句格式如下:
赋值目标<= 表达式
其中,赋值目标是接受表达式的值的信号,它的数据类型必须与表达式的数据类型一致。
条件信号赋值语句与进程中的IF 语句相同,它们有十分相似的顺序性。条件信号赋值语句的语法格式如下:
赋值目标<= {表达式WHEN 赋值条件ELSE}
表达式
执行条件信号语句时,每一赋值条件是按书写次序逐项测定的。一旦发现赋值条件= TRUE,立即将表达式的值赋给赋值目标变量。这里的赋值条件的数据类型是布尔量,当为真时表示满足赋值条件。
注意,条件赋值语句中的ELSE不可省;最后一项表达式可以不跟条件子句,表示以上各条件都不满足时则将此表达式赋予赋值目标信号。
选择信号赋值语句的语法格式如下:
WITH 选择表达式SELECT
赋值目标信号<={表达式WHEN 选择值}
表达式WHEN 选择值
其中,选择值是目标信号被赋对应表达式的值的条件,当选择表达式等于某个选择值时,赋值目标信号被赋对应表达式的值。
所以,虽然选择信号赋值语句不能在进程中使用,但其功能却与进程中的CASE 语句的功能相似。
需要注意的是:选择值不能重叠;并且必须包容所有的条件。它的最后选择值可以是OTHERS。
四、组件例化语句(TOP)
组件例化MAP语句已经在本章第二节中介绍过。组件例化是为了定义一个设计层次或者建立一个VHDL网表。这里从并行描述语句的角度,对它作更细节的说明。组件例化语句的语法结构如下:
实例名称:组件名称PORTMAP(
[端口名称=>]表达式
{,[端口名称=>]表达式} );
其中,实例名称是该组件的实例的名称;组件名称是端口映射组件的名称;表达式是一个信号名、索引名、片段名或者集合,指示组件端口的连接方法;端口映射将组件的各端口与当前实体中信号值表达式连接起来。
五、生成语句(TOP)
生成GENERATE语句用于复制并行描述语句(如组件、进程或者块)的若干备份。生成语句有两种形式。
(一)FOR…GENERATE语句形式
FOR…GENERATE语句用离散的范围决定备份的数目。它描述重复模式。它的语法格式如下:
标号:FOR标志符IN 范围GENERATE
[说明]
BEGIN
{并行语句}
ENDGENERATE [标号];
其中,标号是该语句的名称,用于建立嵌套生成语句;标志符自动由生成语句本身说明,并且是局部的,只存在于该语句内;范围必须是可计算的整数范围,用to或者downto。
(二)IF …GENERATE语句形式
IF …GENERATE语句有条件地生成0或者1个备份。它描述一个结构中的例外情形。它的语法格式如下:
标号:IF 条件表达式GENERATE
[说明]
BEGIN
{并行语句}
END GENERATE [标号];
其中,标号是该语句的名称;表达式是求值结果为布尔型的任何表达式;并行语句可以是任意并行描述语句,包括别的生成语句。
六、并行过程调用语句(TOP)
并行过程调用语句可以作为一个并行语句直接出现在结构体或块语句中。并行过程调用语句通常用于获得一个过程的多个备份。并行过程调用语句的语句调用格式如下:
过程名[([参数名=>]表达式
{,[参数名=>]表达式})];
结构体或块语句中的并行过程调用语句与一个进程等价。等价的进程读取过程中的所有in和inout型参数。(TOP)