Meus pequenos relés: o computador Brainfuck é uma realidade



Exatamente um ano se passou desde a última publicação e eu pensei que o primeiro de abril é um ótimo dia para o resumo anual dos meus três projetos malucos de computador. Naquela época, o projeto existia apenas no papel, mas agora definitivamente se tornou realidade.


Blocos de relé tocando, os cálculos de relé mais rápidos do mundo (mas isso não é preciso), finalização, indicadores de vácuo e LEDs piscando.


Antecedentes históricos



Figura 1: Um volume dos "Radio-Electronic Toys" de Wojciechowski, 1979, agredidos por minha vida e por mim.


Era uma vez, quando tudo era grande e eu era pequeno (um ano como aquele em 2002), meu pai me deu o livro de Wojciechowski, Radio-Electronic Toys. Então eu não tinha computador, mas não ouvia falar da Internet, e um livro familiar para muitos acabou sendo apenas um depósito de dispositivos eletrônicos divertidos. Entre eles, havia uma descrição de um computador eletrônico e um modelo simples de circuito em relés telefônicos. Este modelo, estando no meu segundo ano na universidade em 2008, reuni-me para um relatório sobre a história dos computadores.



Figura 2: RCM - ALU de 4 bits


Naquela época, eu já estava explorando as vastas extensões da Internet e conhecendo a existência dos computadores de retransmissão Harry Porter , computador número 2 e computador Zuse - eu estava pensando em construir minha própria unidade.


Para aqueles que estão pouco conscientes do que os outros têm, sugiro ver minha análise em vídeo de computadores de retransmissão caseiros. Ao longo do ano, está um pouco desatualizado, mas não deixou de ser menos interessante:



No mesmo ano de 2008, nas aulas sobre os fundamentos teóricos da engenharia elétrica, decidi sobre o componente principal - um relé de palheta. Em um dos laboratórios, fiquei surpreso ao observar na forma de onda como o bebê RES55 trabalhava a uma frequência de 50 Hz. Isso causou uma impressão duradoura em mim e comecei a acumular interruptores de palheta.


10 anos se passaram ....


E depois de uma década, o projeto está avançando com grande velocidade de lançamento. Tudo mudou de um ponto morto em novembro de 2016, quando a arquitetura atual nasceu. Infelizmente, decidi fazer todas as placas de circuito impresso por conta própria ... como resultado, um metro quadrado inteiro de PCB de dupla face se transformou em um buraco negro e sugou para si várias centenas de horas-homem de tempo livre, o que é cerca de seis meses para um funcionário. De abril a novembro de 2k17 praticamente nada aconteceu.


Infográficos



A arquitetura da máquina corresponde à máquina de Turing. Há uma fita com dados - RAM para 64 quilos (palavra de 16 bits). RAM - armazena em cache chips de algum tipo de tapete. placas-mãe para Intel Pentium. Para autenticidade, vá para a seção ... Autenticidade. A RAM de microcircuito é usada na maioria dos computadores de retransmissão caseiros que conheço.


O elemento central é um somador paralelo de 16 bits. Ele é responsável por calcular o número da próxima instrução e trabalha com dados e um ponteiro para ela.
Nas entradas do somador, há um registro temporário de 16 bits e um registro de comando de 12 bits. Também são enviados 12 bits para os 4 bits mais altos do somador, o que fornece 16 bits "completos". É importante que o somador funcione corretamente com adição e subtração de um número de 12 bits.


A desvantagem é óbvia - em um momento, podemos pular apenas 2 ^ 12 instruções para trás ou para frente, ou alterar o ponteiro ou os dados por esse valor. O primeiro - você precisa considerar ao escrever programas, o segundo - você sempre pode repetir o procedimento.


Subtração está no código adicional. A transferência paralela fornece um atraso de computação constante - apenas 3 relés em série. Isso não passa de 2ms.


O registro IP e o registro AP, bem como a entrada RAM, são conectados à saída do somador por meio de travas.


Cálculos


As operações principais são exatamente duas partes. Em um caso, trabalhamos com o cálculo de um novo valor de ponteiro, no outro, um novo valor de dados.


Cada aresta ascendente inicia o cálculo de um novo número de instrução. Essencialmente, o IP ++ está concluído. Após o cálculo, o IP é alimentado na entrada de endereço do cartão de memória e, através do barramento de dados, a instrução entra no registro de comandos. Os 4 bits altos determinam a instrução futura, os 12 baixos provavelmente não são iguais a zero e, no futuro, o somador alterará o número no registro temporário exatamente por esse valor.


