Jump to content
RedSpirit

Мастерю свой RAMDAC для VGA, есть проблемы

Recommended Posts

Добрый день! Это мой первый пост на этом форуме, хочу поделиться своими соображениями по сабжу и попросить совета. Опыт работы с электроникой не очень большой и то по сути только в логикой, всего пару месяцев как засел за avr-микроконтроллеры, так что далеко не все тонкости могу знать. В общем...

Хочу сделать типа "видеокарту" для вывода картинки по VGA 640x480x60гц. А точнее фрейм-буфер (или как он там правильно называется) данные из которого преобразуется в аналоговые цветовые сигналы для монитора. Чтобы чуток упростить требование к железу решил, что мне достаточно будет разрешения картинки в 4 раза меньше (320х240) но при этом стандарт таймингов для синхросигналов остается как для  640x480, то есть просто буду 4 пикселя брать за один, это позволит мне сэкономить на частоте пикселей, вместо 25мгц получается ~12.5мгц. Цвет каждого пикселя удобнее всего кодировать одним байтом по схеме 3R-3G-2B (8 значений красного, 8 зеленого и 4 синего, всего 256 цветов). Таким образом мне нужно как минимум 76800 байт на буфер, то есть микросхемку памяти на 128К*8bit (выбрал CY7C109D). Я даже написал консольную утилиту, которая конвертирует любую картинку в нужный формат и на выходе выдает готовый массив байтов. Я звял Atmega664P, не без проблем, но настроил нормальный и достаточно четкий ШИМ для h-sync и v-sync, подключил к монитору и проверил на одном красном цвете, что все работает и все строчки заливаются красным. Осталось дело за малым, я подключил оперативку к МК, подключив все 17 ног адреса, 8 ног данных и 4 для управления памятью заняв практически все выводы мк кроме SPI интерфейса. Теперь надо только по нужным таймингам выставлять на портах адрес для оперативки, а 8 бит данных от нее через нехитрую схему с резисторами (ЦАП) выдавать на монитор. И да, перед этим я предварительно закинул часть картинки во flash-память контроллера, который при запуске "заливает" ее в sram, осталось только бегать по всем адресам и снимать картинку. Но ничего не работало. Перебор адресов на атмеге слишком медленный, в идеале переключение адресов должно происходить с интервалами 79.4 нс а это всего 2 процессорных такта и то при условии, что мк будет работать кварце 25мгц, а судя по отладке в AtmelStudio один цикл тратил 57(!) тактов. При этом надо изменить значения в трех портах (2 целых порта и один бит на еще одном порту), инкрементировать счетчик, переключить управляющие оперативкой пины, чтобы записать значение. Короче, никакой avr тут не справиться, даже если упороться, все переписать на асм и забустить частоту, все равно будет мало.

Ну собственно думать долго не пришлось, сразу пришла идея использовать отдельные битовые счетчики (например SN74HC4040D, на 12 бит) поставить два таких, подать высокочастотный сигнал на нужные мне 12.5 мгц (хотя тут опять-таки всплывается, что есть синхронные и асинхронные счетчики, и типа асинхронные на высоких частотах работают не так как хотелось бы, мне тут пока не все понятно). Я соорудил схему с таким счетчиком в Протеусе, вроде все работает, НООООО...

И тут я наконец-то подошел к вопросу, который уже несколько дней не могу решить. Дело в том, что как я сказал в начале, изначальное разрешение 640х480 я решил уменьшить до 320х240, то есть вместо 640 пикселей на одну строку мне за этот же период времени нужно вывести в 2 раза меньше с меньшей частотой, таким образом пиксели "растянутся" в два раза на одну строку. Но нам так же нужно растянуть пиксель и по вертикали, то есть сделать так чтобы две горизонтальные линии идущие друг за другом были одинаковые, потом еще две одинаковые и так далее до конца кадра. Но наш битовый счетчик считает все по порядку строку за строкой, по идее пройдя по одной линии нужно было бы вычесть из адреса 320 и инкрементировать дальше, чтобы получить две одинаковые строки. Но из счетчика нельзя вычитать, тем более произвольные значения. Можно забить память одинаковой информацией, чтобы не было манипуляций с адресами, но тогда и понадобится в 2 раза больше памяти (стоит сильно дороже) и вообще хранить одну и туже информацию ну совсем не вариант. Я еще рассматривал, что если использовать sram с организацией 64к*16 бит, то есть уменьшаем разрядность адреса с 17 до 16 (до двух портов мк) и храним в одной ячейке сразу два пикселя. Таким образом можно оптимизировать время доступа, но все равно не достаточно для использования мк avr и это никак не решает подход с битовым счетчиком. 

