Знакомлюсь с программируемой логикой

Никогда раньше не имел дел с FPGA, а тут захотелось вначале года новых ощущений. К тому же попался на глаза интересный дисплей от какого-то навигатора, а поскольку дисплей не обладает собственной памятью и обновлять изображение на нём требуется непрерывно с частотой 60 кадров в секунду, а так же учитывая широкую параллельную шину данных… В общем купил под это дело отладочную плату на чипе EP4CE6E22C8N, который относится к семейству Cyclone 4, от компании Altera.

Теперь эти чипы выпускает компания Intel, купившая несколько лет назад Альтеру, но мне попалась плата со старой микросхемой, в маркировке которой ещё присутствует логотип «ALTERA».

Кроме самой FPGA, на плате имеется: 4 кнопки, по столько же светодиодов и DIP-переключателей, четырёхразрядный семисегментник, бузер (динамик-пищалка, как на компьютерных материнских платах), инфракрасный приёмник (он то тут зачем?), кварцевый генератор на 50 МГц, микросхемы SDRAM, SPI Flash и IIC Eeprom, а также порты: VGA, PS/2 и RS232, PBS-разъём для подключения символьного дисплея, JTAG, десятипиновый разъём для прошивки SPI Flash и куча штырьков произвольного назначения — по штырьку от каждого IO вывода ПЛИС, не считая питания. Питание на плату подаётся через USB разъём B-типа или через классический разъём питания. Есть кнопка с фиксацией, для выключения питания всей платы, и тактовая кнопка Reset, которая у меня не работает. 🙂 Для прошивки ПЛИСины в комплекте с платой шёл специальный программатор-отладчик — USB Blaster. Сами же прошивки пишутся в программе «Quartus II» — это монструозная IDE — комбайн, возможности которого, меня поражают!

Скачать Квартус можно с сайта Intel после регистрации. Обычно все рекомендуют скачать последнюю версию программы, но т.к. у меня на компьютере установлена операционная система Windows XP, то последняя версия Quartus мне явно не подходит. Если кто-то скажет, что пора бы уже закопать стюардессу обновиться — не соглашусь т.к. меня эта система полностью устраивает. А менять инструменты по велению моды и бороться потом с новыми глюками — не в моих интересах. Кроме того мне не очень хотелось регистрироваться на сайте Intel, поэтому порывшись в торрентах, скачал 11-ю версию Квартуса… Ставился этот комбайн пару часов (не считая времени на скачивание), а после установки оказалось, что нужное семейство микросхем этой версией не поддерживается! 🙁 Попробовав ещё несколько версий и потеряв часов шесть, я всё-таки зарегистрировался на сайте Intel, ознакомился с вариантами и понял, что у меня только один вариант — 13-я версия Quartus II Web Edition. Качаем, ставим — работает и даже Cyclone IV поддерживается — ночь прошла не зря! 🙂

Наигравшись с кнопками, светодиодами и семисегментниками решил, что пора двигаться дальше. Тот дисплей, ради которого всё затевалось я ещё не потяну по двум причинам:
— ему нужна видеопамять, а имеющуюся на отладочной плате SDRAM я пока не осилил.
— для подключения к шлейфу дисплея нужно изготовить переходник на печатной плате, а травить печатки зимой у меня в мастерской не получится из-за холода.
Так что по совету Васисуалия monitor.net.ru решил пока двигаться в сторону VGA. Для полноценной работы с VGA, опять же — нужна память, но можно пока зайти с другой стороны… Если изображение, которое хотим вывести через VGA простое, например тестовая таблица или цветные прямоугольники — его можно генерировать «на ходу» — одновременно с генерацией синхроимпульсов. На фото пример такого изображения. А ниже — схема проекта.

На схеме видно, что проект содержит три разных модуля:
— модуль PLL, преобразующий тактовую частоту входного генератора в желаемую частоту пикселей. Для разрешения 1024×768 и частоты кадров — 60Hz, частота пикселей должна быть 65MHz.
— самописный модуль генерации синхроимпульсов — «VGA_SYNC».
— счётчик импульсов — «LPM_COUNTER», который считает пиксели и в нужный момент переключает цвет.
Цветовые входы VGA монитора подключены к старшим битам счётчика, что при длине строки в 1024 пикселя и разрдности счётчика — 10 бит делит каждую видимую часть строки на 8 равных частей. Кроме видимой части строки, VGA интерфейс предполагает наличие скрытой (служебной) области. Чтобы счётчик не считал невидимые пиксели его следует выключать после переполнения — для этого используется вход «cnt_en», на который заведен сигнал из генератора синхроимпульсов. Код самого модуля генерации синхроимпульсов, написанный на языке AHDL, представлен на картинке ниже:

Как видно, в нём также применены два счётчика: v_cnt считает строки, а h_cnt — пиксели в строках. Счётчик пикселей тактируется от входа clk, на который поступают импульсы с выхода PLL, а при переполнении выдаёт импульс с выхода cout на тактовый вход счётчика строк. Дальше выполняются проверки значений счётных регистров счётчиков и, в зависимости от содержимого — переключаются состояния выходов модуля.

Архив с проектом можно скачать тут.

Tags: , , , ,

Пятница, Февраль 26th, 2021 Без рубрики

Leave a Reply