Cada borda descendente inicia a operação.


Para operações com registradores AP e IP, a sequência de ações é semelhante a esta:


  1. Através do barramento de endereços, o conteúdo do registro IP (AP) é copiado para o registro temporário;
  2. Registros temporários e de comando são alimentados na entrada do somador. Após 2 ms, a resposta estará pronta na saída do somador.
  3. A resposta é registrada no registro IP ou AP.

Existem alguns recursos. Para comandos AP + BIAS e AP-BIAS, é exatamente esse o caso, para comandos condicionais, quando, por exemplo, IP = (* AP == 0?) IP + 1: IP + -BIAS, ainda precisamos carregar o valor atual da célula de dados no barramento de dados e remover informações de um detector nulo.


Para operações de AP + BIAS e AP-BIAS, a sequência é um pouco diferente.


  1. Através do barramento de dados, o valor atual da célula de memória é gravado no registro temporário.
  2. Registros temporários e de comando são alimentados na entrada do somador. Após 2 ms, a resposta estará pronta na saída do somador.
  3. O registro AP continua sendo alimentado na entrada do cartão de memória. A resposta do somador é gravada diretamente na memória.

Os cálculos sempre ocorrem no modo de 16 bits. Mas o sinalizador nulo da ramificação condicional é definido como:


Z = ((16bit?) *AP : (*AP) & 0x00FF == 0) ; 

Construção civil


Nada mudou desde a última vez.


Módulo



Figura 3: Módulo do computador. Da esquerda para a direita: módulo D-flip-flop, módulo de diodo, módulo 2AND / 2XOR


No núcleo está um pequeno módulo de 40x64mm. Cada módulo é uma placa de circuito impresso com 4 relés, nos quais uma simples operação lógica é implementada. Há um conector para 16 contatos (existem módulos para 12 e 14) e até 4 LEDs. Todos os tamanhos são estritamente fixos.



Figura 4: Módulos durante a montagem


Por exemplo:


  1. Módulo 2AND / 2XOR - 2 operações lógicas independentes - 2AND e 2XOR. São utilizadas 32 peças no bloco somador, dois módulos por bit. No início, todos os 4 LEDs foram soldados, mas o circuito do módulo é tal que dois relés em cada módulo são conectados em paralelo e, para reduzir a energia consumida pela unidade, metade dos LEDs foram removidos.
  2. Módulo D-trigger - 64 peças vão para dois blocos de registro. Destes, 60 são gatilhos sem sinal de ativação.
  3. Módulo de diodo - apenas 8 diodos na placa para implementar um diodo de entrada múltipla OU. Um truque sujo, mas permite economizar tanto em um relé (eu ainda tenho cerca de 400 relés de reserva agora) quanto no tempo - em comparação com um relé, o sinal é transmitido para a saída de um elemento lógico instantaneamente.
  4. Módulo 2 e - Este é o bloco básico. De fato, existem 4 relés com um contato de comutação para implementar absolutamente qualquer circuito lógico. Eles irão para blocos de lógica em uma quantidade desconhecida.
  5. Universal 2AND / 2OR, que é feito de tal maneira que permite implementar quase todas as funções lógicas - 4AND, 4OR, 4AND-NOT, 4OR-NOT e assim por diante. Ele também irá para o bloco lógico em uma quantidade desconhecida.

Como eu disse - depois de perder muito tempo produzindo placas de circuito impresso caseiras, surtei e pedi um conjunto completo de placas de circuito aos chineses. Na primeira semana, montei os primeiros módulos. E um mês depois, todos os módulos do bloco somador estavam prontos.



Figura 5: Bloco somador


Bloquear


32 módulos de 8 módulos em 4 linhas são combinados em um bloco funcional. Existem 5 blocos no total (no pior dos casos, 6):


  1. O bloco somador é um somador completo de 16 bits. Duas entradas de 16 bits para números, 1 linha de transferência de zero bits, duas saídas. Por um lado, a operação de soma, por outro, o XOR entre as entradas. Pode ser usado como uma operação independente.
  2. Bloco de registro IP / AP - Dois registradores independentes de 16 bits sem sinal de ativação. As descobertas de Q e ~ Q são usadas diretamente e são alimentadas através de travas até o local a seguir. Foi possível soldar 4 relés, mas, para salvar o relé, a funcionalidade foi colocada em travas externas.
  3. Bloco de registros TMP / CMD - Existem três registros aqui. Um é um registro temporário de 16 bits. Exatamente o mesmo que IP ou AP. O segundo é de 12 bits; sua saída é conectada à entrada do somador por meio de uma trava. O terceiro é de 4 bits, com um sinal de habilitação embutido. É usado para armazenar a instrução atual.
  4. Blocos lógicos - 2 peças. Ou três. O esquema ainda é desconhecido. Cálculos preliminares mostram que 64 módulos serão suficientes (GOTO: Memory Board).

