Vhdl verilog как установить

от admin

4a4ik

Как начать программировать Плис / FPGA / CPLD? Как установить Quartus II / ModelSim ? И как с ними работать?

В этой статье я расскажу, как начать разрабатывать проекты на Quartus II, как промоделировать написанную на VHDL программу с помощью ModelSim и как залить это в отладочну плату.

На хабре есть хорошая статья обьясняющая чем ПЛИС хороша, как выбрать производителя, язык и почему любой, кто задумывался научиться работать с FPGA / CPLD должен уже бежать покупать отладочную плату.

    использует Altera
  • Quartus II — IDE от Altera, дружелюбнее и интуитивно понятнее чем IDE от Xilinx
  • Мне легче выговорить Altera, чем Xilinx
  • Само название мне нравится больше
    хорошо отзывался о VHDL
  • в моём институте преподают VHDL (я начал изучать до этого курса)
  • В Verilogе можно «выстрелить себе в ногу»,
  • VHDL немного сложнее на первых порах и он не похож на СИ в отличие от Verilog,
  • В VHDL нужно выполнять больше лишних телодвижений (писать строчек кода), но это оплачивается тем что ты прекрасно понимаешь что и где у тебя происходит.
  • Также встречалось сравнение как VHDL = Assembler, Verilog = C.

Рис.1 Altera DE0 board

Многие так и начинают, к тому же вместе с платой ты получаешь пошаговую инструкцию начала работы, вместе с несколькими расписанными проектами. Но я не хотел тратить 80$
В итоге я пошёл на ebay, Нужно купить программатор USB Blaster:

Рис.2 Программатор

И саму отладочную плату. Желательно выбирать с большим количеством периферии, но обязательно чтоб там был вход AS и кварц, дальше по желанию и капиталу: светодиоды, кнопки, VGA разьём, 2 PS/2 разьёма (мышка и клавиатура).
Я выбрал плату за ≈ 35$

Рис.3 FPGA Cyclone Altera EP1C3T144 Learning Board

Как видно слева есть 2 входа для программатора JTAG и AS. JTAG используется для отладки, через него можно запрограммировать Плис напрямую, но после выключения питания прошивка стирается.
Через AS — Active Serial мы программируем чип flash памяти, который будет хранить прошивку при отсутствии питания, каждый раз при включении питания ПЛИС считывает из него данные и конфигурируется для корректной работы.

К примеру, CPLD не нуждаются в отдельной памяти для хранения программ, там используется другая технология, но они хуже по своим параметрам, зато у них меньшее количество ножек и их можно спаять самому в домашних условиях или засунуть в специальный сокет (как и некоторые Плис).

Рис.4 Сокет для микросхемы

После того как мы получили плату и программатор, следует установить необходимое ПО. Нам нужен Quartus II для написания программ и прошивки отладочного комплекта. Нужно выбрать Web Edition, т.к. это бесплатная версия, затем выбирать нужную версию Quartus исходя из устройства (Device), к примеру, у меня Cyclone I, последняя версия, которая мне подойдёт это 11.0.

Рис.5 Выбор версий Quartus II

Теперь нам нужен ModelSim Altera Starter, Starter означает бесплатная версия, он нам нужен той же версии что и Quartus, если такой нет, можно выбрать больше.

Рис.6 Загрузка ModelSim

После того как это скачали, устанавливаем сперва Qurtus II, затем ModelSim следует установить в ту же папку, если вы не меняете место установки, то всё будет правильно по умолчанию.

После запуска Quartus II появится окошко предлагающее создать новый проект:

Рис.7 Окно приветствия Quartus.II

Нажимаем создать проект, если вдруг окна нет, или вы его отключили, то создать новый проект можно через File -> New Project Wizard.

Рис.8 Создание нового проекта

После этого появится окно создания нового проекта:

Рис.9 Создание проекта окно приветствия

здесь просто нажимаем Next.

Далее идёт окно выбора рабочей папки и имени проекта.

Рис.10 Создание проекта окно N 1

Выбираем папку где будет храниться наш проект и как он будет называться. Также тут нужно выбрать имя «top-level design entity», можно сказать, что это имя «объекта» с которым мы будем работать, можно назвать его просто «test», когда будем писать код стает понятно, что это значит.

Жмём Next, перед нами окно добавления файлов:

Рис.11 Создание проекта окно N 2

Жмём Next, теперь нам нужно выбрать модель нашей микросхемы:

Рис.12 Создание проекта окно N 3

После этого жмём Next, теперь перед нами окно выбора ПО для моделирования и различных проверок, можно всё оставить по умолчанию и нажать Next.

Рис.13 Создание проекта окно N 4

Наконец финальное окно, показывающее, что же мы выбрали, нажимаем Finish

Рис.14 Создание проекта окно N 5

