NandGame – Como criar um computador do zero
(nandgame.com)- NandGame é um jogo educativo de puzzles que parte de componentes lógicos simples até, por fim, montar um computador programável
- Cada nível propõe a tarefa de criar um componente que funcione conforme a especificação, e a peça concluída se torna um bloco de construção para a etapa seguinte
- Não é necessário conhecimento prévio de arquitetura de computadores ou software, e matemática no nível de adição e subtração é suficiente, embora algumas tarefas possam levar tempo
- A primeira tarefa é implementar, com fios e relés, um componente nand cuja saída seja
0apenas quando as entradasaebforem ambas1 - Os componentes da caixa de ferramentas são arrastados para a área azul, e a barra de espaço, as setas e Escape controlam o arraste e o cancelamento
Dos componentes básicos ao computador
- NandGame avança combinando componentes básicos para criar peças cada vez mais poderosas e, no fim, montar um computador programável
- Ele é dividido em vários níveis, e em cada etapa é preciso criar um componente que funcione de acordo com a especificação dada
- O componente concluído se torna uma peça que pode ser usada nos níveis seguintes
- O ponto de partida é o componente lógico mais simples
Conhecimento prévio necessário e dificuldade
- Não é necessário conhecimento prévio de arquitetura de computadores ou software
- A matemática não exige mais do que adição e subtração
- Algumas tarefas podem levar tempo para resolver, então é preciso paciência
Primeira tarefa: criar um nand
- A primeira tarefa é implementar um componente nand usando fios e relés
- É preciso conectar as entradas
aebà saída, mas montar o circuito de modo que produza o comportamento especificado 1significa o estado em que a corrente está fluindo, e0significa o estado em que a corrente não está fluindo- A entrada
Vtransmite uma corrente constante que é sempre1
Especificação do nand
- A saída de
nandsó se torna0quando as duas entradas são1 - A especificação exata de entrada e saída é a seguinte
| a | b | saída |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Como controlar
- Arraste os componentes da caixa de ferramentas para a área azul
- Para pegar um item arrastável, pressione a barra de espaço
- Durante o arraste, use as setas para mover o item
- Pressione a barra de espaço novamente para colocá-lo na nova posição, ou Escape para cancelar
1 comentários
Opiniões no Hacker News
Gostei tanto deste jogo que comprei uma pequena placa de desenvolvimento FPGA e criei por conta própria um conjunto de instruções e uma CPU soft.
Não é prático, mas foi um exercício divertido; escolhi uma placa iCE40 porque o ecossistema open source é razoável e o preço é baixo: https://www.digikey.com/en/products/detail/lattice-semicondu...
Hoje talvez existam opções melhores.
Em geral, alguém teria improvisado um conversor USB, mas Wirth quis fazer direito: pegou uma placa FPGA, criou uma CPU soft e colocou em cima dela um SO, um sistema de janelas, um toolchain de linguagem etc.
Com isso, pôde rodar um app de design de hardware e um editor de texto, e experimentar mais designs de CPU soft usando seu mouse favorito.
Joguei um jogo parecido, Turing Complete, e foi realmente divertido: https://store.steampowered.com/app/1444480/Turing_Complete/
É muito parecido com o livro Nand2Tetris.
Eu tinha feito um upgrade da máquina para instruções de 32 bits e até escrito a documentação da linguagem assembly correspondente.
Mesmo ainda em acesso antecipado, é um ótimo jogo.
É bonito, bem-acabado e bem viciante.
É bom que também esteja no GOG: https://www.gog.com/game/turing_complete
Posts relacionados:
NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=36862274 - julho de 2023
NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=31055307 - abril de 2022
NandGame – Build a Computer from Scratch - https://news.ycombinator.com/item?id=25282507 - dezembro de 2020
Show HN: Online challenge: Build a CPU from scratch - https://news.ycombinator.com/item?id=17508151 - julho de 2018
É um exercício realmente divertido.
Ver isto me deixa um pouco amargo, porque me lembra o quanto eu esqueci.
Fiz engenharia elétrica na faculdade há mais de 20 anos e me especializei em arquitetura de computadores, mas profissionalmente nunca usei isso e fui para a área de software.
Eu não lembrava de absolutamente nada sobre como fazer as coisas daqui e, depois de tentativa e erro, mal consegui criar um meio somador.
É parecido com se culpar por não lembrar quem aprovou as Leis dos Cereais, ou quem iniciou o transporte refrigerado nos EUA.
Quando se tem uma compreensão do pano de fundo — a narrativa central, por exemplo que guerras exigem engenharia, que a Revolução Agrícola leva à Revolução Industrial, e que a história é luta de classes —, novas informações se encaixam no lugar como fragmentos dentro de um campo magnético.
Então não se culpe tanto; dá para ser um pouco mais generoso consigo mesmo.
Só depois de fazer tanto este jogo quanto o curso Nand2Tetris é que percebi que os dois implementam o mesmo computador.
Este jogo é a versão gráfica interativa, enquanto o Nand2Tetris original usa HDL textual em vez de clicar e arrastar conexões entre portas lógicas.
Ambos foram divertidos e educativos, mas o NandGame foi mais divertido.
Ainda assim, é bom saber da conexão entre eles. Depois de terminar o NandGame, você pode seguir para as tarefas posteriores do Nand2Tetris, ou seja, trabalhar nas camadas mais altas de software do computador; e também fica mais fácil compartilhar experiências e conteúdo com pessoas que fizeram a outra versão.
Para fazer as tarefas, tive de procurar de novo livros-texto e provas da faculdade, e desisti por volta do ponto em que era preciso quase terminar as partes centrais da CPU.
Sinceramente, achei as aulas e o texto bastante insuficientes; não sei se isso é normal na era da internet, mas eu esperava que o curso e o material didático fossem, em certa medida, autocontidos.
É o LogicSimX/Logic Simulator 2, baseado em desktop, de Andrew Wilkes: https://logicsimx.com/about/ https://andrew-wilkes.itch.io/logic-simulator-2
Parece bom, mas não conheço o suficiente para avaliá-lo direito.
Como ponto para reflexão, se excluirmos a parte de realmente construir uma porta NAND na primeira etapa, ao final desse processo o que surge acaba sendo algo muito parecido com uma rede neural
Para representar uma única porta NAND são necessários 2 neurônios, e a estrutura parece ter n camadas de profundidade, muitos zeros na matriz de pesos e um pouco de espaço de armazenamento
A pergunta é: dadas apenas as semânticas de entrada e saída em nível de assembly, seria possível treinar uma rede neural vazia para que ela se tornasse algo como essa estrutura? Backpropagation obviamente não funcionaria, mas talvez algum tipo de busca direcionada fosse possível?
Testamos uma porta de maioria de 3 entradas e várias outras portas, mas, depois de mais de uma camada, o backpropagation não funcionava bem, provavelmente por falta de precisão de bits
O problema de “treinar sem backpropagation” é, na prática, bem difícil, e acabamos desistindo
Existe algum bom método para treinar redes neurais sem backpropagation? Parece haver algum grau de gargalo de informação, mas é difícil avaliar a informação mútua sem uma rede neural
Não tenho nenhuma experiência nessa área, então gostaria que explicassem o que cada componente faz
Não sei o que um relé faz, nem o que são
ceinTambém fico confuso sobre por que, existindo uma fonte de alimentação separada, basta conectar
aoubà alimentação e ligar para que isso por si só receba energiaQuando a bobina (
c) é energizada, o estado do interruptor muda do estado padrão para o estado opostoUm interruptor normalmente fechado passa o valor de
inpara a saída quandoc = 0, mas, sec = 1, a bobina é energizada e o interruptor se abre, ou seja, desligaUm interruptor normalmente aberto funciona ao contrário
cé a bobina e, quando recebe energia, alterna o interruptoriné o valor que passa quando o interruptor está fechado; aqui, é 1 ou 0A fonte de alimentação separada é necessária para obter um valor 1 independentemente dos dois valores de entrada
Por exemplo, se as duas entradas forem 0 e você quiser sempre emitir 1, é preciso ter um valor alto para puxar a saída para cima, e a fonte de alimentação cumpre esse papel
Cprovavelmente é o C de coil ou controlUm relé é um interruptor mecânico controlado por um eletroímã feito com uma bobina enrolada em um núcleo de ferro
Quando passa corrente pela bobina, ela puxa uma mola metálica e, como resultado, pode permitir que a corrente flua de
inpara a saída ou, ao contrário, interrompê-laOs dois tipos de componentes de relé fornecidos representam exatamente essas duas ações
Muito legal. Recomendo que todos também deem uma olhada ou joguem MHRD
https://store.steampowered.com/app/576030/MHRD/
Parece interessante. É uma pena eu não ter conseguido terminar o livro, e fiquei com vontade de tentar mais com isso