Altera Quartus Prime и ModelSim под Linux. Вводное руководство
В очередной раз, начав изучать что-то новое для себя, я столкнулся с типичной для меня проблемой: нет нигде быстро гуглящегося how-to и step-by-step руководства по быстрому созданию какой-либо простой конструкции на Verilog и описания способа эту конструкцию быстро симулировать без необходимости запуска кода в железе для проверки конечного результата. Я надеялся очень быстро найти готовый материал о том, как под Altera Quartus 20.1 и ModelSim 2020.1 под Linux всё по-быстрому сделать и идти дальше. В итоге не найдя ничего системно и последовательно описанного в одном месте я традиционно разобрался самостоятельно и решил это исправить своей очередной статьей на Хабре.
Возможно, этот материал поможет таким же как я новичкам на самом старте и позволит не растерять энтузиазм во время танцев по граблям. Всем, кто заинтересовался — добро пожаловать под кат.

Дисклеймер. Перед началом повествования, хотелось бы заранее оговориться, что основная цель, которую я преследую при написании этой статьи — рассказать о своем опыте. Я не являюсь профессиональным разработчиком под ПЛИС на языке SystemVerilog и могу допускать какие-либо ошибки в использовании терминологии, использовать не самые оптимальные пути решения задач, etc. Но отмечу, что любая конструктивная и аргументированная критика только приветствуется. Что ж, поехали…
❯ Постановка задачи
Итак. Представим, что вы абсолютный новичок в области ПЛИС aka FPGA и вот однажды вы услышали, интересные рассказы о том, что с помощью одного из языков описания аппаратуры (HDL) можно решать разнообразные задачи с очень высокой скоростью и при этом параллельно, т.е. одновременно. Первым вопросом, которым задался я как новичок когда услышал про ПЛИС — а с чего начать? На тот момент мне казалось, что все начинается с отладок с нужным чипом и примеров. Я без особого понимания критериев отбора, чем отличаются Altera от Xilinx — быстренько заказал себе отладку на Cyclone IV и после того как получил — научился создавать и запускать простейшие проекты. Каждая правка исходного проекта и проверка сопровождалась ожиданием синтеза, роутинга, заливкой прошивки в ПЛИС для проверки и отладки с помощью светодиодов и кнопок и SignalTap. И чем сложнее были примеры — тем больше времени я тратил на ожидание синтеза, рассовывания пробников отладчика по сигналам и тут я начал задумываться о том, что возможно что-то тут я делаю не так. А если вспомнить, что SignalTap занимает в ПЛИС тоже некоторое количество логических блоков и в сложных проектах он уже не умещался в ПЛИС — ситуация точно требовала изменения подхода.
И тут я начал вникать в то, как организуют процесс разработки в среде профессионалов — я понял, что я упустил тут один очень важный шаг — симуляцию и тестирование с помощью т.н. testbench-ей.
Вникнув и разобравшись — я захотел поделиться своим опытом в этом материале и при написании этой статьи я поставил для себя несколько задач: разобрать вопрос создания простого проекта в Altera Quartus под Linux и как запустить его симуляцию в ModelSim, с попутным объяснением как решить возникающие проблемы, коих по ходу дела возникает немало (вполне возможно, что только у меня).
Задачи для меня и моего уровня вполне достижимые, давайте расскажу и покажу как я их решал.
❯ Общий flow разработки под ПЛИС
Вообще, отдельно стоит рассказать о том, как работают с ПЛИС профессионалы и что следует взять себе за ориентир. Ниже, я попытался обобщить в виде схемы свое представление о алгоритме разработки под ПЛИС. Коротко опишу каждый из этих этапов. Оговорюсь сразу, что в рамках этой статьи я рассмотрю только первые три интересующих нас этапа.

Идея и техническое задание. Пункт с вполне понятным смысловым наполнением. На этом этапе формируется идея будущего устройства, что он должен уметь делать, чего делать не должен. На основании идеи формируется уже техническое задание которое отражает в форме измеримых величин требования для конечного устройства.
Реализация HDL-кода. На этом этапе происходит основная часть работы — в HDL-коде реализуется конечный автомат или группа из таковых, вместе со всеми багами, корявостями и синтаксическими ошибками .
Функциональное и поведенческое моделирование (например, в ModelSim). А вот на этом этапе происходит, на мой взгляд самое интересное. Здесь как раз и происходит первая проверка полученного результата, а не напрямую в ПЛИС, как я делал до этого.
В ходе реализации проекта, на каждом этапе когда находятся те или иные ошибки — происходят доработки и исправления — и все начинается по новому циклу. В целом все достаточно просто. Вот реализацию этого флоу я хочу отразить на конкретном примере с картинками и разбором всех граблей.
❯ Создаем проект в Quartus
Итак, казалось бы, что может быть проще: создаем проект и запускаем ModelSim, пишем тестбенч и проверяем, что всё работает как нужно. Я так думал, когда первый раз хотел, что-нибудь прогнать через симуляцию. Но не тут-то было. Но обо всё по порядку.
Открываем Quartus и создадим новый проект:

