МАРСОХОД

Open Source Hardware Project

Проекты Altera Quartus II для платы Марсоход

Видеоигра "Теннис"

    Сделаем простую видеоигру!

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

    Вот что я хочу, чтобы было на экране монитора или телевизора:

План видео игры Теннис

 

  Конечно, когда игра будет готова, насладиться супер графикой нам не удастся. Слишком проста микросхема, на которой мы все будем делать. Меня интересует другой вопрос: «сможем ли мы сделать видео игру используя менее 240 триггеров?». В самом деле, на нашей плате стоит микросхема Altera MAX-II EPM240T100 и в ней действительно всего 240 триггеров, ну и плюс еще всякая логика. Тут интересно само проектирование, а не игра!

    Прежде всего нужно решить, что будет у нас дисплеем. Первое, что пришло мне на ум – пусть дисплеем будет обычный компьютерный SVGA монитор. В самом деле, не к телевизору же подключать!

    Чтобы подключить нашу ПЛАТУ к VGA монитору нам понадобится вот такой разъем:

d-sub15.jpg

    Этот раъем для SVGA имеет следующую распайку:

VGA сигналы

    Я выделил красным цветом те сигналы, которые нам действительно нужны: «Земля» GND, сигналы синхронизации HSYNC и VSYNC и собственно сигналы видео «красный» RED, «зеленый» GREEN, «синий» BLUE. Мы соединим вместе одним проводом RED, GREEN и BLUE и получим один «белый» цвет на экране. Таким образом, все подключение платы к монитору мы сделаем по 4-м проводам.

cable

    Теперь нужно выбрать, какой видеорежим мы будем использовать. На SVGA монитор должны подаваться сигналы строчной и вертикальной синхронизации и собственно сам сигнал, формирующий изображение. Параметры сигналов определяют видеорежим. Вообще-то видеорежимы стандартизированы в спецификации VESA (Video Electronics Standards Association). Нам нужно выбрать один видео режим.

    Просматривая спецификацию VESA я обнаружил, что пожалуй самый удобный для нас видеорежим – 800х600 60Гц. Вот спецификация на этот видео режим (нажмите на картинку, чтобы увеличить ее):

800x600_s

Сейчас объясню: на самом деле в этом режиме частота точек, отображаемых на экране (Pixel Clock) равна 40МГц. На нашей ПЛАТЕ, внутри микросхемы MAX-II мы уже имеем какой-то генератор, который может работать на частоте примерно 5МГц. Этот генератор внутри чипа не очень точный, но его можно попробовать! Фишка в том, что 5МГц меньше 40МГц ровно в 8 раз. Это значит мы не сможем рисовать на экране настоящие «точки», но сможем рисовать горизонтальные полосочки длиной 8 точек. Из полосочек можно формировать на экране квадратики, а из квадратиков и все изображение.

    Итак, пользуясь этой спецификацией можно представить как должны выглядеть сигналы синхронизации для монитора:

hsync_vsync

    Теперь, пользуясь этими картинками, мы можем начинать делать наш проект в системе проектирования Altera QuartusII. Вот как он выглядит:

prj_s

    На картинке даны кое-какие пояснения красным цветом.

    Весь проект QuartusII можно выкачать здесь:

    Отдельные модули для видео синхронизации HVSYNC и сама логика игры GAME были написаны на языке VERILOG (мне так удобнее и проще).

    Исходный текст модуль HVSYNC здесь.

    Исходный текст модуля GAME здесь.

    Итак, после успешной компиляции проекта мы зашиваем его в плату, подключаем монитор SVGA, подаем на плату питание и вот что видим:

    Двумя кнопками можно управлять положением ракетки. «Мячик» отскакивает от стенок и от ракетки. Пропущенный «мяч» это ГОЛ. Количество голов отображается на светодиодах. Все работает!

    Этот проект можно и дальше улучшать. Можно добавлять звуки в момент отскакивания мяча или в момент гола. Можно сделать еще и вторую ракетку для игры вдвоем. Можно на лету увеличивать темп игры. В общем, было бы желание, а усовершенствовать можно еще и еще.

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

 

Комментарии  