Перед нами открывается рабочая область Quartus II с нашим открытым проектом:

Рис.15 Открытый проект Quartus II

Но здесь пока ничего нет, нужно создать VHDL файл:
File -> New (CTRL + N)

Рис.16 Создаём новый файл

Перед нами появится окно выбора файла, который мы хотим создать, выбираем «VHDL File»

Рис.17 Окно выбора формата нового файла

Нажимаем OK, создастся файл Vhdl1.vhd, в принципе всё равно как он называется, но если хочется его переименовать это можно сделать через File -> Save as. Также после того как мы скомпилируем файл Quartus предложит нам выбрать папку куда его следует сохранить, в том же окне его можно переименовать.

Теперь попробуем скомпилировать тестовый код. Заставим загораться светодиод при нажатии кнопки.
Код можно взять здесь.

Вначале мы подключаем необходимые нам библиотеки (строки 1-3).
Далее мы создаём «объект» под названием которое мы выбрали в в первом окне при создании проекта (Рис.9). В объекте мы описываем его внешние выводы, в данном случае они идут на светодиод и на кнопку которые находятся вне микросхемы (строки 7-8).

С кнопки мы будем снимать значения, поэтому пишем «in», на светодиод будем выдавать значение, значит, пишем «out».

std_logic означает логическое значение, в данном случае нам нужно или лог.0 или лог.1.

В 12 строке мы описываем, что происходит внутри нашего объекта, там мы просто выдаём на светодиод значение, полученное с кнопки. Вместо «Behavioral» может быть любое слово, «test» это имя нашего объекта.

Попробуем скомпилировать наш код. Для этого нужно нажать на roccessing -> Start Compilation (Ctrl + L) либо эта же фиолетовая стрелка есть на нашем рабочем окне:

Рис.19 Отчёт компиляции

Здесь показано, сколько использовано логических элементов, ножек и ячеек памяти.

Если мы сейчас зальём нашу готовую прошивку в Плис, то какую кнопку нужно нажимать и какой светодиод загорится? Мы ведь нигде не обозначали это.

После компиляции нужно обозначить какая ножка микросхемы соответствует какому «выводу» объекта. Для этого нужно нажать Assignments -> Pin Planner (Ctrl+Shift+N), либо на эту же иконку на рабочем окне:

Рис.20 Выбор иструмента Pin planner

После нажатия вылезет окно, в котором можно распределить выводы микросхемы:

Рис.21 Инструмент Pin planner

Как видно здесь уже есть 2 наших вывода, осталось указать к каким ножкам они подсоединяются. Это можно определить с помощью даташита либо другой документации которая имеется на данную плату.

Для того чтобы выбрать ножку, нужно дважды нажать на поле в колонке «Location», после чего появится меню выбора соответствующей ножки для данного сигнала/вывода. В моём случае я выбрал PIN 67 для кнопки и PIN 57 для светодиода.

Рис.22 Выбор ножки

После выбора ножек это окно можно просто закрыть, оно автоматически сохранит выбранные значения. Теперь нужно ещё раз скомпилировать проект.

После этого можно посмотреть, как выглядит наша схема на уровне регистров. Это можно сделать, нажав Tools -> Netlist Viewer -> RTL Viewer, либо дважды щёлкнув на него слева в окне задач «Tasks»

Рис.23 Просмотр схемы на уровне регистров

В нашем случае тут нет ничего интересного, у нас даже нет логических схем, вход на прямую подаётся на выход, но при увеличении проекта здесь можно узнать какие элементы использует компилятор, чтобы составить нашу схему и найти ошибки.

Рис.24 Структурная схема нашего кода

Теперь можно проверить работу схемы в симуляторе ModelSim, откроем его.
Можно не обращать внимания на все открытые окна, сейчас на нужно создать новый проект через File -> New Project.

Рис.25 Создание нового проекта для моделирования

Появится окно создания проекта:

Рис.26 Создание нового проекта для моделирования

Название проекта, его местонахождение и название стандартной библиотеки можно выставить любые, это не на что не повлияет. Я обычно выставляю ту же папку в котором находится мой проект Quartus.

После этого появится окно, предлагающее нам добавить файлы:

Рис.27 Окно добавления файлов

Нужно нажать «Add Existing File» выбрать наш Vhdl1.vhd, ничего больше не меняя нажать Close.
После чего откроется окно нашего проекта с добавленным нами файлом:

Рис.28 Наш проект

В колонке Status стоит вопросительный знак, это обозначает, что файл необходимо скомпилировать, прежде чем мы сможем с ним работать.

Нужно нажать Compile -> Compile ALL (или Compile Selected если нужен только 1 файл).
Либо нажать на файл правой кнопкой мыши -> Compile -> Compile Selected (или ALL)

Рис.29 Компиляция проекта