Жмем New Project Wizard, откроется мастер и можно идти по шагам.

Жмём Next и указываем каталог, в котором будет жить наш проект, заполняем его имя.

Тыкаем кнопку Next и указываем, что мы создаем пустой проект, выбрав пункт Empty project.

Файлы никакие добавлять не будем, поэтому жмякаем Next.

В следующем меню выбираем модель чипа с которым вы работаете, в моем случае это EP4CE6F17C8.

А вот в последнем меню в пункте Simulation нужно выбрать ModelSim-Altera и SystemVerilog HDL (если конечно именно он используется, а не VHDL или Verilog HDL например).

Просматриваем Summary, проверяем нет ли ошибок и жмем Finish:

Откроется окно пустого проекта и можно приступать к его наполнению и настройке.
❯ Наполняем проект смыслом
Реализуем первый этап из флоу — т.е. составим техническое задание: необходимо реализовать на языке SystemVerilog модуль, который на входе будет иметь два логических сигнала A и B, и один на выходе Y, который будет результатом логической операции & (AND) от A и B. Идея достаточно простая и эту, казалось бы простую задачу, можно реализовать аж тремя путями.
Рассмотрим каждый из вариантов:
- Gate Level, то есть через представление в виде логических элементов:
module AND_GATE(output Y, input A, B); and(Y, A, B); endmodule
- Data flow, то есть через обозначение направления потока данных:
module AND_DATA_FLOW(output Y, input A, B); assign Y = A & B; endmodule
- Behavioral, то есть поведенческий подход, в котором происходит работа с изменениями состояний сигналов:
module AND_BEHAVIORAL(output reg Y, input A, B); always @ (A or B) begin if (A == 1'b1 & B == 1'b1) begin Y = 1'b1; end else Y = 1'b0; end endmodule
Какой из вариантов вам больше нравится — такой и выбирайте. Мне нравится больше подход Data Flow.
Создаем новый файл в меню File — New — System Verilog HDL File. Откроется редактор, и запишем интересующий вариант модуля:

Далее сохраняем файл и даем ему соответствующее его роли название:

Теперь нужно добавить файл Top-Level entity, в котором будет находиться модуль, который мы будем пропускать через симуляцию. Для этого в Project Navigator с включенным видом Files кликаем правой кнопкой и выбираем пункт Set as Top-Level Entity:

В меню сообщений будет следующая строка: Info (125061): Changed top-level design entity name to «Top».
Теперь можно запустить анализ и синтез:

Но Quartus выдаст нам ошибку, что якобы Error (12007): Top-level design entity «Top» is undefined.
Что ж, придется снова указать, кто в проекте Top-level Entity. Выбираем в Project Navigator вид отображения Hierarchy, кликаем правой по Top и Settings:

Выбираем первый пункт в меню настроек General, далее кликаем по многоточию и выбираем AND_DATA_FLOW и нажимаем ОК и еще раз ОК чтобы закрыть это меню и перезапускаем анализ и синтез:

Дожидаемся окончания операции и видим что все окончилось успешно и без ошибок, только предупреждения:

Смотрим в отчет и видим, что израсходован один логический элемент и задействовано три пина. Эта информация может в будущем оказаться весьма полезной:

Идём дальше. Теперь, раз всё компилируется, стоит произвести моделирование полученного дизайна и убедиться что все будет работать как нужно.
❯ Интеграция Quartus с ModelSim и запуск симуляции
Итак, общий флоу по интеграции ModelSim в процесс разработки под ПЛИС из нескольких этапов:
- Конфигурирование NativeLink, благодаря которому происходит обмен информацией между Quartus и внешними инструментами, например ModelSim;
- Компиляция необходимых библиотек Quartus, которыми будет оперировать ModelSim;
- Написание Testbench (тестового скрипта) и интеграция его в проект;
- Запуск симуляции, анализ результатов и внесение изменений в проект (при необходимости).

То само собой получим ошибку, что EDA Simulation Software настроен:

