O μPD surgiu como uma ferramenta para ajudar no ensino de Arquitetura de Computadores, sendo um processador monociclo cujo pode ter todas as suas instruções simuladas visualmente através de um software de simulação. O projeto foi expandido para uma IDE onde era possível gerar um programa no assemvbly do μPD, compilar e executar, além de gerar o binário do programa desenvolvido. Também foi acrescentado uma ferramenta de geração do "esqueleto" do seu código VHDL (o qual ele foi desenvolvido) para uso em um kit educacional de FPGA.
O objetivo sempre foi contribuir com o aprendizado dos alunos, englobando em um mesmo processador a possibilidade de aprendizado de várias áreas da computação em conjunto.
Quem projetou a arquitetura do processador, bem como boa parte do código em VHDL foi o Marcelo Daniel Berejuck. A Morgana Sartor foi quem ajudou no desenvolvimento do código VHDL e testes, e foi uma das programadoras do software de simulação. A Thaynara Mitie foi uma das programadoras do software e responsável por seus testes de funcionamento.
O μPD utiliza uma arquitetura baseada na arquitetura RISC (Reduced Instruction-Set Computer), o que significa que todas as operações são realizadas com o uso dos registradores. A arquitetura RISC é muitas vezes chamada de “arquitetura Load/Store”. O processador μPD possui um Banco de Registradores com quatro registradores de uso geral (R0, R1, R2 e R3) que podem ser utilizados pelo usuário sem nenhuma restrição.
O procesador μPD é dividido em dois caminhos lógicos, denominados de Caminho de Controle e Caminho de Dados. O caminho de controle é responsável por ler as instruções de máquina armazenadas em uma memória do tipo ROM (Read Only Memory), externa ao processador, e controlar o fluxo de execução das tarefas no caminho de dados. Seus principais componentes internos são a unidade de CONTROLE e uma memória tipo LIFO (Last in, First Out), usada para salvar os registradores quando é executada uma chamada de subrotina (instrução CALL e RET).
O caminho de dados é composto de um Banco de registradores (com quatro registradores), uma Unidade Lógica e Aritmética (ULA), uma memória tipo RAM (Random Access Memory), além de registradores que fazem interface com pinos de I/O (pinos da porta de entrada e saída de dados do processador). É possível conectar na porta I/O diversos dispositivos, que são comandados pelos sinais de endereços da porta I/O. Assim, é possível conectar até 512 dispositivos diferentes nesta porta.
A memória RAM interna tem capacidade para armazenar até 0,5 KWords ou 1KByte. Esse também é o tamanho máximo que um programa poder ter e ser armazenado na memória ROM. O processador μPD permite o uso de até seis (06) interrupções externas, programáveis. A interrupção de maior prioridade é a INT(0) e a de menor, INT(5). A cada interrupção gerada, o processador faz uma CALL para um endereço específico na memória ROM
As instruções do processador possuem seis tipos de formatos, conforme mostra a Figura abaixo. Operações que envolvem três registradores utilizam o formato mostrado na Figura (a), operações que envolvem apenas um registrador destino e outro de entrada estão representadas na Figura (b), operações apenas com os dois registradores de entrada estão na Figura (c), e as operações apenas com registrador de destino estão representadas na Figura (d). Também existem operações que não envolvem registradores, elas estão representadas nas figuras (e) e (f). Abaixo estão descritas as instruções.
| Mnemônico | Opcode (binário) | Opcode (hexadecimal) | Descrição |
|---|---|---|---|
| NOP | 00000 | 00 | “No operation”. Processador gasta um ciclo de relógio se fazernenhuma operação. |
| LDI | 00001 | 01 | Carrega valor imediato contido na instrução (bits de 0 a 8) em umdeterminado Registrador (RDST). |
| ADD | 00010 | 02 | Soma o conteúdo de dois registradores e armazena o resultado emum terceiro registrador. |
| SUB | 00011 | 03 | Subtrai o conteúdo de dois registradores e armazena o resultado emum terceiro registrador. |
| OUT | 00100 | 04 | Escreve o valor contido em um registrador (R0, R1, R2 ou R3) nos pinos de I/O. |
| IN | 00101 | 05 | Lê o valor contido na porta de I/O em um dos registradores (R0, R1, R2 ou R3). |
| JI | 00110 | 06 | Salto (jump) incondicional. Salta para o endereço contido na instrução (bits de 0 a 8). |
| LD | 00111 | 07 | Carrega conteúdo armazenado na memória RAM (endereço nos bits 0 a 8) em um dos registradores (R0, R1, R2 ou R3). |
| STO | 01000 | 08 | Armazena conteúdo de um registrador (R0, R1, R2 ou R3) em uma posição de memória RAM (endereço nos bits 0 a 8). |
| JZ | 01001 | 09 | Salto condicional (jump) se o conteúdo de um registrador (R0, R1, R2 ou R3) for igual a 0 (zero). |
| JE | 01010 | 0A | Salto condicional (jump) se o conteúdo de um registrador (R0, R1, R2 ou R3) for igual a 1 (um). Usar CMP antes. |
| AND | 01011 | 0B | Executa E lógico entre o conteúdo de dois registradores, armazenando o resultado em um terceiro registrador. |
| OR | 01100 | 0C | Executa OU lógico entre o conteúdo de dois registradores, armazenando o resultado em um terceiro registrador. |
| XOR | 01101 | 0D | Executa OU EXCLUSIVO lógico entre o conteúdo de dois registradores, armazenando o resultado em um terceiro registrador. |
| NOT | 01110 | 0E | Executa NÃO lógico no conteúdo de um registrador, armazenando o resultado em um segundo registrador. |
| CALL | 01111 | 0F | Chamada de subrotina (função). Endereço de salto está na instrução (bits de 0 a 8). |
| RETI | 10000 | 10 | Retorno de interrupção. Volta par o ponto onde estava sendoexecutado o programa antes da ocorrência da interrupção. |
| SETR | 10001 | 11 | Configura registradores internos do processador. No momento existeapenas o INT, que habilita interrupções externas. |
| STOP | 10010 | 12 | Para a execução do programa por tempo indeterminado. |
| RET | 10011 | 13 | Retorno de subrotina (função). Retorna para o endereço de onde foi chamada a última subrotina (CALL). |
| CMP | 10100 | 14 | Compara o conteúdo armazenado em dois registradores quaisquer (R0, R1, R2 ou R3). |
A primeira versão do μPD foi implementada em desktop app, onde cada componente interno do processador foi representado como uma classe no software. A linguagem usada para o desenvolvimento foi C# e foi desenvolvido um tradutor com alguns tratamentos de erros para a transformação do Assembly em binário do μPD.
O software possui 3 visões diferentes, que estão expostas em abas.
- Editor: Onde o usuário pode desenvolver o código
- Execução por texto: Onde o usuário consegue acompanhar o funcionamento linha a linha do seu código
- Execução por blocos: Onde o usuário consegue acompanhar o fluxo dos dados em cada componente do processador.
Editor de código
Execução por texto
Execução por bloco
Tiveram seu funcionamento interno exposto de forma visual os seguintes componentes:
- Banco de Registradores
- Memória RAM
- In/Out
- Interrupções
Também há o recurso que possibilita visualizar e gerar o esqueleto do código VHDL dos componentes
Esqueleto de código VHDL de um componente
Para utilizar o aplicativo basta baixar o arquivo compactado neste link, extraí-lo para uma pasta e instalá-lo clicando duas vezes em "setup.exe"
Para contribuir com este projeto você pode dar um fork, clonar no seu PC, fazer testes, procurar bugs, criar novas funcionalidades e etc. As formas para contribuir são muitas: encontrar bugs no código e na documentação, acrescentar issues, resolver issues (se existirem), deixar uma sugestão (issue) ou traduzi-lo para outro idioma. Sinta-se à vontade para entrar em contato com os desenvolvedores para conversar, sugerir algo ou apontar algum problema.
A partir desta primeira versão do software educacional pretende-se torná-lo uma webapp e disponibilizá-la no como uma imagem docker, de forma que qualquer pessoa possa facilmente fazer uso da mesma apenas baixando e abrindo em seu browser. Também há uma necessidade de aprimoramento do tradutor para um compilador de fato, possibilitando a visualização de métricas de desempenho e fornecendo erros mais claros e objetivos ao usuário.

