您好我对使用VHDL实现Mealy状态机感到困惑。我目前的工作是这样的:
process(clk, rst)
begin
if rst = '1' then
state <= s1;
elsif (clk'event and clk = '1') then
state <= next_state;
end if;
end process;
和另一个这样的过程:
process(state, op)
begin
case state is
when s1 =>
...some implementation
end process;
现在的问题是:我需要检测用户按下按钮,但我不确定放在哪里。它应该在第一个过程还是第二个过程中?此外,我还查看了以下指南:implement state machine in FPGA,如果网页上显示的Mealy机器只使用一个进程是可以的吗?如果是这样,那么我认为工作会更容易。谢谢!
答案 0 :(得分:0)
你应该把它放在第二个过程中。第一个过程仅用于更改状态,next_state
也在第二个过程中计算。
有几种方法可以编写FSM,人们倾向于因各种原因而偏向于其中一种。选择适合你的那个。
答案 1 :(得分:0)
您无法仅使用一个进程设计Mealy状态机。在大多数情况下,即使是摩尔状态机,也只能用一个过程建模。
状态机始终具有状态寄存器,必须使用同步过程建模。也就是说,灵敏度列表仅包含时钟的过程(如果它们是异步的,则设置或复位信号)。
同步过程的每个输出都将合成为寄存器的输出,因为它的值仅在时钟的边沿上变化(加上异步设置或复位的状态,如果有的话)。因此,您无法在与状态寄存器相同的同步过程中描述Mealy状态机的输出。如果你这样做了,它就不再是Mealy机器,因为它的输出不会在组合上依赖于输入。
对于摩尔机器来说,事情有点微妙,但除非在非常特殊的情况下,您还需要至少两个过程。当我写“进程”时,我包括进程短手,如并发信号分配,并发过程调用或组件/实体实例化。
简化:如果您能清楚地看到所需的硬件,那么合成的VHDL建模很简单。
同步过程是那些包含寄存器的过程。他们的代码完全:
import requests
url = requests.get(URL)
print url.status_code
将代码放入process(clk)
begin
if rising_edge(clk) then
<your code>
end if;
end process;
,永远将代码放在其他地方。如果您进行了异步设置或重置,则代码必须类似于:
<your code>
其他过程是组合过程。列出所有输入信号(INPUTS)和输出信号(OUTPUTS)。代码必须:
process(clk, reset)
begin
if reset = '1' then
<initialize outputs>
elsif rising_edge(clk) then
<your code>
end if;
end process;
约束每个OUTPUT信号必须在每次执行过程中分配一个值。保证这一点的最佳方法是使用所有 OUTPUTS的默认分配启动流程。
这就是全部。绘制并编码您所看到的内容。额外奖励:每个箭头越过一个过程气泡的边界是一个信号,除非它已经是您设计的主要输入或输出,否则您必须声明。
练习:绘制Mealy状态机的框图,并了解为什么不能使用单个进程建模。还要了解为什么它总是可以用两个过程建模,即使它不一定是可取的。最后,尝试确定仅使用一个进程建模Moore状态机的罕见情况。