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.