Search
Write a publication
Pull to refresh

Comments 61

Видеокарта готова принять за 1 такт координату Х, 1 такт координату Y и 4 такта цвет с последующим сохранением в ОЗУ.  Установлен кварц 50 МГц. Получается более 8 миллионов пикселей в секунду. Но это теоретически.)

Я про реальную требующуюся, у меня SPI на соплях из пинов дает 4 Мбит/с, работает аппаратно на меге и занимает 5 пинов.

Я могу ошибаться, но пины ардуинки могут меняться на частоте мк. То есть, при 12МГц у нас макс скорость будет примерно 4МТ\с, если учесть что команды по 1 такту. (Load->Store->Inc(void* picture))
Тоесть для 256х198 мы можем передавать в 60фпс. (для коня в вакууме)

А учитывая его кривущую архитектуру, там дай бог 10фпс выжать. (в видео слайдшоу, какб)
@PNP80Зачем передавать позицию знакоместа? Для передачи пикселей можно было просто сделать FIFO буфер и вывести пин "FIFO на половину пуст" и добавить пару команд для синхронизации. Это бл тупо удобнее, у тебя в коде просто привязка позиции пикселя и фиговина дёргает прерывание и ты просто кидаешь туда данные. Всё, ничо даже рисовать не надо, ты тратишь минимум тактов мк на отрисовку и при более мощных мк этим будет заниматься DMA. пффф
+Если ты косишь под "ретро" то тем более кринж, 1 передача = 1 пиксель. (при 8битной шине) Если хочется много цветов, то 16бит твой предел. Почему 4 такта на пиксель??? У тебя там синхронизации какие-то? Я не могу понять...пфффф
Не был бы я нищим, я бы "показал как надо", ахахах

@PNP80 Внизу скинули ссылку на этот проект. И это кринжатина лютая.
Ты дёргаешь пины по отдельности, серьёзно? А почему нельзя по маске писать?
Я кнш не вкурсе как там AVR устроена, но вроде под выводы у неё просто кусок памяти, где прописано направление данных и сами регистры с этими данными.
***
Тоесть у тебя в идеале должно уходить всего 4 команды, при твоей разводке, на выставление данных на шине. + "ПЛИС" у тебя детектирует данные по фронту? Это ещё +2 команды, ибо AVR вроде умеет в битовые команды с памятью.
Итого, в идеале у тебя выходит 6 команд на одну передачу по шине, если учесть что команда = 1 такт, то предел по шине около 2МТ\с при 12МГц. (или 8 команд для данные + команды ПЛИС, итого ~1МТ\с)
А у тебя просто вырезки из либ где ты по одному пину ставишь...
***
Я так же не понимаю почему ты не сделал просто клок + команды. Это же вроде самое первое что лезет в голову если ты хоть немного знаком со схемотехникой и как работают шины те жы RAM,PCI,ISA в компах. У тебя тупо на 1 команду больше будет, даже при текущей "архитектуре". То есть, 1 детектор 2 регистра (8х2) там в лучшем случаее 14 ячеек на это уйдёт (если они организованы как LUTх3+Регистр).
***
+ Ок, в MAX2 240 нету sram, тут мой косяк. Так сказать - "Прошу прощения, зря быканул". FIFO нормальное не сделать, максимум должно на 8-12 записей хватать. Хотя там есть флеш на 1КБ...
Я в замешательстве) Как ты данные синхронизируешь, да и ещё пишешь "по пикселю"? Поведаешь нам?

Ты дёргаешь пины по отдельности, серьёзно?
Тоже посмотрел исходники. Похоже, ардуинщики не в курсе что такое DDR, PORT, PIN и что digitalWrite в 30 раз медленнее обычной работы с портами. Не говоря о такой чуши, как куча digitalWrite подряд.
А десятком строк ниже уже PORTD |= (1<<2); //digitalWrite (2, HIGH);
Определитесь уже в каком формате пишете!

