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.
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
- Placa: Terasic / Altera DE2-115
- FPGA: Cyclone IV E
EP4CE115F29C7 - Ferramenta: Quartus Prime
- Clock principal da placa: 50 MHz
Arquivos principais:
modulos/unidade_processamento.v— módulo topomodulos/unidade_controle.v— unidade de controle principalmodulos/unidade_controle_ULA.v— decodificação da ULAmodulos/modulo_ula.v— operações aritméticas e lógicasmodulos/banco_registradores.v— banco de registradoresmodulos/modulo_mem_instrucoes.v— memória de instruçõesmodulos/modulo_mem_dados.v— memória de dadosmodulos/modulo_pc_v2.v— contador de programamodulos/modulo_branch.v,modulos/modulo_jump.v— controle de fluxomodulos/modulo_interrupcao.v— interrupções e temporizadormodulos/modulo_input.v— entradas da placa e integração com PS/2modulos/modulo_output_v2.v— LEDs, displays de 7 segmentos e visualização de estadomodulos/tela_lcd.v,modulos/display_lcd.v,modulos/lcdlab3.v— LCDmodulos/modulo_keyboard_ps2.v,modulos/modulo_scancoder_decoder.v— teclado PS/2modulos/modulo_vga.v,modulos/modulo_buffer.v— saída VGA e framebuffersingle_port_rom_init.txt— programa carregado na memória de instruções
A CPU segue uma estrutura semelhante a um processador simples de ciclo único, com extensões próprias para o projeto.
- 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
A unidade de controle atual reconhece, entre outras, as seguintes instruções:
addsubandorxornorsltsllsrlmultdivjrjalr
lwswaddisubiandiorixorisltibeqbnejjalinoutputshow_lcdpcget_pchalt
os_jump_toos_save_returnset_interr_timerget_interr_typeget_input_keyboardframe_buffer_write
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).
- clock de 50 MHz da placa
- botão principal
- botão de avanço manual (
continue) - chaves (
SW) - interface PS/2
- LEDs
- displays de 7 segmentos
- display LCD
- sinais VGA
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
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.
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.
- Abra o projeto no Quartus Prime.
- Verifique se a entidade de topo está definida como:
unidade_processamento
- Confira os arquivos de pinagem no
.qsf. - Atualize o arquivo
single_port_rom_init.txtcom o programa desejado. - Compile o projeto.
- Grave o
.sofna DE2-115.
Fluxo sugerido:
- carregar um programa simples em
single_port_rom_init.txt - compilar e gravar na placa
- 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
- 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.