image

В первой части была описана идея видеокарты VGA для простого микроконтроллера (или ардуины), с помощью которой можно выводить информацию на стандартный монитор с интерфейсом VGA даже с самых слабых и медленных ядер. Карта, сердцем которой является высокоскоростная ПЛИС, берет на себя все скоростные и критичные к таймингам операции.

Идея была обкатана на макете и показала свою жизнеспособность. Однако для ее реализации «в железе», а тем более в серии, необходимо пересмотреть несколько моментов.

ПЗУ


В качестве ПЗУ была применена микросхема flash-ПЗУ со старой материнской платы компьютера. Она не очень удобна по нескольким причинам. Во-первых, память серии 49 имеет не очень удобный параллельный интерфейс, в котором адрес записывается в два этапа, что усложняет логику работы и существенно увеличивает время доступа к памяти. Во вторых, эта память выпускается в корпусе PLCC, который сам по себе дорог и, кроме того, трудоемок для ручного монтажа. Возможен другой вариант его установки – в панельку, но это также удорожает конструкцию. В третьих, эта память достаточно специфичная и устаревшая и с ее закупкой не в штучных объемах могут возникнуть проблемы.

В  связи с этим было принято решение заменить ее на микросхему 39-й серии в корпусе TSOP. Эти микросхемы имеют тайминги 55 (SST39LF) и 70 (SST39VF) нс (против 270 нс у микросхемы 49-й серии). Даже использовав 70 нс микросхему можно сократить время подготовки данных всего до одного цикла. Была заказана микросхема SST39VF010-70-4C-WHE. Для новой микросхемы циклограмма обмена данными получилась следующая:

image

ОЗУ


ОЗУ также нуждается в замене. Прежде всего, необходимо выбрать устройство, точно работающее от 3,3 В. Также, для удешевления нужно выбрать корпус типа TSOP. В итоге, из доступных на рынке была заказана микросхема IS62LV256AL-45TLI.

ПЛИС


Оригинальная ПЛИС EPM240 на заслуживающих доверия площадках стоит достаточно дорого, порядка 6-7 $, что губит всю экономику микропроекта на корню. Поэтому эти микросхемы были заказаны там же, где и макетная плата – на Алиэкспресс по цене примерно 1,5 $ за шт. Эти микросхемы, видимо, из забракованных партий. Например, у микросхемы на макетной плате встретился случай, когда один из выводов начал выдавать рандомную информацию. Переназначение этого выхода на другой вывод полностью решило проблему, но такой вариант развития событий следует иметь в виду. Вообще говоря, это не такая уж большая плата за дешевизну и в рамках мелкой серии вполне себя оправдывает. Скорее всего, бОльшая часть микросхем будет вполне исправно работать.

Схема и плата


image

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

Также были выбраны компоненты бОльшего типоразмера для удобства их установки вручную. Особенно это касается резисторов, которые необходимо ставить только на предназначенные для них места, постоянно контролируя их номинал, обозначенный на корпусе. Кварцевый генератор тоже был выбран максимального габарита – 7050, хотя у продавца были доступны для заказа и более мелкие аналоги. А вот блокировочные конденсаторы я оставил типоразмера 0603, они все одинаковые и перепутать их невозможно.

Печатные платы были заказаны в фирме JLCPCB в количестве 50 шт и со скидкой на первый заказ стоили весьма недорого. Конечно, свою роль сыграл и достаточно большой заказ – сразу 50 шт, в результате чего общая себестоимость размазалась по большому числу плат. Это, своего рода, тоже риск. Обычно на первых платах встречаются ошибки и неточности и выкинуть 50 негодных плат стоит дороже чем выкинуть, к примеру, 5 плат.

Вместе с платами был заказан и трафарет для нанесения паяльной пасты.

Прошивка и тестирование


Пока все это изготавливалось и ехало, было время задуматься о том, как это все прошивать и проверять. Прошивка ПЛИС трудностей не представляла, для нее был предусмотрен целый разъем и отдельный USB-программатор. А вот с прошивкой ПЗУ знакогенератора дело обстоит сложнее. На макетной плате для того, чтобы сменить прошивку ПЗУ, его необходимо сначала аккуратно вытащить из панельки макета, вставить в панельку программатора, стереть, прошить, вытащить и вернуть в панельку макета. Операции весьма трудоемкие. Дело осложняет еще тот факт, что программатор весьма древний, глючный и требует для работы LPT-порта и древнего ноутбука с операционной системой XP. Также, для программирования 3,3-вольтовых flash микросхем нужен специальный переходник, который оказался у меня чисто по случайности с незапамятных времен. Найти такой сейчас, если бы он вдруг сломался или бы его не было – проблема нерешаемая.