В общем я не вижу выхода как решить проблему дублирующих строк через битовый счетчик. А если все же использовать микроконтроллер, то какой, STM32? У меня с ним нет опыта, да и не слишком ли он жирный для такой вроде бы тривиальной задачки. Может вообще есть дешевая и простенькая готовая RAMDAC микросхемка? Знаю, что такие есть, типа AT76C176, но дорого и фиг где купишь да и не понятно в точности то ли это, что надо или не очень. По этому прошу совета у знающих специалистов, может кто сталкивался с подобным и может дать совет, как лучше сделать. Я в курсе разных поделок "видеоприставок" на ардуино, где они генерируют картинку и текст через vga (от туда я подсмотрел настройки таймеров и шим) но мне нужен именно модуль преобразования информации из памяти в картинку. 

Share this post


Link to post
Share on other sites

Используй хмегу там больше скорость и на той же архитектуре.

Share this post


Link to post
Share on other sites
2 hours ago, RedSpirit said:

 SN74HC4040D, на 12 бит) поставить два таких

В VGA кадре 525 строк по 800 пикселей. Часть пикселей с видеосигналом, а часть бланкирующие пикселы с нулем. Это нужно для того, чтобы луч ЭЛТ монитора успел переместиться к началу новой строки.

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

Два счётчика SN74HC4040, соединенные последовательно. Первый считает до 400 и сбрасывается обратно в 0. Эти импульсы сброса можно использовать для образования горизонтальных синхроимпульсов. Выходные линии первого счётчика используются как младшие адреса ОЗУ фрейм-буфера.

Второй счётчик считает до 525 и  принимает импульсы от первого для адресования строк. Старшие адресные линии для ОЗУ берутся со второго счётчита со сдвигом на 1. Поэтому строки будут удваиваться, т.е. первый счётчик успеет пробежать дважды по кругу, пока второй переключится на следующую строку.

Соответственно, нужно перераспределить кадр в ОЗУ с учётом пустых бланкирующих мест. То есть строка в таком раскладе будет длиной 512 байт. Первые 400 байт адресуемые счётчиком, остальные 112 байтов просто пропадают неиспользуемые. В строке первые 48 байт нулевые, соотвествуют по времени горизонтальному синхроимпульсу, потом 24 байта просто 0, затем 320 байтов видео данные строки, и наконец, оставшиеся тоже 0.

Строки расположены в памяти с шагом 512 байт.

Share this post


Link to post
Share on other sites

Популярные пружинные клеммники Degson со склада Компэл

Пружинные разъемные клеммники Degson с технологией Push-In обеспечивают надежное и безопасное электрическое соединение. При их использовании исключается возможность короткого замыкания в точке контакта, что гарантирует надежное соединение. Электрическая безопасность клеммных блоков подтверждается соответствием мировым стандартам UL, IEC и VDE.
Подробнее

3 часа назад, RedSpirit сказал:

звял Atmega664P

Нафига вообще использовать этих динозавров, когда ARM МК уже копейки стоят?

 

3 часа назад, RedSpirit сказал:

STM32

У них, как минимум, есть возможность аппаратной работы с внешней памятью.

Share this post


Link to post
Share on other sites

Приглашаем на вебинар "Как сделать эффективную антенну для устройств IoT. Решения Quectel" (29.07.2021)

Вебинар посвящен проектированию и интеграции встроенных и внешних антенн Quectel для сотовых модемов, устройств навигации и передачи данных 2,4 ГГц. На вебинаре вы познакомитесь с продуктовой линейкой и способами решения проблем проектирования. В программе: выбор типа антенны; ключевые проблемы, влияющие на эффективность работы антенны; требования к сертификации ОТА; практическое измерение параметров антенн.

Подробнее