Что ж, перейдем к настройке Native Link. Для этого необходимо перейти в общие настройки Quartus и указать каталог, в котором находится ModelSim. Это делается путем перехода в главном меню Tools — Options…

Откроется меню настроек и нужно перейти в пункт меню EDA Tools Options и в поле ModelSim и\или ModelSim-Altera указать путь до каталога modelsim_ase/linux так, как это сделано у меня:

Далее в настройках проекта тоже необходимо какой тип симулятора используется. Для этого возвращаемся в настройки проекта в Project Navigator (в котором мы устанавливали Top-Level Entity) и переходим в пункт меню EDA Tools Settings и в пункте Simulation выбираем ModelSim-Altera / SystemVerilog HDL:

После переходим в пункт Simulation и видим что в пункте настроек NativeLink ничего не настроено и всё нужно сделать своими ручками:

На этом этапе необходимо указать файл testbench, которые у нас еще отсутствуют. Перейдем к созданию этих файлов.
В многих источниках рекомендуют воспользоваться пунктом меню Processing — Start — Start Test Bench Template Writer:

Но на этом этапе я столкнулся с ошибкой, что якобы данная опция для SystemVerilog не поддерживается:

Окей, попробуем создать файл Testbench самостоятельно в проект и прикрепить его в настройках симуляции руками самостоятельно. Для этого берем создаем новый файл через File — New — SystemVerilog HDL File.
После создания файла откроется редактор и в него запишем заготовку:
module and_gate_test_bench; endmodule
После сохраним файл c именем and_gate_test_bench.sv и возвращаемся в меню NativeLink settings. Выбираем пункт меню Compile test bench и кликаем по кнопке Test Benches…
В открывшемся меню Test Benches нажимаем кнопку New… и заполняем настройки следующим образом:

Главное указать Top level module in test bench в четком соответствии как это было заполнено в файле в предыдущих шагах. Везде нажимаем OK и выходим.
Теперь запускаем компиляцию:

И видим в сообщениях, что все завершено удачно:

Теперь запуск RTL Simulation из главного меню должен открыть ModelSim, но этого не достаточно т.к. при запуске симуляции будет выданы ошибки о том, что нет необходимых библиотек для симуляции. Поэтому сделаем компиляцию необходимых библиотек.
Для это необходимо перейти в главное меню и нажать Tools — Launch Simulation Library Compiler:

Откроется меню, в котором нужно указать ModelSim, проверить что в поле Selected families указан Cyclone IV E и что указана директория для сохранения результатов компиляции:

Жмём кнопку Start Compilation и ожидаем результатов компиляции. Ожидаем, что компиляция пройдет успешно:

После закрываем окно и попробуем совершить акт симуляции. =)
❯ Пишем Testbench для проекта
Теперь можно перейти ко второму этапу — моделирование и проверка правильности работы полученного кода через Testbench. Как вы уже поняли — Testbench является по сути отдельным модулем написанный на языке HDL, который объявляется в отдельном файле. Поэтому перейдем в наш файл and_gate_test_bench.sv, который мы создали в предыдущих шагах.
Напомню, что в этой статье я не ставил себе целью подробный разбор как писать testbench-файлы и не планировал рассматривать синтаксис, поэтому приведу код testbench-файла как есть, лишь сопроводив его некоторым количеством комментариев:
module and_gate_test_bench; reg A, B; wire Y; AND_DATA_FLOW DUT(Y, A, B); initial begin A = 0; B = 0; #1 A = 0; B = 1; #1 A = 1; B = 0; #1 A = 1; B = 1; end initial begin $monitor ("%t | A = %d| B = %d| Y = %d", $time, A, B, Y); end endmodule
В начале мы объявляем два регистра A и B, чтобы они сохраняли свое значение до тех пор пока не будут назначено новое. Они будут означать входные сигналы. И зададим сигнальный проводник Y, который будет выводить результат.
После инициализируем экземпляр модуля, созданного в главном файле проекта, с именем DUT, указав сигналы в порядке объявления.
В модуле initial указываются действия которые исполняются после старта модуля в симуляторе. Соответственно при старте задаются значения сигналов A и B равными нулю и через каждый условную единицу времени изменяем сигналы на новые значения (в соответствии с таблицей истинности модуля).
Плюсом к этому добавляем отладочный вывод в лог симулятора, чтобы помимо временной диаграммы видеть текущие значения входных сигналов и того, что имеем на выходе. Сохраняем полученный testbench-файл и нажимаем Compilation.
❯ Запускаем Testbench
Дождавшись результатов компиляции — можно запустить ModelSim и увидеть результаты моделирования. Для этого нужно перейти в главное меню и нажать Tools — RTL Simulation:

Если в предыдущих шагах все сделали правильно — то будет запущен ModelSim и выведен лог:

И если увеличить масштаб в Waveform-меню — можно увидеть результат на временной шкале:

Соответственно, зная наперёд как работает логический элемент AND — мы можем сказать что всё сработало верно, результаты соответствуют ожидаемым, как в логе, так и во временной диаграмме. Ну и покуда всё работает верно — нет необходимости переходить к пути коррекции ошибок и можем считать, что задача решена.
❯ Заключение
Вот путём таких не хитрых манипуляций можно достаточно быстро, без реальной железки, проверить свой HDL-дизайн и получить быстрый ответ на вопрос “работает\не работает”. Если вы застряли, на каком-либо из этапов — не стесняйтесь обращаться за помощью в комментариях, возможно я или более опытные коллеги смогут вам помочь.
Как пользоваться средой моделирования и как раскрыть весь потенциал ModelSim — тема на большое количество статей или даже книгу, тут мы с вами скорее попробовали просто настроить проект перед тем как приступать к более сложным вещам. Но думаю, что много из того, что я буду рассматривать в своих следующих статьях, в той или иной степени, позволит расширить представление о ModelSim и его возможностях.
Если статья вам понравилась — ставьте “подписывайтесь и ставьте стрелочку вверх”. Этим самым вы поддерживаете меня как автора и стимулируете на написание новых материалов для вас. До встречи в следующих статьях!
Возможно, захочется почитать и это:

- ➤ Обзор отладочной платы Altera Cyclone IV EP4CE6
- ➤ Крушение Intel продолжается
- ➤ Zynq 7000. AXI GPIO. Мигаем светодиодом по-новому
- ➤ HabraTab: извлечение и модернизация движка (о, сколько нам открытий чудных. )
- ➤ Разработка BIOS на языках высокого уровня
Пошаговая инструкция: создаем проект Quartus II
В этой статье я расскажу, как создать новый проект в среде Altera Quartus II, как его откомпилировать и как прошить плату Марсоход.
В предыдущей статье «Введение в Verilog, урок первый» я писал о простых «программах» на языке Verilog. Мы изучили простое понятие провод ( wire ) и регистр ( reg ). Я хочу сделать совсем простой проект — соединить проводами кнопочки и светодиоды на плате Марсоход. Чтоб было не совсем скучно, добавим совсем простую логику в наш проект — две логические функции И и ИЛИ .
Соединить проводами — это не значит, что мы будем что-то паять. Мы напишем «программу» на языке Verilog, откомпилируем ее средствами среды разработки Quartus II и зашьем в плату Марсоход.
Вот какая у меня будет программа на Verilog:
module test_wires(
input wire key0,
input wire key1,
input wire key2,
input wire key3,
output wire led0,
output wire led1
);
assign led0 = key0 & key1;
assign led1 = key2 | key3;
endmodule
Светодиод led0 будет гореть если от кнопочек key0 И key1 будет приходить сигнал единица .
Светодиод led1 будет гореть если от кнопочек key2 ИЛИ key3 будет приходить сигнал единица .
Посмотрим, что у нас получится (внимание траффик — более 30 картинок — очень подробная инструкция).
Шаг 1.

Запускаем среду разработки Altera Quartus II Web Edition и выбираем пункт меню File/New Project Wizard . (Нажмите на картинку, чтобы посмотреть крупнее).
Шаг 2.

Вы видите начальный диалог мастера создания проекта. Этот диалог в несколько простых шагов поможет нам сделать наш первый проект. Сейчас нажмем кнопку Next — и пойдем дальше.
Шаг 3.

Сейчас нам нужно выбрать папку для нашего нового проекта и его название. Выберите себе любую пустую папку. Я назвал наш проект lesson1 , вы можете использовать любое другое название.
Шаг 4.

Сейчас можно добавить в новый проект какие-то существующие файлы, модули, может быть из других проектов. Поскольку это наш первый проект, то пропускаем этот шаг. Нажимаем Next .
Шаг 5.

Вот здесь пожалуйста внимательнее. Нужно выбрать тип микросхемы CPLD или FPGA , для которой будет делаться проект. Конечно этот шаг тоже можно пропустить и сделать это назначение позже. Я предлагаю делать выбор сейчас. На плате Марсоход стоит микросхема ПЛИС (CPLD) EPM240T100C5. Вот ее и выбираем. После того, как выбрали — нажимаем Next .
Шаг 6.

