2.5.1 VHDL语言的对象
VHDL语言中可以赋值的对象有三种,即常量(Constant)、变量(Variable)和信号(Signal)。数据对象类似于一种容器,它接受不同数据类型的赋值。变量和常量可以从软件语言中找到对应的类型,然而信号的表现比较特殊,它具有更多的硬件特征,是VHDL中最有特色的语言要素之一。
1.常量
常量的定义和设置主要是为了使程序更容易阅读和修改。例如,将逻辑位的宽度定义为一个常量,只要修改这个常量就能很容易地改变宽度,从而改变硬件结构。常量在设计描述中保持某一规定类型的特定值不变,定义之后在程序中不能再改变,因而具有全局性。
VHDL要求所定义的常量数据类型必须与表达式的数据类型一致。常量定义语句所允许的设计单元有实体、结构体、程序包、块、进程和子程序。
常量定义的一般表述如下:
CONSTANT 常量名: 数据类型[:=值];
例如:
CONSTANT width:INTEGER:=8; --Width是整数类型的常数,其值为8
CONSTANT addr:STD_LOGIC_VECTOR(3 DOWNTO 0):=″0010″;
--addr是4位位宽的矢量数组,其值为″0010″
2.变量
在VHDL语法规则中,变量是一个局部量,只能在进程和子程序中使用。变量主要用在高层次的建模和运算中,它的赋值是一种理想化的数据传输,是立即发生的,不存在任何延时行为。变量的主要作用是在进程中作为临时的数据存储单元。
变量定义和赋值的一般表述如下:
VARIABLE变量名:数据类型[:=初始值];--变量定义
变量名:=表达式或值;--变量赋值
例如:
上例中,result是初始值为12的整数类型的变量,该初始值只在仿真器里面有效,由于硬件电路上电后的随机性,综合器并不支持设置初始值。result值在进程中被修改为0。
3.信号
信号是描述硬件系统的基本数据对象,它代表硬件连线,可以作为设计实体中并行语句模块间的信息交流通道。
信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值(这取决于语句的表达方式),这一属性与触发器的记忆功能有很好的对应关系。
信号的使用和定义范围是实体、结构体和程序包,在进程和子程序中不允许定义信号。与变量相比,信号的硬件特征更为明显,它具有全局特性。例如,在实体中定义的信号,在其对应的结构体中都是可见的。
事实上,除了没有方向说明以外,信号和端口(Port)的概念是一致的。对于端口来说,其区别只是输出端口不能读入数据,输入端口不能被赋值。在实体中对端口的定义实质上是做了隐式的信号定义,并附加了数据流动的方向,因此,在实体中定义的端口,在其结构体中都可以看成是一个信号,并加以使用。
信号定义和赋值的一般表述如下:
SIGNAL变量名:数据类型[:=初始值];--信号定义
信号名<=表达式或值;--信号赋值
例如:
信号也可在状态机中表示状态变量,如:
同变量一样,信号的初始值也只在仿真器里面有效,综合器并不支持设置初始值。并且信号赋值不是立即生效,而是要经历一个特定的延时,即δ延时。因此,赋值号“<=”两边的数值并不总是一致的,这与实际器件的传播延迟特性是吻合的。
信号赋值可以出现在一个进程中,也可以直接出现在结构体的并行语句结构中,但它们运行的含义是不一样的。前者属于顺序信号赋值,这时的信号赋值操作要视进程是否已被启动,并且允许对同一目标信号进行多次赋值;后者属于并行信号赋值,其赋值操作是各自独立并行发生的,且不允许对同一目标信号进行多次赋值。在同一进程中,虽然允许对同一信号进行多次赋值,但由于信号是在进程结束时被赋值,因此只有最后一个赋值语句起作用。例如:
该进程运行实际的结果是x=c XOR b,y=c XOR b。
变量的赋值是直接的、非预设的,变量将保持其值直到对它重新赋值,例如:
该进程运行实际的结果是x=c XOR a,y=c XOR b。
因此,准确理解和把握一个进程中的信号和变量赋值行为的特点以及它们功能上的异同,对正确地利用VHDL进行电路设计十分重要。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。