Внедрение FSM в VHDL - PullRequest
       32

Внедрение FSM в VHDL

6 голосов
/ 14 мая 2011

Просто интересно, реализую ли я в VHDL конечный автомат, нужно ли мне указывать, какие все выходов находятся в каждом возможном состоянии? Даже если я знаю, что некоторые выходные данные не будут меняться от одного состояния к другому, и я знаю, что порядок состояний также будет в том же порядке?

Например, в этом (принудительном) примере:

entity test is
    port (
        clk : in std_logic;
        a : in std_logic;
        b: out std_logic;
        c: out std_logic;
    );
end test;

architecture Behavioral of test is

type executionStage is (s1,s2,s3);
signal currentstate, nextstate: executionStage;

begin
    process (clk)
    begin
          if(rising_edge(clk)) then
                 currentstate <= nextstate;
          else 
                 currentstate <= currentstate;
          end if;
    end process;

    process(currentstate)
    begin
        case currentstate is
            when s1 =>
                if (a = '1') then
                    b <= '1';
                    c <= '0';
                else
                    b <= '1';
                    c <= '1';
                end if;

                nextstate <= s2;

            when s2 =>
                -- b doesnt change state from s1 to here, do I need to define what it is here?
                if (a = '1') then
                    b <= '1';
                    c <= '1';
                else
                    b <= '1';
                    c <= '0';
                end if;

                nextstate <= s3;

            when s3 =>
                if (a = '1') then
                    b <= '0';
                    c <= '0';
                else
                    b <= '1';
                    c <= '1';
                end if;

                nextstate <= s1;
        end case;
    end process;
end Behavioral;

Насколько я понимаю, если я не сделаю этого, будут созданы защелки?

Ничего страшного в этом примере нет, но если у меня есть машина с более чем 10 выходами и более чем 10 состояниями, тогда мои VHDL-файлы начинают выглядеть невероятно грязно, и я уверен, что копировать их не следует и вставлять одно и то же снова и снова. Есть ли лучший способ сделать это?

edit: Могу ли я определить состояние по умолчанию для выхода? IE устанавливает b равным 1 вне всех процессов, а затем определяет только то, что есть в операторах case, где он равен 0? Будет ли это работать?

Ответы [ 4 ]

7 голосов
/ 15 мая 2011

Три проблемы с вашим примером кода:

Последний порт в списке портов не должен содержать точку с запятой:

port (
    clk : in std_logic;
    a : in std_logic;
    b: out std_logic;
    c: out std_logic -- no semicolon here!!!
    );

В процессе регистрации выне должно иметь «другое» заявление.Хотя это, вероятно, будет принято инструментами, это может смутить ваших коллег-разработчиков VHDL.

process (clk)
begin
    if(rising_edge(clk)) then
        currentstate <= nextstate;
    end if;
end process;

В вашей комбинационной логике список чувствительности должен содержать все сигналы, которые вы прочитали:process(a, currentstate).В этом конкретном случае (опять же) все, вероятно, будет работать нормально, но вы обязаны сделать выводы о защелках или вызвать другие проблемы, если ваш список чувствительности неверен.

Что касается вашего вопроса:

  1. Да, вам необходимо присвоить значение (для каждого состояния) каждому сигналу в комбинационном процессе.
  2. Как упоминает Томи, вы можете легко сделать это, назначив значение по умолчанию в начале процесса.
  3. Но вы также можете записать весь конечный автомат в одном синхронном процессе.Таким образом, вам не нужно присваивать значение каждому сигналу в каждом состоянии.
7 голосов
/ 14 мая 2011

Да, вы будете фиксировать защелки, если будете управлять только сигналами, которые должны быть комбинаторными в некоторых ветвях процесса.

Однако вы можете определить состояние «по умолчанию» для сигнала, просто присвоив значениеэто перед оператором case (но в рамках того же процесса).Например:

process(currentstate, a)
begin
    b <= '1';
    c <= '1';
    case currentstate is
        when s1 =>
            if (a = '1') then
                c <= '0';
            end if;

            nextstate <= s2;

        when s2 =>
            -- b doesnt change state from s1 to here, do I need to define what it is here?
            if (a /= '1') then
                c <= '0';
            end if;

            nextstate <= s3;

        when s3 =>
            if (a = '1') then
                b <= '0';
                c <= '0';
            end if;

            nextstate <= s1;
    end case;
end process;
3 голосов
/ 19 октября 2012

Просто примечание к ответу Филиппа (не можете прокомментировать его напрямую?) ..

Я предпочитаю писать конечные автоматы в двух стилях процесса. Это очень ясно показывает, где вы ожидаете триггеры, а где нет. Это также немного больше по линии описание оборудования - представьте себе, например, создание конечного автомата с логикой уровня платы. Зарегистрированное устройство соответствует состоянию <= next_state process, и оператор case отображается в массив и / или перед регистром состояния. </p>

Сказав это, я обычно использую один конечный автомат для небольших простых задач и перехожу на два технологических процесса для больших. Я даже иногда буду использовать третий процесс для организации выходов состояния в различные группы «задач» ... но не часто. Действительно большой конечный автомат говорит мне, что архитектура нуждается в работе ..

0 голосов
/ 23 июня 2011
process (clk)
begin
  if(rising_edge(clk)) then
    currentstate <= nextstate;
  end if;
end process;

Привет

описанный выше процесс проблематичен, но не из-за списка чувствительности. Можно только объявить clk для последовательного процесса. С инструментами моделирования и синтеза проблем не будет. clk - самый быстрый сигнал изменения / перехода в вашем коде.

Однако вы должны использовать (предпочтительно) асинхронный сброс. Конечно, в настоящее время производители говорят, что для дизайна ПЛИС перезагрузка даже не нужна; они происходят во время загрузки. Или они предлагают синхронный сброс.

Тем не менее, асинхронный сброс полезен для платной среды.

Вкратце: добавьте сброс в ваш дизайн и исправьте его поведение.

С уважением Николаос Каввадиас

...