Я художник - я так вижу.)))

Требовать с любителя как с профессионала – не профессионально!)))

 Видеокарта берет содержимое ОЗУ и прорисовывает на мониторе, потом сообщает микроконтроллеру о готовности принимать данные (можно конечно в любое время передавать данные, но будут артефакты на мониторе), камень передает координаты пикселя и цвет.

Если отказаться от  координат, значит, контроллеру придется передавать полностью страницу. А страница весит 32 КБ.

А требовать с любителя сначала ознакомиться с существующими решениями — тоже непрофессионально?
Скажем, в SPI-дисплеях можно и область вывода указать, если нужно вывести не всю картинку, а только небольшой прямоугольник, и дождаться пока контроллер созреет передать следующий пиксель, и настройки поменять.
Если отказаться от координат, значит, контроллеру придется передавать полностью страницу.
Разумеется, нет. Потому что см.выше.
Попробуйте поработать с тем же ili9341, про который я уже писал. Один из самых распространенных дисплеев ведь.

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

Отличная идея! Спасибо за совет!

Тут выше уже отписали. Но суть в том что ты можешь много чего поставить на конвейер. Банально выдав команду "поменять режим" и передав его через 8бит шину. А потом так же настроить х,у и слать данные просто дёргая пин "клока", внутри там просто инкрементный счётчик + мультиплексор от текущего стейта. Это делается очень легко и ресурсов не много тратит, должно в MAX2 эту помещаться.
Тоесть даже не переделывая код железки у тебя выйдет 1 пин для "клока" и 2 пина на 4 команды типа - "выставить х", "выставить у", "передать данные", "поменять режим"
А там на стейт машинах можно почти шо угодно сделать, даже то же рисование куска экрана, просто ещё 2 регистра с координатами, доп проверка на переполнение и 2 битный регистр на состояние (надо же границы рисуемого квадрата передать, а потом рисовать).
Ещё немного наговнокодить и можно даже SDRAM буфер на прямое чтение передавать, но это уже просто приколы)

У меня есть одна проблема: ресурс  используемой ПЛИС  очень ограничен, поэтому в этом варианте это все будет не возможно.

Чел, угараешь? У тебя какая утилизация кристала? Всмсл, сколько ячеек занимает?

***Так, чего-то я напутал, ночью фигню написал, там вся эта магия с пакетной\указатель модами должна +-40 ячеек сожрать.
(Закраска Области и Пакетный режим по сути работают одинаково, потому смысла их отделять нет)
А чтение можно прикрутить условно бесплатно или ценой 1 мультиплексора на шину адреса VGA->SDRAM, хотя двунаправленные выводы могут чуть больше ячеек сожрать, тут хз

Попиксельное рисование пока единственное что умеет видеокарта?
Рисование примитивов и спрайты были бы уместны, мне кажется.

p.s. я понимаю что это ради само образования проект
а так, по стоимости результат мягко говоря грустный, плисины не дешевые и вообще оверкил
Из зала кричат: "Слайды!"

Т.е. немного о преодолении трудностей и ссылки на коды и схемы.

если на скорую руку, то можно глянуть схему и исходники здесь(правда чуть чуть устаревший вариант. Нет функции "пипетка")

https://hackaday.io/project/179852-bk-1-vga-board 

К сожалению  нет. Первый опыт – не возможно все предусмотреть.

"Вы вообще нормальный?!" :) На самом деле уважаю, сам никогда такое не повторю, к сожалению.

А у вас же там нет фреймбуфера и тайминги шины завязаны на тайминги VGA? Зачем тогда передавать координаты пикселей?

И если нет фреймбуфера, то зачем вообще ПЛИС, можно дергать пинами с таймингами VGA: Раз, Два, Видеоигры
И даже на сайте хабрахабр точка ру

P.S. Это должен был быть коммент к статье, а не реплай. Я не очень умный.

Любопытно ) Можно ведь сделать аппаратный скроллинг и поддержку спрайтов, тогда и Марио будет плавно работать.

Это уже не просто видеокарта, а целый GPU получится!

Вы молодец! Запускайте в продажу и не слушайте завистников!

Здорово! Завидую!) Связка ПЛИС + Arduino выглядит как неравный брак. Насколько просторнее надо взять ПЛИС, чтобы одновременно эмулировать Arduino?

Затрудняюсь ответить на Ваш вопрос.

Я точно не помню, но есть проекты мегх каких-то, у них утилизация на ~2-5К ячеек, притом они полностью совместимы с последними стандартами AVR. Есть ещё проекты на OpenCores, но там самопал какой-то, я не смотрел. Так же есть сайт marsohod.org вроде, там дядьки делают самоделки, там же делали "микро AVR" на том же камне что и у нашего героя. Единственное на марсоходе деды сидят которые в схем-редакторе рисуют прошивку, verilog\VHDL кода там мало.
На счёт нормальных ядер AVR под "ПЛИС", там у вас говнокодить не выйдет. Это нормальные люди пишут с нормальными инструментами и скорее всего у вас даже с "разгона" на обкуривание док ничего не получиться. Максимум на шину устройство своё прикрутить, не более. (грубо говоря сделать свой AVR с 8 SPI+UART, ок?)
***
Из более менее обкатанного даже на марсаходе - amber ARM v2. Железка неплохая, код хоть и перегруженный названиями, но разобраться можно. Утилизация около 1.5-2К, если правильно помню. На этой фигне чо только не делали, можно много нагуглить, я полагаю. (+он там вроде по wishbone шине работает, тоесть просто взять что-то из opencores и прикрутить туда не сильно проблем создаст)
***
Если совсем скучно, можно попробовать написать самописный процессор, это не сложно. Из минусов - придётся писать прогу для ассемблера. + Надо отладчиком научиться пользоваться, чтоб хернёй не страдать. (как я раньше) Будет у вас процессор читать из порта SPI, а данных там нет, почему? (пример)
***
Итого вам должно хватить 6К ячеек "ПЛИС" для всяких маленьких подделок с софт процом, а хотите что-то нормальное, берите хотя бы 20К. (хотя что "самодельщик" может тяжёлого сделать? лол)
ЗЫ Если сами разводите платы берите CPLD, ибо в FPGA нужна флеш для прошивки, а там легко накосячить и не то взять если детально не разобраться. (хотя CPLD быстро умирают если напряжения и эксплуатационные условия не соблюдать, но что вам эти +- пол года на утечку 1 бита из прошивки?)

А где статья-то? Какую полезную информацию можно получить из набора картинок и видео? Где описание работы, подводные камни, ограничения — где хоть что-то?!
Я не автор, если что. Но вот hackaday.io/project/179852-bk-1-vga-board

А по теме, такое чаще всего, когда есть законченное изделие, поделиться его работой хочется, а детально рассказать уже не хватает моральных сил.
Эта ссылка должна быть в «статье».
Ну а еще нормальные статьи принято начинать с постановки задачи: для чего это вообще делалось. Мне, например, не очевидно, насколько хватит возможностей Ардуины, учитывая, что у нее всего 4 кБ оперативки.
Я всецело разделяю ваше негодование.

Оперативку можно расширять посредством I2C или SPI модулей. Тогда одной Arduino Nano (ака ATmega 328) хватает для косплея автономного 8-битного компьютера под управлением CP/M с выводом текстового изображения на ТВ 20 строк по 45 колонок символами 4x8, PS/2 клавитура поддерживается примкнувшим STM8. А в плане видеокарт - одна выделенная Arduino Nano может выводить монохром 320x224 с аппаратным плавным попиксельным вертикальным скроллингом (это реализуется очень просто - смещением адреса начала видеобуфера, такую штуку использовали в стародавние времена в одном из Amstrad-ов).
P.S. А можно обойтись и без дополнительной оперативки - память можно эмулировать SD-карточкой, с кэшированием командная строка CP/M вполне отзывчива - такое тоже было, в еще более древних машинах, память на магнитных барабанах играла роль ОЗУ.

