VHDL中常用的数据对象
2017-03-06刘春梅高香梅
刘春梅 高香梅
摘 要
简要介绍了VHDL中数据对象的基本概念,从不同方面讨论了常用的数据对象的区别与联系,通过实例详细比较了信号与变量的用法。
【关键词】VHDL 变量 信号 常量
1 引言
VHDL是一种常用的高级描述语言,通常包含库、程序包、实体、构造体和配置等部分。而数据对象根据不同情况可以定义在VHDL程序的这些部分中,尤其是信号和变量的使用易产生混淆。
2 数据对象的区别与联系
在VHDL语言中,凡是可以赋予一个值的对象称为客体也可叫做数据对象,能够接受不同数据类型的赋值。常用的数据对象主要有常量、变量和信号三种。
从定义范围来看,常量和信号是全局量,变量是局部量。常量可以在程序包、实体、进程中使用,一般在程序开始前对常量进行赋值。信号是电子电路内部硬件实体相互连接的抽象表示,可以在结构体、程序包和实体说明中使用,信号名不能冲突。变量仅在进程语句、过程语句、函数语句的结构中使用,不能将信息带出对它作出定义的当前设计单元。其中,应用在不同范围的变量名可以重复。
从延时特性来看,常量与变量的赋值是立即生效的,没有延时。VHDL语言规则不支持变量附加延时语句,变量的赋值是一种理想化的数据传输,是立即发生。但是信号的代入赋值是允许延时的。比如,A0<=A1 AFTER 10 ns表示信号A0的值是由A1延时10ns所赋予的。
从赋值方式来看,常量与变量采用的是“:=”进行赋值,信号采用的是“<=”进行代入赋值,但是不论何种数据对象,初始化赋值均采用“:=”,其中,采用“:=”对信号赋初值时候不产生延时。常量的值在程序运行过程不能改变,但是信号与变量可以进行赋值。
常量、变量和信号所赋的值应该与定义的表达式数据类型一致,否则会出现错误。信号与变量也可相互赋值,赋值符号的选择取决于被赋值的数据对象。由于变量只能在所定义进程内使用,若想将变量用于进程外,则可以赋值给同类型的信号。在VHDL中,如果需要对某一数据进行多次操作,则必须使用变量,因为对信号的多次赋值只有最后一次会生效。
3 变量与信号用法的实例分析
数据对象中,变量与信号的用法易混淆,以四选一数据选择器为例,分别采用信号赋值语句和变量赋值语句来实现。A0,A1,A2,A3分别为选择器的一位数据输入端,选择端为S1,S0,其中S1S0分别为00,01,10,11时,选择A0,A1,A2,A3的值给输出端口Q。采用信号赋值语句的结构体程序如下:
ARCHITECTURE one OF mux4 IS
SIGNAL xy:INTEGER RANGE 0 TO 3;
BEGIN
PROCESS(A0,A1,A2,A3,S0,S1)
BEGIN
xy<=0;
IF (S0='1') THEN xy<=xy+1;
END IF;
IF (S1='1') THEN xy<=xy+2;
END IF;
CASE xy IS
WHEN 0=>Q<=A0;
WHEN 1=>Q<=A1;
WHEN 2=>Q<=A2;
WHEN 3=>Q<=A3;
WHEN OTHERS =>NULL;
END CASE;
END PROCESS;
END one;
該程序段内xy是全局量的信号,定义在结构体中,其值与S1S0的值一样,当xy分别为0,1,2,3时,将A0,A1,A2,A3赋给Q。经过Quartus II9.0软件程序编译可以通过。仿真结果如图1所示,其中,输入A0设置为频率较高的周期信号,A1为低电平,A2位频率较低的周期信号,A3为高电平。
从图1仿真结果看出,采用信号赋值语句的结果不正确,分析其原因主要是因为信号赋值是在进程结束时更新,启动一次进程信号xy的值只能改变一次。
下面采用变量赋值语句来实现,对程序进行如下修改:
ARCHITECTURE one OF mux4 IS
BEGIN
PROCESS(A0,A1,A2,A3,S0,S1)
VARIABLE xy:INTEGER RANGE 0 TO 3;
BEGIN
xy:=0;
IF (S0='1') THEN xy:=xy+1;
END IF;
IF (S1='1') THEN xy:=xy+2;
END IF;
CASE xy IS
WHEN 0=>Q<=A0;
WHEN 1=>Q<=A1;
WHEN 2=>Q<=A2;
WHEN 3=>Q<=A3;
WHEN OTHERS =>NULL;
END CASE;
END PROCESS;
END one;
该程序段中,作为局部量的变量定义在进程中,经过软件编译成功。图2为采用变量赋值语句的仿真结果。
从图2看出,当S1S0也就是xy的值为0时,Q输出A0的值,S1S0为1时,Q输出A1的值,S1S0为2时,Q输出A2的值,S1S0为3时,Q输出A3的值,所以采用变量赋值语句的结果实现了选择器的功能,这是因为变量赋值是立即更新,启动一次进程变量xy的值为所需要的最后结果。
4 结束语
在VHDL中,数据对象类似于一种容器,它接受不同数据类型的赋值。常量,变量和信号是常用的三种数据对象。其中,信号与变量的使用容易产生混淆,通过实例分析讨论了信号与变量,如果使用不当,结果会产生错误,因此,在设计中要谨慎使用信号与变量。
参考文献
[1]吴方,刘文娟.EDA技术[M].武汉:武汉大学出版社,2011.
[2]刘昌华.EDA技术与应用——基于Quartus II和VHDL[M].北京:北京航空航天大学出版社,2012.
[3]胥勋涛.EDA技术项目化教程[M].北京:电子工业出版社,2011.
作者单位
安徽农业大学经济技术学院 安徽省合肥市 230011