0% acharam este documento útil (0 voto)
304 visualizações13 páginas

Projeto de CPU em Assembly para FPGA

Este relatório descreve um projeto desenvolvido para um laboratório de sistemas digitais que consiste em implementar um programa em assembly para controlar uma CPU simplificada em uma FPGA. O programa recebe 6 números digitados pelo usuário, os ordena de forma crescente usando o algoritmo bubble sort, e verifica se satisfazem três condições: serem maiores que 10, menores que 128 e pares sequenciais.

Enviado por

Lucas Samofalov
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
304 visualizações13 páginas

Projeto de CPU em Assembly para FPGA

Este relatório descreve um projeto desenvolvido para um laboratório de sistemas digitais que consiste em implementar um programa em assembly para controlar uma CPU simplificada em uma FPGA. O programa recebe 6 números digitados pelo usuário, os ordena de forma crescente usando o algoritmo bubble sort, e verifica se satisfazem três condições: serem maiores que 10, menores que 128 e pares sequenciais.

Enviado por

Lucas Samofalov
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Modelo para capa dos relatórios

Centro Universitário FEI

EL 7430 / NE 8430 – Projeto 1 de sistemas digitais III – Laboratório

Prof.: Valter Fernandes Avelino Turma: 720

Data de entrega: 13 / 04 / 2021

Relatório:  ACEITO  RECUSADO  CORRIGIR

Projeto 1 de sistemas digitais III – Sistema modelado em assembly para atender


uma certa exigencia

NOMES NÚMEROS

1. Lucas Samofalov Diniz 122180144


1. Objetivos
O microprocessador, geralmente chamado apenas de processador, é um circuito integrado que realiza as
funções de cálculo e tomada de decisão de um computador. Todos os computadores e equipamentos
eletrônicos baseiam-se nele para executar suas funções, podemos dizer que o processador é o cérebro do
computador por realizar todas estas funções. O próprio microprocessador subdivide-se em várias unidades,
trabalhando em altas frequências. A ULA (Unidade Lógica e Aritmética), unidade responsável pelos cálculos
aritméticos e lógicos e os registradores são parte integrante do microprocessador.
O projeto consiste no desenvolvimento de um programa (firmware) para uma CPU simplificada,
implementada em uma FPGA e especificada em RTL (Register Transfer Level). Essa CPU é composta de
memória de dados, memória de programa que armazena as instruções em linguagem de máquina, registradores
de dados, I/O de entrada e saída de 8 bits cada, uma Unidade Lógica Aritmética (ALU), uma máquina de
estados que gerencia o sequenciamento das operações e o relógio de tempo que sincroniza e gera os ciclos de
máquina. O objetivo é a familiarização em implementação RTL e introdução à Unidade Central de
Processamento (CPU) de sistemas digitais programáveis. A seguir temos uma imagem que representa o nosso
processador, a imagem foi retirada do material de laboratório.

Figura 1: Esquema RTL de forma Macro da CPU.

2. Parte Experimental
O professor de laboratório solicitou que cada dupla de alunos fizessem um tipo de combinação diferente, e
para isso, iremos considerar o seguinte:
D. Se os N números são sequenciais pares e maiores que um valor definido (≠ de 0), sendo que o menor valor
não pode ultrapassar 128. Exemplo: p/ N=5 => 26, 28, 24, 22, 30 (para valores > 15)
Então, os parâmetros definidos pelo professor foi: 6 números, maiores que 0A e o menor valor precisa ser
menor que 80h
A etapa a seguir explicara cada etapa do fluxograma, por isso ele será divido em algumas partes.
Fluxograma:

Aqui é a etapa inicial, onde alocamos alguns registradores para nos auxiliares, depois desses números, o
código irá pedir o primeiro valor para o usuário, após um run, ele aparecerá nos Led’s o valor digitado e isso
se repetirá 6 vezes.
A próxima etapa é a de ordenação dos números para uma melhor comparação dos dados e ela é feita da
seguinte forma, inserimos valores constantes para os registradores do fluxograma, essa etapa de ordenação se
chama “bubble sort”, para ser feito esse algoritmo, consideramos N-1, onde N é a quantidade de números,
porém, resolvemos fazer com que a instrução só fosse falsa, quando acontecesse um flag negativo na ula.
Sendo assim, o programa verifica se R6 é maior que R7, caso seja, haverá a troca de valores entre registradores,
isto é, o que estava em R6 vai para o R7 e R7 vai para o R6, caso essa condição não seja verdadeira, então
nada acontece isso se repetirá para todos os números, e no final, ele volta par o registrador contator (R3), e
assim, saímos com os números ordenados.