После этого вопросительный знак должен измениться на зелёную галочку. Теперь мы можем начать симуляцию. Нажмём Simulate -> Start Simulation (ALT+S . S)

Рис.30 Начало симуляции

После этого появится окно выбора библиотеки, файлов и объектов для симуляции, нужно найти наш файл. В моём случае файл «Vhdl1.vhd» находится в библиотеке «work», в файле мы создали объект «test»:

Рис.31 Окно выбора файла для симуляции

Выбираем файл и жмём ОК, появится окно симуляции.
В левом окне есть созданные нами в коде объекты, у нас только 1 объект «test», у которого есть 2 внешних сигнала: кнопка и светодиод, нужно проверить, как светодиод будет реагировать на изменение состояния кнопки, для этого необходимо их добавить в окно сигналов (Wave).

Т.к. мы используем все сигналы, можно нажать правой кнопкой на объект -> Add -> To Wave -> All items in region.
В последнем окне можно выбрать любой из 3 вариантов. То же самое можно сделать в выпадающем сверху меню «Add»

Рис.32 Добавляем все сигналы из объекта
Рис.33 Выборочно добавляем сигналы

После этого должно открыться окно сигналов (Wave), если оно не появилось его можно открыть нажав Wave в центре экрана:

Рис.34 Открываем окно с сигналами

Если его там нет, его можно добавить через View -> Wave.

Теперь у нас должно быть открыто окно Wave в котором есть 2 добавленных нами сигнала:

Рис.35 Окно с сигналами для симуляции

Нам нужно проверить, что будет происходить со светодиодом при нажатии кнопки. ModelSim не может работать в режиме рального времени, нам нужно задать сигналы, выбрать продолжительность симуляции, запустить её, затем посмотреть полученный результат.

Для симуляции нам понадобится 3 элемента из окошек в рабочей области:

Рис.36 Часть рабочей области с выделенными элементами для симуляции

Слева направо: «Restart» — перезапуск симуляции, «100 ps» — окно с выбором времени симуляции, «Run» — запуск симуляции.

100 пс нам вполне хватит, попробуем запустить симуляцию нажав «Run».
В результате получим такой результат:

Рис.37 Результат симуляции

Как видим появились 2 красные линии напротив наших сигналов, в колонке «Msgs» — показывается значение сигнала, в нашем случае оба сигнала «выдают» U.

U обозначает «Uninitialized» — не инициализован, этот сигнал ещё не принимал никакое значение, на выводе Плис может быть случайное значение. Давайте зададим кнопке лог. 0, что будет означать что кнопка не нажата.

Это можно сделать нажав правой кнопкой на сигнал -> Force.

Рис.38 Выставляем значение на сигнал

Либо через выпадающее меню, Wave -> Force.

Рис.39 Выставляем значение на сигнал

После нажатия на Force появится окно выставления значения:

Рис.40 Окно изменения значения сигнала

Здесь есть несколько вариантов для изменения сигнала, нам нужно в окно «Value» записать 0 и затем нажать ок, подробнее об остальных вариантах можно узнать здесь и здесь, нам сейчас хватит Freeze:

Freeze — намертво изменяет значение до тех пор пока мы не нажмём «No Force» которое находилось в выпадающем меню под «Force», либо пока не закончится время выставленное в строке «Cancel After«

«Delay For» через какой промежуток времени сигнал примет выставленное нами значение.

Записываем 0, нажимаем ОК, Ещё раз жмём Run.

Рис.40 Результат 2 симуляции

Как видим состояние сигналов изменилось, вместо красного цвета они теперь зелёные, также от середины они опустились до низа, можно нажать на сигналы курсором и убедиться что там лог. 0:

Рис.41 Результат 2 симуляции с курсором

Сделаем так чтобы кнопка сама изменяла своё состояние каждые 50 пс, таким же способом выставляются синхросигналы в симуляции которые берутся с выхода кварца.

Для этого вместо Force нужно нажать «Clock. «, появится окно Define clock:

Рис.42 Окно выбора параметров синхросигнала

Рассмотрим, что здесь есть:

Offset — через какое время начнётся наш импульс
Duty — скважность в процентах, отношение отношение длины импульса к периоду, в нашем случае 50% = пол периода высокий уровень, пол периода низкий.
Period — период сигнала в пс.
Cancel — через какое время отключить наш синхросигнал.

Рис.42 Обьяснение параметров

Нам не нужно ничего менять и мы можем просто нажать ОК.
Теперь изменим время симуляции со 100 пс до 300 пс (рис. 36), чтобы увидеть, что светодиод всегда повторяет состояние кнопки.

Рис.43 Финальный результат

В итоге мы убедились, что наш код работает правильно, теперь осталось залить его в микросхему.

Возвращаемся в Quartus II, если вы его закрыли, то при открытии проекта может сразу не открыться наш файл Vhdl1.vhd.

