Пошаговая инструкция для Quartus II: Симуляция проекта

Какой бы проект для CPLD или FPGA мы ни делали: сложный или простой, всегда полезно произвести его симуляцию. Симуляция – это программное тестирование проекта, всегда делается до его проверки в железе. Микросхема имеет входы и выходы. Если мы зададим, например, последовательность и длительность входных импульсов, то система проектирования сможет просчитать результирующие сигналы на всех выходах. И не только на выходах! С помощью симуляции можно заглянуть внутрь всех модулей проекта и посмотреть на процессы, происходящие внутри чипа. Так, еще до тестирования в реальном чипе можно понять правильно работает проект или нет – ведь вы же знаете какие сигналы должны быть на выходах вашей микросхемы?

симуляция сигналов D-триггера

Этот урок про средство разработки Altera Quartus II и про симуляцию проекта. Дальше будет очень много картинок!

Сразу сделаю оговорку: я буду описывать симуляцию именно средствами Quartus II. Существуют дополнительные программные инструменты сторонних разработчиков, подключаемые к Qaurtus II. Они, возможно, имеют большие возможности, но и сложнее.  Один из лидеров в разработке средств тестирования электронных проектов – компания Mentor Graphics. Они, совместно с Altera, разработали программный продукт ModelSim-Altera. На сайте Альтеры можно скачать свободную версию этого продукта, но она имеет ограничение на размер проекта (кажется 10000 строк кода). Основная версия – платная, стоит около 1000$. Однако, как я сказал, мы сейчас не будем использовать ModelSim, а будем использовать встроенные в Quartus II средства.

Теперь вопрос – что мы будем симулировать. Я предлагаю сделать элемент D-триггер на логических элементах И-НЕ и посмотреть, как он работает. Я выбрал этот пример не случайно. Вот D-триггер:

D-триггер

На самом деле D-триггер буквально мистическое устройство. Без него нет цифровых микросхем. Элемент D-триггер запоминает один бит информации. В современных сложных схемах их многие многие тысячи. В чипе платы Марсоход их всего 240. Триггера запоминают состояние входной линии данных именно в момент фронта сигнала тактовой частоты. Это свойство чувствительности именно к перепаду уровня сигнала (от логического нуля до логической единицы или наоборот) тактовой частоты очень ценно.

типичная цифровая схема

Состояние цифровой схемы в каждый момент схемы описывается значениями записанными в триггера. По каждому фронту тактовой частоты триггера переключаются в новое состояние, сохраняя новое, вычисленное комбинаторными функциями значение. Так как запоминание в триггерах происходит одномоментно во всей схеме, то у комбинаторных схем есть время на вычисление своих функций – время вычисления не больше периода тактовой частоты.

Все бы хорошо, только принцип работы самого D-триггера очень сложен и не понятен. И все из-за того, что все логические элементы входящие в его состав соединены обратными связями. Чтобы понять, как же все таки работает триггер мы и будем его симулировать.

Первая часть этого описания – создание проекта Quartus II для D-триггера.
Если вы уже умеете создавать проекты в Quartus II, то можете перейти сразу к шагу 15.


Шаг 1.

Создаем проект Quartus II

Запускаем Quartus II.


Шаг 2.

Создаем проект Quartus II

Создаем новый проект. Для этого выбираем пункт меню File\New Project Wizard.


Шаг 3.

Создаем проект Quartus II

Появляется диалоговое окно мастера-помошника создания проекта. Нажимаем кнопку Next.


Шаг 4.

Создаем проект Quartus II

Выбираем папку, где будет размещен проект. Я выбрал c:\altera\marsohod\flipflop_sim. И указываем название проекта flipflop.


Шаг 5.

Создаем проект Quartus II

Quartus II спрашивает нас, нужно ли создать папку которая еще не существует. Конечно отвечаем Да.


Шаг 6.

Создаем проект Quartus II

Чтобы создать новый файл, принадлежащий проекту, выбираем пункт меню File\New.


Шаг 7.

Создаем проект Quartus II

