Глава 1.
Итак, вводная глава.
Собственно что такое FPGA/CPLD/PAL и т.д. в простом объяснении — это самая обычная программируемая логика. Собственно многие задачи можно решить кучей способов: написать прошивку для микроконтроллера, довесить к нему недостающие интерфейсы (и обнаружить, что производительности не хватило, и операцию, которую надо было выполнить за 1 период тактового сигнала, выбраный МК просто не успевает сделать), вспомнить институтский курс цифровой логики, продумать управляющий автомат (упростив при этом ДНФ из 15-30 элементов, гыгы), набрать всё это на К155/133/1555 микросхемах, получить плату размером с лист А4, потребляющую пару ампер, а можно всё это запихнуть в одну микросхему ПЛИС и не мучаться. Это конечно крайности.
В чем же различия между всеми этими ПЛИС? Ответ простой — в возможностях. Простейшая программируемая логика (PAL) представляет собой две большие матрицы элементов И и ИЛИ, соответственно соединяя их разными способами на ней спокойно можно сделать несложное устройство. Эти микросхемы на сегодняшний момент стоят копейки и позволяют заменить рассыпуху простейшей логики на плате одной микросхемой. Их минус — малая логическая емкость, отсутствие всяких вкусностей типа встроенной памяти и т.д. Как результат — что-то объемное на них сделать довольно сложно, не хватит емкости, да и программатор нужен специальный. Кстати, частенько эти мсх. Оказываются ещё и однократно программируемыми. Зато стоят копейки.
Далее CPLD – это уже вкуснее, теперь у нас есть куча таких матриц, плюс есть готовые триггеры, все это объединено в так называемые «Макроячейки», которые могут соединяться между собой. На борту этих микросхемм появляется конфигурационная память, что позволяет быстро переконфигурировать её (например, для устранения ошибок, расширения функционала и т.д.). В чем минус? Обычно встроенное конфигурационное ПЗУ выдерживает малое число перепрограммирований — около 100. Соответственно отлаживать «в железе» такое устройство может стать недешевым удовольствием.
Следом уже идет ПЛИС типа FPGA – конфигурационная память тут как правило вынесена из микросхемы, соответственно проблем с «ой блин, мы допрошивались» исключается — убили конфигурационную ПЗУшку — сдули и напаяли новую. Также у FPGA обычно бОльшая емкость, т.е. можно больше всего запихнуть вовнутрь. Прогресс на месте не стоит и в FPGA можно обнаружить встроенную память, встроенные умножители(а умножение в МК это частенько больная тема) и т.д. Даже процессорные ядра (например два ядра PowerPC в одной мсх.). К томуже есть готовые блоки (часть бесплатная, часть платная), которые позволяют упростить поставленные задачи (готовые USB/PCI/PCI-express/USART модули, готовые процессорные ядра и т.д., кто хочет знать, что есть — добро пожаловать на http://www.opencores.org). Всё это выглядит вкусно, разочаровывают несколько фактов — во-первых стоимость (простенький первый циклон — 200р по карте мастеркард =), во-вторых, из-за особенностей архитектуры и внутренних соединений, полностью использовать емкость FPGA довольно сложно, хорошо, если удасться использовать 80-90%.
Для чего хорошо использовать плис? Для создания девайса, алгоритм работы которого особо сильно не меняется, для ухода от зависимости от элементной базы (сегодня эта мсх. выпускается, а завтра её с производства сняли и всё), для реализации устройства, в котором нам чертовски важны скорости выполнения поставленной задачи, для создания всяких SOPC девайсов.
Что в ПЛИС хорошего? Много чего, к примеру можно сделать аппаратный кодировщик видео, который будет на сжатие кадра тратить ровно 1 период тактовой частоты, логический анализатор каналов на 200, генератор всяких импульсов заданной формы с управлением от ПК.
Что надо сразу вбить себе в голову? На ПЛИС все операции выполняются… одновременно. Это будет небольшим препятствием тем, кто вжился в программирование МК. Зато исчезнет проблема с прерываниями (а вот прилетел пакет данных от ПК, а у нас тут критическая задача, её прерывать нельзя, блин.. а от ПК тоже надо прям щяс обработать…) Хотите одновременно мигать светодиодом, принимать данные, управлять двигателем и т.п. — да не вопрос!
Так собственно вопрос, а как начать мучать эту ПЛИС? Легко! Ставим для начала себе Altera Quartus II WebEdition (у кого есть полный может ставить его). Для этого надо будет зарегистрироваться на сайте альтеры. При регистрации можно писать откровенную чепуху, всеравно проверяет робот. Для обладателей «помегабайтного трафика» сразу разочарование — квартус весит около гигабайта.
Поставили? Запускаем, ждем, сообщаем квартусу, что мы не переходим на него с MAX++ и что мы не хотим ставить себе имеющиеся у нас дополнительные IP лицензии (всеравно у нас их пока нет).
Теперь создадим новый проект. File → New project wizard. Нам в краце опишут, что сейчас будет, на это ждем Next.
А теперь уже надо включить мозг, и решить, где будем создавать наш новый проект.
Во первых выберем Working Directory нашего проекта. У квартуса есть готовая папка с примерами «qdesigns», лежит она на уровень выше квартуса — по дефолту altera\[version]\qdesigns. Создадим в ней новую папку (ну например meganew) — это и будет нашей рабочей директорией.
Создали и выбрали? Теперь укажем имя проекта, тут уж на ваш вкус, к примеру learn. Хитрая софтина сама заполнит имя модуля верхнего уровня (третья сточка), согласимся с ней, запомнив, что мы ввели — т.к. модуль с таким именем у нас в проекте будет главным, и без него компилировать проект квартус откажется.
Смело жмем next, квартус предложит подключить к проекту имеющиеся исходники, поскольку у нас их нет, то снова жмем next. Софт предложит выбрать ПЛИС, под которую мы будем писать. Пока мы не вышли на уровень железа нас это мало волнует. Такчто выберем что-нить из Cyclone. Жмем next.
Теперь нам предлагают выбрать используемые инструменты (компилятор/синтезтор, среду моделирования, среду оценки временных параметров). Пока нам хватит встроенных средств, ставим везде None и жмем next. Получаем итоговый список, чего мы навносили, жмем finish.
Теперь создадим наш модуль верхнего уровня. File->New. В красивом окне выберем Verilog HDL file. Всё, можно писать =). Назначение прочих пунктов этого меню я объясню позже, пока нам хватит и этого пункта.
А теперь собственно почему именно Verilog HDL, а не AHDL или VHDL? AHDL специфичен только для ПЛИС фирмы Altera (не сложно догадаться по первой букве), что сужает его применение. Почему не VHDL? Он довольно сложный и придирчивый, к томуже он мало похож на языки программирования, которые знает большинство. А вот Verilog довольно красиво перекликается с C (за исключением уродских паскалевских begin/end, они тут вместо красивых { }) Да и VHDL я плохо очень знаю =)
Напишем простейший hello-world, и на его примере разберем синтаксис Verilog-а.
module learn (a,b,c,d); //помните, какое мы задали имя для модуля верхнего уровня?
input a,b;
output [7:0] c,d;
assign c=(a)?8′hCA:8′hFE;
assign d=(b)?8′hBA:8′hBE;
endmodule
Собственно, а что мы только-что написали? Простейшую схемку, которая по входными сигналам a и b выдает на выходы c и d различные константы.
Теперь приступим к построчному описанию.
module learn(a,b,c,d); – этой сторой мы начали описание модуля learn, в скобках мы указали его порты.
input a,b; — тут мы объявили, что порты a и b будут входами, поскольку разрядность мы не указали, то среда создаст их одноразрядными.
output [7:0] c,d; — а это объявило порты c и d выходами с разрядностью равной 8. Как несложно догадаться разрядность указана в скобках от старшего к младшему биту.
assign c=(a)?8′hCA:8′FE; — эту строчку мы рассмотрим в следующей главе, пока примем на веру, что это условное присваивание.
А вот странные 8′hCA мы рассмотрим сейчас — это представление чисел. По умолчанию, если написать, к примеру, 87 среда выделит под число 32 разряда и будет его трактовать как десятичное. Расшифруем запись. До одинарной кавычки идет кол-во разрядов (8), далее представление числа (binary, decimal, hex),у нас это шестнадцатеричное. А следом само число.
Завершает модуль строка endmodule – конец модуля. Кстати, после неё «;» не ставится никогда.
Продолжение завтра в тоже время =)