我对reg初始化有一些疑问。
答案 0 :(得分:2)
第1点:
我们最近讨论了关于电子论坛的初步陈述。
示例1:您有两个寄存器,没有重置编码为:
divide_by_two <= ~divide_by_two;
or
divide_by_two <= not(divide_by_two);
在模拟中始终保持“X”但实际上它将在0或1条件下开始,然后在两者之间切换。要在模拟中解决'X',您需要设置初始条件。如果初始条件为“1”或“0”,则代码应独立工作。
示例2:您有一个除以四个寄存器而没有重置编码为:
divide_by_four[1:0] <= {divide_by_four[0],~divide_by_four[1]};
or
divide_by_four[1:0] <= divide_by_four[0] & not(divide_by_four[1]);
允许这样做的原因是,在操作期间,两个寄存器经历四种可能状态中的每一种:00,01,11,10。它开始的四个中的哪一个无关紧要,序列将永远是重复。再次在模拟中解决“XX”问题,您可以设置初始条件。如果初始条件为00,01,10或11,则代码应独立工作。
许多设计师认为,除了上面的例子,在合成代码中使用初始语句是危险的,最好避免使用它们。
第2点:
您可以使用带有相应HDL代码的“重置”信号来设置启动条件,而不是初始语句。复位转到每个有寄存器的模块是正常的。
答案 1 :(得分:0)
取决于您的目标设计。
您可以 通常 使用带有FPGA的initial
块。您可以在声明它的同一模块中初始化寄存器。不允许分层分配。如果添加复位输入,还可以使用同步复位初始化寄存器。大多数FPGA具有有限数量的具有异步复位/预置(如果有)的触发器。因此,initial
块和同步复位是FPGA的最佳选择。
ASIC 通常 不会合成initial
块。使用同步逻辑中的复位条件完成触发器的初始化。这通常是异步复位,但不是必需的。在ASIC的排序,同步或异步复位中。
对于这两种情况,要进行综合,初始化值需要是确定性的并由常数决定。它不能在输入端口或另一个寄存器的当前状态下导出。
即使您打算从不合成,也应遵循这些指南。否则调试会更具挑战性。