Faça o projeto (Tabela da Verdade e Diagrama Esquemático) de uma ALU de um bit com três entradas de seleção de operação
, que implementa as seguintes oito funções com as duas entradas de dados
e
(além do Vem_Um) (Contemporary Logic Design - Katz e Borriello):
Operação da ALU
0
0
0
0
0
1
menos
0
1
0
menos
0
1
1
mais
1
0
0
XOR
1
0
1
OR B
1
1
0
AND
1
1
1
Vem_Um
Vai_Um
|
|
|
Operação da ALU |
0 | 0 | 0 |
|
0 | 0 | 1 |
|
0 | 1 | 0 |
|
0 | 1 | 1 |
|
1 | 0 | 0 |
|
1 | 0 | 1 |
|
1 | 1 | 0 |
|
1 | 1 | 1 |
|
|
|
|
Vem_Um |
|
|
|
Vai_Um |
Passo 1
Vamos projetar uma ALU de 1 bit cujas entradas são S₂,S₁,S₀ (código de operação), A, B e Vem_Um (Cin), e cujas saídas são Fᵢ e Vai_Um (Cout). O conteúdo é Álgebra Booleana e lógica combinacional, usando um somador completo para as operações aritméticas e portas lógicas para as operações booleanas.
Passo 2
Para realizar adição e subtração com um único somador completo, usamos o truque da representação em complemento a dois. Qualquer operação aritmética pode ser escrita como X + Y + Cin, onde X e Y são A ou suas negações, dependendo de S₁,S₀, e Cin = Vem_Um. O somador completo calcula
Passo 3
Definimos os sinais intermediários para as quatro operações aritméticas (quando S₂=0):
– Se (S₁,S₀)=(0,1) (código 0 0 1 → B−A): X = ¬A, Y = B, Cin = Vem_Um.
– Se (S₁,S₀)=(1,0) (código 0 1 0 → A−B): X = ¬B, Y = A, Cin = Vem_Um.
– Se (S₁,S₀)=(1,1) (código 0 1 1 → A+B): X = B, Y = A, Cin = Vem_Um.
– Se (S₁,S₀)=(0,0) (código 0 0 0 → 0): basta forçar Fᵢ=0 e Vai_Um=0.
– Se (S₁,S₀)=(0,1) (código 0 0 1 → B−A): X = ¬A, Y = B, Cin = Vem_Um.
– Se (S₁,S₀)=(1,0) (código 0 1 0 → A−B): X = ¬B, Y = A, Cin = Vem_Um.
– Se (S₁,S₀)=(1,1) (código 0 1 1 → A+B): X = B, Y = A, Cin = Vem_Um.
– Se (S₁,S₀)=(0,0) (código 0 0 0 → 0): basta forçar Fᵢ=0 e Vai_Um=0.
Passo 4
Para as quatro operações lógicas (quando S₂=1) calculamos em paralelo:
– A XOR B → F₆
– A OR B → F₅
– A AND B → F₄
– constante 1 → F₇
e define-se Vai_Um=0.
– A XOR B → F₆
– A OR B → F₅
– A AND B → F₄
– constante 1 → F₇
e define-se Vai_Um=0.
Passo 5
Usamos então dois multiplexadores 8:1 controlados por (S₂,S₁,S₀). Um MUX8 seleciona Fᵢ entre {0, B−A, A−B, A+B, A⊕B, A∨B, A∧B, 1} e outro MUX8 seleciona Vai_Um entre {0, Cout_{B−A}, Cout_{A−B}, Cout_{A+B}, 0,0,0,0}.
Passo 6
A tabela de seleção condensada fica:
S₂ S₁ S₀ | Fᵢ | Vai_Um
0 0 0 | 0 | 0
0 0 1 | B − A = (¬A+B+Cin) | Cout_{B−A}
0 1 0 | A − B = (¬B+A+Cin) | Cout_{A−B}
0 1 1 | A + B + Cin | Cout_{A+B}
1 0 0 | A ⊕ B | 0
1 0 1 | A ∨ B | 0
1 1 0 | A ∧ B | 0
1 1 1 | 1 | 0
S₂ S₁ S₀ | Fᵢ | Vai_Um
0 0 0 | 0 | 0
0 0 1 | B − A = (¬A+B+Cin) | Cout_{B−A}
0 1 0 | A − B = (¬B+A+Cin) | Cout_{A−B}
0 1 1 | A + B + Cin | Cout_{A+B}
1 0 0 | A ⊕ B | 0
1 0 1 | A ∨ B | 0
1 1 0 | A ∧ B | 0
1 1 1 | 1 | 0
Passo 7
O diagrama esquemático geral é este:
- Entradas A e B passam por inversores controlados por S₁,S₀ para gerar X e Y conforme o caso.
- Um somador completo recebe X, Y e Cin=Vem_Um e produz S_arith e Cout_arith.
- Em paralelo, portas XOR, OR e AND geram S_xor, S_or, S_and, além de um sinal constante 1.
- Dois MUX 8:1 (um para Fᵢ, outro para Vai_Um) recebem os oito sinais aritméticos e lógicos e são controlados por (S₂,S₁,S₀).
Passo 8
Pronto! Tabela da verdade e diagrama esquemático estão definidos de forma modular e reutilizável.
Resposta
Tabela de Seleção (resumida):
S₂ S₁ S₀ | Fᵢ | Vai_Um
0 0 0 | 0 | 0
0 0 1 | B−A = ¬A + B + Cin | Cout_{B−A}
0 1 0 | A−B = A + ¬B + Cin | Cout_{A−B}
0 1 1 | A + B + Cin | Cout_{A+B}
1 0 0 | A ⊕ B | 0
1 0 1 | A ∨ B | 0
1 1 0 | A ∧ B | 0
1 1 1 | 1 | 0
0 0 1 | B−A = ¬A + B + Cin | Cout_{B−A}
0 1 0 | A−B = A + ¬B + Cin | Cout_{A−B}
0 1 1 | A + B + Cin | Cout_{A+B}
1 0 0 | A ⊕ B | 0
1 0 1 | A ∨ B | 0
1 1 0 | A ∧ B | 0
1 1 1 | 1 | 0
Diagrama Esquemático Modular:
+----------------------+
A ------| |
B ---+ | Unidade Arit/Lógica |-- S_arith --+
| | | | +-------+
+--| | +--+-->| MUX8 |-- Fᵢ
Cin=Vem_Um --+ ±---------------------+ | ±------+
|
±---------+ ±------+ ±------+ | ±--------+
A --+ | Porta XOR| | OR | | AND | | | MUX8 |-- Vai_Um
|------>| (A⊕B) | |(A∨B) | |(A∧B) |—±->| seleção | lógica
B --+ ±---------+ ±------+ ±------+ | ±--------+
|
±--------------------------+ |
A --o----| Inversor (seletivo S₁) | |
| ±------------------------+| |
B --o–|-| Inversor (seletivo S₀) |-+ |
| ±------------------------+ |
Cin=Vem_Um ---------------------------------------------+
|
±---------+ ±------+ ±------+ | ±--------+
A --+ | Porta XOR| | OR | | AND | | | MUX8 |-- Vai_Um
|------>| (A⊕B) | |(A∨B) | |(A∧B) |—±->| seleção | lógica
B --+ ±---------+ ±------+ ±------+ | ±--------+
|
±--------------------------+ |
A --o----| Inversor (seletivo S₁) | |
| ±------------------------+| |
B --o–|-| Inversor (seletivo S₀) |-+ |
| ±------------------------+ |
Cin=Vem_Um ---------------------------------------------+
Onde:
– Os inversores aplicam complemento a dois para o somador, conforme explicado.
– O somador completo produz S_arith = X⊕Y⊕Cin e Cout_arith = XY + X Cin + Y Cin.
– Os dois MUX 8:1, controlados por (S₂,S₁,S₀), escolhem entre as oito funções para Fᵢ e entre {0, Cout_{B−A}, Cout_{A−B}, Cout_{A+B}, 0,0,0,0} para Vai_Um.
– Os inversores aplicam complemento a dois para o somador, conforme explicado.
– O somador completo produz S_arith = X⊕Y⊕Cin e Cout_arith = XY + X Cin + Y Cin.
– Os dois MUX 8:1, controlados por (S₂,S₁,S₀), escolhem entre as oito funções para Fᵢ e entre {0, Cout_{B−A}, Cout_{A−B}, Cout_{A+B}, 0,0,0,0} para Vai_Um.