2025-2026, AC, LDSA, Grupo 2
Grupo 2 (LDSA)
Autores: Daniel Alves, José Lopes, Luísa Ferreira
Data: 31 de dezembro, 2025
Introdução
Este projeto consistiu no desenvolvimento e implementação em VHDL de uma arquitetura simplificada de um processador de 16 bits, seguindo os princípios de uma arquitetura RISC. O sistema foi projetado de forma modular, integrando componentes fundamentais como uma Unidade Lógica e Aritmética (ALU), capaz de realizar operações de soma, subtração, lógica booleana e deslocamentos , um Banco de Registos com capacidade de leitura e escrita simultânea e uma Unidade de Controlo responsável pela descodificação de instruções e gestão de sinais.
O processador opera com instruções de 16 bits e utiliza o sistema de memória Little Endian, suportando a utilização de um imediato ou do operando de um registo. O projeto teve como objetivo a implementação prática dos conceitos estudados de forma teórica na UC de Arquitetura de Computadores.
(…)
Demonstração
Estrutura e descrição dos módulos
Este projeto consistiu no desenho de um processador de arquitetura RISC de 16 bits, desenhado para executar um conjunto de instruções aritméticas, lógicas, de deslocamento e de memória através de um fluxo de dados (datapath) integrado. Para desenvolver o mesmo utilizámos vários módulos:
- ALU: Este módulo atua como o gestor central que liga a Unidade Aritmética, a Unidade Lógica e a Unidade de Deslocamento, enviando os dados de entrada para todas elas ao mesmo tempo. A sua função principal é funcionar como um "seletor": com base no código de operação (op), ele escolhe um dos resultados gerados (seja da operação aritmética, da lógica ou do deslocamento) e as respetivas flags para apresentar na saída final, ignorando os restantes.
- Unidade Aritmética: Este módulo executa operações matemáticas de soma e subtração em valores de 16 bits, calculando simultaneamente indicadores de estado (flags como Carry, Overflow, Negative e Zero) para validar o resultado numérico.
![]() |
| Esquemático da UA |
- Unidade Lógica: Este módulo realiza operações booleanas bit a bit (NOT, AND, OR), permitindo a manipulação direta e a filtragem digital dos dados sem envolver cálculos aritméticos.
- Unidade de Deslocamento: Este módulo move os bits de um valor para a esquerda ou para a direita (preservando o sinal).
- Banco de Registos: Este módulo contêm 8 registos de 16 bits e permite ler dois ao mesmo tempo (Rs1 e Rs2) e guarda-se a informação num terceiro (Rd) que é igual ao Rs1, para isso, usa o sinal de escrita apenas ao registo correto e multiplexers que selecionam quais os valores que devem sair para o resto do processador.
- Registo de 16 bits: Este módulo funciona como uma memória temporária capaz de guardar um valor de 16 bits. Ele possui um mecanismo de limpeza imediata com o (Reset) que coloca tudo a zero, e só grava novos dados quando recebe permissão explícita do (Enable) no momento exato do sinal (Clock), se não tiver permissão, ele ignora a entrada e continua o valor antigo na saída, garantindo que a informação não se perde.
- Unidade de Extensão de Sinal: Este módulo converte um valor de entrada de 8 bits para um valor de saída de 16 bits. A operação é realizada replicando o bit mais significativo (bit de sinal) da entrada para preencher os 8 bits superiores adicionais; isto assegura que o valor numérico, seja ele positivo ou negativo, permanece matematicamente correto na representação em complemento para dois.
- Memória de Dados: Este módulo implementa uma memória de leitura e escrita endereçável ao byte, com um limite de 256 posições (decisão de projeto: limitamos o tamanho da memória, de forma a podermos sintetizar). A sua função é adaptar dados de 16 bits para uma estrutura interna de 8 bits: cada operação de escrita ou leitura acede automaticamente a dois endereços consecutivos (o endereço N e N+1), organizando os dados no formato Little Endian.
- Unidade de Controlo: Este módulo descodifica os 4 bits do Opcode para gerar os sinais de controlo globais no processador. Funciona como um descodificador combinatório que traduz o tipo de instrução num conjunto específico de bits que configuram os multiplexadores, ativam a escrita em memória ou registos e selecionam a operação interna da ALU.
Mapas de bits das instruções
Para a arquitetura deste projeto, a codificação das instruções foi definida com a seguinte distribuição de bits:
(…)
Discussão
A validação funcional do processador foi realizada através da execução do Testbench no Vivado, visando comprovar a integração correta da Unidade de Controlo, ALU, Banco de Registos e Memória. A análise sequencial dos sinais de onda apresentada nas figuras seguintes demonstra o cumprimento dos requisitos de descodificação e execução para o conjunto de instruções implementado.
(…)
Por fim, a Figura 15 demonstra a execução da instrução de LOAD (1000001100000100). Calculamos o endereço de acesso utilizando a ALU que vai somar o valor do registo R1, que neste momento é 0 com o imediato extendido 4 (0000000000000100) obtendo o endereço 0000000000000100. Na memória acedemos a esse endereço onde estava guardado o operando 4 (0000000000000100), de seguida com o sinal Ctrl_MemtoReg ativo a 1 passamos o valor para o banco de registos e com o sinal Ctrl_RegWrite ativo também a 1 carregamos o valor no registo principal no ciclo de relógio seguinte.
Conclusões
O projeto permitiu-nos o desenvolvimento e implementação de uma arquitetura de processador de 16 bits do tipo RISC, utilizando a linguagem de descrição de hardware VHDL. O objetivo principal de implementar os blocos funcionais do processador, nomeadamente a Unidade Lógica e Aritmética (ALU), o Banco de Registos, a Memória, o Extensor de Sinal e a Unidade de Controlo, foi plenamente atingido.
Através das simulações realizadas no Vivado, foi possível validar o comportamento do processador face ao conjunto de instruções proposto. Verificou-se que as operações aritméticas, lógicas, de deslocamento e de memória são executadas corretamente, com a devida atualização das flags de estado.
No entanto, ao longo da realização do projeto, identificámos algumas limitações importantes na nossa implementação. Ao nível das instruções, a ausência da instrução MOV obriga a que seja necessário "limpar" um registo (por exemplo, subtraindo-o por si próprio) antes de lhe atribuir um novo valor, tornando o processo menos direto. Para além disso, o facto de o registo de origem ter de ser obrigatoriamente igual ao de destino retira alguma liberdade na manipulação dos dados.
(…)
Referências
- Pereira, C. (2025). 7 – AC Organização dos Computadores [Diapositivos de PowerPoint]. ISCTE – Instituto Universitário de Lisboa. Moodle.
- Pereira, C. (2025). 13- AC Microarquitetura ARM - Pipeline [Diapositivos de PowerPoint]. ISCTE - Instituto Universitário de Lisboa. Moodle
- Pereira, C. (2025). AC Suporte ao Projeto (v7) [Diapositivos de PowerPoint]. ISCTE - Instituto Universitário de Lisboa. Moodle



Comentários