Хорошее руководство для начинающих со скриншотами. Думаю, что многим будет полезно. Спасибо!
Но у меня возникло два вопроса.
1) Можно ли в ПЛИС использовать автоматы Милли с комбинационными выходами?
2) Можно ли подавать на логику переключения состояний сигнал insert, если он не синхронизирован?
2) Входные сигналы, необходимо пропустить через синхронизатор
Единственно, что меня оправдывает, что это учебный проект и не хотелось его усложнять дополнительной логикой, не относящихся к теме конечных автоматов.
Мне кажется, что тема синхронизации в ПЛИС крайне важна. Действительно, не обязательно писать подробности здесь. Но можно хотя бы упомянуть слово-два.
Я помню, как однажды на отладочной плате завёл сигнал с кнопки на вход автомата. Благодаря этому я узнал, какова метастабильность на практике, и что бывает, когда автомат попадает в неизвестное состояние. Тем более, что в случае с one-hot таких состояний много. Это потенциальный сбой, и стоит заранее знать, как таких сбоев можно избежать. По крайней мере, снизить вероятность.
Входные сигналы необходимо синхронизировать с тактовой частотой с помощью синхронизаторов
Напишите пожалуйста, как это можно сделать в данном примере (и что такое синхронизаторы?)
Добавил синхронизаторы для входных сигналов и регистры для выходных сигналов. Новый исходный код на ветке 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}
Использование Quartus и ModelSim