CPU de8 bits
Processador de 8 bits construído do zero, a partir da ULA, para entender arquitetura de computadores por dentro.
- 2024
- Projeto pessoal
- Arquitetura de computadores
- Arquitetura · Lógica digital · ULA
Dá para trabalhar a carreira inteira com sistemas embarcados tratando o processador como caixa preta. Este projeto foi o contrário disso: montar uma CPU de 8 bits partindo da unidade lógica e aritmética, para saber o que tem dentro.
A ULA veio primeiro, num repositório separado. É a peça que calcula, e construir só ela já obriga a encarar soma com vai-um, complemento de dois e as flags que o resto da máquina usa para decidir o que fazer em seguida.
A CPU veio depois: registradores, caminho de dados, decodificação de instrução e o ciclo de busca e execução amarrando tudo.
Por que isso importa no resto do portfólio
Quando você escreve firmware sabendo o que acontece entre buscar a instrução e executá-la, decisões que pareciam arbitrárias (por que essa operação custa mais ciclos, por que essa interrupção tem essa latência) passam a ter explicação.
O que tem dentro
Fiz no simulador Digital, seguindo a arquitetura SAP-1. Os blocos se comunicam por um barramento de 8 bits, e quem escreve nele em cada momento é decidido por drivers tri-state. Sem eles, dois componentes escrevem ao mesmo tempo e os sinais entram em curto.
A unidade de controle é um ring counter de quatro flip-flops D em anel, e é ele que dá as quatro fases de cada instrução. O contador de programa carrega o endereço no registrador de endereço, a memória de programa entrega a instrução ao registrador de instrução e o contador incrementa, o campo de endereço da instrução busca o operando na memória de dados, e a ALU executa e guarda o resultado no acumulador.
Cada instrução tem 8 bits, sendo 3 de opcode e 5 de endereço do operando. São oito operações: soma, subtração, multiplicação, divisão, shift para os dois lados, NAND e XOR. Nos shifts o campo de endereço é ignorado e a ALU opera só sobre o acumulador. A memória é separada em duas EEPROMs, 16 posições para programa e 32 para dados.
O programa de exemplo roda uma sequência de soma, multiplicação, shift à esquerda, subtração, shift à direita e divisão, e dá para acompanhar o acumulador e o registrador MQ mudando a cada ciclo. Não tem desvio condicional nem endereçamento indireto. O objetivo era mostrar o caminho mínimo de buscar, decodificar e executar, não construir uma máquina programável.