Построить цифровые часы в Wireworld


32

Вдохновленный этим вопросом 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, не стесняйтесь представить это. Подтверждение того, что часы работают, будет более утомительным, но я могу прекрасно прочитать ряд бит в паузе симуляции.


Вот небольшой онлайн симулятор.
Нелинейно-

Я работал над этим, но видел его только на прошлой неделе, поэтому, возможно, я буду скучать по награде. Я не могу найти 4-х проводную версию проволочного bcd-> 7-сегмента; Построение преобразователя 4-в-2 перед популярным 2-проводным 7-сегментным устройством (как, например, устройство, поставляемое с Golly) может быть хорошим решением. Одна из проблем этого устройства заключается в том, что, хотя оно красиво выглядит, оно медленно обновляется, что приводит к увеличению размера части A, поскольку оно может выкачивать числа быстрее, чем они могут отображаться, и должно быть искусственно замедлено.
wyldstallyns

У меня есть 150 000 ячеек, работающих в Части А, которые я могу доказать, что работаю, но в настоящее время не хватает части Б., соответствующей
правилам

Я не ожидал, что часть Б будет трудной. Как далеко друг от друга находятся ваши электроны в части А?
Спарр

1
@wyldstallyns Он закрывается в 16.12.2016, 03:30: 35Z (вы можете навести курсор на «завтра», чтобы узнать точное время). Всего наилучшего вам. Мне искренне нравятся твои часы. Это элегантно простая идея и отличное исполнение. Должен признать, я также был удивлен тем, сколько места в итоге заняла моя шахта. И мне было бы интересно увидеть любые улучшения, которые вы можете придумать в вашем. Итак, удачи :)
niemiro

Ответы:


36

Часы с замком

Оценка - 53 508 (из них только 36 828 активно используются из-за L-образного дизайна)

Часы Бег

Высококачественная запись - https://1drv.ms/u/s!ArQEzxH5nQLKhvt_HHfcqQKo2FODLQ
Шаблон Golly - https://1drv.ms/u/s!ArQEzxH5nQLKhvwAmwCY-IPiBuBmBw

Руководящие принципы -

  • Так как я впервые использовал сотовый автомат, я избегал связывать вместе большие готовые компоненты. Один из подходов, который я бы не использовал, был бы двоичным сумматором, начинающимся с нуля и непрерывно добавляющим один к последнему выходу, сопровождаемым двоичным преобразователем в двоично-двоичные разряды, демультиплексором дисплея, 7-сегментным декодером и 7-сегментным дисплеем.
  • Должен быть возможен холодный запуск часов. Я наложил на себя дополнительное ограничение, что одна электронная головка, помещенная в определенную ячейку проводника, должна правильно запускать часы. Я не хотел требовать тщательной ручной синхронизации многих разнородных триггеров и отдельных элементов синхронизации перед началом симуляции.

Часть 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). Обратите внимание, что нижние два провода пересекаются.

Счетчик минут аннотированный

  1. 120-тактные основные часы.
  2. Где разместить электрон для холодного старта. Без какого-либо хвоста электрона он расщепляется в двух направлениях, но диод, находящийся выше, ловит одно из них, давая хороший циклический электрон, вращающийся вокруг 120-разрядной петли.
  3. 12-ти тактные вторичные часы.
  4. Катушка проводник + диод запускает вторичные 12-разрядные часы. Слова не могут описать, насколько неприлично синхронизировать этот маленький кусочек. Вы должны синхронизировать тактовые импульсы 120 и 60 битов, а затем синхронизировать в псевдо-тактах с 12-битным частотным делителем и частотой 24 бита, а затем привязать 24-битные тактовые импульсы к 120-тактовым тактам, иначе вентиль XOR не работает ,
  5. Сдвиг фазы.
  6. Резкий поворот. Один электрон на входе сначала попадает на заданную линию, затем через очень определенное время попадает на линию сброса, давая ровно один импульс, один импульс.
  7. Добавление горбов здесь - на линии сброса, увеличивает задержку между установкой и сбросом на триггере. Каждый дополнительный горб дает дополнительный импульс. Триггер ниже имеет девять дополнительных горбов, так что десять импульсов между установкой и сбросом.
  8. Ворота XOR для моей хитрой линии 2 ^ 1 минуты.
  9. Затвор «И-НЕ» и очень специфическая длина части означают, что каждый прошедший электронный импульс удваивается обратно на себя и уничтожает электрон позади. Частота Halver. Создает 24-битные часы из 12-битного вторичного источника.
  10. 60-ти тактные вторичные часы, которые фактически выполняют большую часть работы. Просто проще запустить быстрые часы с более медленных, поэтому самые медленные часы (120 ударов) являются основными, хотя они почти не используются. Часы с 60 ударами - сердце этой вещи.
  11. Провод обратной связи, который переносит электроны только тогда, когда тикают 60-тактовые часы. Он используется вместе с логическим элементом И-НЕ, чтобы остановить повторный запуск часов с 120-битного мастера. В противном случае происходит много ужасных вещей, и Ctrl-Z спаситель.
  12. Диод, с которого запускаются 60-битные часы.
  13. Все это устройство представляет собой триггер, ворота И и И-НЕ вместе. Это дает защелку. Один импульс запускает его, один импульс останавливает его.
  14. Петля проволоки для калибровки защелки на 10 импульсов, 10 импульсов для входа один на десять. Без него мы получаем 12 импульсов, 8 импульсов выключены. Эти десять на десять защелок образуют основные компоненты десятиминутных блоков таким же образом, как 6-микронные (1 импульс) триггеры формировали основные компоненты минутных блоков.
  15. Начальный импульс холодного пуска вызвал всевозможные проблемы, в том числе сдвиг по фазе по отношению к тактам, которые он запускает. Это портит защелки. Этот логический элемент И захватывает и удаляет несинхронные импульсы, в частности, стартовый импульс.
  16. Это часть дизайна, о котором я немного сожалею в ретроспективе. Он берет электрон, разбивает его на пять и уничтожает пять электронов позади, занимая 111111-100000.
  17. Это берет электрон и сшивает это на фронте. Два этапа впереди, если быть точным. Он берет 100000 и составляет 101000. В сочетании с частью 16 мы получаем 111111 -> 100000 -> 101000. Оглядываясь назад, я хотел бы, чтобы я сделал 111111 -> 101010 -> 101000; он бы достиг того же эффекта в меньшем пространстве.
  18. Вышеприведенные шаблоны затем вставляются в нижнюю защелку для достижения 20 включений, 40 выключений. Это разделено, половина сдвинута по фазе на 20 единиц, и затем они формируют два потока битов высокого порядка из десятков минут.