Feito a ordenação, agora faremos 3 testes, veremos se o menor valor é maior que 10 porque se o esse
resultado for True, então todos os números serão maiores, e o mesmo raciocínio foi feito para checar se o
menor valor é menor que 128, caso algumas dessas condições sejam falsas, então o programa encerra
aparecendo AAh nos leds assim chegamos ao teste de paridade.
E por fim, iremos checar se os números são uma sequencia par, para isso, usamos um registrador auxiliar com
o valor 2, somamos ao registrador menor, para que ele se torne o mesmo valor que R7, fizemos uma subtração,
caso seja 0 então eles são uma sequencia e a mesma coisa é feita para os seguintes, caso seja falso alguma
delas, então aparece AAh nos led’s, caso seja verdadeira, então todas as condições são cumpridas e assim, F0h
é colocado nos led’s e o programa finaliza.

Código assembly, linguagem de máquina e código hexadecimal


MVI R0, FF ----------------- 0: 0100 0000 1111 1111 =>x"40ff"
MVI R1, AA ----------------- 1: 0100 0001 1010 1010 =>x"41aa"
MVI R2, F0 ----------------- 2: 0100 0010 1111 0000 =>x"42f0"
IN R6, CH ----------------- 3: 0010 0110 0000 0000 =>x"2600"
HALT ----------------- 4: 1111 0000 0000 0000 =>x"f000"
OUT LED, R6 ---------------- 5: 0011 0110 0000 0000 =>x"3600"
MOV 19, R6 ---------------- 6: 0001 0110 0001 1001 =>x"1619"
IN R7, CH ---------------- 7: 0010 0111 0000 0000 =>x"2700"
HALT ---------------- 8: 1111 0000 0000 0000 =>x"f000"
OUT LED, R7 ---------------- 9: 0011 0111 0000 0000 =>x"3700"
MOV 1A, R7 --------------- 10: 0001 0111 0001 1010 =>x"171A"
IN R8, CH --------------- 11: 0010 1000 0000 0000 =>x"2800"
HALT --------------- 12: 1111 0000 0000 0000 =>x"f000"
OUT LED, R8 ---------------13: 0011 1000 0000 0000 =>x"3800"
MOV 1B, R8 --------------- 14: 0001 1000 0001 1011 =>x"181b"
IN R9, CH --------------- 15: 0010 1001 0000 0000 =>x"2900"
HALT --------------- 16: 1111 0000 0000 0000 =>x"f000"
OUT LED, R9 ------------- 17: 0011 1001 0000 0000 =>x"3900"
MOV 1C, R9 -------------- 18: 0001 1001 0001 1100 =>x"191c"
IN R10, CH --------------- 19: 0010 1010 0000 0000 =>x"2a00"
HALT --------------- 20: 1111 0000 0000 0000 =>x"f000"
OUT LED, R10 -------------- 21: 0011 1010 0000 0000 =>x"3a00"
MOV 1D, R10 -------------- 22: 0001 1010 0001 1101 =>x"1a1d"
IN R11, CH -------------- 23: 0010 1011 0000 0000 =>x"2b00"
HALT -------------- 24: 1111 0000 0000 0000 =>x"f000"
OUT LED, R11 -------------- 25: 0011 1011 0000 0000 =>x"3b00"
MOV 1E, R11 -------------- 26: 0001 1011 0001 1110 =>x"1b1e"
HALT -------------- 27: 1111 0000 0000 0000 =>x"f000"
OUT LED, RO ----------------28: 0011 0000 0000 0000 =>x"3000"
HALT ---------------- 29: 1111 0000 0000 0000 =>x"F000"
MVI R3, O5 -------------------- 30: 0100 0011 0000 0101 =>x"4305"
MVI R4, 01 -------------------- 31: 0100 0100 0000 0001 =>x"4401"
MVI R5, 00 -------------------- 32: 0100 0101 0000 0000 =>x"4500"
MVI R12, 00 ------------------- 33: 0100 1100 0000 0000 =>x"4C00"
MVI R0, 00 ------------------- 34: 0100 0000 0000 0000 =>x"4000"
P1: SUB R3, R3, R4 35: 0110 0011 0011 0100 =>x"6334"
JUMPF 36: 1101 0000 0000 0000 =>x"d000"
GOTO P2 37: 1011 0000 0010 0111 =>x"b027"
GOTO P11 38: 1011 0000 0100 1111 =>x"b04f"
P2: SUB R5, R6, R7 39: 0110 0101 0110 0111 =>x"6567"
JUMPF 40: 1101 0000 0000 0000 =>x"d000"
GOTO TROCA-1 41: 1011 0000 0010 1011 =>x"b02b"
GOTO P3 42: 1011 0000 0010 1111 =>x"b02f"
TROCA-1: ADD R12, R6, R0 43: 0101 1100 0110 0000 =>x"5c60"
ADD R6, R7, R0 44: 0101 0110 0111 0000 =>x"5670"
ADD R7, R12, R0 45: 0101 0111 1100 0000 =>x"57c0"
GOTO P3 46: 1011 0000 0010 1111 =>x"b02f"