Оперативку можно расширять посредством I2C или SPI модулей.
Только скорость тогда вообще в ноль упадет. Даже в идеальном случае на чтение 1 байта уйдет 16 тактов. Не считая адреса и работы драйвера этой внешней ОЗУ.
с выводом текстового изображения
Вот вывод текста это другое дело. Если не рисовать каждую букву из пикселей, а послать видеокарте команду «нарисуй 'A'».
А в плане видеокарт — одна выделенная Arduino Nano может выводить
ИМХО практичнее было бы сэмулировать какой-нибудь дисплей, который к ардуинам подключают — ili9341 например — и выводить не на трехдюймовую матрицу, а на VGA. По крайней мере под них уже написано довольно много кода, глядишь и пригодится кому.
А если бы такое делал я, скорее ориентировался бы на терминалы вроде vt100 — с управлением по UART. Ну, может, добавил бы специфичных ESC-последовательностей для графического режима.

Только скорость тогда вообще в ноль упадет. Даже в идеальном случае на чтение 1 байта уйдет 16 тактов. Не считая адреса и работы драйвера этой внешней ОЗУ.

Все верно - но штатная оперативка атмеги используется как кэш - однолинейный для инструкций, многолинейный - для данных (все по настоящему )))). И еще немаловажно - атмега еще и эмулирует 8080-й. Скорость эквивалентна 500-600 кГц 8080-го в FAST-режиме (когда гасится экран), 150 кГц - в обычном - медленно, но командная строка CP/M вполне-вполне отзывчива.

Вот вывод текста это другое дело. Если не рисовать каждую букву из пикселей, а послать видеокарте команду «нарисуй 'A'».

Совершенно верно. Во флэше атмеги прошит знакогенератор, экранный буфер в памяти меги - символьный, эмуляция BIOS-процедур CPM 2.2 - экранные - там все просто, а вот разобраться с форматом данных для дисковых процедур - не совсем). IMHO получается симпатично (это знаменитый в узких кругах тест процессора, пройденный "нанокомпьютером"):

выводить не на трехдюймовую матрицу, а на VGA

Вывод на телевизор (композитный сигнал).

P.S. Поддерживаются два виртуальных экрана (буква L в строе статуса обозначает левый экран) (аналогичная штука было в многих микрокомпьютерах, например, Osborne), поэтому чтобы посмотреть правую часть - надо переключиться нажатием сочетания клавиш на PS/2-клавиатуре). Получился полный фьюжн из разных техник, примененных в компьютерах времени моего детства.
P.P.S. Небольшой чит - экран снят ТВ-тюнером, а не фотографированием телевизора.

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

Хотелось бы повторить такое. Есть ли статья/схемы/руководство?

А можно взять более жирный МК, у которого наружу торчит параллельная шина (большие AVR/STM32) и повесить на нее и внешнюю память и видеокарту. Будет всё как у больших компьютеров

Потрясающая работа! А вы платы сами не продаёте для народа?

Серийного производства нет.  Но если будут заказы, то несколько штук могу спаять.

Ничего себе уровень для новичка!

Предположил, что EPM240T100C5N стоит раз в пять дороже Arduino NANO. Посмотрел, оказалось гораздо привлекательней (с поправкой на нынешние цены контроллеров). Есть ли какая ардуиноподобная среда, чтоб попробовать "войти" в ПЛИС?

Есть Квартус с графическим редактором.

К сожалению, в графическом редакторе вот только такие схемки и можно делать. Всё что сложнее Verilog /VHDL.

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

Мне не хватило 240 LE в таком проекте, иерархию никто не отменял и разговор про начало, а не профессиональную разработку на 10 - 100 тысяч LE.

Там можно наловчиться разбираться в схемах + там так же поддерживаются все эти фичи с разбиением схем на модули. + даже пару вич есть типо табличных значений или памяти. (не помню точно, ибо тоже не пользуюсь этим)
С другой стороны описывая код на Verilog/VHDL придётся иногда смотреть чо оно там на генерировало, а так ты сразу видишь схему перед глазами. Так что тут дело вкуса кто на чём схемы описывает.

я делал в Quartus поведение описывал на Verilog

UFO landed and left these words here

Вопрос а стоит ли покупать и использовать или лучше покупать какую-то другую видео карту?

Для AVR смысла в видеокарте немного. У нее не хватит ни памяти, ни скорости подготовить картинку. Ее потолок что-то вроде упоминавшихся ранее ili9341 с разрешением 320х240. Естественно, о быстром обновлении, красивых анимациях и прочем речь и близко не идет. Максимум можно загрузить фоновую картинку с внешней флешки и рисовать поверх нее буковки и циферки.

Проще сравнить это всё с ~8086 и задаться вопросом - "А что те системы умели в плане графики".

Те системы имели несколько больше оперативки. Да и вообще были больше заточены на общение с человеком, чем с другими железками.

Там скорее просто прикол, что цпу наружу торчал шиной ОЗУ, от чего налепить туда любой обвяз было не проблема. И так же к шине крепилась фигня которая тебе буквы на мониторе рисовала. Эх, это был буквально самый лучший конструктор на микрухах которой ты бы мог себе представить.
А так в тех камнях 32-64КБ как раз уже был минимальный стандарт, примерно как в текущих жирных микрухах типо меги. Там сильно позже уже начали и 128КБ и 1МБ осваивать, ибо память тогда дорогая была. *К примеру - 8086 был выпущен в 1978 году, а популярные зхспеки у которых 16КБ-48КБ лишь 1982.

32-64кБ это оперативки, а в Мегах столько флеша. А оперативки там всего 4 кБ. Даже в stm-ках 32кБ ОЗУ далеко не всегда встретишь.
Там скорее просто прикол, что цпу наружу торчал шиной ОЗУ
Так линии для внешней памяти даже в древней AT90S8515 есть, не говоря про более свежие контроллеры. И дисплеи соответствующие встречаются.
Вот только и требования к графике растут. Сейчас вряд ли кого можно впечатлить 4-цветной картинкой. Минимум Doom подавай.

Отлично получилось! Особенно для "первого блина".

Вроде бы на bluepill в монохроме до 800 на 600 разгонялись, и ЕМНИП поднимали текстовый терминал. осталось только графику поднять.
Навскидку
Видео-контроллер на ATmega32
AVR, ARM, CPLD и VGA… 1760 часов чистого времени
Игровая видеоконсоль на AVR AVGA
stm32f103-vga-rs
VGA output using a 36-pin STM32

вы неправильно используете свою видеокарту

Туда надо вектор передавать, напишите простенькую библиотеку для графики

Можно формочки сделать по типу Андроида и стандартные элементы управления, кнопочки, текстбоксы

А плисина в свою очередь бедет рисовать это всё с бешенной скоростью. я давно о таком думал, но в ПЛИСах не шарю

На этой ПЛИСине это не возможно, слишком мало ячеек.

По крайней мере, не с моими мозгами.