Нам нужно создать файл, описывающий наше устройство. Это Design File. И мы сейчас выбираем рисование схемы Block Diagram\Schematic File. Наше устройство очень простое, хотя и будет содержать обратные связи. Его действительно лучше рассмотреть в виде схемы. Это возможно тот случай, когда применение языков типа Verilog не очень оправданно. Текстовое описание D-триггера будет еще менее понятно, чем схема.


Шаг 8.

Создаем проект Quartus II

Сохраняем наш новый файл под именем flipflop.bdf.


Шаг 9.

Создаем проект Quartus II

В поле графического редактора схем нажимаем правую кнопку мыши и в выпадающем меню выбираем пункты Insert\Symbol – вставить элемент.


Шаг 10.

Создаем проект Quartus II

Выбираем из библиотек Quartus II. Нам нужен трехвходовый элемент И-НЕ – это \primitives\logic\nand3.


Шаг 11.

Создаем проект Quartus II

Точно так же выбираем нужные нам входы и выходы \primitives\pin\input и \primitives\pin\output.


Шаг 12.

Создаем проект Quartus II

Вот все элементы которые будут нам нужны для нашей схемы. В графическом редакторе можно кликать на элементы и выделять их. Обычные Ctrl+C и Ctrl+V позволяют копировать и вставлять выделенные участки схемы или отдельные элементы.


Шаг 13.

Создаем проект Quartus II

На самом деле нам будет нужно 6 трех-входовых элементов И-НЕ. Вот мы их и поставим.


Шаг 14.

Создаем проект Quartus II

Выбирая на панели инструментов Orthogonal Node Tool мы можем рисовать провода в нашей схеме. Начнем их рисовать. Сперва сделаем три RS-триггера.


Шаг 15.

Создаем проект Quartus II

Добавим еще входы и выходы. Поименуем их – клик правой кнопки мыши на элементе и выбираем пункт меню свойства Properties. Меняем имя элемента.
Соединяем оставшиеся входы и выходы всех элементов вот так, как на этой схеме. Вот это – типичная схема D - триггера. Она содержит вход данных D, вход для такторой частоты C, два ассинхронных входа: сброс Rn и установка Sn, два выхода: прямой Q и инверсный Qn. Внимательно посмотрите на схему и попытайтесь представить себе, как она может работать. Это очень не просто из-за обратных связей.
Создание нашего проекта практически завершено – можно пытаться симулировать его.
Обратите внимание, что нигде я не задавал тип микросхемы для нашего проекта. На самом деле назначить тип микросхемы и конкретные номера ножек для входов и выходов очень важно, если в конечном счете вы собираетесь зашить проект в чип CPLD или загрузить в FPGA. Если мы собираемся провести просто логическую симуляцию, то нам все равно на какой микросхеме это делать. Поэтому я пропустил эти шаги.


Шаг 16.

Компиляция проекта Quartus II

Прежде чем делать симуляцию нужно откомпилировать проект. Выбираем пункты меню Processing\Start Compilation.


Шаг 17.

Создаем проект Quartus II

После компиляции нужно еще создать специальный netlist для функциональной симуляции. Выбираем пункт меню Processing\Generate Functional Simulation Netlist.
Вообще симуляция бывает временная и функциональная.
Функциональная симуляция позволяет проверить именно логику работы. С ее помощью мы можем убедиться, что проект может и должен работать так как задумано. Прежде всего нужно делать именно функциональную симуляцию.
Временная симуляция позволяет увидеть сигналы с учетом всех возникающих задержек сигнала между элементами, входами и выходами. Временную симуляцию делают в последнюю очередь, уже после функциональной симуляции, чтобы убедиться, что схема может работать на нужной заданной частоте.
Для небольших проектов, например для платы Марсоход, вполне достаточно делать только функциональную симуляцию. Ее чип CPLD весьма быстр, а внутренняя тактовая частота всего 5Мгц. Так что с вероятностью 99,9% можно сказать, что если функциональная симуляция пройдена, то проект будет работать.


Шаг 18.

Создание файла для симуляции Quartus II

