• Labs

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\)

  1. Agora com a equação definida é possível realizarmos uma descrição em VHDL do componente halfadder. Abra o arquivo c_ULA/src/halfadder.vhd e modifique sua arquitetura para implementar a equação do halfadder.
  2. 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:

  1. Extrair a equação do FullAdder
  2. Transcrever para o arquivo: fulladder.vhd
  3. 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