Вдохновленный этим вопросом Game of Life .
Wireworld моделирует «электроны», протекающие через «провода», простые схемы которых создают типичное поведение логических элементов.
Я призываю вас построить цифровые часы в сотовом автомате Wireworld. Ваши часы должны отсчитывать вверх с 00:00 до 23:59 обычным способом или до 11:59 с индикатором AM / PM, а затем обнуляться.
Ваша запись должна быть явно разделена на две части. Часть A должна содержать всю логику без отображения, все части, участвующие в увеличении и циклическом преобразовании цифр. Часть B будет отображением и логикой, которая его управляет. Единственным соединением между этими двумя частями должно быть 16 проводов, представляющих четыре цифры времени в BCD (с одним дополнительным проводом для индикатора AM / PM и одним дополнительным проводом для линии тактового сигнала, если ваши сигналы не являются непрерывными). (РЕДАКТИРОВАТЬ: всегда нулевые провода могут быть опущены)
Время поведения часов должно быть согласованным. Моделирование должно занимать одинаковое количество тактов для каждого из 1440 переходов между состояниями. Любые электроны на 16 проводах должны излучаться из части А одновременно и начинать свое отключение параллельно.
Это соревнование по коду-гольфу. Ваша оценка - это площадь выровненной по оси ограничительной рамки, окружающей часть A.
По аналогии, если бы это был текстовый язык, ваш счет был бы размером функции управления часами, производящей четыре 4-битных выхода, которая содержит цикл и логику для 4 счетчиков, а не функцию, которая декодирует и печатает этот вывод.
Ваша часть B может быть такой большой или маленькой, как вам бы хотелось. Это требуется только для того, чтобы кто-то, кто его запускает, мог видеть выходные данные вашего представления, поскольку не существует простого способа просто «отладить» выходные данные из схемы проводного мира. В сети доступно несколько схем BCD-> 7-сегментных. Не стесняйтесь использовать тот, который вы хотите, или сделать свой собственный, если вам нужна тактовая сигнальная линия, и отображать индикатор AM / PM в некотором масштабе, похожем на цифры.
РЕДАКТИРОВАТЬ: Часть B теперь не является обязательным. Если у вас есть только выходы BCD из вашей части A, не стесняйтесь представить это. Подтверждение того, что часы работают, будет более утомительным, но я могу прекрасно прочитать ряд бит в паузе симуляции.
Ответы:
Часы с замком
Оценка - 53 508 (из них только 36 828 активно используются из-за L-образного дизайна)
Высококачественная запись - https://1drv.ms/u/s!ArQEzxH5nQLKhvt_HHfcqQKo2FODLQ
Шаблон Golly - https://1drv.ms/u/s!ArQEzxH5nQLKhvwAmwCY-IPiBuBmBw
Руководящие принципы -
Часть I: Счетчик минут
Математика
Подсчет от 0 до 9 в двоичном виде (для младшего разряда минут) происходит следующим образом:
0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001
Считая, что в качестве столбцов наименее значимый (поток битов 2 ^ 0) идет 01010101, поток 2 ^ 1 идет 0011001100, поток 2 ^ 2 идет 0000111100, а поток 2 ^ 3 идет 0000000011.
Первое легко - просто флип-флип 01 навсегда. Третий - это поток из четырех единиц, шести нулей, сдвинутый по фазе на шесть нулей. Четвертый - это поток из восьми нулей и двух единиц.
Второй немного сложнее, так как у него неприятная асимметрия. Тем не менее, я замечаю, что (где оператор concat):
0011001100. 0011001100 = 0011001100. NOT (1100110011) = 00110011001100110011 XOR 00000000001111111111 = 5 (0011) XOR 00000000001111111111
(Между прочим, как упоминалось позже, большинство моих часов работает на 60-битном тикере. Волна двойной длины 00000000001111111111 - это то, где возникает необходимость в 120-битном тикере).
дизайн
Выходные потоки сверху вниз идут в минутах (2 ^ 0, 2 ^ 1, 2 ^ 2, 2 ^ 3), затем в десятки минут (2 ^ 0, 2 ^ 2, 2 ^ 1). Обратите внимание, что нижние два провода пересекаются.
Часть II: Счетчик часов
объяснение
Вход в счетчик часов представляет собой одиночный электронный импульс, один раз в час. Первым шагом является сведение этого к одному электронному импульсу, один раз каждые двенадцать часов. Это достигается с помощью нескольких примитивов "latch & catch".
«Защелка» - это 6-микронный триггер, подключенный к И-НЕ и вентилю И, чтобы получить 6-микронную защелку включения / выключения. «Улов» принимает непрерывный поток электронов в качестве входных данных, пропускает их сначала, а затем уничтожает каждый второй электрон, пока поток не закончится, и в этот момент улов сбрасывается.
Установка защелки с последующим улавливанием последовательно приводит к тому, что один электрон входит в>> защелку, а один электрон - с другого конца (остальное улавливается уловом). Затем второй электрон в -> выключает защелку, ловит молча, сбрасывает. Чистый эффект: первый электрон проходит через, второй электрон аннигилирует, и так далее, и так далее, независимо от того, как долго задержка между этими электронами .
Теперь последовательно соедините две цепочки «защелки и уловы», и у вас будет проходить только один из четырех электронов.
Затем возьмите третью «защелку и защелку», но на этот раз вставьте целую четвертую защелку и зафиксируйте на линии SET триггера, между вентилем AND-NOT и SET триггера. Я оставлю вас думать о том, как это работает, но на этот раз только один из трех электронов проходит, независимо от того, как долго задержка между этими электронами .
Наконец, возьмите один из четырех электронов и один из трех, объедините их с логическим элементом И, и только один из двенадцати электронов пройдет через них. Весь этот раздел представляет собой грязные путаницы путей в верхнем левом углу счетчика часов ниже.
Затем возьмите электрон каждые двенадцать часов и делите его на один каждый час, но выводите каждый на другой проводник. Это достигается с помощью длинного спирального проводника с тринадцатью точками выхода.
Возьмите эти электроны - один час по разным проводникам и попали на линию SET триггера. Линия RESET на том же триггере попадает в проводник следующего часа, давая шестьдесят импульсов вниз по каждому проводу в час.
Наконец - возьмите эти импульсы и передайте их в семь с половиной байтов ПЗУ (постоянное запоминающее устройство) для вывода правильных битовых потоков BCD. Смотрите здесь для более подробного объяснения ROM WireWorld: http://www.quinapalus.com/wires6.html
дизайн
Заметки
Полезные ссылки
Я изучил основы WireWorld на http://www.quinapalus.com/wi-index.html . Отличный ресурс.
Для создания и моделирования клеточного автомата я использовал Golly: http://golly.sourceforge.net/
Я взял дизайн ворот AND с http://mathworld.wolfram.com/WireWorld.html
И я только что нашел эту веб-страницу, поэтому не использовал ее, но она выглядит великолепно: http://karlscherer.com/Wireworld.html
источник
Задержка строки памяти - 51 х 2880 = 146880
Уменьшено:
Выход выходит в верхней части каждой петли.
Я поместил все состояния непосредственно на провод с этим lua, позволяя
golly
электронам двигаться вперед между битами, чтобы нам не пришлось следовать за проводом с помощью курсора.Я использовал этот наивный метод, чтобы установить план и проволочный курс, golly и lua.
Для тестирования я добавил эти верхние провода и посмотрел их советы.
Вот сценарий, чтобы собрать 4 набора 4-проводных BCD для глазного яблока.
Окончательный ответ требует обрезки всегда нулевых линий и направления остальных на их правильные BCD-входы.
источник