В связи со всем этим, а также потому как уже была выбрана микросхема корпусе TSOP, которая намертво запаивается на плату, было решено программировать ПЗУ знакогенератора средствами самой ПЛИС через пользовательский параллельный интерфейс. Тут возможны два варианта: программировать ПЗУ, зашивая в ПЛИС специальную прошивку только для программирования ПЗУ или встроить возможность программирования ПЗУ в рабочую прошивку ПЛИС. Второй вариант сложнее и требует дополнительных ресурсов ПЛИС, которые будут использоваться, по сути, только один раз в жизни устройства. К первому варианту пришлось бы прибегнуть, если бы доступных ячеек ПЛИС не хватило бы для реализации второго варианта. Но, к счастью, ячеек почти впритык, но хватило.

Через тот же интерфейс необходимо проводить и тестирование собранного устройства, выводя на экран какую-нибудь тестовую картинку. Мне показалось простым и удобным использовать для этого уже упоминавшийся старый ноутбук с LPT портом. Количества его линий ввода/вывода с лихвой хватает для подачи всех необходимых сигналов на устройство. Из подручных средств по следующей схеме было собрано устройство:

image

 image

Устройство собрано на макетной плате навесным монтажом. Плата закреплена на основании из куска фанеры. Часть деталей (резисторы) смонтированы в корпусе разъема DB25. Испытуемая или программируемая плата подключается с помощью длинных и гибких контактов. Контакты, изгибаясь, создают небольшой натяг в отверстии платы, чем и обеспечивают хороший контакт.

image

Резисторы 2 кОм совместно с резисторами подтяжки интерфейса LPT (около 1 кОм) образуют делитель напряжения, преобразуя логические уровни 5 В в логические уровни 3,3 В. Питание платы обеспечивается простейшим линейным стабилизатором, напряжение берется с разъема USB того же ноутбука. Для защиты по току служит резистор R4 10 Ом. При КЗ или иных проблемах на плате напряжение на нем просто просядет, не допуская перегрузки порта USB. Просадка напряжения менее 2 В контролируется светодиодом – он просто не засветится при включении питания.

image

Консольная программа для прошивки и проверки написана на Си. Для аппаратного доступа к порту 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 (таблица последовательностей приведена ниже). Контроля окончания прошивки не производится, просто выдерживается пауза, заведомо бОльшая времени, необходимого для прошивки.

image 

Это происходит весьма медленно, но при прошивке ПЗУ торопиться не имеет смысла, поскольку сама по себе запись ПЗУ- медленная. К тому же записывать ПЗУ придется в среднем только 1 раз для каждого устройства.

Монтаж и пайка


Пока писалось ПО приехали заказанные платы, детали и микросхемы. Для нанесения паяльной пасты было сделано следующее приспособление:

image 

На прочном основании из куска ДСП из обрезков печатных плат были сделаны упоры для фиксации платы в строго определенном положении. Упоры приклеены на тонкий двухсторонний скотч. Толщину скотча компенсирует листок бумаги, подкладываемый под обрабатываемую печатную плату. Таким образом обрабатываемая плата становится вровень с платами – упорами. На них сверху кладется трафарет, через который наносится паяльная паста.

image

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

image

Лишний припой с этих спаев придется вручную убирать с помощью медной плетенки – лишняя операция.

image

Затем на паяльную пасту вручную расставляются компоненты. Позиционировать их с очень высокой точностью не обязательно, потом они все равно «притянутся» к своим местам силами поверхностного натяжения при оплавлении. Хотя компоненты и прилипают к плате с помощью паяльной пасты, все равно следует соблюдать аккуратность, чтобы случайно не смахнуть уже установленные компоненты с их мест.

image

image

Оплавление припоя осуществляется в самодельном приспособлении. Оно состоит из алюминиевого подогревного столика на основе терморезистора мощностью 300 Вт, купленного на Алиэкспресс и ИК-лампы из гриля от неисправной микроволновой печи мощностью 600 Вт.

image

Лампа защищена от механических повреждений металлическим кожухом. Оплавление происходит очень быстро, буквально в течение нескольких секунд. Во время оплавления нужно следить за компонентами и пинцетом «помогать» им занимать свои места, если они по какой то причине не притягиваются к своим площадкам. Качество пайки, на мой непрофессиональный взгляд, достаточно приличное, неотличимое от устройств промышленного изготовления (если не брать во внимание встречающиеся замыкания выводов и непропаи).

image