я все удивляюсь почему не сделают програмно аппаратное решение, с мультиплексором для поднятия частоты. Не безызвестный VGAX делает на стоковой (16Mhz) ардуине 120px по ширине (используя при этом только 2 бита на цвет из 8 битов порта), один каскад даже на паре КТ315 легко работает на этих частотах в качестве быстрого и очень дешевого мультиплексора для удвоения частоты (а именно запихивания 4х бит с порта в две жилы с разделением по времени - я это проверял)
- да памяти на ардуине маловато 2К это практически полностью уходит на 120х60х2bpp видеобуфер... а с удвоением получиться 240х60х2bpp, но - если реализовать тайловый буфер для символов то 2К это 80х25 - прямо стандартный VGA термнал (ладно там всего 48байт остается, но сделать тогда 40х25 CGA терминал точно можно, причем причем на цветность ограничений уже не будет можно до 4bpp поднять - стандартные 16 CGA цветов)
- дальше нахрен 60fps ардуине? Вместо этого можно интерлейсить строки получая между каждой время на какой-то процессинг (вплоть до буферизации строки для ее повторения) в 240p при 40 символах влазит по 6px на тайл (на букву 5px нужен еще 1 px на разделитель) - маловато, но минимально достаточно даже для букв типа Ж Ш
- дальше, располагая 40х25 тайловым буфером знаимающим чуть меньше половины памяти при хранении 256 видов тайлов и 6p тайлами (по высоте не ограничены) уже можно всякие аля "змейки"/"пакманы" на этом псевдографически писать.
- ПОЧЕМУ до сих пор ни кто не осилил открытыый тайловый движ под ардуину (кроме товарища который писанул на нем свою игрулю) я когда повозился и понял что это возможно (лет 5 назад) понял ну значит скоро появиться... но его все нет. Не уж-то ни у кого из тех кто знает что это можно сделать нет времени???

и даже монетизация у этого есть - можно будет примитивные вообще каскады мультиплексора для ардуины за 100-200р толкать как "софтверный VGA щилд"

я вообще полагаю девбордеры могли бы тогда в будущем оснастить таким каскадом осуществляющим 8pin->4pin (порт удвоенной частоты) выводом.

была бы стоковая ардуина с ТАЙЛОВЫМ движком (что то типа пико-8 на ней бы заколосилось)

вот схемотехника мультиплексора которая была проверенна аппаратно на VGAX
https://www.falstad.com/circuit/circuitjs.html?cct=$+1+0.000005+14.235633750745258+54+5+43 t+240+160+240+192+0+1+-9.148915590723593+-4.999999996545533+100 t+240+288+240+256+0+-1+-0.23550799392262536+-0.6538718449901015+100 r+256+192+304+192+0+470 r+256+256+304+256+0+470 r+240+160+240+112+0+30000 r+192+112+192+160+0+50000 w+240+288+192+288+0 w+192+160+192+288+0 w+224+192+128+192+0 R+304+256+320+256+0+1+7+2.5+2.5+0+0.5 R+240+112+320+112+1+2+200+5+0+0+0.5 R+304+192+320+192+0+1+13+2.5+2.5+0+0.5 g+128+192+96+192+0 w+224+192+224+256+0 w+192+112+240+112+0 o+12+32+0+4099+0.0000762939453125+0.0125+0+2+12+3
(сам VGAX при этом особо не перебирался, просто было проверено что пиксели по ширине там нормально можно съежить вдвое)

кстати т.к. этот каскад использует полуволну для переключения принимая 16Mhz clock он поднимет до 32Mhz скорость пикселей так что на него надо выдать не 16Mhz а 8Mhz с PWM
- но два таких делающих 4pin->2pin можно рекурсивно объединить уже тактируя второй уровень от clock и сделать 8pin->2pin т.е. уже учетверение частоты (clock можно вывести на ногу фьюзом) тогда можно даже 480p сделать для 2bpp (может быть круто именно что для терминала)
- ну а для особо упорных альтренативным билдером прошивки частоты тактирования можно поднять до 20Mhz (столько ATMega328P допускает) и получить максимально 640p даже (это может привдить к ошибкам работы такой ардуины со сторонними либами, но не со встроенными)
// сетка тайлов при этом не увеличится т.к. задана возможностями памяти, но зато тайлы станут 12p 2bpp или 16p 2bpp соответственно

Sign up to leave a comment.

Articles