1.1 运算操作符
①赋值运算符
<= 用于对SIGNAL赋值。
:= 用于对VARIABLE,CONSTANT和GENERIC赋值,也可用于赋初始值。
=> 给矢量的某些位赋值,或对某些位之外的其他位(常用OTHERS表示)赋值。
w <= (0 => '1', OTHERS => '0');
--最低位是1,其他位是0。
②逻辑运算符
操作数必须是BIT,STD_LOGIC或STD_ULOGIC类型或它们的扩展(BIT_VECTOR,STD_LOGIC_VECTOR或STD_ULOGIC_VECTOR,逻辑运算时各位分别进行逻辑运算)。
·NOT——取反
·AND——与
·OR——或
·NAND——与非
·NOR——或非
·XOR——异或
·XNOR——同或
从上至下,优先级依次递减。
③算数运算符
+ 加
- 减
* 乘
/ 除
** 指数运算
MOD 取模
REM 取余
ABS 取绝对值
上述运算符中,“+”、“-”和“*”是可以综合成逻辑电路的,对于“/”,只有在除数为2的n次幂时才可以综合,相当于将被除数右移n位。对于指数运算“**”,只有当底数和指数都是静态数值(CONSTANT或GENERIC参数)时才可以综合。
下述3个运算符(MOD、REM和ABS)都是不可综合的,其中注意:
y MOD x 运算结果是y除以x所得的余数,运算结果通过信号x(即正负号与x相同)返回;
y REM x 运算结果是y除以x所得的余数,运算结果通过信号y(即正负号与y相同)返回;
两个异号整数取模取值规律 (当是小数时也是这个运算规律),先将两个整数看作是正数,再作除法运算,能整除时,其值为0;不能整除时,其值=除数×(整商+1)-被除数,符号根据上述规律确定。
④关系运算符
= /= < > <= >=
关系运算符左右两边的操作数的数据类型(适用于所有数据类型)必须相同。
⑤移位操作符
语法结构:<左操作数><移位操作符><右操作数>
其中,左操作数必须是BIT_VECTOR,右操作数必须是INTEGER类型(可带正负号)。
⑥并置运算符
用于位的拼接,其操作数是支持逻辑运算的任何数据类型。
例
z <= x & "1100";
z = ('1','1','1','0','0');
1.2 属性
①数值类属性(可综合)
d'LOW 返回数组索引的下限值
d'HIGH 返回数组索引的上限值
d'LEFT 返回数组索引的左边界值
d'RIGHT 返回数组索引的右边界值
d'LENGTH 返回矢量的长度值
d'RANGE 返回矢量的位宽范围
d'REVERSE_RANGE 按相反的次序,返回矢量的位宽范围
例
SIGNAL d: STD_LOGIC_VECTOR(7 DOWNTO 0);
则有:d'LOW=0,d'HIGH=7;d'LEFT=7,d'RIGHT=0;d'LENGTH=8;d'RANGE=(7 DOWNTO 0),
d'REVERSE_RANGE=(0 TO 7)。
②信号类属性(可综合)
s'EVENT 如果s的值发生变化,则返回值为布尔量TRUE,否则返回FALSE
s'STABLE 如果s保持稳定,没有发生变化,则返回值为布尔量TRUE,否则返回FALSE
例
如果信号clk出现了上升沿,那么将返回TRUE,即括号中的返回值为TRUE。
IF (clk'EVENT AND clk = '1')...
IF (NOT clk'STABLE AND clk = '1')...
IF RISING_EDGE(clk)...
1.3 自定义属性
第一步,属性声明:
ATTRIBUTE attribute_name: attribute_type;
其中,attribute_type可以是任何数据类型。
第二步,进行属性描述:
ATTRIBUTE attribute_name OF target_name:class IS value;
其中,class可以使数据类型、信号、变量、函数、实体或构造体等。
1.4 通用属性语句
GENERIC(属性)语句提供了一种指定常规参数的方法,所指定的参数是静态的。
GENERIC(属性)语句必须在ENTITY中进行声明,且其指定的参数是全局的。其语法结构如下:
GENERIC (parameter_name1 : parameter_type1 := parameter_value1;
parameter_name2 : parameter_type2 := parameter_value2;
...);