Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Несложный видеоконтроллер на ПЛИС
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
penauch
в ПЛИСах начинающий.
сильно не пинать smile.gif

требуется сделать несложный видеоконтроллер обладающий следующим:

1) вывод на телевизор (PAL / NTSC)

2) разрешение 320 на 240 (QVGA)

3) цветность - 16 бит на точку (компоненты R,G,B побитово 5:6:5), поддержка палитры (256 цветов, 1 байт на точку)

4) доступ к видеопамяти видеоконтроллера через 8-битный порт-ввода вывода

5) обращение к памяти с автоинкрементом адреса (экономит адресные линии, A0=0 - комманды, A0=1 - данные)

6) обращение к видеоконтроллеру во время HBlank или VBlank. Или прийдётся делать 2 страницы

Вопросы:

1) есть ли похожие готовые решения?

2) с чего начать?

3) где можно почитать о принципах построения видеоконтроллеров на ПЛИС?

4) возможно ли впихнуть в недорогую ПЛИС (типа PLCC, QFP с количеством пинов не более 128)?

5) есть ли ПЛИС со встроенной памятью от 512 кБ и выше? со встроенным видео-цап ?
rezident
Для начала нужно воспользоваться поиском по форуму. Темы, схожие или родственные с вашей, поднимались неоднократно. Для примера
http://electronix.ru/forum/index.php?showtopic=54311
http://electronix.ru/forum/index.php?showtopic=64006
http://electronix.ru/forum/index.php?showtopic=58071
penauch
Цитата(rezident @ Oct 13 2009, 04:44) *


к сожалению намёток на мои вопросы там не получил, потому что задачи разные.

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

тоесть на уровне триггеров, регистров и пр. или на VHDL
rezident
Цитата(penauch @ Oct 13 2009, 07:19) *
тоесть как происходит считывание из памяти и выброс на экран?
В цикле, вестимо. laughing.gif Синхронно с генерацией импульсов синхронизации происходит циклический перебор адресов памяти с выборкой значений из видеоОЗУ.
Цитата(penauch @ Oct 13 2009, 07:19) *
как реализуется палитра ?
Обычно с помощью видеоЦАП и таблицы преобразования.
Цитата(penauch @ Oct 13 2009, 07:19) *
обращение к порту?
К какому именно порту? К видеоОЗУ или к регистрам видеоадаптера?
Цитата(penauch @ Oct 13 2009, 07:19) *
тоесть на уровне триггеров, регистров и пр. или на VHDL
А вот это зря! Рано еще. Попробуйте использовать тот же метод, что и небезызвестный Шерлок Холмс - метод дедукции. Идите от общего к частному. Сначала основы изучите, потом на уровне блок-схем прикиньте реализацию и только потом к триггерам и регистрам схемы переходите.
rv3dll(lex)
очень сильно зависит от того как писать в память и какой тип памяти использовать. вывод на тв самому интересен, на монитор vga уже пройденный этап.

этап 1 - выдать растр -сформировать комплексный видео сигнал без данных или с палитрой.
iosifk
Смотрите учебный курс у Альтеры или стартовый набор на Спартан-3е у ксайлинкса...
И сайт Диджилента...
penauch
Цитата(rv3dll(lex) @ Oct 13 2009, 08:18) *
очень сильно зависит от того как писать в память и какой тип памяти использовать. вывод на тв самому интересен, на монитор vga уже пройденный этап.

этап 1 - выдать растр -сформировать комплексный видео сигнал без данных или с палитрой.


Память SRAM 256K x 16
одно слово хранит 1 пиксель в формате RGB 5:6:5

Писать в память видеоконтроллера посредством записи в его 16-битный порт. Интерфейс обмена наподобие как в ЖКИ.
Тоесть:
D0..D15 - данные или команда
A0 (0 - команда, 1 - данные)
CS,OE,WE - стробы: выбор видеоконтроллера, асинхронные чтение, запись

вот через такой порт общение с хост-CPU

при каждом обращении к видео-памяти адрес увеличивается, по достижению конца кадра адрес переходит на начало.

По части вывода на TB ничего сложного - нужна микросхема кодера PAL и будет телевизор. Ну и развертка 15 кГц по горизонтали д.б.

Вопросы:

1) как сделать палитру? 256 цветов из 65536

2) как посчитать растактовки сигналов исходя из частоты кварца, которым тактируется ПЛИС?
rv3dll(lex)
зачем делать палитру, если у тебя уже 65к цветов судя по 5 6 5

