Сбросить в конечный автомат Мили - PullRequest
0 голосов
/ 08 мая 2018

У меня есть некоторые проблемы с сигналом сброса в конечном автомате Мили в VHDL. Я создал очень простой Mealy FSM для более легкого понимания. FSM имеет два процесса, один синхронный для расчета состояния, а другой комбинационный для расчета выходов и следующего состояния. У меня проблема в том, что когда reset = '1' и input1 = "11", то output1 = "11", когда он должен быть output1 = "00"

Эту проблему можно решить путем включения входа сброса в список чувствительности комбинационного блока. Или путем оценки сигнала сброса в состоянии s0 (например, if input1="11" and rst = '0'then). Тем не менее я не видел этих «решений» ни в одной литературе, так что тут есть мои сомнения. Ниже приведен исходный код.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.ALL;

entity fsmtest is

  port (
    clk  : in  std_logic;
    rst : in std_logic;
    input1  : in std_logic_vector(1 downto 0);
    output1  : out std_logic_vector(1 downto 0));


end fsmtest;

architecture rtl of fsmtest is

  type state is (s0, s1);
  signal st, next_state : state := s0;


begin  -- rtl

  process (clk, rst)
  begin --process
    if rst = '1' then
      st <= s0;
      --next_state <= s0;
    elsif clk'event and clk = '1' then  -- rising clock edge
      st <= next_state;
    end if;
  end process;

  process(st, input1)
    begin  -- process

      case (st) is
        when (s0) => --initial state
          if input1 = "11" then
          next_state <= s1;
          output1 <= "11";
          else
          next_state <= s0;
          output1 <= "00";
        end if;

        when (s1) => --wait10
          if input1 = "00" then
            next_state <= s0;
            output1 <= "00";
            else
              output1 <= input1;
              next_state <= s1;
          end if;     
      end case;
  end process;
end rtl;

Спасибо заранее

1 Ответ

0 голосов
/ 08 мая 2018

Когда rst = '1' и input1= "11", тогда output1="11". Это то, что вы написали в своем коде. Вы написали:

  process (clk, rst)
  begin --process
    if rst = '1' then
      st <= s0;

поэтому st равно s0, когда rst равно '1', а затем вы написали

  process(st, input1)
    begin  -- process
      case (st) is
        when (s0) => --initial state
          if input1 = "11" then
            output1 <= "11";

, поэтому output1 равно "11", когда st равно s0, а input1 равно "11".

...