Escolar Documentos
Profissional Documentos
Cultura Documentos
Relat Rio 2
Relat Rio 2
RELATÓRIO 3
CAMPINAS
2019
Sumário
1 Objetivos 1
2 Procedimentos e Resultados 1
2.1 Atividade 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2.1.1 Complementa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2.1.2 Zera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.3 Soma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Atividade 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Atividade 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4 Atividade 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5 Atividade 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 Conclusões 17
3.1 Conceitos Relembrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Noções Adquiridas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1 Objetivos
O objetivo das atividades feitas são:
1 - Explicar o funcionamento da ULA (Unidade Lógico-Aritmética), hábil em resolver
operações aritméticas básicas com números inteiros em complemento de 2.
2 - Fazer o display da FPGA sinalizar números hexadecimais de 0 até F.
2 Procedimentos e Resultados
Os procedimentos para as atividades consistiram em etapas semelhantes. Em todas,
sem exceção, tivemos de:
1 - Construir a tabela verdade.
2 - Desenhar o mapa de Karnaugh para o obter os circuitos minimizados.
3 - Projetar no Quartus II a expressão calculada.
4 - Testar simulações do tipo .vwf que computam a funcionalidade do circuito.
5 - Testar na placa FPGA Cyclone II o projeto feito
Junto de uma exposição da função de cada bloco construı́do, esses serão os passos que
constarão nos procedimentos das seguintes seções.
2.1 Atividade 1
2.1.1 Complementa
O bloco complementa, basicamente, age transformando as entradas de X ou Y em
complemento de 1, ação esta responsável por negativar o número. Para isso usamos uma
porta XOR que liga as entradas de X ou Y e o complemento (C), que no caso das
atividades posteriores vem do decodificador em forma da booleana ”1”, necessária para
a funcionalidade do bloco. O número binário em complemento de 1 posteriormente, no
1
bloco Soma, soma-se ao binário que não está em complemento e, com a soma do
Carry, obtêm-se como saı́da um número em complemento de 2.
C I3 I2 I1 I0 O3 O2 O1 O0
0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 1 0
0 0 0 1 1 0 0 1 1
0 0 1 0 0 0 1 0 0
0 0 1 0 1 0 1 0 1
0 0 1 1 0 0 1 1 0
0 0 1 1 1 0 1 1 1
0 1 0 0 0 1 0 0 0
0 1 0 0 1 1 0 0 1
0 1 0 1 0 1 0 1 0
0 1 0 1 1 1 0 1 1
0 1 1 0 0 1 1 0 0
0 1 1 0 1 1 1 0 1
0 1 1 1 0 1 1 1 0
0 1 1 1 1 1 1 1 1
1 0 0 0 0 1 1 1 1
1 0 0 0 1 1 1 1 0
1 0 0 1 0 1 1 0 1
1 0 0 1 1 1 1 0 0
1 0 1 0 0 1 0 1 1
1 0 1 0 1 1 0 1 0
1 0 1 1 0 1 0 0 1
1 0 1 1 1 1 0 0 0
1 1 0 0 0 0 1 1 1
1 1 0 0 1 0 1 1 0
1 1 0 1 0 0 1 0 1
1 1 0 1 1 0 1 0 0
1 1 1 0 0 0 0 1 1
1 1 1 0 1 0 0 1 0
1 1 1 1 0 0 0 0 1
1 1 1 1 1 0 0 0 0
2
Figura 1: Mapa K de O3
Figura 2: Mapa K de O2
Figura 3: Mapa K de O1
3
Figura 4: Mapa K de O0
4
Figura 7: Bloco do Complementa
2.1.2 Zera
O bloco Zera tem a função especı́fica de zerar as entradas, como próprio nome diz.
Para a execução desta tarefa, usamos a porta AND, com uma entrada sendo o Z e a
outra os bits requisitados, que no futuro serão os de Y. Toda vez que Z = 0, temos como
saı́da do bloco a booleana 0.
Zy I3 I2 I1 I0 O3 O2 O1 O0
0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0
0 0 0 1 1 0 0 0 0
0 0 1 0 0 0 0 0 0
0 0 1 0 1 0 0 0 0
0 0 1 1 0 0 0 0 0
0 0 1 1 1 0 0 0 0
0 1 0 0 0 0 0 0 0
0 1 0 0 1 0 0 0 0
0 1 0 1 0 0 0 0 0
0 1 0 1 1 0 0 0 0
0 1 1 0 0 0 0 0 0
0 1 1 0 1 0 0 0 0
0 1 1 1 0 0 0 0 0
0 1 1 1 1 0 0 0 0
1 0 0 0 0 0 0 0 0
1 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 1 0
1 0 0 1 1 0 0 1 1
1 0 1 0 0 0 1 0 0
1 0 1 0 1 0 1 0 1
1 0 1 1 0 0 1 1 0
1 0 1 1 1 0 1 1 1
1 1 0 0 0 1 0 0 0
1 1 0 0 1 1 0 0 1
1 1 0 1 0 1 0 1 0
1 1 0 1 1 1 0 1 1
1 1 1 0 0 1 1 0 0
1 1 1 0 1 1 1 0 1
1 1 1 1 0 1 1 1 0
1 1 1 1 1 1 1 1 1
5
Pela explicação dada acima, torna-se trivial que as expressões booleanas sejam:
O3 = Zy.I3
O2 = Zy.I2
O1 = Zy.I1
O0 = Zy.I0
2.1.3 Soma
O bloco Soma age somando as 8 entradas e trazendo a tona 8 saı́das, os quais S[3..0]
representam os bits da soma e Z, N, V, C são indicações (flags) de quando a soma
equivale a zero (Z), a soma dá um número negativo (N), quando há overflow (V) e, por
último, quando a soma produz um carry-out (C).
Para isso usamos 4 Full-Adder, são eles os responsáveis por somar os 2 ”nibbles”.
Já os Flags têm a função de sinalizar quando alguma das situações supracitadas
ocorrem.
6
Figura 11: Full-Adder acoplado (Ai = Xi e Bi = Yi)
Xi Yi Cin S C
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
7
S[3] S[2] S[1] S[0] Z
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 0 1 1 0
0 1 0 0 0
0 1 0 1 0
0 1 1 0 0
0 1 1 1 0
1 0 0 0 0
1 0 0 1 0
1 0 1 0 0
1 0 1 1 0
1 1 0 0 0
1 1 0 1 0
1 1 1 0 0
1 1 1 1 0
Pela falta de necessidade de um mapa K e pela auto evidência, temos que a função
booleana é igual a:
Z = (S[3] + S[2] + S[1] + S[0])’
Para a saı́da N utiliza-se o bit mais significativo que indica o sinal do número que está
representado na saı́da. No caso ele é dado por S[3], portanto ligamos ele diretamente a
saı́da N:
N = S[3]
A flag V tem função de detectar quando a soma de dois números positivos resultam em
um número negativo ou quando a soma de dois números negativos resultam em um
número positivo. Isso se tornou possı́vel em nosso circuito através desta expressão
booleana:
8
Figura 14: Mapa K de V
V = S[3].X[3]’.Y[3]’ + S[3]’.X[3].Y[3]
9
2.2 Atividade 2
A Atividade 2 nos introduziu o módulo Decodifica, que possui 3 entradas que juntas
formam o Código de Operação, que selecionará a operação que deverá ser executada
pela ULA. Seguindo as instruções da tabela abaixo, escolhemos um RA da dupla, sendo
o RA escolhido o meu, cujo número é 237561 e fizemos os cálculos.
Função f2 f1 f0
ADD 0 0 1
SUB 0 1 0
CMX 0 1 1
CSX 1 0 0
Podemos, assim, fazer a tabela verdade, os mapas e, por fim, o circuito que deu
origem ao bloco Decodifica.
f2 f1 f0 Cx Cy Zy Carry
0 0 0 x x x x
0 0 1 0 0 1 0
0 1 0 0 1 1 1
0 1 1 1 0 0 0
1 0 0 1 0 0 1
1 0 1 x x x x
1 1 0 x x x x
1 1 1 x x x x
10
Figura 19: Mapa K de Cx
11
As funções booleanas são:
Cx = f2 + f1 .f0
Cy = f2 ’.f0 ’
Zy = f2 ’.(f1 ’ + f0 ’)
Carry = f0 ’
2.3 Atividade 3
A atividade 3 foi a atividade responsável por aglutinar os blocos antes compostos em
uma unidade lógico-aritmética. Seguem as imagens e testes da ULA no software
Quartus:
12
Figura 26: Testes requeridos no moodle
2.4 Atividade 4
A quarta tarefa propunha criarmos um decodificador que alimentasse o display da
FPGA afim de reproduzir os números binários setados em números hexadecimais de 0 a
F considerando no projeto a atividade dos leds em BAIXO. Fizemos as seguintes tabelas
baseando-se na imagem:
13
Figura 30: Display Hexadecimal
14
Figura 35: Mapa K de 3
15
Figura 39: Circuito do decodificador Hexadecimal
2.5 Atividade 5
Implementamos, conforme pedido, um circuito para a entrada de dados na ULA e a
visualização das operações nos displays de 7 segmentos (números) e leds (bits de
condição). Com os displays HEX3, HEX2, HEX1 e HEX0 mostramos os valores de X, Y
e resultado, respectivamente. Os bits de condição Z, N, V, C foram mostrados,
respectivamente, nos leds LEDG[3], LEDG[2], LEDG[1] e LEDG[0]. Para o código da
operação usamos SW[2] a SW[0], para X, as chaves SW[6] a SW[3] e KEY[3] a KEY[0]
para Y. Após isso realizamos novamente os testes e seguem os resultados:
16
Figura 41: Circuito
3 Conclusões
3.1 Conceitos Relembrados
Lembramos, a partir da atividade a parte referente aos somadores e decodificadores.
Inovamos bastante ao uni-los em um só circuito.
17