сразу скажу где будут узкие места.

в кадре не 240 строк - следовательно строку надо выводить по 2 раза - а так как в разных полукадрах, то хранить не получится придётся окучивать память.

итого 480*320*25 - учитывая обратные ходы около 4-5 мегагерц дальше надо разруливать эту асинхронность записи, чтобы было без потерь времени нужно фифо

какую плис хочешь использовать?
penauch
Цитата(rv3dll(lex) @ Oct 13 2009, 09:24) *
зачем делать палитру, если у тебя уже 65к цветов судя по 5 6 5


нужно 2 режима(256 цветов палитровый и 64К директ колор). ну как в видеокарточках ПК


Цитата(rv3dll(lex) @ Oct 13 2009, 09:24) *
в кадре не 240 строк - следовательно строку надо выводить по 2 раза - а так как в разных полукадрах, то хранить не получится придётся окучивать память.


это по-моему называется double scan, так?

Цитата(rv3dll(lex) @ Oct 13 2009, 09:24) *
итого 480*320*25 - учитывая обратные ходы около 4-5 мегагерц дальше надо разруливать эту асинхронность записи, чтобы было без потерь времени нужно фифо


не совсем понял.
как себе представляю считывание из видео-памяти. есть счётчик, который выставляет адреса с частотой пиксельклока (адреса увеличиваются), а видеопамять выдаёт (из неё сканер читает) слова.
вродеб заморочек нет...

Цитата(rv3dll(lex) @ Oct 13 2009, 09:24) *
какую плис хочешь использовать?


навороты в видеоконтроллере не нужны - хотелось бы уложиться в Altera MAX7000 или Cyclone-2 ну худой конец.
alevnew
Цитата(penauch @ Oct 13 2009, 12:06) *
навороты в видеоконтроллере не нужны - хотелось бы уложиться в Altera MAX7000 или Cyclone-2 ну худой конец.

В циклон 2, думаю, без проблем - подобный проект, с выводом на монитор 1024*768 займет порядка 1500 ячеек. Память SDRAM логичнее для плис исползовать. Для ТВ требования попроще, наверное.
penauch
не хотелось бы обсуждать множество вариантов, а хотелось бы остановиться на конкретике, которая написана в первом сообщении.

нужен 320x240 @50/60 Гц 8bpp, 16bpp на телевизионный приёмник
alevnew
Цитата(penauch @ Oct 13 2009, 12:57) *
не хотелось бы обсуждать множество вариантов, а хотелось бы остановиться на конкретике, которая написана в первом сообщении.
нужен 320x240 @50/60 Гц 8bpp, 16bpp на телевизионный приёмник

Под конкретикой подразумевается готовый проект, адаптируемый методом copy|paste ? biggrin.gif
Предполагаю, что извилинами все же придется пошевелить- вряд ли найдется у кого-нибудь пара часов - > дней, для представления конкретики "под ключ".
penauch
Цитата(alevnew @ Oct 13 2009, 12:00) *
Под конкретикой подразумевается готовый проект, адаптируемый методом copy|paste ? biggrin.gif
Предполагаю, что извилинами все же придется пошевелить- вряд ли найдется у кого-нибудь пара часов - > дней, для представления конкретики "под ключ".


мне не нужен копипаст, а нужно чтоб направили на соответствующую литературу или информации.

книжек про ПЛИСы много а вот книги под названием "как сделать видеоконтроллер" или "принципы работы видеоконтроллера" нет.