0 #31 WolfTheGrey 16.04.2015 08:04
Цитирую KhaeS:
Хотя об этом говорится в следующей статье, получается что входное сопротивление разъема монитора 75 Ом и с делителем получаем как раз нужный уровень.



А дайте ссылку в какой статье об этом говориться?! У меня хоть и в китае купленая плата на FPGA с установленным видеочипом и прочей переферией - но выглядит вполне прилично (21EDA). Так вот сигналы там 3х вольтовые. При этом в даташите указано что на самой плате уже стоят подтягивающие резисторы 75 ом. и токоогранечител ьные в 22 ома.
0 #30 KhaeS 21.09.2012 07:26
Цитирую KhaeS:
А что по поводу напряжений, 3.3В не многовато для монитора?


Хотя об этом говорится в следующей статье, получается что входное сопротивление разъема монитора 75 Ом и с делителем получаем как раз нужный уровень.
0 #29 KhaeS 21.09.2012 07:22
А что по поводу напряжений, 3.3В не многовато для монитора?
0 #28 nckma_ 25.04.2012 07:11
Цитирую Александр:
Не могли бы немного более подробно прокомментировать код модуля синхронизации. Особенно интересуют переменные
char_count
char_clock
pixel_state
line_count
line_state
end_of_line
end_of_frame

посмотрите другие проекты: Питон, работа над ошибками Теннис, Теннис для двоих - может там лучше описано?
0 #27 Александр 24.04.2012 16:08
Не могли бы немного более подробно прокомментирова ть код модуля синхронизации. Особенно интересуют переменные
char_count
char_clock
pixel_state
line_count
line_state
end_of_line
end_of_frame
0 #26 nckm_ 05.07.2011 19:17
Цитирую Forker:
Здравствуйте, не совсем понятно как вывести точку на экран vga. Вы замыкаете Red Green Blue просто на + питания? Не могли бы вы пояснить алгоритм вывода. Вертикальная и горизонтальные синхронизации постоянны в процессе работы или частота импульсов изменяется для формирования "адреса" точки по x и по у ?

Сигналы строчной и кадровой частоты регулярные, с параметрами соответствующим и VESA specification. Иначе просто не будет монитор отображать картинку.
Для формирования изображения в нужный момент времени нужно управлять толуко сигналами R/G/B.
Если Вам нужен пиксель скажем на 17й строке картинки, то после кадрового импульса и пропускаете несколько строк для "обратного хода луча" и затем отсчитываете 17ю строку. Так же выдерживаете какой-то интервал времени после строчноги импульса и подаете короткий импульс скажем на Red. Будет красная точка или горизонтальная линия, в зависимости от длительности импульса
0 #25 Forker 05.07.2011 10:27
Здравствуйте, не совсем понятно как вывести точку на экран vga. Вы замыкаете Red Green Blue просто на + питания? Не могли бы вы пояснить алгоритм вывода. Вертикальная и горизонтальные синхронизации постоянны в процессе работы или частота импульсов изменяется для формирования "адреса" точки по x и по у ?
0 #24 Михаил 13.06.2011 17:01
Огромное спасибо! Все дело в не совпадении синхроимпульсов ) исправил как в вашем проекте "Работа над ошибками.Теннис "
0 #23 nckm_ 13.06.2011 07:58
Цитирую Михаил:
Здравствуйте!
Решил сделать вариант по стандарту 800х600@72
с Pixel Clock = 50Мгц.
По горизонтали вместо значений char использовал pixels.
т.е 800 активных px по горизонтали.
В результате изображение расстроилось по горизонтали. Появилось 3 одинаковых сжатых поля.
Можно ли вывести изображение с координатой правее 100 по горизонтали?

и еще - посмотрите проект http://marsohod.org/index.php/projects/134-colortennis
там кое-что исправлено и улучшено, этот проект лучше брать за основу
0 #22 nckm_ 13.06.2011 07:56
Цитирую Михаил:
Здравствуйте!
Решил сделать вариант по стандарту 800х600@72
с Pixel Clock = 50Мгц.
По горизонтали вместо значений char использовал pixels.
т.е 800 активных px по горизонтали.
В результате изображение расстроилось по горизонтали. Появилось 3 одинаковых сжатых поля.
Можно ли вывести изображение с координатой правее 100 по горизонтали?


