我们如何在 VHDL 中设置 FSM 初始状态?
How do we set FSM Initial State in VHDL?
在 VHDL 上实现状态机时,我想知道如何设置输出/当前状态初始条件。我阅读了关于 here.
的其中一个问题
其中一个答案说我们在 case 结构之前进行初始化:
process(currentstate, a)
begin
b <= '1';
c <= '1';
case currentstate is
when s1 =>
if (a = '1') then
c <= '0';
end if;
nextstate <= s2;
然而,这不是让我们在进入过程时自动设置 b<='1'
和 c<='1'
吗?因此,如果我们处于 A 状态,并且每当我们进入流程时,我们都处于移动到 B 的状态,这会直接放置 b<='1'
和 c<='1'
不是吗?
或者它实际上只是 运行 一旦我们启动程序然后在 case 结构中被限制?
同时检查 this link。
在他们的 FSM 实现中,他们没有指定初始状态,编译器或 FPGA 如何确定开始状态?
您正在查看的行未执行初始化。
b <= '1';
c <= '1';
请记住,VHDL 是一种硬件描述语言,而不是编程语言。这两个赋值的作用是为这些信号设置一个 default 赋值,除非在稍后的过程中有其他东西与这些赋值相矛盾。您可以在一个进程中多次分配给同一个信号,最后发生的分配优先。这样就不必编写如下代码:
case State is
when s1 =>
a <= '0';
b <= '1';
c <= '1';
when s2 =>
a <= '1';
b <= '0';
c <= '1';
when s2 =>
a <= '1';
b <= '1';
c <= '0';
end case;
它最终可能会非常重复并且容易出错,因为在许多状态下都有相同的分配,所以默认分配可以真正整理它:
a <= '1';
b <= '1';
c <= '1';
case State is
when s1 =>
a <= '0';
when s2 =>
b <= '0';
when s2 =>
c <= '0';
end case;
相同的模式适用于您不想覆盖每个逻辑分支中的每个输出信号的 if
语句。
如果您想要初始状态,根据具体情况,有两种方法可能适用。在这里,您可以在 start-up 断言 reset
以设置初始状态。请注意,case 语句位于时钟进程内:
process (clk)
begin
if (rising_edge(clk)) then
if (reset = '1') then
State <= s1;
else
case State is
when s1 =>
State <= s2;
when s2 =>
State <= s1;
end case;
end if;
end if;
end process;
另一种选择是用初始值定义状态信号:
signal State : state_type := s1;
我不会深入探讨使用初始值的优缺点,因为已有一些问题对此进行了探讨。
在 VHDL 上实现状态机时,我想知道如何设置输出/当前状态初始条件。我阅读了关于 here.
的其中一个问题其中一个答案说我们在 case 结构之前进行初始化:
process(currentstate, a)
begin
b <= '1';
c <= '1';
case currentstate is
when s1 =>
if (a = '1') then
c <= '0';
end if;
nextstate <= s2;
然而,这不是让我们在进入过程时自动设置 b<='1'
和 c<='1'
吗?因此,如果我们处于 A 状态,并且每当我们进入流程时,我们都处于移动到 B 的状态,这会直接放置 b<='1'
和 c<='1'
不是吗?
或者它实际上只是 运行 一旦我们启动程序然后在 case 结构中被限制?
同时检查 this link。
在他们的 FSM 实现中,他们没有指定初始状态,编译器或 FPGA 如何确定开始状态?
您正在查看的行未执行初始化。
b <= '1';
c <= '1';
请记住,VHDL 是一种硬件描述语言,而不是编程语言。这两个赋值的作用是为这些信号设置一个 default 赋值,除非在稍后的过程中有其他东西与这些赋值相矛盾。您可以在一个进程中多次分配给同一个信号,最后发生的分配优先。这样就不必编写如下代码:
case State is
when s1 =>
a <= '0';
b <= '1';
c <= '1';
when s2 =>
a <= '1';
b <= '0';
c <= '1';
when s2 =>
a <= '1';
b <= '1';
c <= '0';
end case;
它最终可能会非常重复并且容易出错,因为在许多状态下都有相同的分配,所以默认分配可以真正整理它:
a <= '1';
b <= '1';
c <= '1';
case State is
when s1 =>
a <= '0';
when s2 =>
b <= '0';
when s2 =>
c <= '0';
end case;
相同的模式适用于您不想覆盖每个逻辑分支中的每个输出信号的 if
语句。
如果您想要初始状态,根据具体情况,有两种方法可能适用。在这里,您可以在 start-up 断言 reset
以设置初始状态。请注意,case 语句位于时钟进程内:
process (clk)
begin
if (rising_edge(clk)) then
if (reset = '1') then
State <= s1;
else
case State is
when s1 =>
State <= s2;
when s2 =>
State <= s1;
end case;
end if;
end if;
end process;
另一种选择是用初始值定义状态信号:
signal State : state_type := s1;
我不会深入探讨使用初始值的优缺点,因为已有一些问题对此进行了探讨。