После пайки элементов поверхностного монтажа необходимо установить выводные элементы – два разъема. Их придется установить вручную. После пайки осуществляется визуальный контроль и отмывка остатков флюса. После чего плата устанавливается в приспособление для программирования и тестирования.

image

Сразу после удаления замыканий выводов и отмывки плат заработали только 7 из 20 плат. Остальные потребовали еще более внимательного поиска замыканий и непропаев. В конце концов 19 плат запустились, а одну плату пришлось размонтировать и смонтировать с нуля заново, после чего запустилась и она.

image

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

image

Нестандартный режим


Кстати, было бы весьма заманчиво попробовать использовать всю доступную оперативную память, например в режиме 128 символов и 32 строки. Такой режим лучше бы смотрелся на широкоформатных мониторах. Для проверки была написана пробная прошивка для ПЛИС, реализующая нестандартный режим 1024х576. Тайминги по строке были взяты от режима 1024х768, 43 Гц, а тайминги по кадру – от режима 768х576, 60 Гц. При пиксельной частоте 50 МГц частота строк получилась равной 39,55696 кГц, частота кадров – 66,25957  Гц. Оба этих числа находятся в допустимом диапазоне, например для монитора Acer V196HQL. И монитор без проблем отобразил картинку.

image

Единственное, 32 строки символов предполагают использование только 512 пикселей по вертикали из 576. Соответственно, 2 строки над и 2 строки под изображением остались пустыми, да и сами символы получаются мелкие и не очень четкие из-за несовпадения разрешения с нативным для монитора.

image

Поскольку режим этот нестандартный, надеяться что это 100% сработает со всеми мониторами не стоит. Но с большой степенью вероятности можно предположить что проблем не будет. Ведь скалеру ЖК монитора относительно без разницы какого разрешения картинка приходит на вход, главное чтобы сигналы были в допустимых пределах.

ПО доступно на гитхабе.

Вопросы и предложения прошу писать в комментариях.



Возможно, захочется почитать и это:


Комментарии (33)


  1. REPISOT
    06.12.2023 08:35
    +1

    Оплавление происходит очень быстро, буквально в течение нескольких секунд.

    А как вы соблюдаете термопрофиль?


    1. zatim Автор
      06.12.2023 08:35
      +2

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


      1. REPISOT
        06.12.2023 08:35
        +1

        Термопрофиль производители приводят для всех типов корпусов, не только для BGA. И это не просто так. Если вы пока не столкнулись с последствиями (еще не известно, может, ваш термопрофиль близок к рекомендуемому), это ничего не значит.

        А вот как раз неподходящий профиль и приводит к тому, что элементы не выравниваются, встают надгробным камнем или образуют перемычки припоя. Наблюдал как-то, как технологи подбирали режим печи и уменьшали количество дефектов в десятки раз. Еще от структуры платы зависит: внутренние слои, большие полигоны. От этого зависит необходимое время предпрогрева.


  1. Kudriavyi
    06.12.2023 08:35

    Печатные платы были заказаны в фирме JLCPCB

    Животрепещущий вопрос: они сейчас делают платы для России? Или есть какой-то хитрый способ заказа там?


    1. zatim Автор
      06.12.2023 08:35

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


      1. udik_chudik
        06.12.2023 08:35
        +1

        Не реклама, но есть вот такие ребята: https://jlc-pcb.ru/


        1. Ivanii
          06.12.2023 08:35
          +1

          Летом брал здесь https://www.pcbwave.com/ вышло дешевле 1000 р.

          2layers PCB 1.6mm 57mmX60mm 10pcs Green 1-DifferentDesign
          SUBTOTALRUB 100.00
          SHIPPING & HANDLINGRUB 818.00
          GRAND TOTAL (INCL.TAX)RUB 918.00


        1. fokin91
          06.12.2023 08:35

          заказывал у них, дошло за месяц. Дороже чем у jlc. У них на сайте есть калькулятор. у меня 60 плат размером до 10 на 10 обошлись в 5400. Сейчас заказал другие платы через алик https://aliexpress.ru/item/1005005458256680.html?sku_id=12000033161946637 у этих ребят. Жду когда придет, посмотрим как оно будет выглядеть. И у тех и у других можно заказать сборку.


    1. shiru8bit
      06.12.2023 08:35

      Есть посредники на алиэкспрессе.


  1. sav13
    06.12.2023 08:35

    Печатные платы были заказаны в фирме JLCPCB в количестве 50 шт и со скидкой на первый заказ стоили весьма недорого.

    А чего сразу с монтажом не заказали?

    Чем потом так маятся


    1. zatim Автор
      06.12.2023 08:35

      Из-за ПЛИС и микросхем памяти. JLCPCB работает с LCSC, а там нужные микросхемы памяти стоили в 2 раза дороже, чем, например, в американском DigiKey. Также сама ПЛИС стоила в разы дороже чем на Алике. Поэтому для пробной партии пришлось заказать из разных мест и монтировать самостоятельно. Для крупной партии, конечно, выгоднее заказать изготовление полностью в Китае. Плюс можно договориться чтобы и прошивку с тестированием делали тоже они.


    1. bodyawm
      06.12.2023 08:35
      +1

      Думаю, если есть возможность, то для проектов с большим количеством мелочухи лучше заказывать частичную сборку - пусть смдшки распаяют, а большие чипы уже самому ;


  1. JerryI
    06.12.2023 08:35
    +4

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

    А так однозначно плюс!


  1. smart_pic
    06.12.2023 08:35

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

    Смонтировать 30 плат по три микросхемы с шагом 0.5мм проще , быстрее и качественнее паяльником. Притом что все равно приходится убирать и устранять залипоны.


  1. Gudd-Head
    06.12.2023 08:35

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

    Эта ПЛИС не поддерживает никакой отладки через JTAG? Поэтому пришлось использовать LPT порт с ХРюшей?


    1. zatim Автор
      06.12.2023 08:35
      +1

      Поддерживает. Но отладка на этапе мелкосерийного производства уже не нужна, к этому моменту уже все отлажено. Через LPT имитируется пользовательский интерфейс, прошивается ПЗУ и записывается тестовая картинка для контроля исправности платы после монтажа.


  1. konstanttin
    06.12.2023 08:35
    +1

    Интересный проект, тоже хотел сделать что-то подобное для небольших устройств. Но внезапно открыл микросхемы FT812Q и ADV7125 на которых можно собрать некоторую видеокарту по шине SPI.


    1. zatim Автор
      06.12.2023 08:35
      +1

      FT812Q мощная и интересная штука. Там не только видеокарта, но и звук и контроллер тачпада. Цена, правда, кусается 16 баксов если брать от 200 шт. Плюс ЦАП к ней баксов 5-6. И это не считая обвязки и мелочевки.


      1. Ivanii
        06.12.2023 08:35

        Tang Nano 4K Имеет на борту порядка 4 000 LE и HDMI, стоит в районе 1600 р.


  1. ABRogov
    06.12.2023 08:35
    +2

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


    1. firehacker
      06.12.2023 08:35
      +1

      Да что угодно, контроллер станка какого-нибудь.


    1. zatim Автор
      06.12.2023 08:35

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


      1. ABRogov
        06.12.2023 08:35

        А почему ее просто не переслать на ПК и там уже делать всю обработку, сохранение и т.п.?


        1. zatim Автор
          06.12.2023 08:35

          На ПК тоже предполагается отправлять, но нужно ее еще выводить локально. ПК может находиться далеко от устройства.


  1. uis246
    06.12.2023 08:35

    Блин, да с FPGA можно и вывод DVI сделать. VGA все кому не лень делали.


    1. checkpoint
      06.12.2023 08:35
      +1

      И даже HDMI в режиме DVI.


  1. checkpoint
    06.12.2023 08:35
    +1

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

    Мой вариант платки с HDMI и Ethernet: https://github.com/Fabmicro-LLC/Karnix_ASB-254


    1. nixtonixto
      06.12.2023 08:35
      +2

      Если выкидывать - то лучше выкинуть ПЛИС с ПЗУ и ОЗУ, поставить Н723 за 5 долл на том же LCSC, и всё собрать на нём - RGB, Ethernet и обработку данных. RGB-дисплеев тоже полно, и на RGB можно повесить долларовый сериалайзер и пустить LVDS на любую ноутбучную матрицу.


      1. checkpoint
        06.12.2023 08:35

        Это не спортитвно! :)


    1. vit1251
      06.12.2023 08:35

      Верно понимаю, что по определенному IP адресу можно передавать UDP сообщения для формирования изображения на дисплее? У Вас уже готов прототип платы? Можно заказать парочку в целях тестирования?


  1. ovn83
    06.12.2023 08:35

    У xilinx есть ip ядра и для vga и для hdmi


  1. Polarisru
    06.12.2023 08:35
    +1

    Зачем все эти сложности, если VGA или обычный TFT не сильно выского разрешения можно поднять на Raspberry Pi Pico, где еще в том же корпусе будет не сильно слабый ARM? И это все за 4 бакса.


    1. summ
      06.12.2023 08:35

      "Dual-core Arm Cortex-M0+ processor, flexible clock running up to 133 MHz"

      слабый