вот я и хочу выяснить есть ли такая литература вообще или вкратце рассказали об основыных блоках видеоконтроллера с точки зрения блок-схем
AlexanderX
1. Я думаю начать нужно с выбора Video Encoder. Советую посмотреть готовые решения и не мастырить своё на обычном ЦАП. Что-то типа ADV7170, SAF7129 или что-то другое на Ваш вкус (названия привел для понимания что искать).
2. После прочтения документации Вы увидите, что стандартный протокол общения с Video Encoder это ITU-R BT.656, принимающий данные в формате Cb-Y-Cr 4:2:2. Поскольку формат 4:2:2 отличается от заявленного RGB нужно будет сделать специальный конвертер. Формулы преобразования одного в другое и наоборот можно найти в Интернете.
3. Ваше разрешение (320x240) не совпадает со стандартом PAL. Поэтому Вам необходимо произвести увеличение (scale) изображения. Наиболее простое увеличение - это в два раза. Можно простым дублированием, но более симпатичная картинка получится при интерполяции. При увеличении картинки в два раза Вы должны осознавать, что получите изображение не на полный размер экрана, а например, только в центре с полями по краям.
4. По Вашему ТЗ минимальный объем памяти - 153600 байт. Это при одной странице изображения. Делать одну страницу изображения это плохой тон, потому что в момент вывода на экран Вы будете менять изображение, что может привести к различным неприятным видео эффектам. Поскольку все же лучше иметь хотя бы 2 страницы видео памяти, то требуемый объем памяти возрастает до 307200 байт. Такой объем внутренней памяти в ПЛИС встречается только в дорогих семействах. Значит нужно ставить внешнюю видео память. Наиболее простое управление у асинхронной внешней памяти. Опять же для упрощения, можно удвоить частоту на память и в нечетных тактах читать видео память, а в четных писать.
5. Не забудьте что информация в PAL выводится чересстрочная. Но при увеличении в два раза, Вы можете просто дважды вывести один и тот же кадр. Если задумаете масштабироваться в другое число раз по вертикали (не кратное двум), тогда все становится гораздо сложнее.

P.S. ИМНО выводить на компьютерный монитор гораздо проще, чем в телевизионном стандарте. Кстати можно избежать многих проблем с масштабированием, преобразованием форматов и пр. Если выводить черно-белое изображение. Тогда можно применить простой ЦАП, которым сформировать нужную форму, включая синхроимпульсы. cool.gif
EvgenyNik
На первых этапах, я бы вообще, абстрагировался от мысли, что делать надо именно на ПЛИС, оставив только сознание того, что формирование картинки на ТВ или мониторе это строгий реал-тайм и что ваш инструмент это может.
С ТВ не работал, с VGA немного "общался". Изучите принцип формирования кадра, количество сигналов, пикселей, строк, наличие полей. Определите требуемую частоту выборки данных из некой памяти.
Прикиньте скоростные возможности управляющего МК.
Исходя из этого, выбирайте стратегию работы с картинкой (навскидку):
1. Полная смена кадра в течении обратного хода луча
2. Использование 2-ух страниц памяти
3. Поэтапная смена кадра в процессе прорисовки (картинка может "пускать волну")
Продумывайте - как будете физически организовывать работу с памятью - либо отдельными фреймами "только запись" (во время следования полей) и "только чтение" (во время вывода строки), либо произвольное чередование (может потребоваться небольшая буферизация, вероятно - для записи).
Т.о. перед Вами приличное поле для умственной деятельности безотносительно к самой ПЛИС и работе с нею.
rv3dll(lex)
c двумя страницами надо приготовиться писать в два раза больше и вместо волны, которая будет не всегда получим тормоз, особенно если писать это в 2 раза больше будем через кривой интерфейс с мультеплексированием адреса. На сколько динамичная смена картинки? какая скорость шины с контроллером.

с сдрам даже не вздумай начинать
после потерянного месяца на работу с ней поймёшь, что выборочная запись в неё в 10-20 раз медленнее чем в срам.

думаю надо купить отладочный набор и начать с изучения вывода одноцветного изображения на экран в виде одного светодиода.
Rst7
Цитата
с сдрам даже не вздумай начинать
после потерянного месяца на работу с ней поймёшь, что выборочная запись в неё в 10-20 раз медленнее чем в срам.


А не надо выборочно писать smile.gif А если запись последовательная - то со скоростью тактов.
AlexanderX
Вы же видите что человек начинающий, а Вы ему SDRAM советуете. Он только на ней умрет. twak.gif
Maverick
Цитата(penauch @ Oct 13 2009, 09:57) *
не хотелось бы обсуждать множество вариантов, а хотелось бы остановиться на конкретике, которая написана в первом сообщении.

нужен 320x240 @50/60 Гц 8bpp, 16bpp на телевизионный приёмник


Попробуй почитать
это 1

это 2

это 3

это 4 (там на процессор Nios пока можете не обращать внимание, а реализацию VGA контролера посмотрите)
Rst7
Цитата
Вы же видите что человек начинающий, а Вы ему SDRAM советуете. Он только на ней умрет.


Слухи о сложности окучивания SDRAM сильно преувеличены. Например - http://tinyvga.com/avr-sdram-vga

Я тут недавно аналогичное решение в другую сторону (быстро цифровать видеосигнал) применил, только с ARM'ом.

