Комментарии 12

Хорошее руководство для начинающих со скриншотами. Думаю, что многим будет полезно. Спасибо!
Но у меня возникло два вопроса.
1) Можно ли в ПЛИС использовать автоматы Милли с комбинационными выходами?
2) Можно ли подавать на логику переключения состояний сигнал insert, если он не синхронизирован?

1) Вы правы, выходы комбинационной логики в реальном проекте необходимо сохранять в регистрах и уже выходы этих регистров подавать на выход ПЛИС, в противном случае возможный ложные срабатывания (кстати, на графике сигналов они видны)
2) Входные сигналы, необходимо пропустить через синхронизатор

Единственно, что меня оправдывает, что это учебный проект и не хотелось его усложнять дополнительной логикой, не относящихся к теме конечных автоматов.

Мне кажется, что тема синхронизации в ПЛИС крайне важна. Действительно, не обязательно писать подробности здесь. Но можно хотя бы упомянуть слово-два.
Я помню, как однажды на отладочной плате завёл сигнал с кнопки на вход автомата. Благодаря этому я узнал, какова метастабильность на практике, и что бывает, когда автомат попадает в неизвестное состояние. Тем более, что в случае с one-hot таких состояний много. Это потенциальный сбой, и стоит заранее знать, как таких сбоев можно избежать. По крайней мере, снизить вероятность.

Согласен с вами. Добавил абзац о выходных регистрах и входных синхронизаторах.
Входные сигналы необходимо синхронизировать с тактовой частотой с помощью синхронизаторов

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

Добавил синхронизаторы для входных сигналов и регистры для выходных сигналов. Новый исходный код на ветке sync, изменения коснулись файлов soda_machine.sv и soda_machine_types.sv (добавлено новое значение I0=2'b00, отсутствие монеты). Теперь принципиальная схема выглядит так

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

Сигнал insert_sync1 относительно сигнала insert задержится на два такта (у нас же два триггера, включенных последовательно). Выходные сигналы по сравнению с предыдущей схемой задержатся на три такта, с учётом задержки выходных регистров.

Извините за оффтоп, но с помощью чего был нарисован граф? Уже давно ищу инструменты для такого...

Это LaTeX, пакет tikz. Затем pdf с помощью команды convert из ImageMagic, конвертирован в png и кадрирован.


\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows,automata} 
\begin{document}
  \begin{tikzpicture}[->,>=stealth', initial text=reset]
    \tikzstyle{every state}=[fill=blue!20]
    \node [state,initial] (S0) at (162:4) {$S_0$};
    \node [state] (S1) at (90:4) {$S_1$};
    \node [state] (S2) at (18:4) {$S_2$};
    \node [state] (S3) at (-54:4) {$S_3$};
    \node [state] (S4) at (-126:4) {$S_4$};
    \draw (S0) to[in=110, out=160, loop] node[auto] {$I_5$} ();
    \draw (S0) to[bend left] node[auto] {$I_1$} (S1);
    \draw (S0) .. controls (120:7) and (60:7) .. node[auto] {$I_2$} (S2);
    \draw (S1) to[bend left] node[auto] {$I_1$} (S2);
    \draw (S1) to[bend left] node[auto] {$I_2$} (S3);
    \draw (S1) to[bend left] node[auto] {$I_5$} (S0);
    \draw (S2) to[bend left] node[auto] {$I_1$} (S3);
    \draw (S2) .. controls (-24:7) and (-84:7) .. node[auto] {$I_2$} (S4);
    \draw (S2) .. controls (-30:15) and (-150:15) .. node[auto] {$I_5$} (S0);
    \draw (S3) to[bend left] node[auto] {$I_1$} (S4);
    \draw (S3) to[bend left] node[above right] {$I_2 \mid I_5$} (S0);
    \draw (S4) to[bend left] node[auto] {$I_1 \mid I_2 \mid I_5$} (S0);       
  \end{tikzpicture}
\end{document}
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.