Na base de cada bloco, a placa de base é de 200x150 mm, sem fiação. Tudo o que há nele são 32 conectores e pinos quadrados saindo de baixo para uma instalação envolvente.



Figura 6: Placa base e sua cesta


Os módulos que se destacam no conector assim não são confiáveis. Eles ficam pendurados aqui e ali, deixam de tremer e, de todas as formas, reduzem a confiabilidade da estrutura. Para consertá-las, desenhei e imprimi cestas especiais com ranhuras. Os módulos certamente não vão a lugar nenhum - eles sobreviveram a uma viagem de trem para Moscou e voltaram sem problemas.


O cesto poderia ter sido desenhado mais facilmente - com uma camada de 0,32 mm, seria impresso um pouco mais de 10 horas. Três cestas são impressas com plástico PLA, mais duas com HIPS. Este último, devido à falta de uma caixa para a minha impressora, perceptivelmente distorce ao imprimir.


Você pode perceber que o bloco somador não possui orelhas para anexar. A cesta para ele foi impressa pela primeira vez. Depois, encaixe essas orelhas ou imprima uma nova cesta.

Figura 7: Bloco somador e bloco lógico.


Envoltório do fio


No quadro base, aguardamos 600 conclusões que precisam ser interconectadas. Felizmente, é necessário conectar não apenas tudo, mas apenas quase tudo. Por outro lado, não fica mais fácil.


Pegamos uma ferramenta especial, um rolo de fio e uma perna após uma perna, terminamos o diagrama de conexão.



Figura 8: Finalização do bloco somador


Este é apenas o começo do trabalho. Bem, como um começo. No início, houve um horror silencioso - os fios estavam ao acaso, alguns jumpers são longos, outros são muito longos ... Depois de aprender um pouco melhor do que antes, removi a maioria dos jumpers e torci tudo de novo - comecei a esticar os jumpers com uma corda. Portanto, os fios não ficam pendurados e o resultado parece muito melhor. Eu tentei colocar para que os fios não pressionassem nos cantos dos pinos. Como resultado, nem um único circuito. Desde a primeira tentativa, havia apenas linhas de barro.



Figura 9: Finalização do bloco somador. Resultado final


No momento, não é exatamente simples, mas para o primeiro quadro um resultado muito bom, eu acho. Até agora, eu não aprendi como colocar o fio na bobina, ou uma ferramenta de curva, ou mãos ...


No camarada O UA3MQJ possui um artigo detalhado sobre este método de instalação.


Além do bloco somador, é necessário um bloco de registro. Em vez disso, dois registros de bloco. Mais alguns meses - e outros 64 módulos são montados e testados. Resta enrolar a placa de base.



Como foi isso?


Módulos indicadores



Figura 10: Módulo indicador


O estado atual dos registros do processador precisa ser exibido em alguma coisa e eu decidi que os indicadores de vácuo estarão corretos. Na placa 100x100mm (para 10 peças deste tamanho, você pode encomendar aos chineses por US $ 5), existem 6 indicadores IV-6, gatilhos K155TM8 e um microcontrolador. A indicação aqui é dinâmica.


Há também uma entrada de 16 bits para leitura direta do status do registro e uma porta UART para receber comandos do cartão de memória.


Agora o firmware pode ler o status da porta de 16 bits e, no formato HEX, exibi-lo no indicador. No total, preciso de 4 peças desses módulos. Três exibirão o status atual dos registradores - IP, AP e CMD do registrador, a fim de ter uma visualização mais conveniente dos valores armazenados atuais. Quarto - mostrará o número total de instruções executadas.


Trava



Figura 11: Módulo de trava


O módulo de trava consiste em 8 relés RES43. Dentro são dois contatos de fazer. Esquerda e direita são LEDs que exibem o estado atual da entrada e saída.


O tamanho da trava é 100x100mm. A quantidade necessária é de 8 peças. Dois estão prontos, resta recolher mais seis.


Placa de memória



Figura 12: Placa de memória. Vista geral


