是否需要初始化?

9 vhdl

在VHDL中,在创建信号或向量时是否需要初始化?如果忘记初始化信号或整数值会发生什么?

Phi*_*ppe 8

模拟中,如果设置初始值,则向量的每个元素都将获得默认值(这由VHDL语言规范定义).对于枚举类型,这是枚举类型中定义的第一个元素:booleans将是false,std_logic将是'U'(未定义).注意'U'在电路中没有意义.这只是验证工程师的一个暗示,你不知道触发器在上电时有哪个值.

经过综合:FPGA合成器将使用您设置为触发器和记忆价值的"户户通电"的初始值,如果目标技术支持此!如果该技术不支持强制初始值(以及ASIC),则上电时的初始值是未知的.它可以是1或0.(例如参见:http://quartushelp.altera.com/11.0/mergedProjects/hdl/vhdl/vhdl_pro_power_up_state.htm)

两种可能的风格:

  1. 选择显式初始值,带或不带显式复位电路(通常用于现代FPGA)
  2. 将'U'设置为初始值,并使用适当的复位电路强制使用已知的复位值

如果您选择第一个选择,请务必检查您的目标技术是否支持这种风格!


Mar*_*son 7

在模拟中,VHDL中的所有内容都在开始时初始化到代表它们的范围的"最左边"元素.

因此,std_logic会得到'U',boolean会得到false,integer会得到一个很大的负数.您自己定义的任何枚举类型都将初始化为其第一个成员.等等

您可以使用显式初始化来覆盖它:

variable i : integer := 0;
Run Code Online (Sandbox Code Playgroud)

然后模拟器将使用您的初始化.


在合成代码时,在ASIC中,显式初始化被忽略(没有芯片支持它们!),并且所有内容都不可预测地初始化.因此,您有一个复位引脚和显式代码,用于在该引脚置为有效时分配所需的值.

当你瞄准FPGA并且没有明确地初始化时,大部分时间事情将初始化为"零",但你不能依赖它(有时逆变器会被推动,看起来就像它们已经进入'一').因此,您有一个复位引脚和显式代码,用于在该引脚置为有效时分配所需的值.

一些合成器(至少XST)将支持显式初始化并将它们传递到网表中,以便您可以依赖它们.在这种情况下,你仍然可以有一个复位信号 - 它可以做一些不同的事情,因此特定的触发器可以初始化为一个值并重置为另一个值!