back to top
Начало Препоръчано Използване на FPGA за генериране на VGA видео – втора част

Използване на FPGA за генериране на VGA видео – втора част

0
585
Използване на FPGA за генериране на VGA видео – втора част

Оригиналът е на популярния специалист по хардуер и софтуер Ken Shirriff.

В първата част се спряхме на задачата за програмисти FizzBuzz и на нейната реализация не с помощта на компютър, базиран на CPU, а с помощта на програмируема логическа матрица FPGA. Сега ще продължим с оправянето на допуснатите бъгове, с хардуерната реализация на проекта и с по-подробно обяснение на VGA формата.

Грешката, показана в предишното изображение бе в това, че съм вземал следващото значение на FizzBuzz след всеки ред пиксели, а трябваше на всеки 8 реда, за да може да се покаже целия символ. По този начин, предишното изображение се образуваше от изрязани части на осем различни символа. Увеличаването на брояча FizzBuzz на всеки 8 реда оправя проблема, както е показано по-долу. (Отстраняването на VGA грешките e много по-лесно, отколкото другите проблеми с FPGA, понеже всичко веднага се вижда на екрана. Не се налага да се включва и гледа осцилограф, за да се разбере какво точно се е случило).

Използване на FPGA за генериране на VGA видео – втора част
Извеждането на FizzBuzz на VGA монитора

Сега вече мониторът правилно показва решението на програмистката задача FizzBuzz, само че един статичен дисплей е нещо твърде скучно. Промяната на цвета на предния план и фона на всеки един ред съвсем не е сложно – използваме някои от битовете на значението на y за  червения, зеления и синия цветове. По този начин получаваме цветен текст в стил 80-те години на миналия век.

Използване на FPGA за генериране на VGA видео – втора част
Ако цветът на текста и на фона зависят от номера на реда, то текстът става по-интересен

След това реших да добавя примитивна анимация. Най-напред е необходимо в модула vga да бъде добавена индикация, че предстои обновяване на екрана, като това е ново поле на всеки 1/60 секунди. Аз използвах това за динамична промяна на цветовете (Съветвам ви да не променяте цвета 60 пъти в секунда, ако не искате да предизвикате главоболие. По-добре използвайте брояч).

Тестването и пробването на различните графични ефекти е весело и вълнуващо, понеже резултатът веднага се вижда. Аз раздвижих “Fizz” и “Buzz” със цветна следа зад тях (в стил Nyan Cat). За тази цел промених началните позиции на символите в съответствие с брояча. За постигането на цветните дъги зад символите избрах цветове според номерата на редовете (ето защо всеки ред със символи може да има различен цвят) и добавих цветна дъга отзад.

Използване на FPGA за генериране на VGA видео – втора част
Крайният резултат

И накрая добавих още един ефект – гигантските думи “Fizz” и “Buzz”, които отскачат от стените на екрана. Ефектът се базира на отскачане на невидим контур (както е при  FPGA Pong), вътре в който е поставена съответната дума. Променливата dx следи направлението по хоризонтала, а dy – по вертикала. За всеки нов екран – тоест, 60 пъти в секунда, X и Y координатите се увеличават или намаляват на базата на заложените в съответните променливи направления. Ако този контур достигне десния или левия край, то dx променя знака. Аналогично dy се превключва, ако контурът е достигнал горния или долния край. След това във вътрешността на този контур се изобразява текст с големи размери с помощта на друг екземпляр на генератор на символи, какъвто бе описан в предишната част. Думата се увеличава 8 пъти чрез отхвърлянето на трите младши бита на координата. Навярно вече сте се уморили от Verilog и няма да го прилага тук, а само ще окажа съответния GitHub код. Крайният резултат е показан в следния клип:

Хардуерната реализация

В този проект използвах съвсем опростената платка за разработчици Mojo V3, което е FPGA за начинаещи. Тя се базира на FPGA от фамилията Xilinx Spartan 6. Въпреки че това е един от най-малките FPGA, но той все пак има 9000 логически клетки и 11 000 тригера, така че този малчуган умее много неща. Да добавя, че има още много варианти на евтини платки с FPGA чипове.

Използване на FPGA за генериране на VGA видео – втора част
Включването на FPGA платката към VGA монитора е почти тривиално: само три резистора със съпротивление 270 Ω. Макетната платка се използва само за по-стабилно закрепване на кабела към проводниците, идващи от платката