O maior bloco, que contém principalmente dois chips de 64 Kbytes de RAM estática e esquemas correspondentes para entradas de endereço e uma porta de dados. A placa abriga o microcontrolador ATmega1280. Ele tem duas tarefas vitais:


  1. Baixando o programa e os dados iniciais para a RAM. O binário compilado deve ser colocado na memória. Para fazer isso, será possível conectar ao cartão de memória via UART ou telnet (via Wi-Fi) e baixar o arquivo executável. O MK lerá o cabeçalho e exibirá seções de código e dados na RAM. Estou com muita preguiça de fazer isso com os interruptores e botões de alternância - um programa de foder o cérebro que pode fazer algo mais complicado O HelloWorld contém milhares de instruções. Há alguns trunfos no ninho a esse respeito, mas sobre eles outra vez.
  2. Ele implementa comandos para ler dados do console e gravar nele. Sim, sim, instruções. "" e "," são implementados usando o MK. Em vez disso, a lógica do relé informa ao MK que agora é necessário transferir o status do barramento de dados para o console ou vice-versa para gerar o valor do console para o barramento de dados. De fato, o MK funciona como um conversor de interface paralela no UART. Sim, é bem possível executar em alguns especiais. chip e eu vou pensar sobre isso.

Ainda não decidi o que fazer com o modo de 16 bits. Obviamente, a maioria dos programas é escrita sob o cérebro de 8 bits e tudo é simples - lemos e escrevemos o byte baixo. E no modo de 16 bits, o que devo fazer? Exibir a palavra inteira ou apenas o byte baixo também?


Além das principais, o MK possui várias tarefas paralelas, que você pode realizar sem, em princípio, mas elas visam a conveniência de usar a máquina:


  1. O MK é responsável por exibir uma pequena área de memória em uma matriz de LED de 32x16 pixels. Ele faz isso enquanto o barramento de endereços e o barramento de dados não estão ocupados pela lógica principal. Aqui, não tenho certeza de que, para o MK, geralmente haja tempo no ônibus, então a questão precisa ser verificada. Mas no cabeçalho do programa, haverá um endereço de início para exibição e tentarei fazê-lo funcionar. A indicação é dinâmica. Duas colunas de dados são produzidas ao mesmo tempo em um ciclo de clock.
  2. Quando o sinalizador do modo de memória protegida é ativado no binário, no caso de uma tentativa de executar uma seção de dados ou gravar em uma seção de memória, o MK gerará uma exceção "Falha de segmentação". Assim, podemos garantir que o programa não vá aonde não deveria. A leitura da seção de memória não é proibida.
  3. Quando o sinalizador de controle de código é ativado, o MK ativa o simulador e executa as mesmas instruções que o computador, comparando os resultados esperados e recebidos. Se o resultado for diferente, a exceção "Erro da máquina" será lançada. Isso significa que ocorreu um erro nos cálculos e talvez um módulo tenha começado a falhar. Ou também aumentamos a frequência do relógio e os relés não têm mais tempo para calcular. Apenas com a ajuda dessa funcionalidade, tentarei extrair o máximo do carro - algo terá que controlar a operação correta durante esse período.

Ainda existe uma função temporária, mas ainda vital, da placa de memória - emulando um bloco de lógica enquanto ela não está presente. Existem linhas de entrada e saída na placa de memória e podemos fornecer os sinais necessários para os blocos. Portanto, conectando todas as linhas de controle à placa de memória e escrevendo um programa que emita a sequência de comandos necessária, o resultado será no menor tempo possível:


  1. execute os primeiros programas para execução;
  2. algoritmos de depuração e circuitos do bloco lógico, o que aumentará as chances de sua montagem e operação sem erros posteriormente.

Depois, coletando os módulos necessários dos blocos lógicos, todas as funções serão gradualmente transferidas "para o ferro". Quando o MK deixar de ser responsável pela lógica, o projeto será considerado concluído.


Autenticidade


O projeto não foi originalmente concebido como puramente relé, sem o uso de transistores e microcircuitos. Por um lado, o computador é híbrido e perde resistência à radiação; por outro lado, a maioria dos computadores de retransmissão tem uma doença semelhante. A versão final da máquina usará um chip de memória e um microcontrolador. A memória de ferrite será usada em outro projeto, já “Silicon-Free”.


Para compensar o efeito de não-canon, recebi uma máquina de escrever eletrônica "Robotron S6130"



Figura 13: Máquina de escrever eletrônica do tipo camomila.


