Конечный автомат с его состояниями, управляемыми двумя процессами - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь кодировать конечный автомат (FSM) с помощью языка VHDL прямо сейчас (и я фактически новичок в VHDL).То, чего я пытаюсь достичь, это то, что когда машина находится в S11 , STint будет уменьшаться соответственно с CLK2 (так что я могу контролировать, насколько быстроуменьшение есть).Однако S0 до S10 контролируется CLK1 .

Вот мой код:

begin
 process(state,DI,HI,QI,rst)      
 begin
    case State is
      when S0 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0'; STint <= 9;
        if DI'EVENT and DI = '1' then Nextstate <= S4;
          elsif HI'EVENT and HI = '1' then Nextstate <= S2;
          elsif QI'EVENT and QI = '1' then Nextstate <= S1;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S0; end if;
      when S1 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
        if DI'EVENT and  DI = '1' then Nextstate <= S5;
          elsif HI'EVENT and HI = '1' then Nextstate <= S3;
          elsif QI'EVENT and QI = '1' then Nextstate <= S2;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S1; end if;
      when S2 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
        if DI'EVENT and DI = '1' then Nextstate <= S6;
          elsif HI'EVENT and HI = '1' then Nextstate <= S4;
          elsif QI'EVENT and QI = '1' then Nextstate <= S3;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S2; end if;  
      when S3 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
        if DI'EVENT and DI = '1' then Nextstate <= S7;
          elsif HI'EVENT and HI = '1' then Nextstate <= S5;
          elsif QI'EVENT and QI = '1' then Nextstate <= S4;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S3; end if;       
      when S4 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
        if DI'EVENT and DI = '1' then Nextstate <= S8;
          elsif HI'EVENT and HI = '1' then Nextstate <= S6;
          elsif QI'EVENT and QI = '1' then Nextstate <= S5;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S4; end if;  
      when S5 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
        if DI'EVENT and DI = '1' then Nextstate <= S9;
          elsif HI'EVENT and HI = '1' then Nextstate <= S7;
          elsif QI'EVENT and QI = '1' then Nextstate <= S6;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S5; end if;  
      when S6 =>
        DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
          Nextstate <= S11;      
      when S7 =>
        DO <= '0'; HO <= '0'; QO <= '1'; ST <= '0';
          QOint <= -1;
          Nextstate <= S11;
      when S8 =>
        DO <= '0'; HO <= '1'; QO <= '0'; ST <= '0';
          HOint <= HOint -1;
          Nextstate <= S11;
      when S9 =>
        DO <= '0'; HO <= '1'; QO <= '1'; ST <= '0';
          HOint <= HOint -1;
          QOint <= QOint -1;
          Nextstate <= S11;
      when S10 =>                 
        DOint <= 9; HOint <= 9; QOint <= 9; STint <= 9;
          Nextstate <= S0;
      when others => null;          
    end case;
  end process;

  process(CLK1)   
  begin
   if CLK1'EVENT and CLK1 = '1' then
      State <= Nextstate;
   end if;
  end process;

  process(state,CLK2)
  begin
   case State is 
       when S11 =>
        DO <= '0'; HO <= '0'; QO <= '0'; ST <= '1';
    if CLK2'EVENT and CLK2 = '1' then STint <= STint -1;
    elsif STint <= 0 then Nextstate <= S0; end if;
       when others => null;
    end case;
  end process;

Я пробовал много альтернатив, таких как CLK1 в качестве часов для уменьшения STint , но это не сработало, потому что другой int (s) будет уменьшаться снова и снова.Для получения дополнительной информации этот FSM фактически похож на торговый автомат, за исключением того, что в S11 таймер начнет отсчет и перейдет в следующее состояние, которое является S0 .Другие состояния только для входов (таких как деньги) и выходов (таких как изменения).В S11 светодиод ST будет включен, пока таймер продолжает обратный отсчет.Есть ли способ, которым я могу достичь этого?Я был бы очень рад, если бы кто-то мог указать мне, почему мой код не работает.Кажется, что когда машина находится в S11 , она не может изменить свое состояние.Вот как мой код выглядит в TINA: enter image description here

Большое спасибо.Хорошего дня!PS: таймер отображается в STcount output

1 Ответ

0 голосов
/ 08 июня 2018

У вас есть некоторые проблемы в вашем подходе:

  • Несколько часов для FSM.Вам следует избегать использования нескольких часов в ваших проектах и ​​использовать их только при необходимости.Иметь две тактовые частоты для данной цепи - это вопрос проблем.
  • Используйте одну тактовую частоту.Если вы хотите сохранить контроль с помощью часов, создайте отдельную схему для управления только генерацией часов.Счетчик может решить для простой конструкции.Более сложный дизайн может потребовать использования специального оборудования для генерации тактового сигнала (например, PLL).
  • Вы назначаете сигналы в другом процессе, по крайней мере, DO.Это не должно синтезировать.

Я предлагаю вам переосмыслить управление конечным автоматом и понять пределы для убывающей скорости.

...