在VHDL中,创建信号或向量时是否需要初始化? 如果忘记初始化信号或整数值会发生什么?
答案 0 :(得分:8)
在模拟中,如果您不设置初始值,则向量的每个元素都将获得默认值(这是定义的)通过VHDL语言规范)。对于枚举类型,这是枚举类型中定义的第一个元素:布尔值为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 :(得分:7)
在模拟中,VHDL中的所有在开始时被初始化为代表它们的范围的“最左边”元素。
因此,std_logic
将获得'U'
,boolean
将获得false
,integer
将获得较大的负数。您自己定义的任何枚举类型都将初始化为其第一个成员。等
您可以使用显式初始化来覆盖它:
variable i : integer := 0;
然后,模拟器将使用您的初始化。
在综合代码时,在ASIC中,显式初始化被忽略(没有芯片支持它们!),并且所有内容都无法预测地初始化。因此,您有一个复位引脚和显式代码,用于在该引脚置为有效时分配所需的值。
当你瞄准FPGA并且没有明确地初始化时,大多数情况下事情将初始化为“零”,但你不能依赖它(有时逆变器会被推动,事情看起来像他们一样在'一')。因此,您有一个复位引脚和显式代码,用于在该引脚置为有效时分配所需的值。
某些合成器(至少XST)将支持显式初始化并将它们传递到网表中,以便可以依赖它们。在这种情况下,你仍然可以有一个复位信号 - 它可以做一些不同的事情,因此特定的触发器可以初始化为一个值并重置为另一个值!
答案 2 :(得分:0)
在VHDL中并不是绝对必要的,就像它在C / C ++中不是必需的那样,但是可能会出现类似的结果。在没有初始化信号或信号矢量的情况下,模拟器通常会模拟它处于未知状态(假设您正在使用std_logic信号)。但是,合成引擎将选择一个或另一个作为初始值,因为当FPGA编程时,所有存储器元件将以这种或那种方式初始化(即它们未初始化为未知状态)。
有些人不会在声明时初始化信号,而是使用他们的电路来初始化存储器元件(例如,创建复位逻辑以初始化存储器元件)。其他将在声明时初始化内存元素。这些是设计决策,有自己的权衡。