Здесь можно выбрать дополнительные программные инструменты, например, для симуляции проекта, мы пропускаем этот шаг. Нажимаем кнопку Finish . Наш проект создан. Теперь нужно добавить в него файлы, описывающие логику проекта.
Шаг 7.

Заходим в меню File/New и видим вот такой диалог. Здесь нам нужно решить какой именно файл мы собираемся создать, какого типа. Вы можете выбрать Block diagram/Schematic file — тогда логику проекта будем рисовать в виде схемы. Запустится специальный графический редактор и можно будет вставить в проект разные логические элементы, триггера, регистры, счетчики, сумматоры, мультиплексоры и много еще чего. Потом все эти элементы соединяются проводками — они буквально «рисуются» в этом графическом редакторе. Очень удобно. Я расскажу об этом как нибудь в другой раз. Сейчас в этом диалоге мы можем выбрать создание файла на языках описания аппаратуры: AHDL, VHDL, Verilog и других. Я выбираю Verilog — пункт списка Verilog HDL File .
Шаг 8.

Вот наш новый файл создан! Здесь мы будем набирать текст нашей программы.
Шаг 9.

Вот я набрал текст программы и теперь нужно его сохранить в каком нибудь файле. По умолчанию сейчас имя файла Verilog1.v — его можно поменять на любое другое имя файла.
Шаг 10.

Выбираем пункт меню File/Save As .
Шаг 11.

Вот появился диалог позволяющий задать имя записываемого файла. Я предпочитаю давать имена файлов по названию модулей, описанных в них. Конечно это не обязательно, вы можете выбрать себе любое другое имя файла. Сейчас я хочу задать имя файла test_wires.v
Шаг 12.

Файл записан. Вы можете видеть наше имя файла на закладке.
Шаг 13.

Вот здесь пожалуйста внимательней. Сейчас мы скажем среде программирования Quartus II, что этот наш текущий файл test_wires.v является самым главным файлом проекта. Попробую объяснить. Проект всегда включает в себя самый главный модуль, который может включать в себя многие другие модули в других файлах. Сейчас мы явно скажем, кто у нас тут самый главный . Заходим в меню Project/Set As Top Level Entity . Все — готово.
Шаг 14.

Пожалуй можно пробовать компилировать наш проект. Видите кнопочку треугольничек на панели инструментов?.Ну или можно зайти в меню Processing/Start Compilation .
Пожалуй перед компиляцией сделаем еще одну очень важную настройку нашего проекта.
Шаг 15.

Выберем пункт меню Assignments/Device . Здесь можно задать многие параметры компиляции проекта, связанные конкретно с чипом.
Шаг 16.

Появился вот такой диалог — на нем куча всяких настроек. Например можно выбрать тип микросхемы, для которой будет делаться компиляция проекта. Мы уже выбрали микросхему раньше. Сейчас можете проверить — должно быть EPM240T100C5. Нас же сейчас интересует кнопка Device and Pin Options . Нажмем ее.
Шаг 17.

Появился еще более страшный диалог. Не пугайтесь. Выбираем закладку Unused Pins .
Шаг 18.

Сейчас нам нужно сделать очень важную настройку . Мы должны сказать компилятору, что делать с неиспользуемыми ножками микросхемы. Поясню. В написанной нами программе всего 4 входа подключенных к кнопочкам, и два выхода, подключенных к светодиодам. Итого наш проект будет использовать 6 контактов микросхемы ПЛИС. А у нее, например всего 80 контактов, которые мы можем использовать по своему разумению. Компилятор подключит 6 контактов, а что делать с остальными? По умолчанию все неиспользуемые контакты микросхемы подключаются к нулю по питанию. Конечно все зависит от печатной платы, куда впаяна микросхема. Если на плате, например ошибочно, неиспользуемый контакт микросхемы подключен к питанию платы, то произойдет короткое замыкание. Не очень приятно. Что нибудь может сгореть на плате. Поэтому я всегда устанавливаю эту настройку. Я ставлю As input tri-stated . Это обозначает, что неиспользуемые входы будут входами с высоким входным сопротивлением. Это обезопасит микросхему и плату.
Шаг 19.

Вот теперь компилируем!
Шаг 20.

Мы видим, что проект успешно откомпилирован! Поздравляю!
Тем не менее, это еще не все. Пожалуйста обратите внимание на Warnings — предупреждения, а особенно на Critical Warnings — критические предупреждения. Я вообще, всегда рекомендую внимательно читать предупреждения компилятора. Конечно, хорошо бы знать английский язык, но я думаю вы довольно быстро освоитесь. Посмотрим, что же нам выдал компилятор?
Шаг 21.

