Lab 5: Adders
Antes de começar
Toda vez que um novo projeto começar será necessário realizar algumas configurações no repositório do grupo, vocês devem seguir para o documento: Util/Começando novo Projeto
e depois voltar para esse lab.
- Não seguir sem realizar a etapa anterior.
Half-adder
O half-adder é um dispositivo somador binário que possui duas entradas binárias (a,b) e duas saídas binária (soma dos bits (Soma) e o carry (vaium)). A tabela verdade desse componente é detalhada a seguir:
a | b | Soma | Vaium |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
Com a tabela verdade podemos extrair as duas equações que descreve esse componente: Soma e Vaium.
soma = a xor b
vaium = a and b
Note
Leia a teoria: Aritmética Binaria para mais informações.
Tip 1
\(\bar{a} b + a \bar{b} = a \oplus b\)
- Agora com a equação definida é possível realizarmos uma descrição em
VHDL
do componentehalfadder
. Abra o arquivoc_ULA/src/halfadder.vhd
e modifique sua arquitetura para implementar a equação do halfadder. - Valide a implementação executando o script de testes:
pytest -k halfadder
Implementando
Abra o projeto do Quartus e note que o toplevel
faz uso do halfadder
:
begin
u1 : HalfAdder port map(a => SW(0), b=> SW(1), soma => LEDR(0), vaium => LEDR(1));
------
SW(0) --> a -->| |--> Soma --> LEDR(0)
| HA |
SW(1) --> b -->| |--> Carry --> LEDR(1)
------
toplevel
Tarefa
- Implemente o VHDL
- Compile o projeto
- Gere e analise o RTL
- Programe a FPGA
- Mexa nas chaves, o resultado é o esperado?
Full-Adder
Você deve fazer a mesma coisa com o fulladder:
- Extrair a equação do FullAdder
- Transcrever para o arquivo:
fulladder.vhd
- Testar (
pytest -k fulladder
)
Com o módulo passando nos testes, editar o toplevel
para utilizar no lugar do HalfAdder o FullAdder recém implementando!
begin
u1 : FullAdder port map(a => SW(0), b=> SW(1), c=> SW(2), soma => LEDR(0), vaium => LEDR(1));
end rtl;
Tarefa
- Implemente o VHDL
- Compile o projeto
- Gere e analise o RTL
- Programe a FPGA
- Mexa nas chaves, o resultado é o esperado?
Somador
Agora com o FullAdder (FAD) feito podemos construir um somador mais completo, que soma dois vetores de bits. Para isso iremos precisar de dois FullAdders conectados da seguinte maneira:
x1 y1 ---------- x0 y0 '0'
| | | | | | |
v v v | v v v
---------- | ----------
| a b c | | | a b c |
| | | | |
Carry <--|vaium | <--|vaium |
| soma | | soma |
---------- ----------
| |
v v
s1 s0
Nessa ligação, estamos somando dois vetores de dois bits cada: x(1 downto 0) + y(1 downto 0)
que resulta em uma soma de dois bits: s(1 downto 0)
e um carry
.
Question
Explique o que está acontecendo para o seu colega, você entendeu o porque dessa ligação?
Utilizando port map
construa o circuito anterior, utilize como entrada X as chaves [SW(1) SW(0)]
e como entrada Y as chaves [SW(3) SW(2)]
, para visualizar coloque a saída S nos leds [LEDR(1) LEDR(0)]
e o carry no LEDR(3)
Tarefa
- Implemente o VHDL
- Compile o projeto
- Gere e analise o RTL
- Programe a FPGA
- Mexa nas chaves, o resultado é o esperado?
Tip 2
Você deve utilizar port map
para isso, inicializando dois componentes FullAdder