14 часов назад, Yurkin2015 сказал:

Два счётчика SN74HC4040, соединенные последовательно. 

Звучит как потенциальное решение, надо будет с утреца обдумать. Спасибо за развернутый ответ. Если что-то получится обязательно отпишусь.

13 часов назад, BARS_ сказал:

Нафига вообще использовать этих динозавров, когда ARM МК уже копейки стоят?

Кстати да, младшие модели стоят реально копейки, а казалось, что в разы дороже. Немного отстал я от жизни )

Edited by Falconist
Оверквотинг

Share this post


Link to post
Share on other sites

Решения TE Connectivity для 112 Gbps архитектуры и серверов. Перспективные решения для серверов и дата-центров

В статье дается полный обзор серий высокоскоростных разъемов IMPACT и Z-PACK, соединителей SFP- QSFP и Mini-SAS, а также разъемов и кабельных сборок для организации питания. Раскрываются преимущества и отличительные особенности данных серий высокоскоростных разъемов и области их применения.
Подробнее

Posted (edited)

Все еще мало-помалу пытаюсь реализовать сей девайс.

По совету купил отладочную плату Nucleo-64 на STM32F103, стал изучать эти ваши STM-ы, голова пухла, но после некоторых свистоплясок с таймерами все же удалось вывести примитивный, но рабочий VGA-сигнал, когда начал пробовать генерировать осмысленное изображение столкнулся с таким явлением как джиттер, картинка слегка дребезжала и плавала, особенно заметно было на стыке цветов, такая же фигня была и на AVR, но там умельцы с помощью ассемблерных вставок хитро регулировали тайминги и дребезг сводился к минимуму, наверняка решения есть и для STM-ки, но так не хотелось с ним возиться...

А потом мне как обухом по голове прилетела мысль: "Какого черта? Есть же ПЛИС!". Про плисы я только слышал, но никогда не трогал их руками, заказал несколько недорогих микросхемок Альтера, и взял на алике одну из самых дешевых отладочных платок на Altera MAX II с 80 полезными пинами и с кварцем на 50 мгц. Сел изучать Verilog. Это кайф, жалею только о том, что не занимался плисами раньше. Практически сходу за вечер создал схемку, делю входные 50 мгц на 2, дальше просто отсчитываю нужные такты для генерации HSYNC и VSYNC, небольшая отладка осцилографом и все заработало, картинка четкая, без дребезга, можно забыть про рассыпухи, дешевой MAX II хватает за глаза.

Уже  сейчас начал паять на макетке SRAM, она полностью всеми контактами уходит в плис, из этой же плиски сделаю вывод на 8-битный видео ЦАП, и отдельный вход от МК (адрес, данные). В момент когда кадр находится в форточках (не активен) МК сможет записывать произвольные данные в SRAM буфер, а плис, соответственно, управляет всей этой связкой, генерит VGA сигналы и синхронизирует взаимодействие буфера и МК. Если получится, то задача будет решена. Если все получится, то отчитаюсь )

Edited by RedSpirit
Орфография

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Это да... детали конечно. Но люди говорят,  будто дьявол прячется именно в них.. Поэтому "слёзы" лучше убрать, т.к. мужику они не к лицу. Упоминание о "грязи" тоже лучше убрать, т.к. оно рисует, в воображении читателя, грязные, а потому не слишком романтичные городские пейзажи.
    • ну...это детали...
    • Немного нарушена последовательность событий... Мухи белого снега обычно садятся на окно после опадания листвы. Т.е. осень не может наступить после зимы. Лучше написать примерно так: Рассветы запоздалые, опавшая листва Глаза твои усталые, напрасные слова А дальше станет ветрено, тоскливо и темно И снега кучи белые навалит под окно
    • На Смоленском ЦБК знают толк в музыке!
    • Фото меандра и всей морды осциллографа (качественное) с положением ручек облегчило бы гадание....
    • ...я бы мог иногда говорить да какая в ж...культура... когда утром в 4 звонить, и кричать " я люблю тебя, дура!!!....." а потом-ты наутро проснёшься, только этого ты не забудешь. глянешь в зеркало-и ужаснёшься... Но собою однажды побудешь...
×
×
  • Create New...