Читаем: » Critical Warning: No exact pin location assignments for 6 pins of a total 6 pins «.
Это обозначает, что в проекте всего было 6 контактов и всем шести контактам не были сделаны назначения по расположению на чипе. На самом деле компилятор выполнил свою работу, но расположил контакты как попало, как ему было удобно. Так дело не пойдет. У нас уже есть плата Марсоход и кнопочки присоединены к конкретным ножкам микросхемы. Светодиоды так же подключены на плате. Точное расположение контактов нужно смотреть на схеме нашей платы
Схема платы Марсоход ( 54089 bytes )
или в нашем документе
PINOUT файл ( 49477 bytes )
. Нам нужно сказать компилятору куда подключать какую ногу микросхемы.
Шаг 22.

Выберем пункт меню Assignments/Assignment Editor .
Шаг 23.

В открывшемся окне делаем нужные нам назначения согласно схеме нашей платы. В колонке To вписываем имя входа или выхода. В колонке Assignment Name выбираем из списка нужную нам настройку Location . В колонке Value вписываем номер контакта микросхемы — его смотрим в PIN OUT файле или на схеме платы.
Шаг 24.

Кроме назначения местоположения всех контактов нашего проекта нужно сделать еще одну важную настройку. Наши кнопочки подключены одним контактом к нашей ПЛИС, а вторым контактом к нулевому проводу (к земле). Таким образом, при нажатии кнопки, контакт микросхемы ПЛИС будет подключен к земле. А вот что будет, когда кнопка не нажата? Вход микросхемы будет болтаться неподсоединенный и это конечно плохо. Вход микросхемы нужно «притянуть» к напряжению питания резистором, чтобы не нажатая кнопка давала на входе микросхемы четкую логическую единицу. Можно было бы припаять такой резистор снаружи чипа — но не нужно. Микросхема ПЛИС позволяет по вашему желанию подключить внутренний резистор к любому входу. Именно это мы и сделаем. Мы назначаем всем входам проекта с именем key* настройку » Weak Pull Up resistor «.
Вот теперь можете компилировать проект и все будет нормально!
Шаг 25.

После успешной компиляции проекта его можно зашить в чип платы Марсоход. Для этого запускаем программу программатора. Выберите пункт меню Tools/Programmer .
Шаг 26.

Вот так выглядит окно программатора на экране. Видите в левом верхнем углу » No Hardware » — похоже программатор еще не установлен. Подключите программатор к вашему ПК. Если у вас UsbBlaster, то нужно будет установить драйвера к нему. Они находятся в папке C:/Altera/91/Quartus/Drivers . Если у вас ByteBlaster (в том числе сделанный самостоятельно), то драйвера не нужны. Теперь нажмите кнопку Hardware Setup .
Шаг 27.

В открывшемся диалоговом окне выберите тип программатора, который у вас установлен.
Шаг 28.

Теперь нужно проставить нужные «галочки» в Program/Configure и Verify . Строка CFM имеет отношение к собственно программированию ПЛИС. Строка UFM имеет отношение к программированию флеш памяти внутри чипа ПЛИС. Их можно программировать по отдельности.
Колонка Verify обозначает проверить после прошивки.
Шаг 29.


Нужно подключить плату Марсоход к UsbBlaster и подать питание на плату.
Шаг 30.