Кстати, самое смешное, что PAL можно сгенерить даже без специального кодера, хватит банального 8мибитного ЦАПа. Главное - выбрать тактовую частоту равной учетверенной частоте цветовой поднесущей. wink.gif
penauch
спасибо за ссылки.

но про формирование PAL и про цветоразностные сигналы - вы немного усложнили всё.

есть готовые микросхемы кодеров PAL/NTSC, которым на вход заводятся R,G,B, CSync , а на выходе имеем уже композитный ТВ-сигнал

так что со стороны ПЛИС нужно сформировать r,g,b,csync

и не надо озадачиваться всякими черезстрочностями и так далее... - достаточно формировать прогрессивный растр.

исправьте, если ошибаюсь

P.S. память будет SRAM 256K x 16
des00
Цитата(Rst7 @ Oct 13 2009, 11:37) *
Слухи о сложности окучивания SDRAM сильно преувеличены. Например - http://tinyvga.com/avr-sdram-vga

Я тут недавно аналогичное решение в другую сторону (быстро цифровать видеосигнал) применил, только с ARM'ом.


я правильно понял, заинитил, рефреш побоку, запусти чтение страницы и дуй в ЦАП? smile.gif только не понятно на схематике откуда мега берет исходную пикчю ?
Rst7
Цитата
я правильно понял, заинитил, рефреш побоку, запусти чтение страницы и дуй в ЦАП?


Типа того. Конкретно в этом проекте я особо не разбирался, наступил на него случайно, уже когда свое поехало. Но у себя я на строчном синхроимпульсе делаю необходимое количество регенераций. Их там для телевизора 4 шутки всего надо.

Цитата
только не понятно на схематике откуда мега берет исходную пикчю ?


Через последовательный порт заливают.
alevnew
Цитата(Rst7 @ Oct 13 2009, 22:37) *
Слухи о сложности окучивания SDRAM сильно преувеличены.

Согласен.
Вот рабочий пример контроллера SDRAM от Альтеры на верилоге, с описанием и всем что нужно.
Начинал с него, немного доработав.
Нажмите для просмотра прикрепленного файла
rv3dll(lex)
ну это как сказать)))

особенно по сравнению со статикой, которую не надо пречарже и тому подобные вещи - адрес поставил и через такт-два читай и весь проект в макс7000 256
alevnew
Цитата(rv3dll(lex) @ Oct 14 2009, 11:06) *
ну это как сказать)))

особенно по сравнению со статикой, которую не надо пречарже и тому подобные вещи - адрес поставил и через такт-два читай и весь проект в макс7000 256

Тут конечно от конкретной задачи зависит. Но когда требуются мегабайты памяти - SRAM может не помочь.
Раньше пытался SRAM использовать по возможности. Но единыжды разобравшись с SRDAM теперь использую его.
Да и по цене дешевле за мегабайт.
В циклоне 2 данный SDRAM контроллер занимает 147 ячеек.
Rst7
Цитата
Но когда требуются мегабайты памяти - SRAM может не помочь.


Есть еще вопрос в том, что найти SRAM приличного объема быстрее, чем 60-70нс, за вменяемые деньги - проблематично. SDRAM - это так, ненавязчиво, на порядок быстрее.
des00
Цитата(alevnew @ Oct 14 2009, 00:17) *
В циклоне 2 данный SDRAM контроллер занимает 147 ячеек.


это если устроит 8/20 от максимальной полосы памяти %) в бурст режиме ест-но %)
alevnew
Цитата(des00 @ Oct 14 2009, 11:49) *
это если устроит 8/20 от максимальной полосы памяти %) в бурст режиме ест-но %)

Это что имеется в виду??? Не понял. 8/20 - это что и почему?
У меня работает с SDRAM 16Mx16, частота шины 130 Мгц, выше не пробовал.
Режим бурст, ипользую для быстроты полные страницы (по 512 слов).
des00
Цитата(alevnew @ Oct 14 2009, 00:59) *
Это что имеется в виду??? Не понял. 8/20 - это что и почему?
У меня работает с SDRAM 16Mx16, частота шины 130 Мгц, выше не пробовал.
Режим бурст, ипользую для быстроты полные страницы (по 512 слов).


srd_sdram.pdf -> Simulation, Synthesis, Place and Route, and Results -> Table 6 Post Route Performance comparison -> 133MHz -> 212.8Mbyte/s

