Projeto acadêmico de uma CPU de 16 bits multi-ciclo desenvolvida no simulador Logisim-evolution, com suporte completo a memória de dados e instruções, arquitetura de pilha e periféricos mapeados em hardware.
- Visão Geral
- Demonstração
- Arquitetura da CPU
- Registradores Principais
- Unidade de Controle
- Datapath
- ULA (Unidade Lógica e Aritmética)
- Execução Multi-Ciclo
- Memória e Periféricos
- Como Executar
- Equipe
- Referências
Este projeto foi construído para a disciplina de Arquitetura de Computadores (Prof. Vinícius da Silva Borges). O arquivo principal de desenvolvimento é o CPU16BIT.circ.
A arquitetura implementada inclui:
- Arquitetura multi-ciclo
- Unidade de controle sequencial baseada em contador
- Registradores de uso geral e dedicados
- Controle explícito de micro-etapas de máquina
- Separação entre Memória de Programa (ROM) e Memória de Dados (RAM)
- Sistema nativo de Pilha (Stack)
- Periféricos com I/O mapeado em memória
- Interação por saída TTY e sistema de Vídeo Matricial
Assista ao nosso vídeo de apresentação com a explicação e a CPU em pleno funcionamento:
(Clique na miniatura acima para assistir ao vídeo no YouTube)
| Característica | Detalhes |
|---|---|
| Largura de Dados | 16 bits |
| Largura de Endereços | 16 bits |
| Espaço de Endereçamento | 2¹⁶ posições disponíveis |
| Modelo de Execução | Múltiplos ciclos por instrução |
| Sinal de Clock | Sincronismo Global (CLK) |
| Habilitação (Enable) | Pino clk_enb |
O datapath desta CPU é munido com vários registradores que desempenham funções específicas no ciclo de busca e execução:
CONTADOR_DE_PROGRAMA(PC): Armazena o endereço da próxima instrução a ser buscada na memória ROM.REGISTRADOR_DE_INSTRUCAO(IR): Armazena a instrução atual durante as etapas de busca, decodificação e execução.REGISTRADOR_DE_ENDERECO_DE_MEMORIA(MAR): Responsável por fornecer à RAM e aos periféricos mapeados o endereço de acesso.ACUMULADOR(AC): O registrador primário para as operações lógico-aritméticas computadas pela ULA.REGISTRADOR_B(RB): O segundo operando da ULA; utilizado também nas transferências de memória e uso da pilha.REGISTRADORES_Y_E_Z: Registradores auxiliares para a retenção de dados temporários durante micro-operações.FLAGS: Conjunto de sinalizadores alterados pela ULA (como Zero e Carry) fundamentais para os desvios e testes condicionais executados pela Unidade de Controle.REGISTRADOR_TTY/REGISTER_SAIDA: Registradores acoplados à interface de monitoramento e envio de dados para as telas e debug.
A CPU possui uma Unidade de Controle distribuída orientada por um Contador de Ciclos (CONTADOR_CICLO). Em conjunto com o circuito combinacional e o Opcode lido do IR, ela atua em cada etapa gerando com precisão os sinais ativadores para todo o sistema.
Exemplos de Sinais de Controle gerados:
- Registradores: Ativação de carregamento (
*_LOAD) e saída (*_EN). - ULA: Seletores de operação (
ADD,SUB,A_XOR_B). - Memória: Configuração de barramento (
ADDRESS_WRITE,ADDRESS_SELECT,RAM_IN). - Pilha: Controle dinâmico (
STACK_UP,STACK_DOWN,STACK_STORE,STACK_DATA_OUT).
O componente CIRCUITO orquestra o caminho de dados entre as memórias, controladores e lógica funcional.
- PC → ROM → IR: O PC aponta para a instrução na ROM, que devolve uma word de 16 bits para o IR armazenar.
- IR → Unidade de Controle: As linhas de opcode alimentam a Unidade de Controle, despachando os sinais que guiarão as próximas rotas.
- Fluxo de Operação (AC / RB / ULA): Os operandos circulam nos registradores principais (AC, RB, auxiliares) e passam pela ULA. O resultado retorna para retroalimentar os registradores, subir à memória ou enviar artefatos de vídeo para o TTY/Display.
- MAR / RAM / Periféricos: O barramento de endereçamento do sistema é isolado pelo MAR, que coordena leituras e escritas determinando se o destino é a RAM, a placa de vídeo ou registradores dos periféricos de hardware.
Nossa sub-unidade lógica (ULA) tem largura total de 16 bits.
- Operações Aritméticas Implementadas: Soma (
ADD) e Subtração (SUB). - Operações Lógicas Implementadas: XOR Lógico (
A_XOR_B). - Comportamento de Flags: Fornece as flags operacionais ao sistema, como Zero e Carry, permitindo que a CPU decida ramificações de fluxo de maneira condicional (
Branch if Equal, etc.).
A arquitetura segmenta cada instrução em partes menores ditadas pelo CONTADOR_CICLO.
- 1. Fetch: Leitura da instrução apontada na ROM e salvamento destas informações dentro do IR.
- 2. Decode: Interpretação isolada dos bits de opcode e levantamento prévio de barramentos internos.
- 3. Execute: Comandos engatilhados pela decodificação entram em vigor (processamento da ULA, requisições de endereços, alterações no ponteiro de pilha).
- 4. Write-back: Fase terminal onde o Acumulador e os registradores são alimentados com o resultado final, o PC é atualizado e os ciclos de relógio são reiniciados para buscar a próxima instrução.
- ROM (Memória de Programa): Memória exclusiva de leitura (16-bit word / 16-bit addressing). As instruções devem ser gravadas pelo Logisim (clique com o botão direito ➔ Edit Contents).
- RAM (Memória de Dados): Arquitetura encarregada de manter as variáveis dinâmicas, o espaço Stack e manter mapeadas as regiões relativas aos componentes periféricos controlados pelo
MAR.
O sistema provê suporte nativo a controle de pilha. A manipulação do ponteiro na RAM ocorre dinamicamente por intermédio dos sinais STACK_UP, STACK_DOWN, STACK_STORE e STACK_DATA_OUT.
- TTY: Terminal mapeado no
REGISTRADOR_TTYpara impressão sequencial de texto e depuração. - Sistema de Vídeo: Uma matriz de display simulada (8x8) sustentada pelos circuitos
PLACA_DE_VIDEOeBUFFER_VIDEO. O datapath pode injetar pixels diretamente no Framebuffer alterando a visualização gráfica durante o código.
Pré-Requisito: Logisim-evolution (versão 3.8.0 ou superior).
Siga as instruções passo a passo para carregar e iniciar a CPU:
- Abra o Logisim-evolution.
- Acesse
Arquivo > Abrire carregue oCPU16BIT.circ. - Na árvore à esquerda, clique e expanda sobre o projeto, e abra o circuito principal chamado
FINAL_BUILD.
- Procure pelo componente de RAM principal na parte superior do circuito.
- Clique com o botão direito nela e selecione a opção
Carregar imagem.... - Localize e selecione o arquivo:
FINAL_ASSEMBLY_OS_WITH_TETRIS_RAM_FILE.
Na seção inferior do FINAL_BUILD, carregue as matrizes de controle:
- Clique com o botão direito na primeira ROM, escolha
Carregar imagem...e selecioneOPCODE_ROM_MICROCODE_1. - Clique com o botão direito na segunda ROM, escolha
Carregar imagem...e selecioneOPCODE_ROM_MICROCODE_2. - Clique com o botão direito na terceira ROM, escolha
Carregar imagem...e selecioneOPCODE_ROM_MICROCODE_3.
- Habilite o sinal do Clock acendendo a chave/botão
clk_enblocalizada na porção inferior direita do projeto. - Configure a frequência do Clock: No menu do topo vá em
Simular>Frequência de pulsoe escolha2.0 kHz(esta é a velocidade ideal testada). - Ative os pulsos de clock pressionando as teclas
CTRL + K. - Abaixo do terminal TTY, utilize a ferramenta "Teclado" para interagir com o terminal simulado!
| Integrante | RA (Registro Acadêmico) |
|---|---|
| Emanuel Carneiro da Silva | 082230017 |
| João Vitor Maciel Nai | 082230004 |
| José Gabriel de Morais Souza | 082230001 |
