2025-2026, AC, LDSA, Grupo 7
Grupo 7 (LDSA)
Autores: Pedro Formosinho, Manuel Homem, Miguel
Santos
Data: 27 de dezembro,
2025
Introdução
Este
projeto consiste no desenvolvimento de uma arquitetura de processador de 16
bits em VHDL, no âmbito da Unidade Curricular de Arquitetura de Computadores. O
objetivo central é implementar um processador simplificado do tipo RISC
(Reduced Instruction Set Computer) para compreender a interligação entre os
principais blocos funcionais de um sistema computacional.
| Diagrama de blocos |
Mapa de Bits das Instruções
O processador utiliza instruções de tamanho fixo de 16 bits. O formato das instruções é:
- Opcode (Código da operação) - 4 bits
- Rd (Registo de destino) - 3 bits
- I (Bit Imediato, indica se a operação usa um valor imediato ou um registo) - 1 bit
- Rs2 / Imm (Valor do Imediato, ou valor do registo destino) – 8 bits
A ordem fica: Opcode [15 downto 12] + Rd [11 downto 9] + I [Bit 8] + Rs2/Imm [7 downto 0].
(…)
Estrutura e Descrição dos Módulos
O projeto foi desenvolvido em VHDL utilizando o Vivado, visando um dispositivo da família Zynq-7000 (xc7z007sclg400-2). A arquitetura segue um modelo modular hierárquico, onde o módulo de topo que é o Processador integra o Caminho de Dados (Datapath) e a Unidade de Controlo.
Abaixo apresenta-se a descrição dos módulos constituintes identificados na hierarquia do projeto:
- Processador.vhd (Módulo topo): É a entidade principal que instancia e conecta todos os componentes do sistema (Memórias, ALU, PC, Registos e Unidade de Controlo), gerindo os sinais de clock e reset globais.
- UnidadeControlo.vhd: Responsável por descodificar as instruções provenientes da memória e gerar os sinais de controlo (seleção de MUXs, Write Enable de registos e memória, operações da ALU) para coordenar o fluxo de dados.
- PC.vhd (Program Counter): Registo que armazena o endereço da próxima instrução a ser executada. É atualizado a cada ciclo de clock (incremento ou salto).
- Instruction_Memory.vhd: Memória ROM (Read-Only Memory) que armazena o código do programa. Recebe o endereço do PC e fornece a instrução correspondente.
- • BancoRegistos.vhd: Contém os registos de uso geral do processador. Permite a leitura de dois operandos e a escrita de um resultado num mesmo ciclo. É composto internamente por 8 instâncias de Registo.vhd.
- ALU16bits.vhd (Unidade Lógica, Aritmética e Deslocamentos): O núcleo de processamento, responsável por executar operações matemáticas, lógicas e deslocamentos. Pela estrutura do projeto, esta unidade agrega sub-blocos especializados:
- UnidadeAritmetica.vhd: Para somas e subtrações (ADD e SUB).
- UnidadeLogica.vhd: Para operações lógicas AND, OR e NOT.
- UnidadeDeslocamento.vhd: Para operações de deslocamentos (SHL, SHR).
- Sign_Extend.vhd: Unidade de extensão de sinal, utilizada para converter valores imediatos de 8 bits para 16 bits, mantendo o sinal aritmético.
- MUX.vhd: Multiplexers utilizados para direcionar o fluxo de dados (ex: escolher entre um registo ou um valor imediato para entrar na ALU).
- memoria.vhd: Memória de Dados (RW – Read/Write), onde o processador pode ler (LOAD) ou guardar (STORE) resultados de operações.
- Adder.vhd: Somador dedicado, usado para incrementar o PC (PC + 2).
(…)
Demonstração
(…)
Instrução 7 (LOAD): O processador transita para a instrução 1000110100000001 no PC 000c.
- Resultado da Operação: A operação resulta no valor 1, visível tanto na saída da ALU como no endereço em write_data, que vai ser o valor da soma do enderenço base + imediato.
- Configuração de Controlo: Os sinais de controlo alteram-se, destacando-se o memread em 1, permitindo a leitura da memória.
Esquemático da memória de
instruções |
(…)
Conclusão
A realização deste projeto permitiu a implementação e validação de um processador funcional de 16 bits em VHDL, utilizando a ferramenta Vivado.
Desempenho: A simulação comportamental (tb_Processador.vhd) demonstrou que o processador executa corretamente as instruções sequenciais. A separação da ALU em sub-unidades (Aritmética, Lógica e Deslocamento) permitiu uma organização lógica clara. A utilização da Zynq-7000 oferece recursos lógicos mais do que suficientes para esta implementação, garantindo tempos de resposta rápidos para a frequência de relógio alvo.
Limitações:
- Espaço de endereçamento: Sendo uma arquitetura de 16 bits, o espaço de endereçamento é limitado a 64KB (ou menos, dependendo da largura do barramento de endereços implementado), o que restringe o tamanho dos programas e dados.
- Período de relógio: Implementado como ciclo único, o tempo de ciclo é determinado pela instrução mais lenta (caminho crítico), limitando a frequência máxima de operação.
- Imediatos Curtos: No formato de instrução implementado (Tipo-I), o campo destinado ao valor imediato é de 8 bits (bits 7 a 0). Isto limita a representação direta de constantes ao intervalo de -128 a 127 (em complemento para dois). Para carregar valores de 16 bits na sua totalidade, a arquitetura exigiria a combinação de múltiplas instruções.
Possíveis melhorias:
- Pipeline: Implementar uma arquitetura em pipeline (ex: 5 estágios: Fetch, Decode, Execute, Memory, Write-Back) para aumentar o throughput de instruções.
- Periféricos de I/O: Adicionar controladores para LEDs ou Switches da placa de desenvolvimento para permitir interação em tempo real, mapeando-os em memória (Memory Mapped I/O).
- Extensão do ISA: Incluir instruções de multiplicação em hardware ou suporte para interrupções, tornando o processador capaz de lidar com eventos assíncronos.
Referências
- Pereira, Conceição (2025-2026). AC Suporte ao Projeto [PowerPoint]. ISCTE Sintra.
Comentários