Цитата
The post route performance results for the SDR SDRAM controller are shown in Table 6. Throughput is calculated using a 32 bit data path to SDRAM and a 20 clock READA cycle time for an 8 cycle SDRAM burst. READA cycle time in clocks represents the critical path as WRITE A cycle time is 15 clocks.


при чтении бурстами по 8 выше 40% полосы чтения не получить, при бурстах меньше будет все хуже. Исключение режим чтения полных страниц.
Rst7
Цитата
при чтении бурстами по 8 выше 40% полосы чтения не получить, при бурстах меньше будет все хуже. Исключение режим чтения полных страниц.


Тут все не так просто - в пределах активированного банка все столбцы можно читать произвольно. Но утилизация этой фичи требует усложнения контроллера - если новый адрес не попадает ни в один из активированных банков, то самый старый (в смысле - давно использовавшийся) деактивируется и активируется с новым адресом строки. Ну и кроме того, держать банк в активированном виде до бесконечности нельзя.
des00
Цитата(Rst7 @ Oct 14 2009, 01:57) *
Тут все не так просто - в пределах активированного банка все столбцы можно читать произвольно. Но утилизация этой фичи требует усложнения контроллера - если новый адрес не попадает ни в один из активированных банков, то самый старый (в смысле - давно использовавшийся) деактивируется и активируется с новым адресом строки.


это я в курсе, в своем контроллере я это учел, правда весит он не 140 плиток %)

Цитата
Ну и кроме того, держать банк в активированном виде до бесконечности нельзя.


так то оно так, но это время много больше рекомендуемого периода авторефреша, поэтому большой проблемы тут нет smile.gif
Rst7
Цитата
но это время много больше рекомендуемого периода авторефреша,


Не совсем. Иногда выгоднее выдавать не равномерный авторефреш, а пачками, главное, чтобы все 4К прошли за 64мс - этот момент оговорен в даташитах.

Я вообще это к тому, что контроллер SDRAM выгодно точить под необходимое применение - например, достаточно красиво (и малоресурсно) можно генерить видеосигнал. Или - цифровать wink.gif
des00
Цитата(Rst7 @ Oct 14 2009, 02:10) *
Не совсем. Иногда выгоднее выдавать не равномерный авторефреш, а пачками, главное, чтобы все 4К прошли за 64мс - этот момент оговорен в даташитах.


можно работать вообще без рефреша, если вы обращаетесь ко всей нужной вам области памяти(это не обязательно вся память) за пресловутые 64мс. т.к. авторефреш это последовательность комманд act-pre, а адрес тупо берется из счетчика %)

Цитата
Я вообще это к тому, что контроллер SDRAM выгодно точить под необходимое применение - например, достаточно красиво (и малоресурсно) можно генерить видеосигнал. Или - цифровать wink.gif


согласен целиком и полностью %)
Rst7
Цитата
можно работать вообще без рефреша


Безусловно.

Цитата
согласен целиком и полностью %)


Согласие есть продукт при полном непротивлении сторон biggrin.gif
alevnew
Цитата(des00 @ Oct 14 2009, 12:52) *
srd_sdram.pdf -> Simulation, Synthesis, Place and Route, and Results -> Table 6 Post Route Performance comparison -> 133MHz -> 212.8Mbyte/s
при чтении бурстами по 8 выше 40% полосы чтения не получить, при бурстах меньше будет все хуже. Исключение режим чтения полных страниц.

Если по 8 читать, то да, потери будут на команды ощутимые.
Но и то, при полосе 40% это 19 нс. SRAM с таким временем доступа и большим объемом, думаю, не слишком доступны и дешевы.
На счет 15 тактов - на то он и бесплатный образец smile.gif
rv3dll(lex)
можно много чего.
у меня была задача в которой 1024*768 отрисовывались хекстайлами vnc и всё такое. в динамической памяти это выливалось в переключение банков в среднем за раз на 10 отрисованных точек. Так вот для повышения производительности пришлось для 16 битного цвета поставить 32х битную ZBT и чмтать и писать по 2 точки поочерёдно. там правда отдельного контроллера выявить не удаётся так как сам контроллер имеет функции заливки прямоуг полигонов любого размера одним цветом и из буфера массивом, копирование пллигонов, функции частичного наложения аппаратный загружаемый курсор мыши.
torik
Цитата
и не надо озадачиваться всякими черезстрочностями и так далее... - достаточно формировать прогрессивный растр.

Наверное, все же нужно формировать черезстрочное изображение, если в кодере нет встроенной памяти на кадр...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.