Нажимаем в програматоре кнопку Start — и, все готово! Плата Марсоход прошита с только что откомпилированным проектом! Урра!
После прошивки, подключаем питание и пробуем, что у нас получилось:
Обратите внимание, как все работает.
Прежде всего, у нас горят два светода, когда мы ничего не нажимаем. Как я уже говорил, не нажатая кнопочка обозначает логическую единицу на входе микросхемы. Входы притянуты внутренним резистором чипа к напряжению питания ( Weak Pull-Up Resistors ).
Левые две кнопки key3, key2 объединены в логическую функцию ИЛИ . Именно поэтому светодиод led1 гаснет только если нажать обе эти кнопки.
Правые две кнопки key1 , key0 объединены в логическую функцию И . Именно поэтому светодиод led0 гаснет если нажать хотя бы одну кнопку.
Вот так это все работает.
Теперь у нас есть инструкция, по которой вы сможете создавать свои проекты. Возможно она показалась вам длинной и занудной. Может быть сложной. На самом деле, дальше будет гораздо проще. Если у вас будет хотя бы один готовый проект (а их у нас на сайте уже много), то достаточно просто открыть его и удалить лишнее. Очень много времени обычно уходит на разные настройки. Если брать готовые проекты за основу, то там все настройки уже сделаны и тратить время на это уже не нужно.
Quartus + ModelSim. Интеграция в картинках и создание TestBench
В жизни каждого начинающего разработчика настает момент, когда необходимо делать качественные скачки в процессе разработки. Для меня такая необходимость возникла при отладке Verilog проекта в Quartus. Моими основными инструментами на тот момент были: тупое долбление в код, SignalTap и In-System Source and Probe.
Времени на компиляцию тратилось все больше и больше, количество памяти в кристалле все меньше, а ясности не прибавлялось.
Тогда было принято решение перенести отладку в виртуальное пространство при помощи инструмента ModelSim.
Поразительно, но перерыв кучи документации я так и не нашел нигде единого руководства по интеграции Quartus и ModelSim.
Данная статья посвящена новичкам, освещает основные моменты интеграции программ Quartus и ModelSim.
План
1. Подготовка проекта
2. Компиляция библиотек
3. Конфигурирование NativeLink
4. Генерация TestBench и привязка к проекту
5. Запуск симуляции
Подготовка проекта.
Для тех, кто работает на Verilog и VHDL это пункт не нужен. Тем же, кто орудует в схематике и желает отладить проект в ModelSim необходимо знать, что ModelSim квадратики не поддерживает)
Выход есть – преобразовать свой проект в Verilog или VHDL командой:
File — Create/Update — Create HDL Design File from Current File

Выберите желаемый формат выходного файла. Добавьте его в проект. BDF файл необходимо при этом исключить из проекта.
Внимание! Необходимо очень внимательно проверить преобразование, Quartus может и лажануть)
Компиляция библиотек для ModelSim
Внимание! Если используете ModelSim Altera Edition это пункт надо пропустить, там библиотеки уже встроены и скомпилированы.

Tools — Launch EDA Simulation Library Compiler.
Выбираем инструмент моделирования ModelSim и путь к нему, свой чип и язык программирования.
Здесь и дальше я буду использовать C:\MSim_lib для размещения библиотек.
Нажимаем Start Compilation.
Конфигурирование NativeLink
NativeLink – инструмент для налаживания связи между Quartus и Modelsim

Все эти телодвижения выполняется однократно для каждого проекта.
Жмем Assignments — Settings — Simulation
Ставим настройки в точности как на картинке.

Жмем More EDA Netlist Writer Settings…
Указываем путь к скомпилированным библиотекам.

Жмем More NativeLink Settings…
Опять указываем путь к скомпилированным библиотекам)
Настройка закончена, но сюда мы еще вернемся.

upd. В настройка необходимо указать путь к ModelSim.
Идем в Tools — Options — EDA Tool Options
Прописываем путь в ModelSim
Генерация TestBench и привязка к проекту
Собственно это ключевой момент статьи.
Во всех туториалах и документах, которые мне попадались это операция почти не описана. Может это само собой всем известно, но я потратил изрядно времени для осознания как надо делать ПРАВИЛЬНО.

Жмем Processing – Start – Start Test Bench Template Writter

В Message можно увидеть где же располагается ваш testbench.
Учтите, это всего лишь шаблон, а не готовый testbench. Quartus не ясновидец, придется все необходимые воздействия писать руками)

Теперь надо testbench привязать к проекту. Для этого идем опять в
Assignments — Settings — Simulation

Делам все как на картинке
Testbench: произвольное имя нашего testbench
Top Level in Test Bench: имя топ левел модуля testbench. Чтобы его узнать нужно посмотреть сгенерированный testbench. В моем случае Quartus дал имя counter_vlg_tst.
Test Bench Files: добавляем файл с testbench. В моем случае counter.vt
Жмем ОК.
Настройка закончена!
Запуск симуляции

Тут все просто: Tools – Run EDA Simulation Tools – EDA RTL Simulation
Дальше начинается не простой этап моделирования и вылавливания глюков вModelsim.
Спасибо за внимание.
Комментарии ( 21 )
thank you very very much!
наиактуальнейше. Типо пишу учебный проект по FSM. Задолбался уже глюки искать. Вот симуляция нам частично поможет 🙂
эх, начнем стандартно — со счетчика 🙂
так, либо чего-то я не так делаю… что имеется
Q11 + Modelsim Altera starter edition
Все делаю как в статье, выбирая где можно, ModelSim Altera.
дохожу до последнего шага, где EDA RTL Simulation. NativeLink рапортует об ошибке: типо не может запустить программу ModelSim, т.к. не указаны его расположение или по указанному расположению нет исполняемого файла.
Залажу в Tool -> Launch EDA sim library compiler. Там выбрано Tool name: ModelSim, а в поле Executable location пусто. Чтож, определяю его как C:\altera\11.0\modelsim_ase\win32aloem (там валяется exeшник, проверял), в поле появляется пусть. Жмакаю на Закрыть. Снова вызываю это окошко — в поле пути ПУСТО. wtf? Винда 7. У кого-нить такое было? Или что-то непрально делаю?
Пробовал отдельно ModelSim запускать. Запускается. Просто интересно глянуть как в связке работает. Ведь только начинаю. Вдруг так удобнее будет 🙂
зачем вы запускаете компиляцию библиотек для ModelSim Altera Edition? я же написал что для этого пакета этот шаг надо пропустить. имя используемого симулятора надо определить в assignments — settings — simulation.
попробуйте использовать чистый ModelSim, т.е. без Altera Edition
так я первый раз и пробовал именно как написано, пропуская шаги для предустановленной альтеровской версии. Сейчас на рабочем компе попробовал — безрезультатно — просит определить путь к exeшнику modelsim’а.
зы. пробовал оба варианта — чистого modelsim’a и altera edition. нифига. будем пробовать дальше )
ага. по ходу дела вот в чем причина была. Заглянул по Tools -> Options -> EDA Tool Option. там пути напротив ModelSim и ModelSim-altera были пустыми. добавил путь до эхешника ModelSim’a, перезапустил Quartus на всяк случай и все заработало. )))
да, действительно. этот момент я упустил.
путь не надо указывать для каждого нового проекта, вот я и забыл)
Ошибки И Способы Их Решения Altera Quartus
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.
Поделиться
Последние посетители 0 пользователей онлайн
- Ни одного зарегистрированного пользователя не просматривает данную страницу
Сообщения
Увы, уже подделывают https://aliexpress.ru/item/1005005178139520.html?spm=a2g2w.detail.rcmdprod.0.4b077c23x0ofHC&mixer_rcmd_bucket_id=aerabtestalgoRecommendAbV16_controlRu1&ru_algo_pv_id=6be187-61b690-54f186-bdee0a-1707091200&scenario=aerSimilarItemPdpRcmd&sku_id=12000031987529903&traffic_source=recommendation&type_rcmd=core Коль это не оригинал, значит подделка. Вполне возможно что и неплохая.
Измерял двумя мильтиметрами и плюс этот китайский показометр. Как раз на ней и буду сабирать. Плюс ардуина считает Вольты, амперы, ватты, А/ч. Плюс вход на этот показометр будет переключатся либо ЛБП либо внешний вход. На внешний вход будут подключаться разные источники питания для их проверки, а выход нагружается на электронную нагрузку.
А давайте без снобизма. Я вам показал видео, где автор собирает идентичную схему. Питание направляет исключительно на COM, у него все работает. Это вопреки законам природы?)
![]()
Внимательно посмотрите на страницу 11 мануала.
![]()
Он может подавать куда угодно, есть законы природы, что, совсем не в теме? Читайте, изучайте.
Mosfet-ы статикой пробить практически не возможно, это не Jfet-ы. Микросхемы? Ну может быть и мосфеты . если сетевая фаза висит на корпусе паяльника. Но тогда и самого должно трахом токнуть. Off: Вопрос ко всем адреналиньщикам, пытающим шим-контроллер IR2153 в схеме усилителя D-класса: что изменяется на выходе такого увеселителя после LC-фильтра при изменении напряжения на 3-й ноге этой микросхемки, скважность прямоугольных импульсов , или их частота?
Я собираю конструктор от Adafruit. В описании к их микроконтроллеру Feather M4 указано, что подключенные выходные пины — это PWM outputs. Осциллографом, конечно, нет проверял. Но не суть, в любом случая я вижу по мультиметру, что сигнал, идущий с компьютера на этот контроллер, порождает, когда надо, то 3.3В, то ноль на соответствующем выходе, который я уже соединяю с усиливающей микросхемой ULN2803 . Есть на оф.сайте, и инструкции, и видео-демонстрация того, что я собираю. Не думаю, что лажовую схему и принцип у них бы ушло в массовое производство/продажи. Вот видео, где показано использование ULN2803. Там автор тоже подает питание только на COM, а не на OUT. Приведу даже подписанный скриншот, где у него что. В приципе вот с этого момента он там вкратце рассказывает про пины и показывает, как собирает данную схему.