Часть II: Счетчик часов

объяснение

Вход в счетчик часов представляет собой одиночный электронный импульс, один раз в час. Первым шагом является сведение этого к одному электронному импульсу, один раз каждые двенадцать часов. Это достигается с помощью нескольких примитивов "latch & catch".

«Защелка» - это 6-микронный триггер, подключенный к И-НЕ и вентилю И, чтобы получить 6-микронную защелку включения / выключения. «Улов» принимает непрерывный поток электронов в качестве входных данных, пропускает их сначала, а затем уничтожает каждый второй электрон, пока поток не закончится, и в этот момент улов сбрасывается.

Установка защелки с последующим улавливанием последовательно приводит к тому, что один электрон входит в>> защелку, а один электрон - с другого конца (остальное улавливается уловом). Затем второй электрон в -> выключает защелку, ловит молча, сбрасывает. Чистый эффект: первый электрон проходит через, второй электрон аннигилирует, и так далее, и так далее, независимо от того, как долго задержка между этими электронами .

Теперь последовательно соедините две цепочки «защелки и уловы», и у вас будет проходить только один из четырех электронов.

Затем возьмите третью «защелку и защелку», но на этот раз вставьте целую четвертую защелку и зафиксируйте на линии SET триггера, между вентилем AND-NOT и SET триггера. Я оставлю вас думать о том, как это работает, но на этот раз только один из трех электронов проходит, независимо от того, как долго задержка между этими электронами .

Наконец, возьмите один из четырех электронов и один из трех, объедините их с логическим элементом И, и только один из двенадцати электронов пройдет через них. Весь этот раздел представляет собой грязные путаницы путей в верхнем левом углу счетчика часов ниже.

Затем возьмите электрон каждые двенадцать часов и делите его на один каждый час, но выводите каждый на другой проводник. Это достигается с помощью длинного спирального проводника с тринадцатью точками выхода.

Возьмите эти электроны - один час по разным проводникам и попали на линию SET триггера. Линия RESET на том же триггере попадает в проводник следующего часа, давая шестьдесят импульсов вниз по каждому проводу в час.

Наконец - возьмите эти импульсы и передайте их в семь с половиной байтов ПЗУ (постоянное запоминающее устройство) для вывода правильных битовых потоков BCD. Смотрите здесь для более подробного объяснения ROM WireWorld: http://www.quinapalus.com/wires6.html

дизайн

Счетчик часов аннотированный

  1. Один электрон в час на входе.
  2. Первая защелка.
  3. Первый улов.
  4. «Защелка и защелка» встроена во внешнюю строку «Защелка и защелка».
  5. И ворота.
  6. Защелка AM / PM (включается / выключается каждые двенадцать часов).
  7. Каждая петля провода имеет длину 6x60 = 360 единиц.
  8. Флип / Флоп повернул на бок, чтобы создать меньший профиль.
  9. Семь с половиной байтов ПЗУ.