P3: SUB R5, R7, R8 47: 0110 0101 0111 1000 =>x"6578"
JUMPF 48: 1101 0000 0000 0000 =>x"d000"
GOTO TROCA-2 49: 1011 0000 0011 0011 =>x"b033"
GOTO P4 50: 1011 0000 0011 0111 =>x"b037"
TROCA-2: ADD R12, R7, R0 51: 0101 1100 0111 0000 =>x"5c70"
ADD R7, R8, R0 52: 0101 0111 1000 0000 =>x"5780"
ADD R8, R12, R0 53: 0101 1000 1100 0000 =>x"58c0"
GOTO P4 54: 1011 0000 0011 0111 =>x"b037"
P4: SUB R5, R8, R9 55: 0110 0101 1000 1001 =>x"6589"
JUMPF 56: 1101 0000 0000 0000 =>x"d000"
GOTO TROCA-3 57: 1011 0000 0011 1011 =>x"b03b"
GOTO P5 58: 1011 0000 0011 1111 =>x"b03f"
TROCA-3: ADD R12, R8, R0 59: 0101 1100 1000 0000 =>x"5c80"
ADD R8, R9, R0 60: 0101 1000 1001 0000 =>x"5890"
ADD R9, R12, R0 61: 0101 1001 1100 0000 =>x"59c0"
GOTO P5 62: 1011 0000 0011 1111 =>x"b03f"
P5: SUB R5, R9, R10 63: 0110 0101 1001 1010 =>x"659a"
JUMPF 64: 1101 0000 0000 0000 =>x"d000"
GOTO TROCA-4 65: 1011 0000 0100 0011 =>x"b043"
GOTO P6 66: 1011 0000 0100 0111 =>x"b047"
TROCA-4: ADD R12, R9, R0 67: 0101 1100 1001 0000 =>x"5c90"
ADD R9, R10, R0 68: 0101 1001 1010 0000 =>x"59a0"
ADD R10, R12, R0 69: 0101 1010 1100 0000 =>x"5ac0"
GOTO P6 70: 1011 0000 0100 0111 =>x"b047"

P6: SUB R5, R10. R11 71: 0110 0101 1010 1011 =>x"65ab"
JUMPF 72: 1101 0000 0000 0000 =>x"d000"
GOTO TROCA-5 73: 1011 0000 0100 1011 =>x"b04b"
GOTO P1 74: 1011 0000 0010 0011 =>x"b023"
TROCA-5: ADD R12, R10, R0 75: 0101 1100 1010 0000 =>x"5ca0"
ADD R10, R11, R0 76: 0101 1010 1011 0000 =>x"5ab0"
ADD R11, R12, R0 77: 0101 1011 1100 0000 =>x"5bc0"
GOTO P1 78: 1011 0000 0010 0011 =>x"b023"
P11: MVI, R3, 00 79: 0100 0011 0000 0000 =>x"4300"
MVI, R4, 0A 80: 0100 0100 0000 1010 =>x"440A"
MVI, R5, 80 81: 0100 0101 1000 0000 =>x"4580"

SUB, R3, R6, R4 82: 0110 0011 0110 0100 =>x"6364"


JUMPF 83: 1101 0000 0000 0000 =>x"D000"
GOTO P13 84: 1011 0000 0101 0110 =>x"B056"
GOTO P15 85: 1011 0000 0111 1011 =>x"B07B"