Infelizmente, a máquina foi para mim em um estado de vida gasto. Ele foi usado por muito tempo na contabilidade, mas no final foi abandonado para morrer em esplêndido isolamento.



Eu recomendo ver uma revisão única deste monstro.


Diretamente, a mecânica está em boas condições, mas a placa processadora, na qual estava um par de baterias D-0,25 NiCd, foi usada com muita força. Eles vazaram com segurança e inundaram tudo com eletrólito.


Quero restaurá-lo e usá-lo como um terminal de entrada / saída para o computador, mas, além do mau funcionamento da parte eletrônica, a máquina possui uma margarida russa (unidade com letras) e teclas russas. O segundo é decidido por adesivos, o primeiro deve ser procurado e aqui ainda não tenho sorte. Sobre o fato de ser necessário um cartucho com fita de tinta, geralmente fico em silêncio. Pelo menos eu tenho papel para ela ..


Se for decidido pelos eletrônicos que está irremediavelmente perdido, tentarei encontrar um doador ou desenvolverei um novo preenchimento eletrônico. Tornar um painel de controle um punhado de shagoviks não é a tarefa mais difícil. Será mais difícil traduzir um manual do alemão e entender o TK. Obviamente, esta máquina merece um artigo separado sobre os resultados do reavivamento. Contra ela, até agora é a prioridade do trabalho realizado.


Testes


Todos aqueles que leram até este local receberão uma recompensa na forma de rachaduras e zumbidos.


Para começar, vamos tentar aplicar uma onda quadrada na entrada do relé através de uma cascata de transistor:



Figura 14: Teste de alta velocidade da chave reed RES55. Um sinal amarelo está na bobina, azul está nos contatos


Como a entrada do osciloscópio possui uma certa capacitância e, depois que o contato do relé é aberto, ele permanece no ar e a autodescarga começa, vemos o expoente oposto. A uma frequência de 1,7 kHz! Para o revezamento! Para um pequeno revezamento de palheta! Parada normal em 20Hz ou um pouco mais alta. A uma frequência nominal de 100 Hz, as bordas ascendente e descendente são de aproximadamente 600 µs cada. Aqui eles são tão pequenos (200 microssegundos), porque a energia da anterior ainda permanece na bobina no momento da próxima ligação.


Aplicamos tensão nos blocos, cortamos os interruptores dos instrumentos de medição soviéticos nas entradas.



Figura 15: Bloco somador e bloco registrador em operação


Isso conta! Legal.



Então parecia da cena. No começo, eu queria refazer os switches para 16 bits. Conecte os indicadores à entrada e à saída, mas ... Eu não pude resistir.


Bem, como tudo funciona, e o relé acabou sendo capaz de velocidades insanas, alimentamos o meandro da linha de transferência:



E nós cortamos 500Hz. O somador lida, embora o som não possa ser dito. Na verdade, o som é nítido, mas o microfone condensador pensa de maneira diferente. Até onde eu sei, este é o adicionador de relé mais rápido do mundo.


Para ser continuado



Figura 16: Projetando uma estrutura de computador


Gradualmente, as seis peças de travas ausentes são coletadas e a estrutura da futura máquina começa a ser projetada. Existem seis blocos no desenho, caso 64 módulos não sejam suficientes para a lógica. E se for o suficiente - o local sob o bloco central inferior permanecerá vazio.


Ao mesmo tempo, estou escrevendo um firmware para um cartão de memória para que ele possa substituir um bloco lógico ausente. No verão, o computador poderá executar seu primeiro programa.


Três computadores ???


Sim três O primeiro é o atual BrainfuckPC. O segundo é um computador pneumático , com o codinome FluidicPC .


Sobre o terceiro monstro futuro resistente à radiação, você já pode encontrar referências na Internet, mas eu não quero pulverizar entre os projetos e primeiro quero finalizar o atual - ainda não o anunciei.


Figura 17: Comutação dos decatrons A101, A102 e A103
Embora a partir desta imagem você já possa adivinhar o que será discutido.


PORQUE ????




Referências


Todo o projeto continua completamente aberto. Portanto, os principais links para o projeto:


  1. Repositório com diagramas de circuitos e layouts de PCB . Também há firmware para o módulo indicador e o cartão de memória
  2. Nesta página , publico semanalmente e não muito relatórios sobre o que foi feito. Agora você está lendo um artigo, um pouco mais do que completamente composto por essas notas. Com tradução, comentários e adições.
  3. Compilador e emulador .

Source: https://habr.com/ru/post/pt411145/


All Articles