Содержание
Вступление (Introduction)
Cравнение методов описания конечного автомата (Comparison of State Machine Description Methods)
Цель этого руководства (The Purpose of This Tutorial)
Создание диаграммы состояния (Creating a State Diagram)
Реализация (Implementation)
Создание проекта BLACKJACK (Creating BLACKJACK Design)
Использование помощника по созданию новых исходных файлов (Using New Source File Wizard)
Добавление портов (Adding Ports)
Добавление дополнительных портов (Adding Extra Ports)
Описание дополнительных переменных (Defining Additional Variables)
Добавление состояния сброса (Adding a Reset State)
Добавление инициализации (Adding Initialization Actions)
Добавление состояния для запроса карты (Adding a State to Request a Card)
Генерация кода HDL (HDL Code Generation)
Прием и обработка Новой Карты (Receiving and Handling of the New Card)
Анализирование Общего Результата (Analyzing the Total Score)
Проверка Окончательного Счета (Testing the Final Score)
Назначение Приоритетов Условия (Assigning Condition Priorities)
Выбор Кодирования Состояния (Selecting State Encoding)
Компилирование проекта (Compiling the Design)
Нахождение и исправление ошибок (Locating and Correcting Errors)
Имитатор (Simulator)
Заключение (Conclusion)
Вступление
Редакторы конечного автомата предоставляют простой графический ввод проекта. Так как установки состояния могут быть легко перенастроены на любые устройства, редакторы состояния становятся очень популярными среди проектировщиков, которые ценят технологическую независимость. Эта обучающая программа предназначена для пользователей
Active-VHDL, кто хотят узнать, как работать с редактором конечного автомата, который используется для графического ввода проектов VHDL.
Сравнение методов описания конечного автомата
Давайте рассмотрим очень простой конечный автомат, который используется для управления светофором. Так как самый лучший способ начинать любую разработку конечного автомата - устное описание, давайте опишим операции контроллера светофора следующим образом:
Контроллер основан на таймере, который включает все лампы светофора в предопределенной последовательности.
Когда красный индикатор включен и таймер сигналит, что зеленый индикатор должен быть зажжен (GO_GREEN, сигнал переходит в Высокое состояние), включить ЗЕЛЕНЫЙ сигнал и выключить другие сигналы. Когда зеленый индикатор включен и таймер сигналит, что желтый индикатор должен быть зажжен (GO_YELLOW, сигнал переходит в Высокое состояние), включить ЖЕЛТЫЙ сигнал и выключить другие сигналы. Когда желтый индикатор включен и таймер сигналит, что красный индикатор должен быть зажжен (GO_RED, сигнал переходит в Высокое состояние), включить КРАСНЫЙ сигнал и выключить другие сигналы.
Диаграмма Состояния - графический метод описания конечного автомата. Например, диаграмма состояния для контроллера светофора показывается ниже:
Конечные автоматы могут быть преобразованы в HDL код, который может затем быть преобразован в физическую реализацию (netlist) программами логического синтеза.
VHDL описание контроллера светофора показано ниже:
Основные преимущества и недостатки проектов конечного автомата перечислены в таблице ниже:
Устное Описание Диаграмма Состояния HDL Описание
компактное |
очень компактная |
длинное |
легко читаемое |
очень легко читаемая |
тяжело читаемое |
трудно составляемое |
легко составляемая |
легко составляемое |
|
само-документируемая |
требует документации |
Цель этого руководства
Это руководтво обучит Вас, как использовать Редактор Конечного Автомата для ввода диаграмм конечного автомата и логического синтеза проектов. Мы предполагаем, что Вы уже знакомы с приложением Active-VHDL.
Типовой проект, созданный в этом руководстве - конечный автомат, который играет в Blackjack.
Цель игры состоит в том, чтобы выбрать ряд карт, сумма которых будет так близко к 21 насколько возможно. Каждая карта имеет десятичное значение между 2 и 11, где 11 называется ТУЗОМ и может быть зассчитана как 1 если нужно. Игрок с самым большим количеством очков, но ниже чем 21 будет победителем.
Просьба о дополнительной карте обозначена выводом SAY_CARD (этот сигнал Высокого уровня или логическая 1), который генерируется каждый раз, когда общяя сумма всех карт - менее 17. Однако, он никогда не может быть сгенерирован, если общая сумма карт превышает 21.
Поступление новой карты обозначено сигналом NEW_CARD, изменяющимся с 0 в 1.
Автомат должен вывести сигнал SAY_BUST, когда сумма карт превышает 21. В случае, если общее количество очков между 17 и 21, автомат должна вывести сигнал SAY_HOLD.
Общий счет нужно показать на ОБЩЕМ выводе (выводе общего результата). После достижения условия SAY_HOLD или условия SAY_BUST, автомат должен остаться в последнем состоянии до появления на входе сигнала NEW_GAME (сброса).
Сигнал NEW_GAME сбрасывает конечный автомат.
Автомат будет реализовываться, рисуя диаграмму состояний. Диаграмма будет автоматически преобразована в соответствующий VHDL код. Затем, Вы можете проверить функциональные возможности автомата, моделируя код в VHDL имитаторе.
Использование помощника по созданию новых исходных файлов
Чтобы открыть новое окно Редактора Состояний, выберите
State Diagram из New в меню File.Используя ряд последовательно появляющихся окон помощника, Вы можете создать новый проект.
Для создания шаблона диаграммы состояний:
Примечание:
Расширение файлов диаграмм состояния по-умолчанию *.ASF и новый файл будет назван BLACKJACK.ASF.
Для добавления портов в окне
Design Wizard – Ports выполните следующие операции:Все назначенные имена порта отображаются в поле над кнопкой
New и в области предварительного просмотра символа, которая размещена слева от имени порта.С помощью процедуры, описанной выше, введите следующие порты:
Для ввода диапазона шины [3;0] для сигнала CARD, нажмите кнопкуType, чтобы открыть диалог Port Type. Затем выберите тип порта STD_LOGIC_VECTOR, и введите диапазон шины, используя массивы в поле Range.
Вы можете также ввести диапазон шины, используя полеArray Indexes в диалоговом окне Design Wizard - Ports.
Обратите внимание, что все назначенные порты В/В появляются внутри символа, который отображается слева вышеупомянутого окна.
ОБРАТИТЕ ВНИМАНИЕ: Редактор Состояний поддерживает только синхронные конечные автоматы, что означает, что все переходы из одного состояния в другой, выполняются только при поступлении сигналов таймера, и проект не может функционировать без сигналов таймера.
Новая диаграмма состояний, созданная помощником показана ниже:
ОБРАТИТЕ ВНИМАНИЕ: Если Вы выбирете множественные автоматы, они будут преобразованы в отдельные параллельные процессы в VHDL.
Добавление дополнительных портов
Дополнительные порты ввода - вывода могут быть добавлены в любое время к диаграмме состояния, нажатием кнопки
Output/ / Input Port, размещенной внизу вертикальной инструментальной панели. Так как мы нуждаемся в порте вывода, показывающем общий счет игры Blackjack, давайте добавим его сейчас:
Окно
Port Properties позволяет Вам определить выбранный входной сигнал как таймер, и порты вывода как комбинаторный или зарегистрированный. Зарегистрированные (Registered) порты содержат установленое значение в дополнительном регистре. Комбинаторные (combinatorial) выводы изменяются каждый раз при изменении входных условий.ОБРАТИТЕ ВНИМАНИЕ: Так как общая сумма всех карт может быть 26 (самое большое количество очков, при котором новая карта выводится - 16, а самое большое количество очков в новой карте может быть 10), порт TOTAL должен иметь двоичный диапазон от 0 до 31, который требует 5 битов данных [4:0].
Новые порты вывода, перечисленные в верхнем правом углу основнго экрана Редактора Состояния должны выглядеть как показано ниже:
Описание дополнительных переменных
Конечный автомат должен знать,является ли любая из карт ТУЗОМ, потому что, когда счет превышает 21 (с ТУЗОМ, рассчитанным как 11), ТУЗ может быть рассчитан как 1 для уменьшения счета.
Следующая процедура описывает, как определить новую переменную с именем Ace (Туз)
:
Каждый конечный автомат должен быть проинициализирован. В случае игры Blackjack инициализация происходит, когда начата новая игра. Давайте добавим инициализацию всех портов вывода к диаграмме состояния прямо сейчас.
Окно
Machine Properties имеет несколько меток для группировки различных опций внутри окна. Щелкните на Reset и выберите следующее:Это будет гарантировать, что сигнал NEW_GAME будет использоваться как сброс машины и когда он активизирован, машина автоматически перейдет в состояние Start.
ОБРАТИТЕ ВНИМАНИЕ:
Треугольный символ сброса - не состояние; это указывает, что связанный переход будет выполнен в любое время, когда встретится это условие и будет выполнен независимо от текущего состояния машины. Переход сброса показывается только для документационной цели.
Как только условие сброса выполнено, машина переходит в состояние Start. Чтобы определять действия, которые следуют за сбросом, мы будем должны определить входные действия. Входные действия автоматически присоединены к верхней части символа состояния и указывают, что определенный код выполняется только один раз, когда машина переходит в это состояние.
Ace := false;
TOTAL <= "00000";
SAY_CARD <= '0';
SAY_HOLD <= '0';
SAY_BUST <= '0';
Обратите внимание, что Вы должны использовать VHDL синтаксис:
Перечисленные действия показаны ниже:
ОБРАТИТЕ ВНИМАНИЕ:
Комбинаторные назначения порта вывода в состояние сброса также используются как значения по умолчанию в других состояниях. Это означает, что вывод будет установлен в значение по умолчанию во всех состояниях, даже, где значение явно не было задано. В данном примере, SAY_BUST будет '0' во всех состояниях, если только Вы не добавите операцию SAY_BUST < = '1'.
Добавление состояния для запроса карты
Как только сброс выполнился, конечный автомат запускаетсяс, запрашивая карту. Это будет осуществлено добавлением состояния Hit_me.
1. Добавьте состояние Hit_me под состоянием
2. Для того, чтобы нарисовать переход между
Start и Hit_me, нажмите кнопку Transition.3. Затем, кликните где-нибудь внутри
Start и затем Hit_me. Строка будет выведена между этими состояниями.4. Для того, чтобы выйти из режима редактирования, нажмите левую кнопку мыши снаружи значков состояния.
ОБРАТИТЕ ВНИМАНИЕ: Переход из состояния
Start в состояние Hit_me безусловен, и он будет автоматически выполнен в следующем цикле таймера, после входа в состояние Start (это означает, что состояние Reset будет длиться один цикл таймера).Чтобы выразить просьбу о новой карте, SAY_CARD должен быть установлен в '1'. Так как этот сигнал должен остаться активным все время, мы должны использовать
state action а не entry action.ОБРАТИТЕ ВНИМАНИЕ:
State actions выполняются на каждом цикле часов, пока автомат остается в данном состоянии. Exit Action выполняется только при переходе в выбранное состояние. Exit Action выполняется после выхода из активного состояния.1. Нажмите кнопку
2. Поместите 'dot end' указателя мыши над Hit_me и нажмите левую кнопку мыши.
3. Напечатайте SAY_CARD < = '1' в окне редактирования.
4. Нажмите левую кнопку мыши вне поля редактирования. После этой операции диаграмма состояния будет выглядеть как показано ниже:
На этом этапе была создана часть конечного автомата. Прежде, чем расширить проект, мы рассмотрим генерируемый код, чтобы показать, как элементы диаграммы соответствуют сгенерированному коду.
ОБРАТИТЕ ВНИМАНИЕ: Процесс генерации HDL кода проверяет некоторые ошибки диаграммы, но не проверяет ваши VHDL-выражения. Полная проверка синтаксиса будет выполняться позже, когда проект будет синтезироваться.
1. Используя вкладку File из окна
2. Выбирает опцию
Generate Code из меню, чтобы просмотреть сгенерированный код.ОБРАТИТЕ ВНИМАНИЕ: Необходимо, чтобы Вы обучились связывать код, который генерируется c элементами на рисунке. Редактор состояний использует стандартные шаблоны для создания VHDL проекта. Понимание конструкции VHDL очень полезно при отладке проекта с помощью VHDL имитатора.
VHDL код, сгенерированный Редактором Состояний может быть разделен на несколько разделов.
·Entity declaration section содержит список всех портов, определенных в диаграмме состояний.
·Global declarations section описывает:
·Machine declarations section описывает объекты, персональные для каждой машины (процесса).
·Reset definition section определяет поведение машины при инициализации.
·Machine action description section определяет действия, выполняемые в специфических состояниях и переходах между состояниями
·Output port assignment section определяет логическое моделирование выводов
Как только новая карта была запрошена, машина должна подождать, пока ее не получит. Поступление новой карты будет отмечено сигналом NEW_CARD. Приведенное ниже добавит раздел проекта, который обрабатывает сигнал NEW_CARD:
ОБРАТИТЕ ВНИМАНИЕ
:Так как эти действия должны быть выполнены, только один раз при вводе состояния, будет использоваться
entry action.Чтобы назначать
entry action к состоянию, используйте карту Actions окне State Properties :1. Нажимает правую кнопку мыши внутри значка состояния
2. Выберите
Properties в появившемся меню3. Нажмите вкладку
Actions.4. Наберите в поле
Entry:TOTAL<=TOTAL+CARD;
Ace:=(CARD=11) or Ace;
5. Нажимает кнопку
OK, чтобы завершить операцию.
ОБРАТИТЕ ВНИМАНИЕ:
Вышеописанные действия должны быть определены как действия входа (entry actions). Иначе, общий счет будет увеличиваться на каждом активном фронте синхроимпульса, пока машина остается в состоянии Got_it.Диаграмма состояния должна теперь выглядеть как показано ниже:
Как только новая карта была получена, общий счет карт должен быть модифицирован и проверен. Если он менее 17, конечный автомат должен запросить новую карту и возвратиться к состоянию Hit_me.
Добавление новой карты:
ОБРАТИТЕ ВНИМАНИЕ: Добавление условия NEW_CARD = '0' предупреждает конечный автомат от использования той же самой карты больше чем один раз.
После завершения этого шага диаграмма состояния будет выглядеть как показано ниже:
Обнаружение условий Hold/Bust:
ОБРАТИТЕ ВНИМАНИЕ: Переход
@ELSE выполняется, когда никакие другие условия не выполнены в этом состоянии. Этот переход будет выполнен, если значение TOTAL = 16 или меньше, и он заставит машину запрашивать новую карту в состоянии Hit_me.Диаграмма состояний с 5 состояниями должна выглядеть так:
Как только машина переходит в состояние
Test 21, то общий счет - 17 или больше. Теперь конечный автомат должен проверить, не превыил ли счет 21. Если нет, он установит сигнал SAY_HOLD. Если счет более чем 21, должен быть активизирован сигнал SAY_BUST, указывая, что машина проиграла игру. Перед установкой сигнала SAY_BUST, машина должна проверить, была ли любая из ранее выбранных карт ТУЗОМ. Если имелся Туз, это может уменьшить общий счет на 10, чтобы избавиться от ситуации "bust".
NOTE: Т.к. ACE – переменная типа Boolean, то никаких дополнительных операторов отношения не требуется добавлять к данному условию.
ОБРАТИТЕ ВНИМАНИЕ:
Действия перехода позволяют избегать избыточных состояний. Если Вы не назначали это действие к переходу, другое состояние должно быть создано, чтобы выполнить действие TOTAL <= TOTAL-10.Конечная диаграмма состояний со всеми состояниями, переходами, условиями, и действиями должна выглядеть как показано ниже:
Назначение приоритетов условия
Обратите внимание, что в состоянии Test21, оба условия TOTAL < 22 и ТУЗ (Ace) могут появиться одновременно. В таком случае, поведение машины зависит от последовательности оценок условий. Чтобы избежать беспорядка, Вы должны назначить различные приоритеты к каждому переходу. Так как наш автомат должен сначала проверить,является ли TOTAL меньше чем 22, назначьте приоритет 1 переходу
"Test21 Ю Hold" и приоритет 2 переходу "Test21 Ю Test16".Для изменения приоритета перехода:
ОБРАТИТЕ ВНИМАНИЕ:
Переходы без назначенного приоритета выполняються в последнюю очередь.
Когда конечные автоматы компилируются в логику, текущие состояния сохраняются в регистре "состояния" (state), являющемся группой переключателей. Каждое состояние назначено отдельному переключателю. Однако, если имеются некоторые параллельные переходы состояний, они могут создать сбой в комбинаторной логике, и конечный автомат может перейти в запрещенное состояние. Рекомендуемый тип кодирования для всего FPGAs -
One-Hot, который назначает такие значения каждому состоянию, чтобы только один бит регистра переходов мог быть утановлен в данный момент времени. One-Hot кодирование, однако, использует большее количество разрядов, т.к. каждое состояние требует один бит в регистре. По этой причине это не рекомендуется для CPLDs, который требователен к ресурсам. Редактор Состояния поддерживает One-Hot и двоичное кодирование. Другие типы кодирования могут быть созданы вручную путем назначения кодов к каждому состоянию.Двоичный метод кодирования будет использоваться в этом руководстве, чтобы упростить анализ проекта в имитаторе.
1. Вызовите окно
2. В поле
Encoding выбирите опцию Encoded и опцию Binary из списка, и затем нажмите ОК.
ОБРАТИТЕ ВНИМАНИЕ:
Команда кодирования Symbolic позволяет инструменту синтеза автоматически выбирать метод кодирования привилегированного состояния. Metamor XVHDL использует по умолчанию двоичное кодирование, если коды не назначены каким-либо значениям.
Чтобы скомпилировать проект, выберите
Compile из меню Design или нажмите кнопку. AVHDL автоматически генерирует VHDL код, соответствующий диаграмме состояния.
Нахождение и исправление ошибок
Порты вывода не могут использоваться конечным автоматом для чтения. При чтении порта требуется, чтобы он был определен как двунаправленный. Обратите внимание, что сигнал 'TOTAL' не читаем, потому что он находится в режиме OUT и будет выдаваться ошибка каждый раз, когда TOTAL будет появляться в правой части выражения назначения сигнала.
Для исправления этой ошибки:
Используя процедуру, описанную выше, назначьте следующие имитаторы (stimulators) к сигналам:
NEW_CARD |
0 0, 1 80 -r 100 |
NEW_GAME |
1 0, 0 20 -r 600 |
CARD |
16#0 0, 16#A 100, 16#3 200, 16#8 300 |
CLK |
0 0, 1 5 -r 10 |
Приведенная формула базируется на очень простом синтаксисе:
value [ time { , value time } [ -r period ] ]
где:
[] Квадратные скобки указывают необязательный элемент
{} Фигурные скобки указывают необязательный элемент, который может повторяться
Названия сигнала в окне
Waveform должны выглядеть как показано ниже :
Вы должны получить результаты, подобные показанным ниже:
Как показано выше, Редактор Состояний - мощный инструмент для создания проектов логического управления в VHDL. Графические диаграммы обеспечивают превосходную документацию проекта и позволяют Вам эффективно
генерировать результаты синтеза.