я думаю где-то у вас в коде ошибочка закралась. Если пришлете код - можно попробовать починить
0 #21 Михаил 12.06.2011 21:25
Здравствуйте!
Решил сделать вариант по стандарту 800х600@72
с Pixel Clock = 50Мгц.
По горизонтали вместо значений char использовал pixels.
т.е 800 активных px по горизонтали.
В результате изображение расстроилось по горизонтали. Появилось 3 одинаковых сжатых поля.
Можно ли вывести изображение с координатой правее 100 по горизонтали?
0 #20 nckm 07.02.2011 05:55
Цитирую Kerio:
К каким именно контактам группы RIGHT MOTOR подключать конкретные проводки от VGA ?

Посмотрите по схеме платы (http://marsohod.org/howtostart/plata) и по проекту Quartus:
F0 - VSYNC
F1 - HSYNC
F2 - VIDEO
Названия F0, F1, F2 в проекте и на схеме совпадают.
Если монитор будет плохо держать видеорежим, то нужен более стабильный генератор 5Мгц
+1 #19 Kerio 05.02.2011 20:26
К каким именно контактам группы RIGHT MOTOR подключать конкретные проводки от VGA ?
0 #18 nckm 26.01.2011 06:34
Цитирую remrum:
Немного подправив код перенёс проект на запылившийся
MAX II kit и LCD 480x272 выдранный из журнала вог.
Автору респект,вернул интерес к плисам :-)
сайт реально познавательный !

прикольно!
я рад, что кому-то интересно, что мы делаем!
0 #17 remrum 25.01.2011 14:41
Немного подправив код перенёс проект на запылившийся
MAX II kit и LCD 480x272 выдранный из журнала вог.
Автору респект,вернул интерес к плисам :-)
сайт реально познавательный !
0 #16 nckm 21.11.2010 13:34
Цитирую chirik:
А вы VGA напрямую к плис подключаете? Но, для задания уровня цветности в VGA используется аналоговый сигнал? Или поэтому изображение черно-белое?

Конечно настоящий VGA сигнал аналоговый. Но я просто использую 0 и 1 для создания черно-белого изображения. R, G и B соединены вместе
0 #15 chirik 21.11.2010 12:07
А вы VGA напрямую к плис подключаете? Но, для задания уровня цветности в VGA используется аналоговый сигнал? Или поэтому изображение черно-белое?
0 #14 Алексей 20.10.2010 08:29
Николай, вы жжете!

Я сам в такую игрушку в детстве играл часами (правда для двоих, с пультами в виде переменного резистора на проводе :)

Успехов вам :)
-9 #13 styfer 28.08.2010 19:13
Прочитано, принято, понято :) то что искал)
Не в обиду владельцу сайта, но ИМХО, над дизайном стоило бы поработать чуть подольше и поусерднее. Всё-таки внешний вид сайта играет немаловажную роль. Могу судить по личному опыту: после того как-на http://rem-stroy.com/ - моём сайте был нарисован и свёрстан новый диз, читатели стали задерживаться гораздо надольше, да и самому приятно смотреть. Подумайте над этим, думаю моё мнение разделят многие..
0 #12 Сергей 05.08.2010 21:20
Мне кажется что это все же програмная часть виновата, а не генератор, кстати вопрос, ни кто не пытался USB интерфейс реализовать?
0 #11 Chettuser 05.08.2010 14:48
"Сейчас работаем над созданием простого программатора через USB."
Наиполезнейшая вещь! ИМХО!. 8)

ЗЫ: Простите - кажется на 33 секунде был фальшивый сквозной гол? (я подозреваю что это от нестабильности генератора, или мне показаться могло). :D
0 #10 Николай 31.05.2010 06:22
Цитирую Владимир:
Красиво расписано,показано.Но как это можно сделать в домашних условиях??????????Допустим приобрел я ваш "марсоход"...КАК мне при помощи обычного ноута его запрограммировать????
п.с.у нас одинаковые колонки)

