VHDL 数据对象
Data Objects(数据对象)4种,变量VARIABLE,常量CONSTANT,信号SIGNAL,文件FILE。
CONSTANT相当电路里恒定的电平,GND或VCC。
VARIABLE和SIGNAL区别
1 SIGNAL可以设置传输延时,VARIABLE 不可以
2 VARIABLE只能做局部信息载体,SIGNAL可以做为模块间的信息载体
3 VARIABLE有时后只是一种过渡,最后的信息传输和截面间的通信都是 通过SIGNAL完成的。
尽管VHDL仿真器允许变量和信号设置初始值,但在实际应用中,VHDL综合器并不会把这些信息综合进去。
VARIABLE
VARIABLE 是局部变量只能在进程和子程序中使用。不存在延时行为(仿真过程中共享变量例外)
VARIABLE 变量名:数据类型 :=初始值;
例子:
VARIABLE a: INTEGER;
VARIABLE b,c:INTEGER:=2; --综合器将略去所有初始值
VARIABLE d: STD_LOGIC; --定义标准位变量
变量赋值:
目标变量名:=表达式;
例子:
VARIABLE x,y: REAL;
VARIABLE a,b:BIT_VECTOR(0 T0 7):
x:=100.0;
y:=1.5+x; --运算表达式赋值
a:=b;
a:="10100101"; --位矢量赋值
a(3 TO 6):=('1','1','0','1',);
a(0 TO 5):=b(2 TO 7);
a(7):='0'; --位赋值
VHL'93 支持共享变量,但现在大多数VHDL不支持
SHARED VARIABLE fre: BOOLEAN:=true;
SIGNAL
SIGNAL类似连接线。SIGNAL做为一种数值容器
不但能容纳当前值,还能容纳历史值。这一点与触发器的记忆功能有很好的对应关系。
除了没有方向以外,SIGNAL和实体的端口(PORT)概念是一致的。信号可以看成实体内部的端口
格式:
SIGNAL 信号名:数据类型:=初始值;
例子
SIGNAL temp: STD_LOGIC :=0;
SIGNAL flaga,flagb:BIT;
SIGNAL data: STD_LOGIC_VECTOR(15 T0 0);--定义了一个位失信号
--或总线信号
--或数组信号
SIGNAL a:INTEGER RANGE 0 TO 15; --定义了一个整数变化范围为0-15
用户可以自定义信号数据类型,
TYPE four IS ('X','0','1','Z');
SIGNAL s1: four;
s1的初始值是默认的,VHDL规定初始值取 LEFT‘most项,数组中最左项
在进程中,只能将信号列入敏感表,不能将变量列入敏感表,这是因为只有信号才能把进程外的东西带入进程内。
目标信号名〈=表达式;
〈=表示信息传入。可以设置延时。信号获得传入的数据并不是即时的。即使是零延时,也要经历一个特定的延时过程。因此〈=两边的数值并不总一致,这与实际器件的延时很接近,
信号的初始值符号仍是:= 这是因为仿真的坐标是从初始赋值开始的,在此之前无所谓延时
x<=9;
z<=x AFTER 5ns;
尽管综合器在综合的时候略去所设置的延时,但是即使没有利用AFTER关键词设置信号的赋值延时,任何信号赋值都是存在延时的。
在综合后的功能仿真中,信号或变量间的延时是看成零延时的,但为了给信息传输的先后做出符合逻辑的排序,将自动设置一个小的延时。即一个VHDL模拟器的最小分辨率时间。
顺序信号赋值,要看进程是否被启用。
并行信号赋值,各自独立并行的发生。
在进程中,允许同一个信号有多个驱动源(赋值源)
在结构体中并行信号赋值语句的运行是独立于结构体中的其他语句的,每当驱动源改变,都会发生并行赋值操作。
常数
常数的定义和设置主要是为了使设计的实体中的常数容易读和修改。
例如,将位矢量的宽度定义为一个常数,只要修改这个常数就能容易的改变宽度,从而改变硬件结构。具有全局性。
CONSTANT 常数名:数据类型:=表达式;
CONSTANT dely:TIME:=25ns;--时间类型
在程序包中定义的常量可以暂不设定具体数值,它可以在程序包体中设定
PACKAGE t IS
CONSTANT rst : STD_LOGIC;
END PACKAGE t;
PACKAGE BODY t IS
CONSTANT rst : STD_LOGIC:='0';
END PACKAGE BODY t;
可视性 使用范围
文章评论(0条评论)
登录后参与讨论