Заметки

  1. Благодаря 6-микронному дизайну с одним электроном в минуту, симуляция запускается со скоростью шесть поколений в минуту (одно поколение каждые 10 секунд) для часов реального времени.
  2. Линия AM / PM является высокой (1) для AM, низкой (0) для PM. Это может показаться немного необычным способом выбора, но есть основания. Во время холодного пуска часов линия AM / PM изначально низка (0). Как только линия AM / PM становится высокой (1), это означает, что отсчет начался в 12:00. Весь вывод до этой точки должен игнорироваться, весь вывод после этой точки считается значимым.

Полезные ссылки


изменил требования, так что всегда нулевые выходы могут быть опущены. биты 4 и 8 для десятков часов никогда не используются, а биты 8 для десятков минут.
Спарр

Solid! Настоящая инженерия. Были ли бы полезны какие-то другие логические элементы? Я собираюсь перебить некоторых.
wyldstallyns

1
Это прекрасно
Спарр

1
О боже, это достаточно близко, теперь я вынужден попытаться оптимизировать мой. У меня есть повторяющиеся шаблоны, которые я мог бы сократить, чтобы освободить место, чтобы сложить других.
wyldstallyns

3
Я не знаю, насколько вы активны в мета, так что это для того, чтобы вы знали, что я номинировал этот ответ на Best of PPCG 2016 .
Питер Тейлор

5

Задержка строки памяти - 51 х 2880 = 146880

Образ

Уменьшено:

Образ

Выход выходит в верхней части каждой петли.

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

Я использовал этот наивный метод, чтобы установить план и проволочный курс, golly и lua.

local g = golly()

local minutes_in_day = 1440 -- 60x24
local interval = 4 -- how often to send electrons

local function bcd4(num)
    num=math.floor(num)
    local t={}
    for b=4,1,-1 do
        t[b]=math.floor(math.fmod(num,2))
        num=(num-t[b])/2
    end
    return table.concat(t)
end

local function makewire(x,y1,y2)
    for y1=1,y2 do g.setcell(x,y1,3) end
end

local function makeloop(x,y,size)
    local len = size/2 - 1
    makewire(x,y+1,len); makewire(x+2,y+1,len) -- main wires
    g.setcell(x+1,y,3); g.setcell(x+1,y+len,3) -- endcape
end

local function paint(x,y,pattern)
    for v in string.gmatch(pattern,".") do
        if v=="1" then g.setcell(x, y, 1); g.setcell(x, y-1, 2) end
        x = x + 4
    end
    g.show(pattern);g.update() -- slows things down but more interesting to watch
    for i=1,interval do g.step() end
end

for x=0,63,4 do makeloop(x,0,minutes_in_day * interval) end

for hour = 0,23 do
      for minute = 0,59 do
         paint( 0, 2, bcd4(hour/10) .. bcd4(hour%10) .. bcd4(minute/10) .. bcd4(minute%10) )
      end
end

Для тестирования я добавил эти верхние провода и посмотрел их советы.

Imgur

Вот сценарий, чтобы собрать 4 набора 4-проводных BCD для глазного яблока.

-- watches 16 wires spaced 4 apart starting at (0,-4)
local ticks = 1440 -- set to match the length of your 24 hour loop
local g = golly()
local output = ""
local nums = {  ["0000"] = "0", ["0001"] = "1", ["0010"] = "2", ["0011"] = "3", ["0100"] = "4",
                ["0101"] = "5", ["0110"] = "6", ["0111"] = "7", ["1000"] = "8", ["1001"] = "9",
                ["1010"] = "A", ["1011"] = "B", ["1100"] = "C", ["1101"] = "D", ["1110"] = "E",
                ["1111"] = "F" } -- full set in case we have errors (i did)

for i=0,ticks,1 do
   local text = ""
   for i=0,48,16 do -- set your X here, change the 0 and 48
       local word = ""
       for j=0,15,4 do
            local bit = g.getcell(i+j,-4) -- set your Y here, change -4
            if bit == 0 or bit == 3 then word = word .. "0" else word = word .. "1" end
       end
       text = text .. nums[word]
   end
   g.show(text); output = output..' '..text
   g.update(); g.step();g.step();g.step();g.step()
end
g.note(output)

Окончательный ответ требует обрезки всегда нулевых линий и направления остальных на их правильные BCD-входы.


изменил требования, так что всегда нулевые выходы могут быть опущены. биты 4 и 8 для десятков часов никогда не используются, а биты 8 для десятков минут.
Спарр

2
Это веселая и потрясающая реализация!
Спарр

1
Хорошо, я побил другие функциональные часы на 11-м часу. Я собираюсь атаковать самые длинные и короткие петли с помощью различных трюков.
wyldstallyns

Я не собираюсь делать это. Я могу сохранить 1/4 от размера, переключившись на импульсы 3 микрона, но он все равно не будет достаточно плотным, чтобы побить Ниемиро.
wyldstallyns
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.