Ако ще използвате някой VGA монитор, най-лесно е да се вземе платка за разработчици с FPGA конектор. Но ако такъв няма, както е например при Mojo, включването на VGA монитора не е проблем. Просто поставете 270 Ω резистори между червения, зеления и синия контакти между изходите на FPGA и входните изводи на VGA. Сигналите за хоризонталната и вертикалната синхронизация могат да бъдат взети директно от FPGA.

За написването и синтеза на Verilog използвах средата за разработване на Xilinx с име ISE. За да укажа конкретните физически контакти на FPGA, добавих няколко реда в конфигурационния файл mojo.ucf. Тук червеният извод pin_r съответства на крачето номер 50 и т.н.

NET "pin_r" LOC = P50 | IOSTANDARD = LVTTL;
NET "pin_g" LOC = P40 | IOSTANDARD = LVTTL;
NET "pin_b" LOC = P34 | IOSTANDARD = LVTTL;
NET "pin_hsync" LOC = P32 | IOSTANDARD = LVTTL;
NET "pin_vsync" LOC = P29 | IOSTANDARD = LVTTL;

Извеждането на сигналите от FPGA към VGA е често срещана задача и нейните разнообразни решения могат да бъдат намерени в Глобалната мрежа в проекти като „FPGA Pong“, „24-битов цвят с чипа DAC“, „Платката Basys 3“ и други.

Малко по-подробно за VGA формата

VGA форматът изглежда доста странно, но ако се вгледаме в историята на телевизията и на електронно лъчевата тръба, то всичко си идва на местата.Е електронно лъчевата тръба поток от електрони попада върху екрана, осветявайки луминофорното покритие и по този начин се образува изображението. Сканирането става във вид на растерен масив: лъчът сканира екрана отляво на дясно, а след това импулсът на хоризонталната синхронизация го принуждава много бързо да се върне наляво в началото на следващия ред на изображението, като това е хоризонталният обратен ход на развивката. Този процес се повтаря ред по ред дотогава, докато в долната част на екрана се стигне до края на изображението и тогава започва вертикалният обратен ход на развивката, при което лъчът се връща в началната позиция горе вляво на екрана. При хоризонталния и вертикалния обратен ход лъчът се спира и обратният ход не се показва на екрана. Скицата  по-долу показва схематично действието на растерното сканиране:

Използване на FPGA за генериране на VGA видео – втора част

Именно тези особености и характеристики са мигрирали във VGA мониторите, включително импулсите на хоризонталната и вертикалната синхронизация, както и гасенето на видео сигнала за обратния ход.

През 1953 година излиза стандартът за цветна телевизия NTSC. Но VGA е много по-опростен от NTSC, понеже се използват пет проводника за синхронизациите и за цветовите сигнали. Не се налага всичките тези сигнали да бъдат вмъкнати в един общ сигнал със сложно кодиране. Но една от странните особености на NTSC, които се прехвърлиха към VGA е, че кадровата честота на екрана не е точно 60 Hz, а 59,84 Hz.

Лъчът на осцилографа по-долу показва VGA сигнала за два реда от изображението. Импулсите за хоризонтална синхронизация, които са изобразени с жълт цвт показват началото на съответния ред. Малките червени, зелени и сини импулси в началото на реда са белите пиксели на числата от програмистката задача FizzBuzz. Червеният сигнал в средата на линията показва част от плаващата червена дума “Buzz”.

Използване на FPGA за генериране на VGA видео – втора част
Лъчите на осцилографа показват червеният, зеленият и синият сигнали на VGA, както и хоризонталната синхронизация

Заключение

Генерирането на VGA видео сигнал с помощта на FPGA се оказа много по-лесно от очакванията ми, но мен едва ли ще ме вземат на работа, ако на интервюто ми дадат задачата FizzBuzz, която да бъде реализирана с помощта на FPGA. но ако се интересувате от FPGA, пред които се очертава бляскаво бъдеще, настоятелно препоръчвам да експериментирате с видео сигнали. Това не е много по-сложно от мигане на светодиоди, но е несравнимо по-полезно. Генерирането на видеосигнал е много по-интересно, отколкото да се търси грешка с помощта на осцилограф, понеже резултатът веднага се вижда на екрана. И дори нещо да не се получи от първия път, резултатът е интересен и може да се каже дори весел.

АбонаментВсичко важно от света на технологиите, директно в пощата ти.

С абонирането приемате нашите Условия и Политика за поверителност. Може да се отпишете с един клик по всяко време.


Коментирайте статията в нашите Форуми. За да научите първи най-важното, харесайте страницата ни във Facebook, и ни последвайте в Google Новини, TikTok, Telegram и Viber или изтеглете приложението на Kaldata.com за Android, iPhone, Huawei, Google Chrome, Microsoft Edge и Opera!

×