P13: SUB R3, R5, R6 86: 0110 0011 0101 0110 =>x"6356"
JUMPF 87: 1101 0000 0000 0000 =>x"D000"
GOTO P14 88: 1011 0000 0101 1010 =>x"B05A"
GOTO P15 89: 1011 0000 0111 1011 =>x"B07B"
P14: MVI R3, 01 90: 0100 0011 0000 0001 =>x"4301"
MVI R4, 00 91: 0100 0100 0000 0000 =>x"4400"
AND R4, R6, R3 92: 0111 0100 0110 0011 =>x"7463"
JUMPZ 93: 1110 0000 0000 0000 =>x"E000"
GOTO P15 94: 1011 0000 0111 1011 =>x"B07B"
GOTO P16 95: 1011 0000 0110 0000 =>x"B060"
P16: MVI R3, 02 96: 0100 0011 0000 0010 =>x"4302"
MVI R5, 00 97: 0100 0101 0000 0000 =>x"4500"
ADD R6, R6, R3 98: 0101 0110 0110 0011 =>x"5663"
SUB R5, R6, R7 99: 0110 0101 0110 0111 =>x"6567"
JUMPZ 100: 1110 0000 0000 0000 =>x"E000"
GOTO P15 101: 1011 0000 0111 1011 =>x"B07B"
GOTO P17 102: 1011 0000 0110 0111 =>x"B067"
P17: ADD R7, R7, R3 103: 0101 0111 0111 0011 =>x"5773"
SUB R5, R7, R8 104: 0110 0101 0111 1000 =>x"6578"
JUMPZ 105: 1110 0000 0000 0000 =>x"E000"
GOTO P15 106: 1011 0000 0111 1011 =>x"B07B"
GOTO P18 107: 1011 0000 0110 1100 =>x"B06C"
P18: ADD R8, R8, R3 108: 0101 1000 1000 0011 =>x"5883"
SUB R5, R8, R9 109: 0110 0101 1000 1001 =>x"6589"
JUMPZ 110: 1110 0000 0000 0000 =>x"E000"
GOTO P15 111: 1011 0000 0111 1011 =>x"B07B"
GOTO P19 112: 1011 0000 0111 0001 =>x"B071"
P19: ADD R9, R9, R3 113: 0101 1001 1001 0011 =>x"5993"
SUB R5, R9, R10 114: 0110 0101 1001 1010 =>x"659A"
JUMPZ 115: 1110 0000 0000 0000 =>x"E000"
GOTO P15 116: 1011 0000 0111 1011 =>x"B07B"
GOTO P20 117: 1011 0000 0111 0110 =>x"B076"

P20: ADD R10, R10, R3 118: 0101 1010 1010 0011 =>x"5AA3"
SUB R5, R10, R11 119: 0110 0101 1010 1011 =>x"65AB"
JUMPZ 120: 1110 0000 0000 0000 =>x"E000"
GOTO P15 121: 1011 0000 0111 1011 =>x"B07B"
GOTO P21 122: 1011 0000 0111 1101 =>x"B07D"
P15: OUT LED, R1 123: 0011 0001 0000 0000 =>x"3100"
HALT 124: 1111 0000 0000 0000 =>x"f000"
P21: OUT LED, R2 125: 0011 0010 0000 0000 =>x"3200"
HALT 126: 1111 0000 0000 0000 =>x"f000"

3. Resultados e Discussão
Depois de todo o discutido, podemos finalmente mostrar as formas de onda, primeiramente foi simulado
uma situação onde os apenas um numero esteja errado, para testar se o programa detecta que estamos chegando
numa sequência numérica e par.
Agora a seguir, iremos mostrar uma simulação completa para o caso dos números serem uma sequência par,
porém, vamos deixa-lo de forma desorganizada, para mostrar o algoritmo do buble sort funcionando.
4. Conclusões
Pela simulação apresentada, podemos perceber o pleno funcionamento do código em assembly, executando
assim a tarefa que foi designada perfeitamente. A parte mais difícil e complicado de todo o projeto foi criar
um arquivo correto que executasse corretamente o código, pois diversas vezes não aparecia resultados ou o
programa simplesmente rodava simulações anteriores, foram feitas muitas vezes até ficar satisfatório, outra
parte que demanda bastante tempo é a transformação do código assembly para o código de máquina.
No mais, o projeto ocorreu sem maiores dificuldades.

Você também pode gostar