Identificação:
Nome: Gustavo Henrique Gomes Matsushita RA: 79194
Nome: Gustavo Matheus Tófoli RA: 77436
1º Trabalho da Disciplina de Circuitos Digitais II –
Prof. Nardênio Almeida Martins - Ciência da
Computação
Projeto: ULA de 1 bit:
A ULA (Unidade Lógico-Aritmética) é um circuito digital
pelo qual são realizadas as operações lógicas e aritméticas
num processador, tomando decisões lógicas e resolvendo
sintaxes lógicas numa determinada programação. Ela tem um
papel indispensável para o funcionamento de uma CPU (central
de processamentos) e/ou microprocessadores, em sua total
abrangência.
Neste trabalho, a ULA (de 1 bit) projetada possui as
seguintes funções lógicas: AND, NAND, OR, NOR, XOR, XNOR e
também as aritméticas: Somador Completo e Subtrator Completo.
Entretanto ela não se limita a essa quantidade de operações e
muito menos a 1 bit. É possível introduzir mais bits a uma
ULA, assim como outras funções como: inversão, deslocamento
(para esquerda ou para direita), identidade e complemento, e
determinar se uma quantidade é maior, menor ou igual à outra
(comparação).
Para a execução dessas operações ocorre o seguinte
processo: a ULA recebe os dados dos registradores, que são
basicamente células de memória, vindo da unidade de controle
(UC), que decodificam qual operação a ULA deve realizar.
Assim, esses dados são processados e armazenados nos
registradores de saída para serem executados.
Para o projeto de ULA de 1 bit criou-se um circuito
Decodificador, o qual permitiria definir qual das operações
citadas anteriormente deveria ser executada. Analisando as
operações que deveriam ser realizadas, verificou-se que o
decodificador poderia ser desenvolvido de tal forma onde, com
três entradas (E2, E1, E0), cada uma das operações seria
executada uma por vez se, e somente se, determinadas entradas
estiverem ligadas (1) ou desligadas (0), como mostra a tabela
abaixo:
ENTRADAS SAÍDASE2 E1 E0 OPERAÇÃO0 0 0 AND0 0 1 NAND0 1 0 OR0 1 1 NOR1 0 0 XOR1 0 1 XNOR1 1 0 SOMADOR1 1 1 SUBTRATOR
(Tabela 1.1 – Tabela Verdade do Decodificador)
Para a elaboração dos circuitos que realizam as operações
de Somador e Subtrator Completo, foram construídas tabelas
verdade, em seguida, montados os respectivos Mapas de
Karnaught e com isso obter as expressões simplificadas para o
resultado da soma ou subtração (S) e para o Carry Out (Cout),
apresentadas a seguir:
Somador:
(Tabela 1.2 – Tabela Verdade do Somador)
ENTRADAS SAÍDASA B Cin S Cout0 0 0 0 00 0 1 1 00 1 0 1 00 1 1 0 11 0 0 1 01 0 1 0 11 1 0 0 11 1 1 1 1
(Mapa 1.1 – Mapa de Karnaught S do Somador)
S = A B Cin
(Mapa 1.2 – Mapa de Karnaught Cout do Somador)
Cout = AB + BCin + ACin = A(B + Cin) + BCin
Subtrator:
(Tabela 1.3 – Tabela Verdade do Subtrator)
ENTRADAS SAÍDASA B Cin S Cout0 0 0 0 00 0 1 1 10 1 0 1 10 1 1 0 11 0 0 1 01 0 1 0 01 1 0 0 01 1 1 1 1
(Mapa 1.3 – Mapa de Karnaught S do Subtrator)
S = A B Cin
(Mapa 1.4 – Mapa de Karnaught Cout do Subtrator)
Cout = ĀB + BCin + ĀCin = Ā(B + Cin) + BCin
Para fazer com que as saídas da ULA realizassem a operação
desejada de forma correta, utilizou-se duas portas AND, onde
uma primeira com três entradas receberia E2, E1 e E0 de acordo
com a Tabela 1.1, de tal forma que ficaria com o valor lógico
(1) somente quando essa operação fosse selecionada. Já a
segunda, recebe a saída da primeira, além do circuito da
operação aritmética ou da porta lógica, que são formados por
outras duas entradas a serem operadas: A e B. Com isso, devido
ao fato da primeira entrada ser sempre (1) para determinada
operação, o valor resultante dependerá exclusivamente do
circuito das operações aritméticas ou da porta lógica. As
saídas dessas portas AND para as funções lógicas e para a
saída S do Somador/Subtrator, foram ligadas a duas portas OR
de quatro entradas de modo a resultarem em uma única saída
final, como é representado na figura abaixo:
Cout - SUBTRATOR
Cout - SOMADOR
FUNÇÕES LÓGICASS - SOMADOR E SUBTRATOR
Cin0V
B0V
A0V
E00V
E10VE2
0V
U18BU18A
L3
L2
L1
U13D
U13C
U13B
U16A
U15C
U15B
U15A
U14C
U14B
U14A
U8C
U8B
U8A
U13AU11C
U12BU11B
U1D
U12A
U11AU5D
U10C
U10BU5C
U10A
U5B
U7CU7B
U9A
U7A
U6A
U4CU5A
U4AU3A
U2CU2A
U1CU1BU1A
(Figura 1.1 - ULA)
Decodificado r
O decodificador foi desenvolvido através de arquitetura
Comportamental utilizando-se o comando Sequencial CASE WHEN.
Seu código em VHDL foi escrito descrevendo todos os casos de
sua tabela verdade, apresentado na tabela 1.1. Segue abaixo o
código do decodificador:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY Decodificador IS
PORT(E2,E1,E0: IN BIT;
S0,S1,S2,S3,S4,S5,S6,S7: OUT BIT);
END Decodificador;
ARCHITECTURE comportamental OF Decodificador IS
SIGNAL Controle: BIT_VECTOR(2 DOWNTO 0);
SIGNAL Saida: BIT_VECTOR(7 DOWNTO 0);
BEGIN
Controle <= E2&E1&E0;
Process (Controle)
Begin
CASE Controle IS
WHEN "000" => Saida <= "00000001";
WHEN "001" => Saida <= "00000010";
WHEN "010" => Saida <= "00000100";
WHEN "011" => Saida <= "00001000";
WHEN "100" => Saida <= "00010000";
WHEN "101" => Saida <= "00100000";
WHEN "110" => Saida <= "01000000";
WHEN "111" => Saida <= "10000000";
END CASE;
END PROCESS;
S0 <= saida(0);
S1 <= saida(1);
S2 <= saida(2);
S3 <= saida(3);
S4 <= saida(4);
S5 <= saida(5);
S6 <= saida(6);
S7 <= saida(7);
END comportamental;
(Figura 1.2 – Formas de Onda do Decodificador)
Unidade Lógica
A Unidade Lógica contém todas as funções lógicas descritas
anteriormente (AND, NAND, OR, NOR, XOR, XNOR), suas entradas
são A e B, e possui seis saídas (S0, S1, S2, S3, S4, S5), uma
para cada função. Seu código foi escrito com base no resultado
de cada operação para cada estado de entrada.
Utilizou-se arquitetura Comportamental para seu
desenvolvimento com o comando Sequencial IF THEN ELSE. Segue
abaixo o código da unidade lógica em VHDL:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY UnidadeLogica IS
PORT(a,b:IN BIT;
S0,S1,S2,S3,S4,S5:OUT BIT);
-- S0=AND; S1=NAND; S2=OR; S3=NOR; S4=XOR; S5=XNOR;
END UnidadeLogica;
ARCHITECTURE comportamental OF UnidadeLogica IS
BEGIN
PROCESS(a,b)
BEGIN
IF (a='0' AND b='0') THEN
S0<='0'; S1<='1'; S2<='0';
S3<='1'; S4<='0'; S5<='1';
ELSIF (a='0' AND b='1') THEN
S0<='0'; S1<='1'; S2<='1';
S3<='0'; S4<='1'; S5<='0';
ELSIF (a='1' AND b='0') THEN
S0<='0'; S1<='1'; S2<='1';
S3<='0'; S4<='1'; S5<='0';
ELSIF (a='1' AND b='1') THEN
S0<='1'; S1<='0'; S2<='1';
S3<='0'; S4<='0'; S5<='1';
END IF;
END PROCESS;
END comportamental;
(Figura 1.3 – Formas de Onda da Unidade Lógica)
Somador Completo de 1 bit
O Somador Completo de 1 bit foi desenvolvido com
arquitetura de Comportamental usando o comando Concorrente
WITH SELECT WHEN, descrevendo no código qual deve ser a saída
(S e Cout) quando se tem uma dada entrada (A e B), como foi
apresentado na tabela 1.2. Segue abaixo o código do somador:
LIBRARY ieee;
USE ieee.std_logic_1164;
ENTITY Somador IS
PORT(A,B,Cin:IN BIT;
S,Cout: OUT BIT);
END Somador;
ARCHITECTURE comportamental OF Somador IS
SIGNAL entrada:BIT_VECTOR(2 DOWNTO 0);
SIGNAL saida:BIT_VECTOR(1 DOWNTO 0);
BEGIN
entrada <= A&B&Cin;
WITH Entrada SELECT
saida <= "00" WHEN "000",
"10" WHEN "001",
"10" WHEN "010",
"01" WHEN "011",
"10" WHEN "100",
"01" WHEN "101",
"01" WHEN "110",
"11" WHEN "111";
S <= saida(1);
Cout <= saida(0);
END comportamental;
(Figura 1.4 – Formas de Onda do Somador)
Subtrator Completo de 1 bit
Para o desenvolvimento do Subtrator, descrevendo os casos
apresentados anteriormente na tabela 1.3, foi utilizada
arquitetura Comportamental com o comando Concorrente WHEN
ELSE. Segue abaixo o código do Subtrator:
LIBRARY ieee;
USE ieee.std_logic_1164;
ENTITY Subtrator IS
PORT(A,B,Cin:IN BIT;
S,Cout: OUT BIT);
END Subtrator;
ARCHITECTURE comportamental OF Subtrator IS
SIGNAL Entrada : BIT_VECTOR(2 DOWNTO 0);
SIGNAL Saida : BIT_VECTOR(1 DOWNTO 0);
BEGIN
Entrada <= A&B&Cin;
Saida <= "00" WHEN entrada =
"000" ELSE
"11" WHEN entrada = "001" ELSE
"11" WHEN entrada = "010" ELSE
"01" WHEN entrada = "011" ELSE
"10" WHEN entrada = "100" ELSE
"00" WHEN entrada = "101" ELSE
"00" WHEN entrada = "110" ELSE
"11" WHEN entrada = "111";
S <= saida(1);
Cout <= saida(0);
END comportamental;
(Figura 1.5 – Formas de Onda do Subtrator)
Package (Pacote)
O pacote para o desenvolvimento da ULA contém as
declarações de cada componente que vai ser utilizado durante o
código final, sendo esses componentes os desenvolvidos
anteriormente (Decodificador, Unidade Lógica, Somador e
Subtrator), além de uma AND, uma OR de duas entradas e uma OR
de oito entradas. Segue abaixo o código VHDL do pacote:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
PACKAGE ULA_package IS
COMPONENT Decodificador IS
PORT(E2,E1,E0:IN BIT;
S0,S1,S2,S3,S4,S5,S6,S7:OUT BIT);
END COMPONENT;
COMPONENT UnidadeLogica IS
PORT(A,B:IN BIT;
S0,S1,S2,S3,S4,S5:OUT BIT);
END COMPONENT;
COMPONENT Somador IS
PORT(A,B,Cin:IN BIT;
S,Cout:OUT BIT);
END COMPONENT;
COMPONENT Subtrator IS
PORT(A,B,Cin: IN BIT;
S,Cout: OUT BIT);
END COMPONENT;
COMPONENT AND_2 IS
PORT (a,b: in bit;
s:out bit);
END COMPONENT;
COMPONENT OR_2 IS
PORT (a,b: in bit;
s:out bit);
END COMPONENT;
COMPONENT OR_8 IS
PORT (a,b,c,d,e,f,g,h: in bit;
s:out bit);
END COMPONENT;
END ULA_package;
ULA
Para o desenvolvimento e a simulação final da ULA, o código
VHDL foi escrito em uma arquitetura Estrutural com uso de
Componentes, estes componentes são os projetos apresentados
anteriormente e que foram descritos e inseridos no Pacote.
Os três componentes adicionais citados anteriormente: uma
porta AND de duas entradas, uma porta OR de duas entradas e
uma porta OR de oito entradas, foram necessários para
completar o projeto, apresentando corretamente os resultados
esperados.
Devido a algumas limitações do software Circuit Maker
Student, utilizado na elaboração da ULA apresentada na Figura
1.1, como um limite máximo de fios e elementos do circuito, a
ULA desenvolvida no código VHDL apresenta algumas diferenças.
Abaixo temos uma especificação de etapas tomadas para sua
codificação:
Para utilizar o sinal do decodificador para fazer a seleção
das funções adicionou-se ao circuito de cada operação uma
porta AND, onde uma das entradas é o resultado da operação
(s0, s1, s2, s3, s4, s5, s6, s7) e a outra, o sinal do
decodificador ( D0, D1, D2, D3, D4, D5, D6, D7). Desse
modo, todas as operações que não foram selecionadas terão
resultado (0). Como são oito saídas, utilizou-se uma porta OR
de oito entradas, assim a ULA terá apenas uma única Saída.
Para que tenha apenas uma saída do Cout, e para que uma das
operações não interfira na saída Cout quando a outra estiver
selecionada, utilizou-se o mesmo princípio da seleção das
operações, ou seja, uma porta AND ligando o sinal do
decodificador ao Cout. Em seguida, com uma porta OR, entramos
com o sinal Cout do Somador (CoutSom) e o Cout do Subtrator
(CoutSub) tendo uma única saída Cout.
Segue abaixo o código da ULA:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.ULA_package.all;
ENTITY ULA IS
PORT(E2,E1,E0 : IN BIT; -- Controle
A,B : IN BIT; -- Entrada de dados
Cin : IN BIT; -- Cin do Somador/Subtrator
Saida : OUT BIT; -- Saída com o resultado a
função escolhida no controle
Cout : OUT BIT); -- Cout do Somador/Subtrator
END ULA;
ARCHITECTURE estrutural OF ULA IS
SIGNAL D0,D1,D2,D3,D4,D5,D6,D7,
s0, s1, s2, s3, s4, s5, s6, s7, C0, C1,
Sand, Snand, Sor, Snor, Sxor, Sxnor, Ssom,
Ssub,
CoutSub, CoutSom:BIT;
BEGIN
P1 : Decodificador PORT MAP (E2, E1, E0, D0, D1, D2, D3,
D4, D5, D6, D7);
P2 : UnidadeLogica PORT MAP (A, B, s0, s1, s2, s3, s4,
s5);
P3 : Somador PORT MAP (A, B, Cin , s6, C0);
P4 : Subtrator PORT MAP (A, B, Cin , s7, C1);
P5 : and_2 PORT MAP (D0, S0, Sand);
P6 : and_2 PORT MAP (D1, s1, Snand);
P7 : and_2 PORT MAP (D2, s2, Sor);
P8 : and_2 PORT MAP (D3, s3, Snor);
P9 : and_2 PORT MAP (D4, s4, Sxor);
P10: and_2 PORT MAP (D5, s5, Sxnor);
P11: and_2 PORT MAP (D6, s6, Ssom);
P12: and_2 PORT MAP (D7, s7, Ssub);
P13: or_8 PORT MAP (Sand, Snand, Sor, Snor, Sxor, Sxnor,
Ssom, Ssub, Saida);
P14: and_2 PORT MAP (D6,C0 , CoutSom);
P15: and_2 PORT MAP (D7,C1 , CoutSub);
P16: or_2 PORT MAP (CoutSom,CoutSub , Cout);
END estrutural;
(Figura 1.6 – Formas de Onda da ULA)
Referências Bibliográficas:
CAPUANO, FRANCISCO GABRIEL E IDOETA, IVAN V. ELEMENTOS DEELETRÔNICA DIGITAL. EDITORA ERICA, 40a EDICAO, 2006.
GUNTZEL, JOSÉ LUÍS. PROJETO DE UMA UNIDADE LÓGICO-ARITMÉTICA(ULA). INSTITUTO DE FÍSICA E MATEMÁTICA DA UNIVERSIDADEFEDERAL DE PELOTAS, 2003.
PINTO, ROSSANO PABLO. PORTAS LÓGICAS E CIRCUITOS DIGITAIS.SISTEMAS DA COMPUTAÇÃO, 2007.
TOCCI, RONALD; WIDMER, NEAL; MOSS, GREGORY L. SISTEMASDIGITAIS: PRINCÍPIOS E APLICAÇÕES. EDITORA: PEARSON PRENTICEHALL, 10a EDICAO, 2007.
AMORE, ROBERT d’. VHDL: DESCRIÇÃO E SÍNTESE DE CIRCUITOSDIGITAIS. LTC, RIO DE JANEIRO, 2005.