Skip to content

Repository files navigation

Projeto-Processador

Projeto de um sistema computacional em Verilog para a placa DE2-115, desenvolvido com foco didático em organização de computadores, arquitetura de processadores e integração com periféricos externos.

O sistema implementa uma CPU simples de 32 bits, com memória de instruções, memória de dados, banco de registradores, ULA, unidade de controle e periféricos de entrada e saída. Ao longo do desenvolvimento, o projeto passou a incluir também suporte experimental a teclado PS/2 e VGA.

Visão geral

O topo do projeto é o módulo unidade_processamento, que integra os principais blocos da arquitetura:

  • PC (Program Counter)
  • Memória de Instruções (MI / ROM)
  • Memória de Dados (MD / RAM)
  • Banco de Registradores
  • ULA
  • Unidade de Controle
  • Lógica de branch, jump e interrupção
  • Módulos de entrada e saída
  • Display LCD
  • Teclado PS/2
  • Framebuffer / VGA

Os parâmetros principais do sistema são:

parameter DATA_WIDTH = 32;
parameter INSTR_ADDR_WIDTH = 13;
parameter DATA_ADDR_WIDTH  = 13;

Com isso, a arquitetura trabalha com:

  • dados de 32 bits
  • até 8192 posições na memória de instruções
  • até 8192 posições na memória de dados

Plataforma alvo

  • Placa: Terasic / Altera DE2-115
  • FPGA: Cyclone IV E EP4CE115F29C7
  • Ferramenta: Quartus Prime
  • Clock principal da placa: 50 MHz

Estrutura do projeto

Arquivos principais:

  • modulos/unidade_processamento.v — módulo topo
  • modulos/unidade_controle.v — unidade de controle principal
  • modulos/unidade_controle_ULA.v — decodificação da ULA
  • modulos/modulo_ula.v — operações aritméticas e lógicas
  • modulos/banco_registradores.v — banco de registradores
  • modulos/modulo_mem_instrucoes.v — memória de instruções
  • modulos/modulo_mem_dados.v — memória de dados
  • modulos/modulo_pc_v2.v — contador de programa
  • modulos/modulo_branch.v, modulos/modulo_jump.v — controle de fluxo
  • modulos/modulo_interrupcao.v — interrupções e temporizador
  • modulos/modulo_input.v — entradas da placa e integração com PS/2
  • modulos/modulo_output_v2.v — LEDs, displays de 7 segmentos e visualização de estado
  • modulos/tela_lcd.v, modulos/display_lcd.v, modulos/lcdlab3.v — LCD
  • modulos/modulo_keyboard_ps2.v, modulos/modulo_scancoder_decoder.v — teclado PS/2
  • modulos/modulo_vga.v, modulos/modulo_buffer.v — saída VGA e framebuffer
  • single_port_rom_init.txt — programa carregado na memória de instruções

Organização da CPU

A CPU segue uma estrutura semelhante a um processador simples de ciclo único, com extensões próprias para o projeto.

Blocos principais

  • Banco de registradores: leitura de dois operandos e escrita de resultado
  • ULA: soma, subtração, operações lógicas, comparações, deslocamentos e operações especiais
  • Memória de instruções: armazena o programa em formato binário
  • Memória de dados: usada por instruções de load/store
  • Unidade de controle: decodifica o opcode e gera os sinais de controle do datapath
  • Controle de fluxo: branch, jump, jr, jal, jalr
  • Interrupções: suporte a timer e finalização por halt

Instruções suportadas

A unidade de controle atual reconhece, entre outras, as seguintes instruções:

Tipo R

  • add
  • sub
  • and
  • or
  • xor
  • nor
  • slt
  • sll
  • srl
  • mult
  • div
  • jr
  • jalr

Tipo I / J e extensões

  • lw
  • sw
  • addi
  • subi
  • andi
  • ori
  • xori
  • slti
  • beq
  • bne
  • j
  • jal
  • in
  • output
  • show_lcd
  • pc
  • get_pc
  • halt

