Задумал я наконец взяться за разработку электронной версии игры Реверси в манере 70-80-ых. Т.е. не используя процессорные технологии. Каждая клетка игрового поля выполена в виде функционально законченного кубика с контактами. На верхней стороне камждого кубика расположен двух цветный светодиод (красный/синий) и кнопка. Внутри - микросхема XC9536. Все кубики соединятся друг с другом с восьми сторон. Т.е. один кубик имеет до восьми соседей. Вот примерная схема соединения кубиков в одном направлении: Код (Text): -──────────v────────────────────v────────────────────v──────────- ┌─────────^─────────┐┌─────────^─────────┐┌─────────^─────────┐ -┼─────────v─────────┼┼─────────v─────────┼┼─────────v─────────┼- │┌────────^────────┐││┌────────^────────┐││┌────────^────────┐│ ││ ┌───┬─────┬───┐ ││││ ┌───┬─────┬───┐ ││││ ┌───┬─────┬───┐ ││ │└─┤NIx│ │ │ │││└─┤NIx│ │ │ │││└─┤NIx│ │ │ ││ └──┤NSt│ │ │ ││└──┤NSt│ │ │ ││└──┤NSt│ │ │ ││ -───┤PIx│ │X/O├─*┼───┤PIx│ │X/O├─*┼───┤PIx│ │X/O├─*┼- -───┤PSt│ │Sta├──*───┤PSt│ │Sta├──*───┤PSt│ │Sta├──*- -───┤Sup│ │Str├──────┤Sup│ │Str├──────┤Sup│ │Str├───- -───┤CRq│ │CAk├──┐┌──┤CRq│ │CAk├──┐┌──┤CRq│ │CAk├──┐ └───┴─────┴───┘ ││ └───┴─────┴───┘ ││ └───┴─────┴───┘ │ -──────────v─────────┘└─────────v─────────┘└─────────v─────────┘ -──────────^────────────────────^────────────────────^──────────- Как видно, один кубик должен иметь 10 контактов для связи с другими только по одной оси. Понятно, на на игровом поле таких осей - четыре. И полная схема расключения усложняется. Вот описание контактов: CAk: Change Acknowledge CRq: Change Request NIx: Next cage index NSt: Next cage cast status PIx: Previous cage index PSt: Previous cage cast status Str: Status change string Sup: Support for status change X/O: Current cage index (0-"o"; 1-"x") XOn: Current cage cast (0-"passive"; 1-"active") ================================================ CAk: Подтверждение смены статуса CRq: Запрос на возможность смены статуса NIx: Индекс следующей клетки NSt: Активность следующей клетки PIx: Индекс предыдущей клетки PSt: Активность предыдущей клетки Str: Цепь смены статуса Sup: Поддержка цепи смены статуса X/O: Статус текущей клетки (0-"o"; 1-"x") XOn: Текущая клетка (0-"пассивна"; 1-"активна") Принцип работы достаточно прост: Схема текущей клетки анализирует состояние её соседей и на основе их сигналов изменяет свой режим или статус. Так, сигналами NOn-NSt-POn-PSt определяется состояние соседних клеток. Активная клетка дублирует сигнал Str к Sup, если следующая клетка пассивна или оба их индекса совпадают. Если текущая клетка не активна и к ней пришёл сигнал Str, то при нажатии на её кнопку она дублирует его к CAk и также переключается в активное состояние, меняя свой индекс соответственно с предыдущей клеткой. Активная клетка дублирует сигнал CRq к CAk, перключая свой индекс, если сигнал Str активен. Ниже я представляю графическое изображение схемы. Если меня спросите про содержимое кубика, отвечу, что схему ещё не начертил, так-как не совсем продумал всю логику. Тем более, нету vhdl набросков. Я даже не уверен, хватит ли всех выводов XC9536 для полноценного сопряжения...
Paguo_86PK Это очень сложная схема соединений. И поэтому еще в прошлом тысячелетии изобрели сенсорный экран и микропроцессоры. Может оно и неправильно, но пока именно так живем
XC9536 и правда маловата, но запихнуть можно при должном опыте, например засунуть коммутатор, но лучше и дешевле взять ARM-Cortex например какой-нибудь
Ну, для меня те времена, когда я радовался, что несколько десятков байтов машинного кода заставили пищать спикер и издавать трель, прошли. Сейчас меня больше всего интересуют системы, наподобии нейронных сетей, подобных из книги 70-ых Войцеховского с перцептронном. Если задуматься, то чисто электронная фигня на простых микросхемах, например, на выставке, привлечёт больше внимания публики, чем очередной гаджет с сенсорным экраном и на одном процессоре. Ведь на сборку первого может уйти недели кропотливой пайки и расключения десятков проводов. Тогда как на второе - всего один вечер. Причём, как Вы и заметили, схема расключения в моём случае довольно сложная. А в случае с PIC, например, просто бъётся алгоритм и всё. Меня это уже, понимаете ли, не заводит. Вот и сижу на досуге, сам смотрю "Певец на свадьбе", а сам перепродумываю всё технику расключения. У меня получается ровно 36 контактов: 34 для связей с соседями и 2 под сброс + строб. И меньше никак не получается. Для игры на поле 6x6 понадобится 36 штук XC9536, что примерно обойдётся в $25 в общем. Прилично! Если есть желающии пошевелить мозгами и набросать хотя бы на бумаге карандашом начинку одного кубика, может подключиться к прожекту! А у меня, после летних каникул мозги никак не включатся. Даже алгоритмы бить отвык. ) SVG-анимашку еле набил в блокноте. И то, в Opera и IE пашет, а в Chrome и FireFox ругань выходит. Хотя Sony Erricson, с незначительными искажения в позициях текста, но полностью воспроизводит анимацию! Чушь какая-то у этих вэб-инженеров! Никак не договорятся о стандартах! :-((
Во-первых, с одного соседа клетка принимает 4 сигнала: 1) Вход-Активность: Состояние клетки определенно или она пуста? 2) Вход-Индекс: Активная клетка переключена в X или O? 3) Вход-Цепь: Активная клетка разрывает цепь изменений? 4) Выход-Звено: Данная клетка является звено цепи изменений. Иначе разрывает его. Во-вторых, всем своим соседям клетка сообщает своё состояние: 1) Выход-Активность; 2) Выход-Индекс. Что, не трудно подсчитать, требует 32 вывода (по 3 сигнала с каждого из 8 соседа + 1 сигнал к каждому из 8 соседу) + ещё 2 ко всем соседям. Итого 34 коммуникационных вывода и 1 как вход от кнопки пользователя, когда тот нажал на неактивную клетку. Если один вывод, связанный со всеми клетками для сброса, чтобы нужные клетки, запрограммированные на центральное "x"(синий) и "o"(красный), верно установились. А остальные - погасли. Если пользоваться троичным состоянием ("0", "1" и "z"), что поддерживается в VHDL с натяжкой, то можно было бы съэкономить 9 выводов, на подобии тринарной логики! А так, имеем целочисленную бинарную логику: 00 - (+0) Клетка пассивна (состояние "z"); 01 - (+1) Клетка установлена в "o"; 10 - (-2) Не используется; 11 - (-1) Клетка установлена в "x". Если соседей описывать сторонами света: Код (Text): NW N NE W h E (h - here) SW S SE То алгоритм набросать можно так: Код (Text): if((east.index != '0') && (east.index != here.index)) // Если справа имеется индекс и он отличен east.stringAk <= '1'; // Создаём цепь идущую вправа if((east.index != '0') && (east.index == here.index)) // Если справа имеется такой же индекс east.stringAk <= west.stringRq; // Продолжаем левую цепь вправо, если она имеется if((here.index == '0') && (west.stringRq == '1') && (here.user == '1')) // Если здесь пусто и нажато { here.index = west.index xor '2'; west.stringAk <= west.stringRq; } if((west.stringRq) && (east.stringRq)) // Если клетка - часть цепи и она замкнута пользователем here.index ^= '2'; // меняем "x" на "o" или "o" на "x" Как я понял, если не ошибся, это примерно нужный алгоритм рефлексов клетки по направлению с Запада на Восток. Тем же принципом описываются другие направления. Как Вы поняли, всего их восемь. Не так уж и сложно получилось. Дерзайте!
Я все никак не могу отойти от этого видео: http://www.youtube.com/watch?v=sNCqrylNY-0 Как люди делают такое на микропроцессоре, который даже деление/умножение целых чисел не знает..
Ну все равно, этож полный ад, в реалтайме генерить музыку, синхронизировать видео, при этом еще и эффекты крутить... У меня все равно шок просто. Чувак имхо гений.
Ад в основном с видеоразверткой. Звук там простой, три канала прямоугольники генерят, один из них (для басов) аналоговым способом фильтрует высокие частоты.
Вообще-то процессорные технологии - с одной стороны прорыв, с другой - тупик. Вот смотрите. В советском фильме 1930-ых про футболиста в комнате стоял дубовый ламповый робот. Волею режиссёра он здоровался с гостями и ещё что-то (не помню, смотрел сто лет назад!). Сейчас в современном процессоре даже дубовой сотки поместились бы тысячи схем того робота! Однако, что 80 лет назад сделать ограниченный прототип мозга из десятков ламп было фантастикой. Что сейчас, имея миллиард транзисторов у себя на коленях, распознавание речи и визуальных объектов - всё-таки очень и очень далеки от ожиданий. В идеале, виртуальная студия не должна иметь голубых или зелёных стен для построения виртуального заднего плана. Компьютер должен сам ссылаться на библиотеку автоматически накопленных образов и выделять в кадре людей, столы и стулья, отделяя их от окон и кондиционеров, а так же гриммёров и даже другого оператора в кадре, скрывая их. Скажите, даже при нелинейном монтаже, сколько времени уйдёт на обработку одного кадра в такой системы, основываясь на современные достижения технологий в сфере обработки образов? Ответ я и сам знаю: почти нереально! И чем же, по Вашему, процессорная модель "Реверси" лучше дискретной логики? Даже используя простейщие процессоры, число транзисторов у нас будет излищне бОльшим, чем если бы собирать кубики на обычных ТТЛ микросхемах, путаясь в проводах для их связи. Конечно, поле 32x32 лучше организовывать процессором. Не спорю и даже за! А вот 6x6 и даже 8x8 вполне реально выполнить дискретно. Или с помощью ПЛИС для простоты. И не надо, пожалуйста, считать число транзисторов в ПЛИС и сравнивать с процессором. Так-как в перспективе ПЛИС разумно заменить на ПЛМ и достичь пика в соотношении задача/тех.затраты. А ещё в перспективе можно в промышленных масштабах разместить всю логическую схему в корпусе светодиода. Тогда просто соединив контакты всех светодиодов в ряд, получим поле для игры в "Реверси"! (чтобы не было придирок, в светодиоды не буду впихивать кнопки. а ход будет делатся в клетке на перекрёстке X и Y осей) И ещё, даже если реально эту схему никто и не отважется собирать. Очень полезно иметь общее представление её решения. Замечу, что меня к этому подтолкнул крайне небрежный пост, который ошарашил меня и я всё это время пытался сообразить, на сколько это так? Возможно человек имел ввиду простейщий вариант, где каждый кубик переключается в ручную. Но меня интересует именно автомат! Где нажатие на один кубик перекрашивает все остальные нужные! А это на порядок сложнее игры "Жизнь", а не проще, как утверждал постер! Но я рад, что пусть даже теоритически, но в конце лета всё-таки решил эту задачу под некоторый процент! Осталось ли демо-алгоритм состряпать, где одна клетка поля имеет кучу свойств и сама бы их просчитывала, основываясь на окружении. Тогда как классический алгоритм просто сканирует ряды и песечения. Ну Вы поняли...
Паяные контакты - это всегда дорого и ненадежно. Производство всего устройства на универсальном микроконтроллере с мультиплексированием матрицы кнопок и светодиодов дешевле и надежнее даже для указанных вами размеров полей, несмотря на то, что количество транзисторов в таком случае получается в сотни тысяч раз больше необходимого - таково следствие из зависимости стоимости производства универсального микроконтроллера от количества произведенных микроконтроллеров. Я не зря выделил слово, именно универсальность контроллера позволяет на порядки увеличивать количество произведенного, а значит, существенно снижать стоимость производства одного контроллера и при этом получать выгоду.
Реализация игрушек (Реверси, Жизнь или еще что-то) в виде электронных схем никаким образом не приблизит решение перечисленных задач. Эти задачи упираются не в ограничение последовательно/параллельно, а в наше незнание того, как построен мозг и в частности, кора. Уже давно ясно, что мозг не самоорганизуется из нейронов. Вероятно, он самоорганизуется из каких-то более сложных элементов, которые в свою очередь построены из нейронов по генетической программе. Сейчас задача - понять, действительно ли так (хотя в пользу этого много свидетельств), узнать нейронную структуру таких элементов, узнать функцию таких элементов, а уж реализовать их можно будет так, как будет выгоднее на момент открытия структуры и функции таких элементов, и вполне может быть, что выгоднее опять же будет именно программно на одном или группе процессоров.
Я уже сказал. Ещё в литературе за 70-ые можно найти схемы релельные 4-битной машины. А также релельного лабиринта с ботом-мышью. В детстве я читал, но не понимал теорию. А вот с Реверси, как уже повторяю который раз, мне интересна именно дискретная схема одной клетки поля в теоритических планах. Я, тем самым, разминаю мозг и задаюсь вопросом, под силу ли мне решение этой задачи? А то, как я подчеркнул, сказано, мол алгоритм рефлексов одной клетки игры "Жизнь" сложнее, чем в "Реверси". Можете точно сказать, на сколько именно? Я думаю, скоро узнаю. Когда разработаю полные схемы клетки "Реверси", подсчитаю число транзисторов и количественно сравню. В "Жизни" можно обойтись простой логикой 5-ИЛИ и 3-И для одной из 256 ситуаций, когда рождается новая клетка. Что требует уже 10-КМОП транзисторов на 5-ИЛИ и 6 на 3-И. Итого - 16 на 1/256 ситуций. Всего - 4096 транзисторов на одно только "рождение" новой клетки. Не трудно подсчитать общее число транзисторов на клетку, чтобы сравнить с клеткой "Реверси".
Paguo_86PK В игре "Жизнь" сложность заключена в том, что существует "два слоя" : т.е. сначала приходится считать следующее состояние всех клеток, а потом только можно менять. В программе конечно можно реализовать это просчетом 3-х строк(столбцов) и изменением 2 из них, которые уже не нужны на следующем шаге. Как это электронно сделать - только хорошей синхронизацией или сложной схемой "бегущая волна". В "реверси" такого нет при правильной реализации. Но я согласен, что для большого поля схема реверси становится "неподъемной" по сравнению с игрой "Жизнь". Но может я и не прав. Транзисторы вы неправильно считаете. Зачем же 256 отдельных схем анализа. Она одна и умножения на 256 нет. Там нужен счетчик, несколько компараторов и несложная логика. 200-300 транзисторов.
Вы как-то странно подсчитываете. А процедуру оптимизации двоичной функции вы проводить не собираетесь? Карты Карно, там, и т.п.?
В аппаратной реализации в моём случае каждая клетка поля - самофункциональна: Логическая часть анализирует состояние соседей, а состояние хранит в JK-триггере. Тем самым, все клетки переключаются синхронно в новое состояние. Понимаю, это очень затратно использовать для каждой клетки триггер и вентили. Но, экспериментально поле 32x32 в любой ПЛИС легко описать! Да, я знаю, чтобы действовать по правилу "n>3->kill", достаточно найти любые 4 единичных бита, использовав 4-И-логику. 256 элементов 4-И или древо-подобная организация с большей экономией. Но, если Вы читали давние мои темы про схемы умножения/деления без тактовой частоты, вспомните, что я всегда иду от худшей реализации. Потом оптимизирую!