Обзор маршрута проектирования ПЛИС FPGA Advantage компании Mentor Graphics. Часть 3
Настоящая статья является продолжением описания маршрута проектирования FPGA Advantage, начатого в журнале «Компоненты и технологии», № 7`2005. В ней пойдет речь о создании конечного автомата (State Machine) в пакете HDL Designer.
Все статьи цикла:
- Обзор маршрута проектирования ПЛИС FPGA Advantage компании Mentor Graphics. Часть 1.
- Обзор маршрута проектирования ПЛИС FPGA Advantage компании Mentor Graphics. Часть 2
- Обзор маршрута проектирования ПЛИС FPGA Advantage компании Mentor Graphics. Часть 3
- Обзор маршрута проектирования ПЛИС FPGA Advantage компании Mentor Graphics. Часть 4. Моделирование в среде FPGA Advantage
- Обзор маршрута проектирования ПЛИС FPGA Advantage компании Mentor Graphics. Часть 5. Основы синтеза
- Обзор маршрута проектирования ПЛИС FPGA Advantage компании Mentor Graphics. Часть 6. Подготовка к тестированию
- Обзор маршрута проектирования ПЛИС FPGA Advantage компании Mentor Graphics. Часть 7. Расширенная отладка
- Обзор маршрута проектирования ПЛИС FPGA Advantage компании Mentor Graphics. Часть 8. Расширенные возможности проектирования
- Обзор маршрута проектирования ПЛИС FPGA Advantage компании Mentor Graphics. Часть 9. Расширенные возможности синтеза: ограничения синтеза
Конечный автомат (State Machine) (рис. 1) — это некоторый набор состояний (States). Каждое состояние имеет свое уникальное имя. В любой конкретный момент времени автомат может находиться в одном из состояний. Состояния связаны между собой переходами (Transitions). В начальный момент моделирования автомат находится в «начальном состоянии» — это то состояние, которое было добавлено первым. Решение о том, в какое состояние переходить, принимается на основе текущего состояния и входных данных. Действия, т.е. присвоения выходным или внутренним сигналам новых значений, могут выполняться как на переходах, так и на состояниях. Существует множество методов кодировки конечного автомата, которые, с целью экономии места, в настоящей публикации не рассматриваются.
Как правило, конечные автоматы применяются для проектирования сложной управляющей логики. HDL Designer имеет набор инструментов для функциональной (поведенческой) отладки конечного автомата. Например, при моделировании в ModelSim текущее состояние может выделяться одним цветом, те состояния, в которых автомат побывал ранее, — другим, а те состояния, в которых автомат ни разу не был в процессе моделирования, — третьим. Таким образом, пользователь может наглядно наблюдать поведение логики конечного автомата. Об этом и других способах анализа будет рассказано в одной из следующих статей.
Основные элементы, встречающиеся в конечном автомате (рис. 2):
- Состояние (State)
- Переход (Transition)
- Точка прерывания (Interrupt Point)
- Точка восстановления (Recovery Point)
- Сигнал разрешения (Enable)
- Синхросигнал (Clock)
- Точка входа в иерархию (Entry Point)
- Точка выхода из иерархии (Exit Point)
- Ссылка (Link)
- Узел (Junction)
- Графический комментарий (Comment Graphics)
- Штамп (Title Block)
Состояние (State)
Состояние отображается в виде залитого круга, содержащего уникальное имя — имя состояния. Состояние может быть одного из трех типов: обычное состояние (добавляется через меню Add ? State); иерархическое состояние (добавляется через меню Add ? Hierarchical State) и состояние ожидания (добавляется через меню Add ? Wait State).
- Обычное состояние — это состояние, в котором непосредственно может находиться конечный автомат. Например, автомат, приведенный на рис. 1, в начальный момент времени будет находиться в состоянии WaitState. Начальное состояние выделено двойной окружностью. То состояние, которое помещается на пустую диаграмму первым, и будет начальным состоянием. В окне свойств состояния (Object Properties) можно ввести действия. Например, это могут быть присваивания значений некоторым сигналам или выходным портам. Действия вводятся в полном соотвествии с синтаксисом выбранного языка (VHDL или Verilog). Эти действия будут выполнены, когда автомат перейдет в соответствующее состояние.
- Иерархическое состояние — это состояние, в котором может находиться только диаграмма конечного автомата и ничто другое. Иерархическое состояние объединяет в себе несколько обычных состояний. Например, если щелкнуть два раза левой клавишей мыши по состоянию load_ones_tens_zero (рис. 1), то появится диаграмма, показанная на рис. 3. Вложенная диаграмма содержит все то же самое, что и диаграмма верхнего уровня, плюс два дополнительных элемента: вход в иерархию (Entry Point) и выход из иерархии (Exit Point). Иерархическое состояние может быть сгенерировано в полуавтоматическом режиме. Для этого на любой существующей диаграмме необходимо выделить одновременно несколько состояний при помощи клавиши Shift, а затем щелкнуть правой клавишей мыши по одному из выделенных состояний и выбрать Relevel ? Add hierarchy. При этом все выделенные состояния будут заменены на одно иерархическое, а исчезнувшие будут помещены внутрь созданного иерархического состояния.
- Состояние ожидания — это состояние, в котором автомат задерживается на несколько тактов. Их количество указывается в свойствах этого состояния.
Переход (Transition)
Менять текущее состояние конечный автомат может только в соответствии с созданными переходами. Они изображаются в виде линий, соединяющих состояния. При этом их внешний вид (Appearance) может меняться.
Переход может содержать действия (Actions) и условия (Conditions). Визуально это отображается так: поверх линии, изображающей переход, помещается текстовый блок, разделенный горизонтальной чертой на две части: над чертой — условие, при котором этот переход будет выполнен, под чертой — действие. Действия и условия пишутся в полном соответствии с синтаксисом выбранного языка (VHDL или Verilog). Например, если условием перехода будет A равно B, а действием C присвоить D, и используется язык VHDL, то строки, которые необходимо ввести в текстовый блок, будут выглядеть так:
Обратите внимание на точку с запятой в конце строки присваивания. Строка «a = b» будет вставлена внутрь VHDL-предложения if (…) или case …, поэтому после нее точки с запятой не требуется, в то время как «c <= d;» является полным VHDL-предложением, которое по синтаксису должно заканчиваться точкой с запятой.
Каждый переход имеет приоритет, изображаемый цифрой внутри окружности. Чем ниже цифра, тем выше приоритет, т. е. система сначала пытается выполнить переход под номером 1, и, если результатом проверки условий на этом переходе является «ложь», то осуществляется попытка выполнить переход под номером 2. Очевидно, что если переход 1 не имеет условий, то переход будет всегда выполняться только по нему.
Точка прерывания (Interrupt Point)
Этот элемент имеет наивысший приоритет. То есть, если выполняется условие, заданное на переходе, исходящем из точки прерывания, то в каком бы состоянии не находился автомат, будет выполнен именно этот переход. Если диаграмма имеет несколько точек прерывания, то на исходящих из них переходах указывается приоритет.
Точка восстановления (Recovery Point)
Точка восстановления указывает на то состояние, в котором конечный автомат окажется в случае, если происходит ошибка в работе автомата и вычислить «правильное следующее» состояние не удается. Иными словами, это точка перехода при сбое.
Сигнал разрешения (Enable)
Указывает имя входного сигнала, разрешающего продолжение работы конечного автомата.
Синхросигнал (Clock)
Указывает имя того входного порта, который будет считаться синхросигналом, а также задает тип синхросигнала (передний фронт, задний фронт и т. д.).
Ссылка (Link)
Может быть использована для визуального разрыва линии перехода. Например, на рис. 1 изображены две ссылки на состояние WaitState, благодаря чему нет необходимости «вести» линии переходов от точки восстановления и точки прерывания непосредственно к состоянию, а достаточно «подвести» переход к ссылке на это состояние.
Узел (Junction)
Изображается в виде ромбика. Служит для логического объединения нескольких переходов. Может быть одного из трех типов: AND, IF и CASE. Если, например, к узлу типа AND подведен переход с условием «a = b», и из узла выведен переход с условием «c = d», то это по существу означает один переход с условием «(a = b) and (c = d)».
Графический комментарий (Comment Graphics) и штамп (Title Block)
На диаграмму конечного автомата, как и на любую другую диаграмму среды HDL Designer, может быть добавлен графический блок, не несущий функциональной нагрузки с точки зрения моделирования, а призванный упростить понимание схемы пользователем. Текстовое содержимое этого графического блока может быть включено в сгенерированный HDL код. Для этого надо щелкнуть по нему правой клавишей мыши и в разделе Include In HDL выбрать соответствующее место в коде, куда будет включен комментарий. Например, это может быть начало HDL-описания или место после указанного объекта. На рис. 4 показан пример использования графических комментариев. Несколько графических комментариев можно объединить в группу. Для этого надо выделить несколько блоков, щелкнуть по одному из них правой клавишей мыши и выбрать меню Group ? Group. Частным случаем группы графических комментариев является штамп. Он рассматривался в одной из предыдущих статей.
Свойства конечного автомата
В рамках одного объекта «Конечный автомат» может быть несколько независимых, работающих одновременно вложенных автоматов. Такие автоматы обычно называются параллельными. На рис. 1 изображен конечный автомат, содержащий всего один параллельный автомат под именем machine0. Их можно создавать, удалять и переименовывать. Для всех параллельных автоматов доступен единый набор входных и выходных портов. Свойства конечного автомата, доступные через меню Diagram ? State Machine Properties, будут распространяться только на один выбранный параллельный автомат. Перечислим основные свойства, которые можно выбрать в окне State Machine Properties:
- Стиль генерации. Определяет, будет автомат синхронным или асинхронным, а также количество процессов, которые будут обрабатывать логику конечного автомата.
- Кодировка: Gray, 1-Hot, 2-Hot и т. д.
- HDL-текст. В этом же окне можно поместить некоторый VHDL или Verilog текст, который будет без изменений вставлен в сгенерированный код.
- Объявления сигналов в текстовом виде. Пользователь может создать новый локальный сигнал, как в таблице сигналов, так и объявить его при помощи HDL-текста в окне свойств конечного автомата.
- Суффикс для сигналов (подробнее будет рассмотрен в последующих разделах).
Стиль генерации
Если проектирование ведется на языке VHDL, то после генерации VHDL-кода логика работы конечного автомата будет описываться несколькими параллельными процессами. Спонятием процесса можно более детально ознакомиться, обратившись к руководству по языку VHDL. Количество процессов указывается в окне свойств автомата Diagram > State Machine Properties. Типовой конечный автомат описывается тремя процессами: clocked, nextstate и output. В процессе output выполняются действия (Actions), описанные на переходах и состояниях. Процесс nextstate вычисляет значение следующего состояния. Процесс clocked изменяет текущее состояние на то, которое было вычислено в процессе nextstate. Кодировка, количество процессов и выполняемые ими функции могут задаваться пользователем и влияют на скорость работы конечного автомата и занимаемый им объем вентилей после синтеза. Совокупность этих параметров напрямую зависит от решаемой конечным автоматом задачи.
В процессе синтеза пакет Precision Synthesis автоматически распознает конечный автомат и выполняет его оптимизацию.
Порты и сигналы
Непосредственно на диаграмме конечного автомата не представлены графические изображения сигналов и портов. Их можно увидеть, щелкнув по пункту Signals Table из панели Structure Navigator, расположенной справа. Если этой панели нет, ее можно включить при помощи меню View ? Diagram Browser.
Сигнал может работать по одной из трех схем: Registered, Clocked и Combinatorial (столбец Scheme в таблице сигналов). С точки зрения генерации HDL-описания, различия в схемах заключаются в том, в каком процессе будет выполняться фактическое присваивание данных сигналу. Понятие «фактическое» присваивание требует пояснения. Рассмотрим, например, выходной порт clk_ones, работающий по схеме Registered. На одном из переходов конечного автомата в диалоговом окне можно ввести действие «clk_ones <= ‘1’;», означающее, что выходному порту присваивается значение ‘1’. Однако после нажатия кнопки Ok, HDL Designer предложит пользователю заменить «clk_ones» на «clk_ones_int» и, если пользователь соглашается с данным предложением, «clk_ones <= ‘1’;» будет заменено на «clk_ones_int <= ‘1’;», а при генерации всего конечного автомата в процесс clocked будет добавлена строка «clk_ones <= clk_ones_int;». Таким образом, если порт работает по схеме Registered, то данные, которые пользователь попытается присвоить этому порту, будут сохранены во внутреннем регистре, а на порт эти данные попадут только после прихода следующего синхросигнала.
Похожая ситуация будет и со схемой Clocked. К сигналам добавляется суффикс «_cld», но, в отличие от Registered, для присвоения значения фактическому порту будет создано параллельное со всеми тремя процессами предложение VHDL, например, «cnten_ones <= cnten_ones_cld;», т. е. данные на порт cnten_ones придут сразу же, как только изменится cnten_ones_cld.
При работе сигнала по схеме Combinatorial никаких внутренних сигналов создаваться не будет, присвоения будут выполняться непосредственно сигналам, указанным пользователем.
Локальные сигналы, в отличие от портов, могут работать только по схемам Clocked и Combinatorial.
Expression Builder
В процессе ввода действий и условий пользователь может воспользоваться помощником, облегчающим создание HDL-предложения. Он автоматически появляется, когда пользователь переходит в поле редактирования HDL-текста. Если он автоматически не включился, то это можно сделать через меню Edit ? Expression Builder. Так, например, в поле Ports/Locals этого помощника перечислены все порты и локальные сигналы. Щелкнув мышью по одному из них, в поле ввода текста можно автоматически поместить соответствующее имя сигнала.
Внешний вид (Appearance)
Как и в блок-схеме (см. КиТ № 8`2005, стр. 88), в конечном автомате внешний вид всех объектов настраивается, но с некоторыми ограничениями. Так, например, состояние может отображаться только в виде окружности, но можно задать цвет и стиль линии. Настройки внешнего вида имеют три уровня: относящиеся ко всем автоматам, относящиеся только к текущему автомату и относящиеся к конкретному объекту.
Настройки для всех автоматов доступны через меню Options ? Master Preferences ? State Diagram менеджера проекта Design Manager. Заданные там настройки будут применяться ко вновь созданным диаграммам. Для того, чтобы применить эти настройки к текущей диаграмме, необходимо открыть ее и выбрать меню Options ? Master Preferences ? Apply to new and existing objects.
Настройки для текущего автомата задаются через меню Options ? Diagram Preferences, в окне редактора конечного автомата.
Настройки, относящиеся к конкретному объекту, можно изменить, щелкнув правой клавишей мыши по объекту и выбрав в контекстном меню пункт Appearance.
Самостоятельная работа
Если в распоряжении пользователя имеются сконфигурированные данные для лабораторных работ, о которых говорилось в первой статье (см. КиТ № 7`2005, стр. 70), и создана блок-схема, описанная во второй статье (см. КиТ № 8`2005, стр. 88), то можно самостоятельно создать архитектуру для блока BCDRegControl (см. КиТ № 8`2005, стр. 91, рис. 4). Для этого необходимо открыть созданную ранее блок-схему BCDRegister, щелкнуть правой клавишей мыши по блоку BCDRegControl и выбрать Open As ? New View. В появившемся диалоговом окне нужно выбрать State Diagram и нажать кнопку Next. В следующем окне — просто нажать кнопку Finish. При этом будет создан новый конечный автомат. Пользователь может самостоятельно создать диаграмму, приведенную на рис. 5. Рис. 6 и 7 показывают содержимое иерархических состояний CountOnes и CountTens соответственно. Свойства сигналов могут быть заданы пользователем в соответствии с рис. 8.
Сгенерировать VHDL код можно через меню Tasks ? Generate ? Run Single окна редактора конечного автомата. Посмотреть сгенерированный ранее VHDL код можно через меню HDL ? View Generated VHDL.
В следующей статье будет описан процесс моделирования созданного объекта BCDRegister.