Создадим файл для симуляции. В нем мы будем описывать входные сигналы и задавать выходные сигналы, которые хотим смотреть. Выбираем пункт меню File\New и затем в появившемся диалоге Verification\Debugging Files\Vector Waveform File.


Шаг 19.

stepa19s

Вот такой был создан файл.


Шаг 20.

Создание файла для симуляции в Quartus II

Сохраним наш файл симуляции под именем, например, flipflop.vwf.


Шаг 21.

добавление сигналов в файл симуляции Quartus II

Сейчас мы должны выбрать сигналы, которые будем смотреть и которые будем определять. Клик правой клавиши мыши на левой панели Names и в выпадающем меню выбираем пукнт Insert\Insert Node or Bus.


Шаг 22.

Выбор сигналов для симуляции проекта Quartus II

Появилось диалоговое окно. В нем вы можете набрать имя выхода какого нибудь сигнала или элемента. Сразу скажу, что это очень не просто. Полное имя сигнала может быть очень длинным и не всегда понятным. Поэтому лучше воспользоваться поиском сигнала в проекте. Нажимаем кнопку Node Finder.


Шаг 23.

Выбор сигналов для симуляции проекта Quartus II

Появляется диалоговое окно для поиска сигналов в проекте Node Finder. Оно достаточно удобное. В поле Look указано имя нашего проекта – в нем будет поиск сигнала. Здесь ничего менять не нужно. В поле Named можно задать часть имени сигнала или провода. Например, вы ищите в проекте выход модуля с именем data, но в проекте несколько модулей с выходами/входами с таким именем. Тогда для поиска в этом поле Named укажите *data*. Потом нажмете кнопку List (произвести поиск) и в таблице Nodes Found будет показан список всех модулей содержащих такой сигнал. Если указать просто *, то это значит, что нас интересуют вообще все сигналы, не зависимо от имени. Еще важное поле – Filter. Здесь из списка можно выбрать тип сигналов для поиска. Мы выбираем сейчас Pins: All – то есть нас интересуют физические входы и выходы икросхемы. Нажимаем кнопку List и видим список наших входов и выходов.


Шаг 24.

Выбор сигналов для симуляции проекта Quartus II

Выбираем все нужные нам сигналы слева в таблице найденых сигналов Nodes Found и переносим их вправо в таблицу выбранных сигналов Selected Nodes. Нажимаем кнопку OK.


Шаг 25.

Выбор сигналов для симуляции проекта Quartus II

Вот в нашем файле симуляции нужные нам сигналы.


Шаг 26.

Редактирование сигналов для симуляции проекта Quartus II

Прежде чем редактировать сами сигналы нужно задать временную сетку (это для удобства рисования). Для этого зайдите в пункт меню Edit\Grid Size.
Еще нужно задать длительность симуляции. Для этого зайдите в пункт меню Edit\End Time.


Шаг 27.

Редактирование сигналов для симуляции проекта Quartus II

Редактировать входные сигналы проекта можно с помощью кнопок панели инструментов. Например, выбираем сигнал Rn и нажимаем кнопку Forcing High (1). Таким образом, входной сигнал Rn становится логической единицей на всем отрезке времени. Делаем то же самое и с сигналом Sn. Логическая единица на этих сигналах делает их неактивными для D-триггера, который мы собираемся редактировать.


Шаг 28.

Редактирование сигналов для симуляции проекта Quartus II

Выбираем сигнал C и нажимаем на панели инструментов кнопку Overwrite Clock.  Сейчас в этом диалоговом окне мы сможем задать поведение сигнала как тактовой частоты. Задаем период тактовой частоты 50нс.


Шаг 29.

Редактирование сигналов для симуляции проекта Quartus II

