你不能设计一个只有一个进程的 Mealy 状态机。即使是摩尔状态机,在大多数情况下,也无法仅使用一个进程进行建模。
状态机总是有一个状态寄存器,必须用同步过程建模。也就是说,敏感度列表仅包含时钟(如果它们是异步的,则设置或重置信号)的过程。
同步过程的每个输出都将合成为寄存器的输出,因为它的值仅在时钟边缘发生变化(加上异步设置或复位的状态,如果有的话)。因此,您不能在与状态寄存器相同的同步过程中描述 Mealy 状态机的输出。如果你这样做了,它就不再是 Mealy 机器了,因为它的输出不再依赖于输入。
对于摩尔机器,事情要稍微微妙一些,但除了非常特殊的情况外,您还需要至少两个进程。当我编写“进程”时,我将进程简写包括在内,例如并发信号分配、并发过程调用或组件/实体实例化。
为了简单起见:如果您清楚地了解所需的硬件,则用于综合的 VHDL 建模很简单。
- 绘制硬件框图,清楚地标明寄存器和组合部分。
- 绘制包围硬件元素的气泡,每个进程一个气泡,遵守如果气泡包含寄存器,则其所有输出必须是寄存器输出的规则。
同步进程是那些包含寄存器的进程。他们的代码完全正确:
process(clk)
begin
if rising_edge(clk) then
<your code>
end if;
end process;
把你的代码放在<your code>,永远不要把代码放在别处。如果您有异步设置或重置代码必须类似于:
process(clk, reset)
begin
if reset = '1' then
<initialize outputs>
elsif rising_edge(clk) then
<your code>
end if;
end process;
其他过程是组合过程。列出它们的所有输入信号 (INPUTS) 和输出信号 (OUTPUTS)。代码必须为:
process(INPUTS)
begin
<your code>
end process;
每个 OUTPUT 信号必须在每次执行过程中分配一个值。保证这一点的最佳方法是使用 all OUTPUTS 的默认分配开始该过程。
就是这样。绘制并编码您所看到的。奖励:每个穿过您的流程气泡边界的箭头都是您必须声明的信号,除非它已经是您设计的主要输入或输出。
练习:画出 Mealy 状态机的框图,并理解为什么不能用单个进程对其进行建模。还要理解为什么它总是可以用两个过程建模,即使它不一定是可取的。最后,尝试确定摩尔状态机只能用一个进程建模的罕见情况。