на сегодняшний день есть только 2 способа: программатор USBBlaster или ByteBlaster. ByteBlaster можно сделать самому, но нужен параллельный порт для его подключения. Сейчас работаем над созданием простого программатора через USB.
0 #9 Владимир 30.05.2010 23:15
Красиво расписано,показ ано.Но как это можно сделать в домашних условиях??????? ???Допустим приобрел я ваш "марсоход"...КА К мне при помощи обычного ноута его запрограммировать????
п.с.у нас одинаковые колонки)
0 #8 сергей 26.04.2010 09:06
жаль... но все же спасибо за ценную информацию
0 #7 николай 26.04.2010 08:45
Цитирую сергей:

2. То есть когда пишут что доступно столько то вентелей и столько то логических ячеек, то подрузумевается что у нас доступны столько то вентелей + столько то логических ячеек?(то есть оговоренное количество вентелей не входит в эти ячейки?)

У меня есть опыт работы только с альтерой. Она по моему никогда не пишет про вентили - только про логические элементы
0 #6 сергей 26.04.2010 07:54
1. Все верно, если нужен D тригер который работает по фронтам то да схема такова, но думаю в большинстве можно обойтись тригером который будет работать по уровнбю, ну это мое мнение
2. То есть когда пишут что доступно столько то вентелей и столько то логических ячеек, то подрузумевается что у нас доступны столько то вентелей + столько то логических ячеек?(то есть оговоренное количество вентелей не входит в эти ячейки?)
0 #5 николай 26.04.2010 07:08
Цитирую сергей:

Еще есть вопрос не в тему, много где пишут: столько то системных вентелей, столько логических ячеек, отсмюда вопрос что в ПЛИС-ах подрузумевается под логмческой ячейкой, а что под системным вентилем?


Про вентили и логические ячейки. Я думаю так: вентиль это два или три транзистора (инвертор или И-НЕ или ИЛИ-НЕ). Вентили - это скорее понятие используемое при разработке ASIC. В плис или фпга используется понятия типа Логический элемент. Это довольно крупная структура - в ней и триггер и таблица look-up-table по которой вычисляется логическая функция связанная с триггером, "провода" соединяющие каждый элемент с соседними. Я думаю логический элемент в ПЛИС или ФПГА это СОТНИ вентилей. Из за этого они собственно и дороже ASIC в массовом производстве
0 #4 николай 26.04.2010 07:04
Цитирую сергей:
почему так много?
Может я чего то не понимаю но если рассматривать схематехнику, то там просто добавляется инвертор, если же делать синхроным то еще два элемента и-не, в сумме получается 4 элемента и-не и один инвертор, или просто 5 и-не если на один из них подавать одинаковые сигнлы, от куда с десяток?
Еще есть вопрос не в тему, много где пишут: столько то системных вентелей, столько логических ячеек, отсмюда вопрос что в ПЛИС-ах подрузумевается под логмческой ячейкой, а что под системным вентилем?


Вот хорошая статья про D-триггер: http://www.mirmk.net/content/view/32/28/

В приведенной схеме 6 трехвходовых И-НЕ. Если перейти к 2х входовым, то будет в 2 раза больше.
0 #3 сергей 26.04.2010 06:39
почему так много?
Может я чего то не понимаю но если рассматривать схематехнику, то там просто добавляется инвертор, если же делать синхроным то еще два элемента и-не, в сумме получается 4 элемента и-не и один инвертор, или просто 5 и-не если на один из них подавать одинаковые сигнлы, от куда с десяток?
Еще есть вопрос не в тему, много где пишут: столько то системных вентелей, столько логических ячеек, отсмюда вопрос что в ПЛИС-ах подрузумевается под логмческой ячейкой, а что под системным вентилем?
0 #2 николай 26.04.2010 05:20
Цитирую сергей:
Всего 240 тригеров.. ну насколько я помню из 2 элементов 2или-не(2и-не) можно изготовить один триггер, так что не проблема сделать и больше


Из двух элементов можно сделать только RS триггер, а это редко нужно. Нужен D - Триггер, а он уже требует с десяток элементов типа и-не
0 #1 сергей 25.04.2010 18:25
Всего 240 тригеров.. ну насколько я помню из 2 элементов 2или-не(2и-не) можно изготовить один триггер, так что не проблема сделать и больше

Добавить комментарий


Защитный код
Обновить


GitHub YouTube Twitter
Вы здесь: Начало Проекты Проект Марсоход Видеоигра "Теннис"