Чтобы видеть все файлы нашего проекта нужно нажать View -> Utility Windows -> Project Navigator.

Рис.43 Открываем Project Navigator

Появится окно содержащие иерархию наших объектов, файлы и созданные элементы:

Рис.43 Project Navigator

Можно кликнуть 2 раза на test и откроется наш файл.

Мы его уже скомпилировали и соединили сигналы с внешними ножками микросхемы. Теперь осталось его только залить в Плис. Сперва нужно открыть окно программатора, для этого нажимаем Tools -> Programmer, либо на его иконку в рабочей области:

Рис.44 Открываем Programmer

В результате появляется окно программатора:

Рис.45 Окно Programmer

Здесь уже может быть всё выставлено, но я покажу, что нужно сделать, если нам нужно выбрать чем программировать, что и как.

В выпадающем меню Mode выберем JTAG, как я говорил в данном случае прошивка пропадёт при отключении питания, но нам это сейчас не важно.

Нам нужно добавить нашу микросхему, для этого жмём Add Device.
Появляется окно выбора устройства, выбираем наше:

Рис.46 Окно выбора устройства

Жмём ОК. Теперь наше устройство должно появиться в окне программатора:

Рис.47 Окно программатора с нашей микросхемой

Теперь следует добавить файл с прошивкой, для этого жмём на строку с нашим устройством ( EP1C3T144 0000000000 ) чтобы выбрать его.

Затем нажимаем Add File, после чего должна открыться корневая папка нашего проекта, в котом ым можем выбрать 1 из 2 файлов .sof или .pof.

Согласно документации, .pof нужны для CPLD и Flash памяти, .sof для FPGA. Значит, выбираем последний.

Поставим галочку в строке с нашим устройством в колонке «Programm / Configure».

Теперь нужно настроить программатор, подключаем USB Blaster к компьютеру, Если Windows не сможет сам установить для него драйвер, потребуется установить его вручную. Подробная инструкция здесь, драйвера находятся в папке:

После того как компьютер опознал USB Blaster, возвращаемся к окну программатора и нажимаем Hardware Setup.

В открывшемся окне под надписью «Available hardware items» должен быть Usb Blaster:

Рис.47 Окно настройки программатора

В выпадающем меню «Currently selected hardware» выбираем Usb-Blaster и нажимаем Close.

Теперь подключаем Usb Blaster к нашей отладочной плате в разъём JTAG, включаем питание и в окне «Programmer» жмём Start.

Наконец плата запрограммирована, для того чтобы прошивка не пропала после выключения питания в выпадающем меню Mode в окне «Programmer» нужно выбрать Active Serial Programming вместо JTAG, использовать .pof файл и подключить USB Blaster в разъём AS.

Заключение

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

Отличный курс для Xilinix / VHDL есть здесь. Тут можно начать с изучения VHDL, не так важно какой производитель ведь код один и тот же. Здесь шаг за шагом рассматриваются основные составляющие языка на примерах со светодиодами и кнопками.

В интернете можно найти готовые проекты с исходным кодом на нужном вам языке, по ним тоже можно многому научиться.

  • Начинающие на плис обычно идут по одному пути:
  • Несколько интересных проектов:

вывод изображения на VGA или телевизор, терминал, вывод изображений, небольшие видео игры как Pong, HDMI, работа с любыми дисплеями, обработка видео данных, камера.

Музыкальные шкатулки, ШИМ, ЦАП, АЦП, цифровой микрофон, обработка звука, распознавание и синтезирование речи.

Делаем свой процессор и его части, RAM, ROM, ALU, в книгах можно найти примеры реализаций готовых процессоров.

Финальные проекты студентов Корнелльского университета: здесь.

Литература
  • Circuit Design and Simulation with VHDL — Отличный справочник VHDL
  • Rapid Prototyping of Digital Systems — Много практики и примеров с кодом
  • Digital Design with CPLD Applications and VHDL — Схема к каждому коду
  • Hdl Chip Design — её называют просто «Синяя книга»
  • The designer guide to vhdl
  • Проектирование на ПЛИС. Курс молодого бойца

Запомните, если сделаете проект, не забудьте выложить исходный код, помогите в изучении другим.

FPGA. Просто о сложном — Создание проекта в Quartus II. Сравнение VHDL и Verilog

Самыми популярными языками описания цифровой аппаратуры являются VHDL и Verilog. В этой статье я постараюсь сравнить синтаксис двух этих языков на примере «бегущего огонька», архивы проектов будут прикреплены в конце статьи. Для полного понимания описываемых процессов настоятельно рекомендую ознакомиться с предыдущими статьями цикла:

Рассмотрим структуру создаваемого модуля «бегущего огонька», который назовем leds_case. В модуле будет один вход для тактового сигнала clk, и четыре выхода (четырехбитная шина) для светодиодов.