Нарисуем сигнал D. Для этого нажмем на панели инструментов кнопку Waveform Editing Tool – средство для рисования. Теперь, с помощью мыши, мы можем просто рисовать сигнал. Обратите внимание как я нарисовал сигнал D. Я хочу проверить его влияние на D-триггер во всех возможных вариантах. Сигнал D у меня появляется импульсом когда C стабильно в единице, затем появляется, когда C стабильно в нуле, затем держится в единице во время спада сигнала C и, напоследок, D держится в единице, когда идет фронт сигнала C. Искусство симуляции состоит в том, чтобы проверить как можно больше важных возможных комбинаций входных сигналов. Чем больше вариантов вы проверите, тем больше вероятность, что проект будет работать правильно. Аппаратный проект, как и программный, может содержать ошибки, баги. Чем больше отсимулируете, тем больше уверенности, что критических ошибок в проекте нет.


Шаг 30.

Настройка симуляции Quartus II

Нужно задать тип симуляции. Зайдите в пункт меню Assignment\Settings.


Шаг 31.

Настройка симулятора Quartus II

В диалоговом окне Settings нас сейчас интересует раздел Simulator Settings. Здесь нужно задать тип симуляции – Functional, функциональная (нас сейчас интересует именно логика работы, а не временные задержки внутри чипа). Ну и конечно задаем имя входного файла симуляции flipflop.vwf. нажимаем OK. Вот теперь все готово для симуляции.


Шаг 32.

Запуск симулятора в Quartus II

Запускаем симулятор из пункта меню Processing\Start Simulation.


Шаг 33.

Анализ симуляции D-триггера в Quartus II

После успешной симуляции можно рассмотреть сигналы на выходе триггера Q или инверсного ему Qn. Вот посмотрите на это чудо. Изменение входного сигнала D абсолютно не важно, важно только его состояние в момент фронта C. Именно фронт сигнала C записывает входной сигнал D на выход Q. Как же это происходит? Чтобы разобраться нам нужно посмотреть еще на внутренние сигналы нашего проекта.


Шаг 34.

Редактирование сигналов для симуляции проекта Quartus II

Добавим еще внутренние сигналы для симуляции. Еще раз запустим диалог поиска сигналов (смотри шаг 21). В окне поиска установим фильтр Design Entity (all names) и нажмем кнопку поиска List. Теперь мы видим еще и внутренние сигналы названные A0, A1, B0, B1, C0, C1 – это имена nand3 элементов И-НЕ и значит это имена их выходных сигналов. Конечно, довольно часто, при симулировании других проектов вы можете столкнуться с фактом, что нельзя найти какой-то сигнал, он пропал. Это объясняется очень легко. Компилятор синтезатор сделал оптимизацию и просто выбросил сигнал как несущественный. Компилятор при оптимизации может выбрасывать не только комбинаторную логику, но и регистры! Что же делать, если интересующего сигнала не оказалось, если он выброшен оптимизатором? Есть два варианта: либо ограничиться тем, что есть, либо устанавливать в проект виртуальные пины (Virtual Pins). При установке виртуального пина сигнал всегда будет существовать в проекте и вы сможете смотреть симулятором сигналы в точке где он установлен. Установка виртуального пина грозит увеличением количества используемой логики, ведь часть функций могла бы быть оптимизирована, а вы не дали это сделать установкой виртуального пина!
В нашем примере D-триггера все элементы остались месте. Их нельзя оптимизировать, ведь они соединены сложными обратными связями. Посмотрим, что нам покажет симулятор на этот раз.


Шаг 35.

Симуляция D-триггера в Quartus II

Вот поведение внутренних сигналов D-триггера. Теперь можно попробовать разобраться в принципе работы D-триггера. Сигналы A0 и A1 – это выходы верхнего RS-триггера первой ступени. Сигналы B0 и B1 – это выходы нижнего RS-триггера первой ступени. Сигналы A1 и B0 действуют как S и R для RS-триггера второй ступени. Из симуляции видно, что в зависимости от текущего состояния RS-триггеров первой ступени в момент прихода фронта сигнала C выходы этих триггеров устанавливаются либо в 0,1,0,1 либо в 1,0,1,0 (в порядке A0, A1, B0, B1). Одновременно с этим переключением состояние триггеров первой ступени переписывается во второй RS-триггер.

Я надеюсь, теперь, пользуясь симулятором вы сможете более детально изучить не только этот D-триггер, но и все ваши будущие проекты.

 

 

Добавить комментарий