7.1 处理静态数据——GENERIC和CONSTANT
对象 | GENERIC(通用属性) | CONSTANT(常量) |
语法结构 | GENERIC (parameter_name: parameter_type := parameter_value); | CONATANT 常量名: type := 值; |
功能 | 指定常规参数(静态) | 确定默认值(静态) |
范围 | 全局 | 全局 |
用途 | GENERIC语句必须在ENTITY即实体中进行声明,且可指定多个参数。 | 常量可以在包集、实体和结构体中声明,即有在哪一级声明,该常量对于该级所包含的所有描述是全局的。 |
7.2 处理非静态参数——SIGNAL和VARIABLE
- 信号定义的一般格式如下:
SIGNAL name: type [range] [ := initial_value];
例
SIGNAL control: BIT := '0';
SIGNAL count: INTEGER RANGE 0 TO 100;
SIGNAL y: STD_LOGIC_VECTOR (7 DOWNTO 0);
注意:
①VHDL中的信号表示的是逻辑电路中的“硬”连线,既可以用于电路单元的输入\输出端口,也可以用于电路内部各单元的连接。
②对信号赋初始值的操作是不可综合的。
③进程中只允许对一个信号进行一次赋值操作。
- 变量说明的格式如下:
VARIABLE name: type [range][ := 初始值];
例
VARIABLE control: BIT := '0';
VARIABLE count: INTEGER RANGE 0 TO 100;
VARIABLE y: STD_LOGIC_VECTOR (7 DOWNTO 0) := "10001000";
注意:
与信号一样,对变量赋初始值的操作也是不可综合的。
7.3 寄存器的数量
编译器对不同风格的代码进行编译时产生寄存器的数量会不同,故代码优化的目的不仅是为了解使用什么方法可以减少寄存器的数量,更是为了知道代码是否可以实现预期的结果。
- 对于信号:
当一个信号的赋值是以另一个信号的跳变为条件时,或者说当发生同步赋值时,该信号经过编译后就会生成寄存器。(这样的同步赋值只能在进程、函数或过程中出现,一般跟在 IF signal'EVENT...或 WAIT UNTIL...等语句之后。
- 对于变量:
①如果变量的值没有被进程(函数或者过程)以外的代码调用,那么不一定会生成寄存器。
②如果一个变量是在一个信号跳变时被赋值,并且该值最终又被赋给了另外的信号(信号是全局的,可以进行数值传递),那么综合后就会产生寄存器。
③如果一个变量在还没有进行赋值操作时已被使用,那么也会在综合时产生寄存器。