В модуле будет всего два процесса, которые будут выполнятся параллельно друг-другу, синхронно с тактовым сигналом clk. В первом процессе сделаем счетчик, который бы считал равные временные отрезки, через которые происходит переключение с одного светодиода на другой. Во втором процессе реализуем функцию, которая бы включала поочередно светодиоды по истечению определенного промежутка времени заданного счетчиком из первого процесса.

Читать:
Как проверить разъем телефона

Чтобы не быть голословным, реализуем данный модуль на отладочной плате от ALTERA с CPLD семейства MAX II.

Плата прошивается по JTAG программатором USB BLASTER.

Т.к. на самой отладочной плате нет светодиодов, то я нашел у себя старую плату, на которой было 4 светодиода включенных по схеме на рисунке ниже.

Итак, теперь создадим новый проект в среде Quartus II, которую можно скачать на официальном сайте Altera. Запускаем среду, для создания нового проекта кликаем на New Project Wizard (на картинке обведено красным).

В этом окне среда нам сообщает какие операции нужно совершить для создания проекта. Пропускаем.

В этом диалоговом окне указываем рабочую папк, где будет храниться проект, а также название топового модуля. Т.к. у нас в проекте запланирован всего один модуль, то назовем его led_case.

Далее выбираем Empty project, тем самым подтверждаем создание абсолютно чистого проекта.

В следующем диалоговом окне нам предлагают подключить файлы проекта, но так-как нам нечего подключать, то пропустим этот шаг.

В этом диалоговом окне выбираем микросхему, которую мы будем программировать. Выбираем параметры соответствующие микросхеме на нашей плате: семейство MAX II корпус TQFP и количество ножек 100. Немного остановимся на параметре Core Speed grade — это параметр характеризующий время задержки прохождения сигнала между внутренними соединениями в ПЛИС. Проект созданный для ПЛИС со speed grade 5 без проблем заработает на ПЛИС со speed grade 10, но проект созданный для ПЛИС со speed grade 10 не будет адекватно работать, если вообще разведется, на ПЛИС со speed grade 5. Как определить speed grade? Очень просто: в названии микросхемы EPM240T100C5 последняя цифра 5 и есть значение speed grade.

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

В этом диалоговом окне среда показывает нам суммарные сведения о выбранных нами настройках.

Для начала напишем модуль на VHDL. Cоздадим VHDL файл. Выберем File -> New

В появившемся окне выбираем VHDL file.

Теперь напишем код и разберем его.

Теперь напишем код выполняющий ту же самую функцию но на Verilog, для этого создадим новый проект, но новый модуль создадим как Verilog file

// Как видите, никаких библиотек на математику и типы данных мы не подключаем

Как Вы можете убедится оба языка очень похожи и мнение о том, что синтаксис Verilog подобен высокоуровневому языку С сильно преувеличено. Как я и говорил ранее, выбор на чем писать сугубо личный и основан исключительно на популярности языка, так что о том что для читателя является достоинством, а что недостатком я доверю решать самому читателю. А вообще, никто не мешает Вам выучить и Verilog и VHDL. В одном проекте допускается то, что один модуль может быть написан на Verilog, а другой на VHDL. Хочется еще сказать пару слов о переносимости проектов на разные ПЛИС: если Вы не используете специфические ресурсы ПЛИС, такие как аппаратные умножители, множители частоты и т.д., то перенести проект на другую ПЛИС не составит труда. Например наш проект не использует ничего кроме таблиц соответствия и триггеров, и следовательно его можно перенести не только на ПЛИС из другого семейства, но и на ПЛИС другой фирмы!

Раз у нас уже есть прошивка, то самое время научиться прошивать плату и посмотреть на результаты своих трудов, но перед этим давайте сначала синтезируем проект. Для этого кликаем на значок вверху экрана. Должен предупредить сразу, что синтез проекта для ПЛИС требует ресурсов компьютера и занимает долго времени, по сравнению с микроконтроллерами.

После того как синтез проекта выполнится успешно, настало время присвоить портам из модуля реальные пины ПЛИС. Для этого кликнем на значок Pin Planning вверху экрана.

Перед нами откроется изображение нашей микросхемы. Мы видим на какие ножки мы можем «повесить» наши сигналы, но перед тем как это сделать расскажу Вам, что есть три типа пинов: обычные пины входа/выхода, на них можно заводить переферию (у ПЛИС есть несколько банков, куда входят группы пинов), пины тактирования, на них заводится тактовая частота, а еще есть пины сброса (reset) на которые заводится сигнал сброса. У меня на плате нет кнопки reset’а, поэтому эти пины трогать не будем. На PIN_14 нужно завести сигнал clk, чтобы затактировать банк с пинами номер 1. PIN_2, PIN_3, PIN_4, PIN_5 входят в банк пинов номер 1, и следовательно на них «повесим» выходную шину управления светодиодами. После того, как Вы назначили все требуемые пины, просто закройте окно Pin Planner’а, все результаты сохранятся.

