VHDL数据对象之详解
数据对象类似于一种容器,它接受不同数据类型的赋值, 数据名称必须和右方的表达式类型一致.
- 常量constant
- 变量variable
- 信号signal
常量constant
- 主要是为了使设计实体中的常数更容易阅读和修改
- 通过修改常数,可以改变硬件结构
- 恒定值,一旦赋值后,在程序中不能再改变
- 具有全局意义
constant 常数名: 数据类型 :=表达式;
举例:
constant fbus : bit_vector := "010110";
constant vcc : real := 5.0;
constant delay : time := 25ns;
常量定义的位置
- 实体,结构体,程序包
- 块,进程,子程序
常量的使用范围
- 取决于它被定义的位置,向下包含
- 在程序包定义的的常量可以用于调用此程序包的所有实体中
- 在设计实体中定义的常量可以用于这个实体的所有结构体中
- 定义在某一结构体中的常量只能用于此结构体
- 定义在结构体的某一单元的常量,只能用于该单元中
变量variable
- 变量是一个局部量,不能将信息带出对它做出定义的当前设计单元
- 只能在进程和子程序中使用
- 变量的赋值是一种理想化的数据传输,立即发生,无延时
变量定义
variable 变量名 : 数据类型[:= 初始值];
举例:
variable a : integer;
variable b: integer :=2;
变量赋值
目标变量名 :=表达式
信号signal
- 信号类似于连线,可以作为设计实体中并行模块件的信息交流通道
- 体现了硬件系统运行的并行性
- 体现了传输过程中的惯性延时
- 多驱动源的总线行为
- 容纳当前值,保存历史值
信号的定义
signal 信号名 : 数据类型[:=初始值];
举例:
signal s1 : std_logic := 0;
signal s2 : bit;
signal s3: std_logic_vector(15 downto 0);
信号赋值
目标变量名 <= 表达式;
信号与port的关系
- 信号可以认为是没有方向的端口
- 数据流向是双向的
- 实体中定义的端口,在结构体中,都可以看成是信号,无需重新定义
信号定义的位置
- 实体,结构体,程序包
- 进程和子程序中不允许定义信号,只能使用信号
- 在进程中,只能将信号列入敏感变量列表,而不能将变量列入
三者的比较
- 从硬件电路系统看,常量相当于电路中的恒定电平,如GND, VCC接口,而变量和信号则相当于电路中的连线和连线上的信号值
- 从仿真和VHDL语句的功能上看,信号可以设置延时量,变量不能.变量只能作为局部的信号载体,而信号可以座位模块件的信息载体
- 从综合后的电路上看,信号一般将对应更多的硬件结构
- 虽然仿真器允许设置初始值,但是综合器不理会这些
信号和变量的比较
- 信号代表电路单元,功能模块之间的互联,代表实际的硬件连线
- 作用范围不同:
->信号在程序包,实体,结构体中定义,是全局量,但在进程,子程序中可以使用
->变量只能在进程和子程序中定义使用,是局部量 - 信号赋值延时更新,变量赋值立即更新
- 多次赋值
->在一个进程中多次对信号赋值,最后一次赋值有效
->多个进程对同一信号赋值,对应多源驱动,可实现线与,线或,三态
->对变量的赋值,每次都有效