Inspirado por esta questão do Jogo da Vida .
O Wireworld simula "elétrons" que fluem através de "fios", arranjos simples dos quais produzem comportamento típico de porta lógica.
Desafio você a construir um relógio digital no autômato celular Wireworld. Seu relógio deve contar entre 00:00 e 23:59 da maneira usual ou 11:59 com um indicador AM / PM e, em seguida, redefinir.
Sua entrada deve ser visivelmente dividida em duas partes. A parte A deve conter toda a lógica de não exibição, todas as partes envolvidas no incremento e loop dos dígitos. A parte B será a tela e a lógica que a guia. A única conexão entre essas duas partes deve ser de 16 fios, representando os quatro dígitos do tempo no BCD (com um fio opcional para o indicador AM / PM e um fio opcional para uma linha de relógio de sinal, se os sinais não forem contínuos). (EDIT: sempre é possível omitir zero fios)
O tempo do comportamento do relógio deve ser consistente. A simulação deve receber o mesmo número de ticks para cada uma das 1440 transições entre estados. Quaisquer elétrons nos 16 fios devem ser emitidos da parte A ao mesmo tempo e iniciar sua viagem em paralelo.
Esta é uma competição de golfe com código. Sua pontuação é a área da caixa delimitadora alinhada ao eixo ao redor da parte A.
Por analogia, se esse fosse um idioma textual, sua pontuação seria do tamanho da função de gerenciamento de relógio, produzindo quatro saídas de 4 bits, que contêm um loop e a lógica para 4 contadores, não a função que decodifica e imprime essa saída.
Sua parte B pode ser tão grande ou pequena quanto você gostaria. Isso é necessário apenas para que a saída do seu envio possa ser vista por alguém que o esteja executando, pois não há uma maneira fácil de simplesmente "depurar" as saídas de um circuito do mundo wirew. Existem vários circuitos BCD-> 7segment disponíveis online. Sinta-se à vontade para usar o que desejar ou criar o seu próprio se precisar de uma linha de sinal com relógio, e exiba seu indicador AM / PM em uma escala semelhante aos dígitos.
EDIT: Parte B agora é opcional. Se você possui apenas as saídas BCD da sua parte A, sinta-se à vontade para enviá-las. Será mais tedioso confirmar que o relógio funciona, mas posso ler uma linha de bits muito bem em uma simulação em pausa.
fonte
Respostas:
Relógio de travamento
Pontuação - 53.508 (dos quais apenas 36.828 são usados ativamente devido ao design em forma de L)
Gravação de alta qualidade - https://1drv.ms/u/s!ArQEzxH5nQLKhvt_HHfcqQKo2FODLQ
Padrão Golly - https://1drv.ms/u/s!ArQEzxH5nQLKhvwAmwCY-IPiBuBmBw
Princípios Orientadores -
Parte I: O contador de minutos
Matemática
A contagem de 0 a 9 em binário (para o dígito de minutos menos significativo) é a seguinte -
0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001
Lendo que, como colunas, o menos significativo (fluxo de bits de 2 ^ 0 unidades) vai 01010101, o fluxo de 2 ^ 1 unidades vai 0011001100, o fluxo de 2 ^ 2 unidades vai 0000111100 e o fluxo de 2 ^ 3 unidades vai 0000000011.
O primeiro é fácil - basta virar flip 01 para sempre. O terceiro é um fluxo de quatro 1s, seis 0s, fase deslocada em seis zeros. O quarto é um fluxo de oito 0s e dois 1s.
O segundo é um pouco mais difícil, pois possui uma assimetria desagradável. No entanto, percebo que (onde. É operador concat):
0011001100. 0011001100 = 0011001100. NOT (1100110011) = 00110011001100110011 XOR 00000000001111111111 = 5 (0011) XOR 00000000001111111111
(Aliás, como mencionado anteriormente, a maioria do meu relógio é executado em um relógio de 60 batidas. A onda de comprimento duplo 00000000001111111111 é onde entra a necessidade do relógio de 120 batidas).
desenhar
Os fluxos de saída de cima para baixo vão Unidades de Minutos (2 ^ 0, 2 ^ 1, 2 ^ 2, 2 ^ 3) e, em seguida, Dezenas de Minutos (2 ^ 0, 2 ^ 2, 2 ^ 1). Observe que os dois fios inferiores estão cruzados.
Parte II: O Contador de Horas
Explicação
A entrada para o contador de horas é um único pulso de elétron, uma vez por hora. O primeiro passo é reduzi-lo a um único pulso de elétron, uma vez a cada doze horas. Isso é alcançado usando várias primitivas "trava e captura".
Uma "trava" é um flip-flop de 6 mícrons conectado a uma porta AND-NOT e AND para fornecer uma trava on / off de 6 mícrons. Uma "captura" pega um fluxo contínuo de elétrons como entrada, permite a primeira passagem e depois aniquila todos os outros elétrons por trás, até que o fluxo termine no ponto em que a captura é redefinida.
A colocação de uma trava, seguida de uma trava, em série, resulta em um elétron em -> gire a trava, um elétron na outra extremidade (restante preso em trava). Em seguida, o segundo elétron in -> desliga a trava, apanha silenciosamente as redefinições. Efeito líquido: o primeiro elétron passa, o segundo elétron é aniquilado e assim por diante, independentemente do tempo de atraso entre esses elétrons .
Agora encadeie dois "trava e trava" em série, e você tem apenas um em cada quatro elétrons passando.
Em seguida, pegue uma terceira "trava e trava", mas desta vez incorpore uma quarta trava inteira e trava na linha SET do flip-flop, entre o portão AND-NOT e o SET do flip-flop. Vou deixar você pensar sobre como isso funciona, mas desta vez apenas um em cada três elétrons passa, independentemente de quanto tempo o atraso entre esses elétrons .
Finalmente, pegue um em quatro elétrons e um em três, combine-os com uma porta AND, e apenas um em cada doze elétrons passará. Esta seção inteira é o rabisco bagunçado de caminhos para o canto superior esquerdo do contador de horas abaixo.
Em seguida, pegue o elétron a cada doze horas e divida novamente em um a cada hora, mas coloque cada um em um fio condutor diferente. Isso é conseguido usando o condutor espiral longo com treze pontos de saída.
Pegue esses elétrons - um a uma hora em diferentes condutores e atinja uma linha SET de flip-flop. A linha RESET no mesmo flip-flop é atingida pelo condutor da próxima hora, emitindo sessenta pulsos por fio por hora.
Finalmente - pegue esses pulsos e passe-os para sete bytes e meio de ROM (Memória Somente Leitura) para emitir os fluxos de bits BCD corretos. Veja aqui uma explicação mais detalhada da ROM do WireWorld: http://www.quinapalus.com/wires6.html
desenhar
Notas
Links Úteis
Aprendi o básico do WireWorld em http://www.quinapalus.com/wi-index.html . Um excelente recurso.
Para criar e simular o autômato celular, usei Golly: http://golly.sourceforge.net/
Peguei o design do portão AND em http://mathworld.wolfram.com/WireWorld.html
E acabei de encontrar esta página, por isso não a usei, mas parece ótima: http://karlscherer.com/Wireworld.html
fonte
Atraso na memória da linha - 51 x 2880 = 146880
Reduzir o zoom:
A saída sai da parte superior de cada loop.
Eu coloquei todos os estados diretamente no fio com esta lua, deixando
golly
os elétrons avançarem entre os bits, para que não tenhamos que seguir o fio com um cursor.Usei esse método ingênuo para definir um bar e um curso intensivo sobre o mundo do arame, golly e lua.
Para testar, adicionei esses fios superiores e observei as dicas deles.
Aqui está o script para coletar os 4 conjuntos de BCD de 4 fios no globo ocular.
A resposta final requer a remoção das linhas sempre com zero e o roteamento do restante para as entradas corretas do BCD.
fonte