После того как мы все правильно присвоили, сделаем синтез и имплементацию проекта нажав на соответствующую иконку вверху экрана.

После успешной сборки проекта откроем утилиту Programmer в верней части экрана, в которой можно прошить нашу ПЛИС.

В появившемся окне Programmera нажмите Hardware Setup, если Ваш программатор не определился автоматически. Драйвера на программатор должны установиться автоматически, но если по каким-то причинам этого не произошло, то их можно найти в папке с установленной средой. Нажмите Add File, чтобы загрузить сгенерированный средой файл прошивки.

Файл прошивки можно найти в папке output_files вашего проекта. Выбираем его.

Далее появится вот такое окошко. Внизу мы можем увидеть, что ПЛИС выбрана правильно. Чтобы запрограммировать нашу ПЛИС ставим галочки Program/Configure и Verify и жмем Start. Если все сделано правильно, то статус-бар Progress станет зеленым и будет отображать 100%.

Добавлю видео работы прошивки, чтобы Вы убедились что все написанное правда, а так же два варианта прошивки: на Verilog и на VHDL. Спасибо за внимание.

Настройка Sublime Text 3 для работы с VHDL файлами

Редактор Sublime Text существенно экономит время при работе с vhdl и verilog файлами. Для тех, кто не работал с редакторами типа Sublime Text, Notepad++ и т.п. опишу основные полезные функции данных редакторов:

  • множественное выделение/редактирование строк кода (нажатие средней кнопки мыши или при зажатой клавише Ctrl)
  • установка меток (закладок) в коде, помогает ориентироваться в больших файлах. (Ctrl + F2 или через пункт меню Goto→ Bookmarks)
  • возможность разделения рабочей области на несколько окон (Alt + Shift + 2 или из меню View→ Layout)
  • открытие одного файла несколько раз (File→ New View into File)
  • комментирование выделенных строк кода (Ctrl + /)
  • поиск и замена (Ctrl + h)
  • поиск по всем открытым файлам (Ctrl+Shift+f)
  • вставка сниппетов (шаблонов кода) (написать ключевое слово + клавиша Tab)
  • написание и использование функций на языке python
  • возможность установки различных дополнений
  • гибкая настройка

Интеграция Sublime Text

Для начала состыкуем САПР для работы с ПЛИС и редактор Sublime.

    Интеграция Sublime Text с Xilinx ISE:
    в ISE идем в меню Edit → Preferences → Editors: Text Editor → Editor = Custom
    Вставляем строку в окно «Command line syntax»:

Плагины

Различные плагины (packages) расширяют функциональность редактора. Packages можно
устанавливать как в онлайн так и оффлайн-режиме.

Для установки плагинов в офлайн-режиме нужно проделать нехитрые манипуляции:

  1. Скачиваем нужный плагин с GitHub
  2. Извлекаем из архива
  3. Переименовываем папку, например, «Sublime-HDL-master» в «Sublime HDL»
  4. Полученные папки копируем в папку Packages (расположение данной папки легко найти, выбрав в Sublime Text пункт меню Preferences → Browse Packages)

Text Pastry – плагин для автоматической множественной нумерации. Очень помогает при работе с большим количеством нумерованных сигналов/портов.

  1. Выделяем нужные участки строк
  2. Вызываем меню Ctrl+Shift+P
  3. Ищем пункт “Text Pasty Command Line”
  4. В появившемся окне, расположенном в нижней части экрана, вводим:
    • 0 — нумерация от 0
    • \i(1,10) — нумерация от 1 с инкрементом 10
    • 1 end=4 — нумерация 1, 2, 3, 4, 1, 2, 3, 4 и т.д.
    • letters a-c upper — A, B, C, A, B, C, и т.д.
    • letters a-c upper x3 — A, A, A, B, B, B, C, C, C и т.д.
    • 1 x3 — 1, 1, 1, 2, 2, 2, 3, 3, 3, и т.д.
    • x y z — x, y, z, x, y, z, x, y, z, и т.д.

Sublime Verilog — поддержка синтаксиса языка Verilog

Verilog Gadget – набор функций и сниппетов для работы с Verilog файлами.

SmartVHDL — поддержка синтаксиса языка VHDL. Также при наведении на сигнал или порт в коде появится окно с подсказкой о типе (количество бит) данного сигнала/порта. При наведении на сигнал в контекстном меню появится пункт “Goto Definishion” — переход к месту объявления сигнала.