Extensões do sistema

  • os_jump_to
  • os_save_return
  • set_interr_timer
  • get_interr_type
  • get_input_keyboard
  • frame_buffer_write

HALT e interrupções

No estado atual do projeto, a instrução HALT não foi implementada como parada permanente da CPU. Ela é tratada como um evento de interrupção, permitindo devolver o controle para o fluxo do sistema operacional.

Além disso, existe suporte a:

  • interrupção por temporizador
  • salvamento de PC de retorno
  • leitura do tipo de interrupção pelo software

Portanto, o sistema computacional está atrelado à um sistema operacional desenvolvido para a arquitetura alvo desenvolvida, e que possui como principal característica a execução de programas de forma preemptiva e não preemptiva. Deve-se ajustar inicialmente essa escolha no início do sistema (um BIOS emulado).

Entradas e saídas da placa

Entradas principais

  • clock de 50 MHz da placa
  • botão principal
  • botão de avanço manual (continue)
  • chaves (SW)
  • interface PS/2

Saídas principais

  • LEDs
  • displays de 7 segmentos
  • display LCD
  • sinais VGA

Teclado PS/2

O projeto possui uma implementação de recepção PS/2 voltada ao uso didático.

Características atuais:

  • recepção do teclado em modo dispositivo → FPGA
  • captura serial básica por borda de descida do clock PS/2
  • decodificação simples de scancodes
  • integração com instrução de entrada via teclado

Limitações conhecidas:

  • implementação simplificada do protocolo
  • sem suporte completo a todas as teclas e sequências estendidas
  • sem tratamento completo de paridade/erros para uso robusto

VGA

O projeto também inclui uma implementação de VGA com framebuffer simplificado.

Características gerais:

  • geração de sincronismo horizontal e vertical
  • saída RGB simples
  • framebuffer de baixa resolução lógica com escalonamento para tela VGA
  • escrita de pixels via instrução dedicada (frame_buffer_write)

Observação:

A integração do VGA foi desenvolvida para testes e ainda pode exigir ajustes finos de pinagem, temporização e organização do software que escreve no framebuffer.

LCD e displays

O sistema usa:

  • display LCD para visualização textual simples
  • displays de 7 segmentos para visualização de valores internos, incluindo PC e registradores
  • LEDs para saída e depuração do estado do sistema

Esses periféricos são úteis principalmente durante os testes de execução e depuração do processador.

Como compilar

  1. Abra o projeto no Quartus Prime.
  2. Verifique se a entidade de topo está definida como:
unidade_processamento
  1. Confira os arquivos de pinagem no .qsf.
  2. Atualize o arquivo single_port_rom_init.txt com o programa desejado.
  3. Compile o projeto.
  4. Grave o .sof na DE2-115.

Como testar

Fluxo sugerido:

  1. carregar um programa simples em single_port_rom_init.txt
  2. compilar e gravar na placa
  3. observar:
    • LEDs
    • displays de 7 segmentos
    • LCD
    • resposta do teclado PS/2
    • saída VGA, quando habilitada

Durante os testes, o projeto pode operar com:

  • avanço manual por botão
  • execução controlada por clock interno
  • leitura de entrada por switches e teclado

Observações importantes

  • O projeto ainda está em evolução e algumas partes foram implementadas de forma incremental.
  • Há módulos auxiliares e versões intermediárias mantidos para testes.
  • Alguns warnings de compilação podem surgir dependendo da versão do Quartus e do estado das integrações recentes.
  • A arquitetura foi sendo expandida para incluir periféricos e rotinas de sistema, então há trechos que ainda podem ser refinados.

Se este projeto for usado em continuação de desenvolvimento, o ideal é manter este README alinhado com a versão atual do hardware e das interfaces ativas no topo da CPU.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages