Видеокарта VGA для микроконтроллера. Часть 2. От идеи до мелкой серии
В первой части была описана идея видеокарты VGA для простого микроконтроллера (или ардуины), с помощью которой можно выводить информацию на стандартный монитор с интерфейсом VGA даже с самых слабых и медленных ядер. Карта, сердцем которой является высокоскоростная ПЛИС, берет на себя все скоростные и критичные к таймингам операции.
Идея была обкатана на макете и показала свою жизнеспособность. Однако для ее реализации «в железе», а тем более в серии, необходимо пересмотреть несколько моментов.
❯ ПЗУ
В качестве ПЗУ была применена микросхема flash-ПЗУ со старой материнской платы компьютера. Она не очень удобна по нескольким причинам. Во-первых, память серии 49 имеет не очень удобный параллельный интерфейс, в котором адрес записывается в два этапа, что усложняет логику работы и существенно увеличивает время доступа к памяти. Во вторых, эта память выпускается в корпусе PLCC, который сам по себе дорог и, кроме того, трудоемок для ручного монтажа. Возможен другой вариант его установки — в панельку, но это также удорожает конструкцию. В третьих, эта память достаточно специфичная и устаревшая и с ее закупкой не в штучных объемах могут возникнуть проблемы.
В связи с этим было принято решение заменить ее на микросхему 39-й серии в корпусе TSOP. Эти микросхемы имеют тайминги 55 (SST39LF) и 70 (SST39VF) нс (против 270 нс у микросхемы 49-й серии). Даже использовав 70 нс микросхему можно сократить время подготовки данных всего до одного цикла. Была заказана микросхема SST39VF010–70–4C-WHE. Для новой микросхемы циклограмма обмена данными получилась следующая:
❯ ОЗУ
ОЗУ также нуждается в замене. Прежде всего, необходимо выбрать устройство, точно работающее от 3,3 В. Также, для удешевления нужно выбрать корпус типа TSOP. В итоге, из доступных на рынке была заказана микросхема IS62LV256AL-45TLI.
❯ ПЛИС
Оригинальная ПЛИС EPM270 на заслуживающих доверия площадках стоит достаточно дорого, порядка 6–7 $, что губит всю экономику микропроекта на корню. Поэтому эти микросхемы были заказаны там же, где и макетная плата — на Алиэкспресс по цене примерно 1,5 $ за шт. Эти микросхемы, видимо, из забракованных партий. Например, у микросхемы на макетной плате встретился случай, когда один из выводов начал выдавать рандомную информацию. Переназначение этого выхода на другой вывод полностью решило проблему, но такой вариант развития событий следует иметь в виду. Вообще говоря, это не такая уж большая плата за дешевизну и в рамках мелкой серии вполне себя оправдывает. Скорее всего, бОльшая часть микросхем будет вполне исправно работать.
❯ Схема и плата
После окончательного выбора основных компонентов была уточнена схема (приведена выше) и разработана печатная плата (на КДПВ). К ней тоже были некоторые требования. Поскольку приобрести все компоненты в одном месте не представляется возможным и они будут прибывать в разное время и из разных мест, монтаж платы придется делать вручную и самостоятельно. Для этого плата, прежде всего, была разведена так, чтобы все компоненты располагались только на одной ее стороне, а также было минимизировано число выводных компонентов, из которых остались только внешние разъемы.
Также были выбраны компоненты бОльшего типоразмера для удобства их установки вручную. Особенно это касается резисторов, которые необходимо ставить только на предназначенные для них места, постоянно контролируя их номинал, обозначенный на корпусе. Кварцевый генератор тоже был выбран максимального габарита — 7050, хотя у продавца были доступны для заказа и более мелкие аналоги. А вот блокировочные конденсаторы я оставил типоразмера 0603, они все одинаковые и перепутать их невозможно.
Печатные платы были заказаны в фирме JLCPCB в количестве 50 шт и со скидкой на первый заказ стоили весьма недорого. Конечно, свою роль сыграл и достаточно большой заказ — сразу 50 шт, в результате чего общая себестоимость размазалась по большому числу плат. Это, своего рода, тоже риск. Обычно на первых платах встречаются ошибки и неточности и выкинуть 50 негодных плат стоит дороже чем выкинуть, к примеру, 5 плат.
Вместе с платами был заказан и трафарет для нанесения паяльной пасты.
❯ Прошивка и тестирование
Пока все это изготавливалось и ехало, было время задуматься о том, как это все прошивать и проверять. Прошивка ПЛИС трудностей не представляла, для нее был предусмотрен целый разъем и отдельный USB-программатор. А вот с прошивкой ПЗУ знакогенератора дело обстоит сложнее. На макетной плате для того, чтобы сменить прошивку ПЗУ, его необходимо сначала аккуратно вытащить из панельки макета, вставить в панельку программатора, стереть, прошить, вытащить и вернуть в панельку макета. Операции весьма трудоемкие. Дело осложняет еще тот факт, что программатор весьма древний, глючный и требует для работы LPT-порта и древнего ноутбука с операционной системой XP. Также, для программирования 3,3-вольтовых flash микросхем нужен специальный переходник, который оказался у меня чисто по случайности с незапамятных времен. Найти такой сейчас, если бы он вдруг сломался или бы его не было — проблема нерешаемая.
В связи со всем этим, а также потому как уже была выбрана микросхема корпусе TSOP, которая намертво запаивается на плату, было решено программировать ПЗУ знакогенератора средствами самой ПЛИС через пользовательский параллельный интерфейс. Тут возможны два варианта: программировать ПЗУ, зашивая в ПЛИС специальную прошивку только для программирования ПЗУ или встроить возможность программирования ПЗУ в рабочую прошивку ПЛИС. Второй вариант сложнее и требует дополнительных ресурсов ПЛИС, которые будут использоваться, по сути, только один раз в жизни устройства. К первому варианту пришлось бы прибегнуть, если бы доступных ячеек ПЛИС не хватило бы для реализации второго варианта. Но, к счастью, ячеек почти впритык, но хватило.
Через тот же интерфейс необходимо проводить и тестирование собранного устройства, выводя на экран какую-нибудь тестовую картинку. Мне показалось простым и удобным использовать для этого уже упоминавшийся старый ноутбук с LPT портом. Количества его линий ввода/вывода с лихвой хватает для подачи всех необходимых сигналов на устройство. Из подручных средств по следующей схеме было собрано устройство:
Устройство собрано на макетной плате навесным монтажом. Плата закреплена на основании из куска фанеры. Часть деталей (резисторы) смонтированы в корпусе разъема DB25. Испытуемая или программируемая плата подключается с помощью длинных и гибких контактов. Контакты, изгибаясь, создают небольшой натяг в отверстии платы, чем и обеспечивают хороший контакт.
Резисторы 2 кОм совместно с резисторами подтяжки интерфейса LPT (около 1 кОм) образуют делитель напряжения, преобразуя логические уровни 5 В в логические уровни 3,3 В. Питание платы обеспечивается простейшим линейным стабилизатором, напряжение берется с разъема USB того же ноутбука. Для защиты по току служит резистор R4 10 Ом. При КЗ или иных проблемах на плате напряжение на нем просто просядет, не допуская перегрузки порта USB. Просадка напряжения менее 2 В контролируется светодиодом — он просто не засветится при включении питания.
Консольная программа для прошивки и проверки написана на Си. Для аппаратного доступа к порту LPT используются широко известные драйвера DLPORTIO. Следует отметить, что эти драйвера нормально работают только под ХР, с использованием их под Виндовс 7 и выше возникли проблемы. И хотя в интернетах описаны способы решения этой проблемы, мне этого сделать не удалось.
❯ Шрифты
Для формирования дампа для записи в ПЗУ знакогенератора необходимы файлы шрифтов. Для этого без всяких доработок подходят файлы *.FNT из системы MSDOS или программ тех времен. Эти файлы непосредственно содержат битовые маски символов таблицы ASCII. Для шрифта размером 8×16, например, каждый символ описывается 16-ю последовательно расположенными байтами.
_ _ _ _ _ _ _ _ 00H байт 0
_ _ _ _ _ _ _ _ 00H байт 1
_ _ _ 0 _ _ _ _ 10H байт 2
_ _ 0 0 0 _ _ _ 38H байт 3
_ 0 0 _ 0 0 _ _ 6CH байт 4
0 0 _ _ _ 0 0 _ C6H байт 5
0 0 _ _ _ 0 0 _ C6H байт 6
0 0 0 0 0 0 0 _ FEH байт 7
0 0 _ _ _ 0 0 _ C6H байт 8
0 0 _ _ _ 0 0 _ C6H байт 9
0 0 _ _ _ 0 0 _ C6H байт 10
0 0 _ _ _ 0 0 _ C6H байт 11
_ _ _ _ _ _ _ _ 00H байт 12
_ _ _ _ _ _ _ _ 00H байт 13
_ _ _ _ _ _ _ _ 00H байт 14
_ _ _ _ _ _ _ _ 00H байт 15
Современные файлы *.FNT (формат впервые введен в системе Виндовс) имеют другой формат, хотя и имеют то же расширение. Для преобразования этих файлов в нужный формат, вычленения из них битовых масок написана консольная программа fnt2bin.exe. На вход программе необходимо давать файл шрифта *.FNT высотой 16 пикс. Преобразовать шрифт в этот формат можно с помощью любого бесплатного конвертера шрифтов. На выходе программы fnt2bin.exe будет файл размером ровно 4096 байт, содержащий битовые маски символов преобразованного шрифта.
Таким образом был подготовлен дамп прошивки ПЗУ знакогенератора, содержащий 32 различных шрифта.
Для прошивки этого дампа в ПЗУ средствами самой ПЛИС был использован один из свободных битов регистра управления. Логика была выбрана такой, чтобы этот бит можно было активировать только при активном сигнале RESET. При выходе из режима сброса, этот бит автоматически сбрасывается и ПЛИС переходит в нормальный режим работы. После установки этого бита меняется вся логика установки адреса и сам этот регистр адреса подключается к шине адреса ПЗУ (а не ОЗУ). 17-разрядный адрес записывается тремя кусками по 6, 6 и 5 бит. Старшие два бита байта адреса определяют «кусок» записываемого адреса. 00 — биты с 0 по 5, 01 — биты с 6 по 11, 10 — биты с 12 по 16. Затем необходимо переключиться в режим передачи данных и передать байт данных, который по фронту сигнала HOST_CS запишется в микросхему ПЗУ. Таким образом, одна элементарная посылка адреса и данных в микросхему ПЗУ состоит из 4 шагов. Затем из этих посылок необходимо сформировать последовательности для инициации прошивки байта во flash (таблица последовательностей приведена ниже). Контроля окончания прошивки не производится, просто выдерживается пауза, заведомо бОльшая времени, необходимого для прошивки.
Это происходит весьма медленно, но при прошивке ПЗУ торопиться не имеет смысла, поскольку сама по себе запись ПЗУ- медленная. К тому же записывать ПЗУ придется в среднем только 1 раз для каждого устройства.
❯ Монтаж и пайка
Пока писалось ПО приехали заказанные платы, детали и микросхемы. Для нанесения паяльной пасты было сделано следующее приспособление:
На прочном основании из куска ДСП из обрезков печатных плат были сделаны упоры для фиксации платы в строго определенном положении. Упоры приклеены на тонкий двухсторонний скотч. Толщину скотча компенсирует листок бумаги, подкладываемый под обрабатываемую печатную плату. Таким образом обрабатываемая плата становится вровень с платами — упорами. На них сверху кладется трафарет, через который наносится паяльная паста.
Паяльной пасте следует придать консистенцию густой сметаны, чтобы она легко мазалась, но, в то же время не растекалась дальше отверстия в трафарете. Следует избегать образования на площадках слишком толстого слоя припоя. Если на пассивных компонентах это не имеет значения, то на контактах микросхем с малым шагом это приводит к образованию спаев соседних выводов как на фото ниже.
Лишний припой с этих спаев придется вручную убирать с помощью медной плетенки — лишняя операция.
Затем на паяльную пасту вручную расставляются компоненты. Позиционировать их с очень высокой точностью не обязательно, потом они все равно «притянутся» к своим местам силами поверхностного натяжения при оплавлении. Хотя компоненты и прилипают к плате с помощью паяльной пасты, все равно следует соблюдать аккуратность, чтобы случайно не смахнуть уже установленные компоненты с их мест.
Оплавление припоя осуществляется в самодельном приспособлении. Оно состоит из алюминиевого подогревного столика на основе терморезистора мощностью 300 Вт, купленного на Алиэкспресс и ИК-лампы из гриля от неисправной микроволновой печи мощностью 600 Вт.
Лампа защищена от механических повреждений металлическим кожухом. Оплавление происходит очень быстро, буквально в течение нескольких секунд. Во время оплавления нужно следить за компонентами и пинцетом «помогать» им занимать свои места, если они по какой то причине не притягиваются к своим площадкам. Качество пайки, на мой непрофессиональный взгляд, достаточно приличное, неотличимое от устройств промышленного изготовления (если не брать во внимание встречающиеся замыкания выводов и непропаи).
После пайки элементов поверхностного монтажа необходимо установить выводные элементы — два разъема. Их придется установить вручную. После пайки осуществляется визуальный контроль и отмывка остатков флюса. После чего плата устанавливается в приспособление для программирования и тестирования.
Сразу после удаления замыканий выводов и отмывки плат заработали только 7 из 20 плат. Остальные потребовали еще более внимательного поиска замыканий и непропаев. В конце концов 19 плат запустились, а одну плату пришлось размонтировать и смонтировать с нуля заново, после чего запустилась и она.
Все-таки, стоит признать, ручной монтаж компонентов с шагом выводов 0,5 весьма трудоемок и лучше поручить это дело автомату. В крайнем случае, одну-две платы можно смонтировать вручную, но на большей серии начинают проявляться ошибки.
❯ Нестандартный режим
Кстати, было бы весьма заманчиво попробовать использовать всю доступную оперативную память, например в режиме 128 символов и 32 строки. Такой режим лучше бы смотрелся на широкоформатных мониторах. Для проверки была написана пробная прошивка для ПЛИС, реализующая нестандартный режим 1024×576. Тайминги по строке были взяты от режима 1024×768, 43 Гц, а тайминги по кадру — от режима 768×576, 60 Гц. При пиксельной частоте 50 МГц частота строк получилась равной 39,55696 кГц, частота кадров — 66,25957 Гц. Оба этих числа находятся в допустимом диапазоне, например для монитора Acer V196HQL. И монитор без проблем отобразил картинку.
Единственное, 32 строки символов предполагают использование только 512 пикселей по вертикали из 576. Соответственно, 2 строки над и 2 строки под изображением остались пустыми, да и сами символы получаются мелкие и не очень четкие из-за несовпадения разрешения с нативным для монитора.
Поскольку режим этот нестандартный, надеяться что это 100% сработает со всеми мониторами не стоит. Но с большой степенью вероятности можно предположить что проблем не будет. Ведь скалеру ЖК монитора относительно без разницы какого разрешения картинка приходит на вход, главное чтобы сигналы были в допустимых пределах.
ПО доступно на гитхабе.
Вопросы и предложения прошу писать в комментариях.