VHDL Mode – набор функций и сниппетов для работы с VHDL файлами. Основная часть функций запускается, например, сочетанием клавиш Atl+K, C, P, где C и P нажимаются поочередно. Основные функции:

  • Копирование данных портов (названия портов, типы данных)
  • Вставка данных портов как объявление сигналов
  • Вставка данных портов как объявление компонента
  • Генерация тестбенча по скопированным данным портов
  • Автоформатирование кода (выравнивание табуляции и т.п.)

Поддержка ucf файлов

По умолчанию редактор Sublime не у меет работать с ucf-файлами. Разметка ucf эквивалентна разметке языка tcl. Осталось только объяснить это редактору:

  • Создадим в папке Packages новый файл Tcl.sublime-settings
  • Заполним файл строкой
  • Сохраним файл

Создание шаблонов кода (snippets)

Пусть нам надо вставить шаблон кода:

Причем нам бы хотелось, чтобы после вставки текста по нажатию Tab курсор устанавливался на позиции My_proc, clk, rst, data_in, для быстрого изменения значений этих данных. Для этого создадим новый сниппет:Tools → Developer → New Snippet. Редактируем данные:

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

Подробнее о создании шаблонов читайте в статье «Как создать сниппет?».

Написание собственных функций на языке python

Подробно о создании функций (плагинов) описывалось в статьях «Как написать простой плагин», «Как написать сложный плагин».

Вставка сниппетов это, конечно хорошо, но хотелось бы, например, чтобы тот же шаблон создания процесса заполнялся автоматически в зависимости от входных сигналов, а также чтобы процесс модифицировался при наличии таких сигналов как rst и ce. Еще обычно после процесса идет присвоение внешним портам модуля значений внутренних сигналов, пусть тоже делается автоматически.

Для парсинга данных файла VHDL воспользуемся функциями плагина Vhdl mode.

Примерный алгоритм наших действий:

  1. Получить данные о всех портах модуля
  2. Все порты типа «in» включить в шапку процесса
  3. Если есть порты с названием ce и/или rst, то добавить соответствующие условия if else в процесс
  4. За процессом вставить строки присвоения выходным портам значений внутренних сигналов (обычно такие сигналы называют также как и порт, добавляя приставку «s_» или «_net»)

Здесь $ – метка, куда будет вставлено описание процесса,
$ — метка, где будет присвоение внешним выходным портам значений внутренних сигналов.

Сохраним его под именем, например, test.sublime-snippet в папку VHDL Mode/Snippets.
Воспользуемся написанными функциями в папке VHDL Mode. Так как знания языка python у меня начальные, то будем модифицировать функции плагина, по аналогии с уже описанными в нем.

Создадим в файле vhdl_lang.py новые функции в классе Interface(), назовем их in_port и out_port:

Функция out_port вставляет за процессом строки, например:
data_out1 <= data_out1_net;
data_out2 <= data_out2_net;

Создадим в папке VHDL Mode новый файл, назовем его my_func.py, вставим текст:

Осталось присвоить горячие клавиши. Так как наш класс называется PasteAsProcess, то команда должна называться paste_as_process (перед символами, кроме первого, написанными в верхнем регистре нужно поставить знак нижнего подчеркивания).

Идем Preferences → Key Bildings. Вставляем строку:

Теперь для работы нам надо сначала скопировать значения портов vhdl файла сочетанием клавиш «alt+k», «p», «w» (по умолчанию). Затем вызвать нашу функцию клавишами «alt+k», «p», «z».

Вывод

Сниппеты и функции значительно упрощают работу с vhdl файлами.

Даже начальных знаний языка python достаточно для написания простых, но рабочих функций.

how to include vhdl in verilog?

is there an easy way to put a design in vhdl inside a verilog design?

i have a nice dynamic verilog file with port declarations towards the external hw, but i want to write my own logic in vhdl. not so familiar with verilog yet.

can i write some kind of wrapper for the vhdl? if so, how?

  • Mar 25, 2008
  • #2
echo47
Advanced Member level 6

verilog include vhdl

Which HDL compiler software are you using?

With ModelSim and Xilinx XST, I can build projects that include both Verilog and VHDL source files without doing anything special. VHDL can instantiate a Verilog module, and vice-versa, without using any wrapper file. But don't mix Verilog and VHDL source code in the same file, use separate files.

  • Mar 25, 2008
  • #3
godis_knugen
Newbie level 4

include vhdl

im using xilinx ise 9.1

have tried using the verilog file as top and simlpy instantiate the vhdl as a module,
example:
u_l user_l(
. clk(usr_clk),
.addr(ht_wr_addr)
);

but it says unexpected error when i run synthesis.

  • Mar 25, 2008
  • #4
echo47
Advanced Member level 6

ise include path

Mixed-language compiling usually works in ISE XST. You may have triggered some other bug that caused the "unexpected error" crash. Maybe an ISE update would help you.

Try this example. It works fine in ISE 9.2.04:

taha.zand

  • Oct 18, 2021
  • Mar 25, 2008
  • #5
godis_knugen
Newbie level 4

rpsyscore_api.v

ok, that worked, but not when i have this:

module top `include "rpsyscore_api.v"

wire clk;
wire [3:0] q;
wire [3:0] icount;

count4 counter(.clk(clk), .Q(q));

where rpsyscore_api.v specifies the ports and the "verilog include path" under synthesis properties is set to the destination of the api file.

then i get :
error Analyzing hierarchy for module <top> in library <work>.
ERROR:Xst:2683 — Unexpected error found while building hierarchy.

  • Mar 25, 2008
  • #6
echo47
Advanced Member level 6

include vhdl to verilog

That worked for me in both ISE and ModelSim. I assume rpsyscore_api.v contains this line:
(clk, icount);

I run ISE from command-line scripts, not from Project Navigator. The fragment line in rpsyscore_api.v looks like gibberish, not a Verilog module, so try giving it a different extension than ".v", or put it outside the Verilog search path, so Project Navigator doesn't try to automatically interpret it as a Verilog file. That's just a guess.

  • Mar 25, 2008
  • #7
godis_knugen
Newbie level 4

instantiate vhdl block in verilog

but rpsyscore_api.v is a verilog module .
looks something like:

input usr_clk;
input usr_rst;
.

"here goes lots of `ifdef and `ifndef statements"

  • Mar 26, 2008
  • #8
echo47
Advanced Member level 6

ise design verilog vhdl

rpsyscore_api.v may be fine when "included" into your top file, but by itself it is incomplete. It begins with a parenthesis instead of a 'module' keyword.

In other words, you put a non-Verilog file into ISE's include path and gave it a ".v" extension, so ISE may be stumbling over it.

godis_knugen

  • Mar 26, 2008
  • Mar 26, 2008
  • #9
godis_knugen
Newbie level 4

can we mix vhdl and verilog in xst

aha, i see. oh and bythe way the property i set was "verilog include directories" under synthesis- properties.

Nope, didn´t help.

but it works if i comment the line " count4 counter(.CLK(clk), .Q(q)); " that instantiates the vhdl block

  • Mar 26, 2008
  • #10
echo47
Advanced Member level 6

`include verilog vhdl

I can't reproduce your problem. Can you upload your various source files to be sure we are both looking at the same files?

godis_knugen

  • Mar 26, 2008
  • Mar 26, 2008
  • #11
godis_knugen
Newbie level 4

how to write a verilog wraper for vhdl design

finally it works, i tried starting a new fresh project and using ise9.2 with the latest sp. i still dont know why it didn´t work before though. ¨
anyway, thanks for the help.

  • Mar 26, 2008
  • #12
echo47
Advanced Member level 6

ise verilog `ifndef

That's good news! Maybe your code was simply triggering some obscure bug in the older version.

  • Apr 18, 2010
  • #13
ishwarayya
Newbie level 1

Dear echo47 & godis_knugen ,

i have tried the counter example in modelsim XE3/starter 6.3c version,by modifiying the code as like below

*********top.v file*******************
`include "count4.vhd"
module top (clk, icount);
input clk;
wire [3] q;
output [3] icount;

count4 counter(.clk(clk), .Q(q));

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity count4 is
port
(
CLK : in std_logic;
Q : out std_logic_vector(3 downto 0)
);
end count4;

architecture archi of count4 is
signal tmp: std_logic_vector(3 downto 0) := "0000";
begin
process (CLK)
begin
if (rising_edge(CLK)) then
tmp <= tmp + 1;
end if;
end process;
Q <= tmp;
end archi;
************************

—> but when i simulate .v file its shows following error

** Error: count4.vhd(1): near ";": syntax error, unexpected ';', expecting "STRING_LITERAL"

is there any extra settings u did while simulating .

Added after 23 minutes:

Dear echo47 & godis_knugen ,

i have tried the counter example in modelsim XE3/starter 6.3c version,by modifiying the code as like below

*********top.v file*******************
`include "count4.vhd"
module top (clk, icount);
input clk;
wire [3:0] q;
output [3:0] icount;

count4 counter(.clk(clk), .Q(q));

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity count4 is
port
(
CLK : in std_logic;
Q : out std_logic_vector(3 downto 0)
);
end count4;

architecture archi of count4 is
signal tmp: std_logic_vector(3 downto 0) := "0000";
begin
process (CLK)
begin
if (rising_edge(CLK)) then
tmp <= tmp + 1;
end if;
end process;
Q <= tmp;
end archi;
************************

—> but when i simulate .v file its shows following error

** Error: count4.vhd(1): near ";": syntax error, unexpected ';', expecting "STRING_LITERAL"

Похожие публикации