Сделаем простую видеоигру!
Когда-то, в далекие времена
, появились в магазинах первые электронные телевизионные видеоприставки. Эти приставки позволяли своим счастливым владельцам играть в довольно незамысловатые игры: «питон», «теннис», «тетрис». Я помню мы, мальчишками, выстраивались в очередь, что бы поиграть. Приставка была только у одного моего друга. Конечно сейчас видеоиграми никого не удивить. Современные игры для компьютеров и приставок красочны, динамичны и увлекательны. Стоимость разработки таких настоящих игр в дизайн студиях исчисляется миллионами долларов и ведется много месяцев. Мы же сейчас поставим перед собой совсем простую цель. Мы будем делать примитивную игру «теннис».
Вот что я хочу, чтобы было на экране монитора или телевизора:
Конечно, когда игра будет готова, насладиться супер графикой нам не удастся. Слишком проста микросхема, на которой мы все будем делать. Меня интересует другой вопрос: «сможем ли мы сделать видео игру используя менее 240 триггеров?». В самом деле, на нашей плате стоит микросхема Altera MAX-II EPM240T100 и в ней действительно всего 240 триггеров, ну и плюс еще всякая логика. Тут интересно само проектирование, а не игра!
Прежде всего нужно решить, что будет у нас дисплеем. Первое, что пришло мне на ум – пусть дисплеем будет обычный компьютерный SVGA монитор. В самом деле, не к телевизору же подключать!
Чтобы подключить нашу ПЛАТУ к VGA монитору нам понадобится вот такой разъем:

Этот раъем для SVGA имеет следующую распайку:
Я выделил красным цветом те сигналы, которые нам действительно нужны: «Земля» GND, сигналы синхронизации HSYNC и VSYNC и собственно сигналы видео «красный» RED, «зеленый» GREEN, «синий» BLUE. Мы соединим вместе одним проводом RED, GREEN и BLUE и получим один «белый» цвет на экране. Таким образом, все подключение платы к монитору мы сделаем по 4-м проводам.
Теперь нужно выбрать, какой видеорежим мы будем использовать. На SVGA монитор должны подаваться сигналы строчной и вертикальной синхронизации и собственно сам сигнал, формирующий изображение. Параметры сигналов определяют видеорежим. Вообще-то видеорежимы стандартизированы в спецификации VESA (Video Electronics Standards Association). Нам нужно выбрать один видео режим.
Просматривая спецификацию VESA я обнаружил, что пожалуй самый удобный для нас видеорежим – 800х600 60Гц. Вот спецификация на этот видео режим (нажмите на картинку, чтобы увеличить ее):
Сейчас объясню: на самом деле в этом режиме частота точек, отображаемых на экране (Pixel Clock) равна 40МГц. На нашей ПЛАТЕ, внутри микросхемы MAX-II мы уже имеем какой-то генератор, который может работать на частоте примерно 5МГц. Этот генератор внутри чипа не очень точный, но его можно попробовать! Фишка в том, что 5МГц меньше 40МГц ровно в 8 раз. Это значит мы не сможем рисовать на экране настоящие «точки», но сможем рисовать горизонтальные полосочки длиной 8 точек. Из полосочек можно формировать на экране квадратики, а из квадратиков и все изображение.
Итак, пользуясь этой спецификацией можно представить как должны выглядеть сигналы синхронизации для монитора:
Теперь, пользуясь этими картинками, мы можем начинать делать наш проект в системе проектирования Altera QuartusII. Вот как он выглядит:
На картинке даны кое-какие пояснения красным цветом.
Весь проект QuartusII можно выкачать здесь:
Игра теннис (43.93 Кбайт)
Отдельные модули для видео синхронизации HVSYNC и сама логика игры GAME были написаны на языке VERILOG (мне так удобнее и проще).
Исходный текст модуль HVSYNC здесь.
Исходный текст модуля GAME здесь.
Итак, после успешной компиляции проекта мы зашиваем его в плату, подключаем монитор SVGA, подаем на плату питание и вот что видим:
Двумя кнопками можно управлять положением ракетки. «Мячик» отскакивает от стенок и от ракетки. Пропущенный «мяч» это ГОЛ. Количество голов отображается на светодиодах. Все работает!
Этот проект можно и дальше улучшать. Можно добавлять звуки в момент отскакивания мяча или в момент гола. Можно сделать еще и вторую ракетку для игры вдвоем. Можно на лету увеличивать темп игры. В общем, было бы желание, а усовершенствовать можно еще и еще.
Да, чуть не забыл. Если применить внешний генератор, более стабильный, чем тот, что внутри чипа, то картинка на экране монитора перестанет дрожать. Если вдобавок еще и поднять частоту генератора, то можно будет делать изображение более детализованным.











Комментарии
Сигналы строчной и кадровой частоты регулярные, с параметрами соответствующим и VESA specification. Иначе просто не будет монитор отображать картинку.
Для формирования изображения в нужный момент времени нужно управлять толуко сигналами R/G/B.
Если Вам нужен пиксель скажем на 17й строке картинки, то после кадрового импульса и пропускаете несколько строк для "обратного хода луча" и затем отсчитываете 17ю строку. Так же выдерживаете какой-то интервал времени после строчноги импульса и подаете короткий импульс скажем на Red. Будет красная точка или горизонтальная линия, в зависимости от длительности импульса
и еще - посмотрите проект http://marsohod.org/index.php/projects/134-colortennis
там кое-что исправлено и улучшено, этот проект лучше брать за основу
я думаю где-то у вас в коде ошибочка закралась. Если пришлете код - можно попробовать починить
Решил сделать вариант по стандарту 800х600@72
с Pixel Clock = 50Мгц.
По горизонтали вместо значений char использовал pixels.
т.е 800 активных px по горизонтали.
В результате изображение расстроилось по горизонтали. Появилось 3 одинаковых сжатых поля.
Можно ли вывести изображение с координатой правее 100 по горизонтали?
Посмотрите по схеме платы (http://www.marsohod.org/index.php/howtostart/plata) и по проекту Quartus:
F0 - VSYNC
F1 - HSYNC
F2 - VIDEO
Названия F0, F1, F2 в проекте и на схеме совпадают.
Если монитор будет плохо держать видеорежим, то нужен более стабильный генератор 5Мгц
прикольно!
я рад, что кому-то интересно, что мы делаем!
MAX II kit и LCD 480x272 выдранный из журнала вог.
Автору респект,вернул интерес к плисам
сайт реально познавательный !