在同步过程中,用 rising_edge(fpga_clock) ,如果由于时钟上升而导致进程触发(执行)时没有新的赋值,则不需要默认变量赋值和默认信号赋值,并且两者都将保持上升时钟之前的值。
rising_edge(fpga_clock)
关于推断锁存器,您可能想到的可能与组合过程有关,其中如果某些分支可以推断出锁存器。 if 声明不分配给驱动信号,如:
if
process (d, en, q) begin if en = '1' then q <= d; end if; end process;
在这种情况下 q 仅在更新时更新 en 是 '1' ,因此推断锁存器保持值 q 如果 en 是 '0' 。
q
en
'1'
'0'
作为一个相关的注释,使用变量来保持顺序(时钟)过程中的状态通常是不好的编码风格,并且更好地声明信号 sequencer_count 。原因是所有触发器的编码风格都相同,并且由于在典型的仿真波形中无法查看变量,因此更容易调试。
sequencer_count
这些行都不是必需的:
start_writing <= start_writing; start_reading <= start_reading; sequencer_count := sequencer_count; -- is this line necessary
他们都没有做任何事情。完全分配和锁存推断只是组合逻辑的一个问题。这是(同步)顺序逻辑。您永远不必担心使用(同步)顺序逻辑完成任务。
为什么是这样?那么,在组合逻辑的情况下,如果你没有完整的赋值,那么会有一些输入组合导致一个通过过程的路径,其中一个过程的输出(由它驱动的信号)没有分配值。任何信号都将保持其值,直到分配新值。因此,在分配不完整的情况下,结果电路必须记住(存储)该输出的状态。因此,将合成某种可以存储信息的电路。这不会是一个触发器,因为没有时钟,没有 rising_edge 函数调用等;相反,锁存器将被合成以进行记忆。这是非常糟糕的,因为(a)无论如何,锁存器基本上是坏的,并且(b)你想要组合逻辑但是顺序。那是一个错误。
rising_edge
但是,在(同步)时序电路中,您已经有了存储空间。触发器可以被认为是1位存储器。因此,您无需担心(同步)顺序过程中的完全分配。您期望得到的电路能够存储东西。