12

Click here to load reader

Unidade Lógica e Aritmética

Embed Size (px)

Citation preview

Page 1: Unidade Lógica e Aritmética

Projeto de uma Unidade Lógica e Aritmética

Giovani Pivato, Valci Costa de Oliveira

Universidade de Caxias do Sul, CARVI, DPEI – Engenharia Elétrica

[email protected], [email protected]

Resumo

Implementação de uma Unidade Lógica Aritmética

usando Linguagem de Hardware VHDL, capaz de

realizar operações pré-determinadas com operandos

de 8 bits.

.

Palavras-chave: ULA, Unidade Lógica, Unidade Aritmética, Unidade Lógica-Aritmética, Mux, Multiplexador, Somador Completo, Subtrator.

1. Introdução

Este artigo tem o propósito de expor a

implementação de uma unidade lógica e aritmética,

usando-se uma linguagem de hardware (VHDL),

através de uma ferramenta computacional (ISE versão

11.1).

A execução do trabalho teve inicio com o estudo e

introdução na linguagem VHDL, sua sintaxe, forma de

estruturação, comandos e suas particularidades por ser

distinta de uma programação usual, como por exemplo,

C++.

Após o estudo da linguagem, verificou-se a forma

de utilização da ferramenta computacional ISE versão

11.1, que permite que estruturas escritas na linguagem

VHDL sejam sintetizadas, simuladas e inseridas em

FPGA’s.

Utilizando a linguagem e a ferramenta já citadas, foi

criada uma entidade que soma 1 bit, após, interligando

esta entidade que soma 1 bit de forma adequada a

linguagem, construiu-se uma entidade de soma 8 bit’s.

Na seqüência, foram criadas uma entidade que

comporta-se como um MUX, uma entidade que

comporta-se como uma unidade aritmética, uma

entidade que comporta-se como uma unidade lógica e

após uma entidade top, que utiliza e interliga todas as

outras entidades citadas, de forma orientada a se

comportar como uma ULA.

Foi simulado o comportamento da ULA na

ferramenta de simulação existente no ISE 11.1,

buscando verificar a assertividade do projeto

executado.

Este artigo tem na seqüência uma breve revisão

teórica, os passos do desenvolvimento, resultados

obtidos, conclusões e os códigos das entidades e

simulações implementados em VHDL, constam no

anexo deste trabalho.

2. Revisão bibliográfica

A linguagem VHDL possibilita descrever em

software o comportamento, funcionalidade de um

elemento de hardware ou até de um sistema físico

inteiro.

Uma entidade (entity) é uma abstração que

descreve um sistema, uma placa, um chip, uma função

ou, até mesmo, uma porta lógica. Na declaração de

uma entidade, descreve-se o conjunto de entradas e

saídas.

Os ports correspondem a pinos e são tratados como

objetos de dados. Pode-se atribuir valores ou obtê-los

de ports. Cada entrada ou saída possui um modo

(mode) de operação. Os modos possíveis são: In, Out,

buffer, inout. Respectivamente, permitem entrada de

dados, saída de dados, saída de dados com

possibilidade de realimentação e a ultima pode

substituir qualquer uma das outras.

A arquitetura de uma entidade pode ser descrita de

três formas distintas, mas que, em geral, conduzem a

uma mesma implementação funcional. As descrições

são: comportamentais, por fluxo de dados ou estrutural.

As regras básicas para formação de nomes são, o primeiro caractere deve ser uma letra, o último não

pode ser underscore, não são permitidos 2 underscores

em seqüência e maiúscula / minúscula são equivalentes.

Os sinais são de vital importância em virtualmente

todos sistemas eletrônicos, podendo transmitir dados

internamente ou externamente ao sistema, assumindo

assim um papel muito importante em VHDL. Os sinais

externos são apresentados na entity e os sinais internos

são apresentados na architecture.

3. Desenvolvimento

Para obter uma ULA com as funcionalidades

demonstradas na tabela 1, foram desenvolvidas seis

entidades em VHDL e interligadas de forma adequada.

Na seqüência será abordado o desenvolvimento de

cada entidade e sua funcionalidade.

Page 2: Unidade Lógica e Aritmética

Tabela1 SEL OPERAÇÃO UNIDADE 0000 Y <= A Aritmética 0001 Y <= B Aritmética 0010 Y <= A +1

COM COUT Aritmética

0011 Y <= B +1 COM COUT

Aritmética

0100 Y <= A + B SEM COUT

Aritmética

0101 Y <= A + B + CIN COM COUT

Aritmética

0110 Y <= A - 1 SEM COUT

Aritmética

0111 Y <= B - 1 SEM COUT

Aritmética

1000 Y <= A and B Lógica 1001 Y <= A or B Lógica 1010 Y <= not A Lógica 1011 Y <= not B Lógica 1100 Y <= A xor B Lógica 1101 Y <= A nand B Lógica 1110 Y <= 1, se A=B, 0

se diferente de B Lógica

1111 Y <= 1 se A>B, 0 se menor ou igual a B

Lógica

A primeira entidade a ser desenvolvida foi

denominada soma1, que tem a funcionalidade de um

somador completo de um bit. A implementação desta

entidade se deu a partir da tabela verdade de um

somador completo, demonstrada na tabela2. Desta,

extraiu-se as equações da saída e do carry-out (cout).

Tabela2 ENTRADAS SAÍDAS A B CIN Y COUT 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

As equações que descrevem a saída Y e o Cout são:

Y <= (A Xor B) Xor Cin; Cout <= ((A and B)or (Cin and (A xor B)));

1ª IMPLEMENTAÇÃO (Entidade ULA)

Através da ferramenta de simulações, foi realizado o

teste de funcionalidade da entidade soma1. Visto ser

uma entidade simples, foi testada toda a tabela verdade

e obteve-se o resultado esperado em todas as

combinações de entrada.

A segunda entidade criada denominou-se soma8,

que tem a funcionalidade de um somador de 8 bit`s. sua

implementação se deu a partir da associação de oito

somadores completos de 1 bit (entidade soma1), como

pode ser observado no código fonte desta entidade

(anexo), as entradas e saídas desta entidade foram

declaradas do tipo std_logic_vector para comportar os

8 bits`s. Os carry-out dos somadores foram ligados

internamente através de sinais, sendo que o carry-out

de saída da entidade corresponde ao carry-out final da

soma de 8 bits.

A entidade soma8 por ser mais complexa e ter 256

possibilidades de entradas distintas, assim, foi testada

por amostragem. Foram inseridos valores de entrada e

verificadas as saídas para os casos testados.

Utilizando-se o somador de 8 bit’s para as

operações que contemplam Carry-out, foi

implementada a entidade Aritmetico, que tem a função

de realizar as operações aritméticas da ULA. As

demais operações, ou seja, aquelas que não

contemplam operações com Carry-out, foram

implementadas diretamente, o que é viabilizado pelo

uso da biblioteca STD_LOGIC_UNSIGNED.

A saída da entidade é controlada por um

multiplexador 8:1, que determina o valor a ser escrito

na saída de acordo com o sinal de seleção que há no

momento, sendo que as três situações em que se utiliza

o componente soma8, estão comutadas, ligadas no sinal

S0.

Também foram utilizados três multiplexadores 2:1,

em cada um das entradas do componente soma8 (SA,

SB, CIN), que tem como objetivo, no caso das entradas

SA e SB, escrever os valores pré-determinados para A

e B nos casos em que há somas do tipo A+1 com

Carry-out. No caso no CIN, o multiplexador tem a

simples função de habilitar o uso do Carry-in na soma,

fato que ocorre somente quando o Sinal de Seleção é

“0101”.

A quarta entidade criada, denominada logic, visa

realizar as operações lógicas da ULA demonstrada na

tabela1.

Partindo-se da tabela, foram extraídas as funções

referentes a cada situação do sinal de seleção, que

foram implementadas através do uso de um

multiplexador 8:1. As situações que demandavam,

além do sinal de seleção, outras condições foram

implementadas com o uso da cláusula AND, ou seja,

Page 3: Unidade Lógica e Aritmética

para que o valor de saída fosse o determinado, as duas

condições deveriam ser atendidas (sinal de seleção

determinado + outra condição).

A quinta entidade denominada MUX, é um

multiplexador 2:1. Tem a simples função de determinar

o valor que será inscrita na saída Y da ULA de acordo

com o primeiro bit(MSB) do sinal de seleção.

Finalmente, a ULA propriamente dita, entidade top,

é uma associação de todas as entidades descritas

anteriormente, tem a função de executar as operações

aritméticas e lógicas e escrever o valor esperado na

saída, de acordo com a tabela1.

Foram utilizados dois sinais internos do tipo

Std_logic_vector de 8 bits, que tem a função de

transportar o sinala de saída da unidade lógica (SL) e

da unidade aritmética(SA) até o multiplexador, que

controla a saída geral da ULA.

Os testes das entidades Aritmético, Logic, Mux e

ULA foram executados exatamente como os testes da

entidade Soma8: fez-se a atribuição dos valores

aleatórios nas entradas e observou-se se as saídas

correspondiam as valores esperados.

2ª IMPLEMENTAÇÃO (Entidade ULA_2)

Após a implementação da ULA, conforme descrito

acima, partiu-se para a implementação de uma solução

alternativa, tendo como objetivo a busca pela solução

mais eficiente, ou seja, que execute as mesmas

operações ocupando menos hardware.

Construiu-se uma nova entidade Arith_2, operador

aritmético alternativo para a ULA. Os componentes

soma1 e soma8 são os mesmos utilizados na entidade

AriTmetico.

A saída da entidade Arith_2 é controlada por um

multiplexador 8:1, que faz a escolha do sinal a ser

escrito no sinal de saída Y da entidade. Assim como na

entidade Aritmético, as operações que não utilizam

Carry-out são executadas diretamente.

No entanto, as operações que envolvem Carry-out

foram implementadas com a utilização de 3 somadores

completos de oito bits, do tipo soma8. Em cada

situação são escritos valores nas estradas do somador,

definidos de acordo com a tabela 1. Foram utilizados 3

sinais do tipo_std_logic_vector de 8 bits, interligados à

saída de cada um dos somadores. O multiplexador

controla a saída a ser habilitada.

Foram utilizados, complementarmente, 2

multiplexadores, sendo um deles detinado a controlar o

valor de entrada no Carry-In, e um destinado a

controlar o valor a ser escrito no Carry-out.

Para viabilizar a utilização dos Três somadores,

foram necessários 5 sinais do tipo std_logic_vector de

8 bits e 4 sinais do tipo std_logic.

O restante da implementação foi idêntica à primeira

descrita, sendo que para a composição da solução

alternativa mudou-se apenas a Unidade Lógica, tendo o

resto da implementação permanecido inalterado.

Para a realização dos testes, foi utilizada a mesma

metodologia descrita na implementação anterior.

4. Resultados obtidos

Os resultados obtidos para os testes de todas as

entidades indicaram que estas atingiram os objetivos,

ou seja, realizaram as operações de forma a que o

resultado obtido nas saídas estivesse de acordo com o

determinado para a tabela de soluções do problema.

Com relação à comparação entre as

implementações, pode-se afirmar que a primeira

implementação apresentou os resultados mais

satisfatórios.

A tabela abaixo apresenta os resultados obtidos: Implementação N° de Slices

utilizados N° de Slices disponíves

Utilização

Implementação

(ULA)

71 4656 1%

Implementação

(ULA_2)

77 1920 4%

A primeira implementação (ULA) utilizou, no total,

13 sinais internos às entidades: 7 – soma8, 4 –

aritmético, 2 – ULA.

A segunda implementação (ULA_2), por sua vez,

utilizou 18 sinais: 7 – soma8, 9 – Arith_2, 2 – ULA.

5. Conclusões

Após o desenvolvimento das duas soluções e

simulação das mesmas, como pode ser observado no

corpo deste trabalho e nos resultados obtidos a

primeira implementação apresenta vantagens em

relação à segunda.

A primeira implementação ocupa uma área de

hardware significativamente menor do que a segunda.

Em relação à funcionalidade, as duas

implementações atendem a tabela verdade proposta

para esta ULA, logo, ficou evidente a possibilidade de

várias e diferentes implementações para solução de um

mesmo problema.

Das soluções desenvolvidas a escolhida foi a

primeira implementação, por se mostrar mais eficiente

na utilização do hardware e por conseqüência, no

desempenho do circuito implementado.

Observa-se também, que a utilização de um número

menor de sinais internos contribuiu para a eficiência da

Page 4: Unidade Lógica e Aritmética

primeira implementação, demonstrando que as

rotinas/estruturas das entidades criadas pelo

programador têm um papel fundamental não só na

questão funcionalidade, mas também, na eficiência e

desempenho que esta implementação terá.

Durante o desenvolvimento deste projeto foram

enfrentadas dificuldades, sobretudo, pelo

desconhecimento das particularidades da linguagem

VHDL e da utilização da ferramenta ISE 11.1.

Pelo exposto ao longo deste trabalho e com base

nos resultados e argumentações já realizadas, entendeu-

se por escolher a primeira implantação da ULA.

Page 5: Unidade Lógica e Aritmética

Anexo 1 – Códigos fonte das implementações

1ª IMPLEMENTAÇÃO

ENTIDADA SOMA1

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Soma1 is

port( A,B,Cin :in std_logic;

Y, Cout: out std_logic);

end Soma1;

architecture Behavioral of Soma1 is

begin

Y <= (A Xor B) Xor Cin;

Cout <= ((A and B)or (Cin and (A xor B)));

end Behavioral;

ENTIDADA SOMA8 library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity soma8 is

Port ( A, B: in std_logic_vector ( 7 downto 0);

Cin: in std_logic;

Cout: out std_logic;

Y : out std_logic_vector ( 7 downto 0));

end soma8;

architecture Behavioral of soma8 is

component soma1 is

port( A,B,Cin :in std_logic;

Y, Cout: out std_logic);

end component soma1;

Signal C0, c1, c2, c3, c4,c5, c6: std_logic;

Begin

somador1: soma1 port map ( A =>A(0), B=>B(0), Cin=>cin, cout=>c0, Y=>Y(0));

somador2: soma1 port map ( A =>A(1), B=>B(1), Cin=>c0, cout=>c1, Y=>Y(1));

somador3: soma1 port map ( A =>A(2), B=>B(2), Cin=>c1, cout=>c2, Y=>Y(2));

somador4: soma1 port map ( A =>A(3), B=>B(3), Cin=>c2, cout=>c3, Y=>Y(3));

somador5: soma1 port map ( A =>A(4), B=>B(4), Cin=>c3, cout=>c4, Y=>Y(4));

Somador6: soma1 port map ( A =>A(5), B=>B(5), Cin=>c4, cout=>c5, Y=>Y(5));

Somador7: soma1 port map ( A =>A(6), B=>B(6), Cin=>c5, cout=>c6, Y=>Y(6));

Somador8: soma1 port map ( A =>A(7), B=>B(7), Cin=>c6, cout=>cout,Y=>Y(7));

end Behavioral;

Page 6: Unidade Lógica e Aritmética

ENTIDADE ARITMETICO

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ARITMETICO is

port( A,B : in std_logic_vector (7 downto 0 );

Cin :in std_logic;

Y: out std_logic_vector ( 7 downto 0);

Cout: out std_logic;

Sel: in std_logic_vector ( 2 downto 0));

End ARITMETICO;

architecture NICE of ARITMETICO is

component soma8 is

Port ( A, B: in std_logic_vector ( 7 downto 0);

Cin: in std_logic;

Cout: out std_logic;

Y : out std_logic_vector ( 7 downto 0));

end COMPONENT soma8;

SIGNAL S0, SA, SB: std_logic_vector (7 downto 0);

SIGNAL SIN: std_logic;

Begin

Y <= A WHEN SEL = "000" ELSE

B WHEN SEL = "001" ELSE

A + B WHEN SEL = "100" ELSE

A - 1 WHEN SEL = "110" ELSE

B-1 WHEN SEL = "111" ELSE

S0;

somador: soma8 port map (A=>SA ,B=> SB, Cin=>Sin, cout=>cout, Y => S0);

SA <= "00000001" WHEN SEL = "011" ELSE

A;

SB <= "00000001" WHEN SEL ="010" ELSE

B;

SIN <= CIN WHEN SEL ="101" ELSE

'0';

end NICE;

ENTIDADE LOGIC

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity logic is

Port (A, B : in std_logic_vector ( 7 downto 0);

Sel : in std_logic_vector ( 2 downto 0);

Y: out std_logic_vector ( 7 downto 0));

end logic;

architecture nova of logic is

begin

Page 7: Unidade Lógica e Aritmética

Y <= A AND B WHEN SEL = "000" ELSE

A OR B WHEN SEL = "001" ELSE

NOT A WHEN SEL = "010" ELSE

NOT B WHEN SEL = "011" ELSE

A XOR B WHEN SEL = "100" ELSE

A NAND B WHEN SEL = "101" ELSE

"00000001" WHEN SEL = "110" AND A = B ELSE

"00000000" WHEN SEL = "110" AND A /= B ELSE

"00000001" WHEN SEL = "111" AND A > B ELSE

"00000000";

end nova;

ENTIDADE MUX

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity mux is

port ( Y_LOGIC: IN std_logic_vector ( 7 downto 0);

Y_ARITH: IN std_logic_vector ( 7 downto 0);

SEL: IN std_logic ;

Y: OUT std_logic_vector (7 downto 0));

end mux;

architecture solar of mux is

begin

Y <= Y_ARITH WHEN SEL = '0' ELSE

Y_LOGIC;

end SOLAR;

ENTIDADE ULA – SOLUÇÃO FINAL

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ULA is

port( A,B : in std_logic_vector ( 7 downto 0);

Cin :in std_logic;

Y: out std_logic_vector (7 downto 0);

Cout: out std_logic;

Sel: in std_logic_vector ( 3 downto 0));

end ULA;

architecture unit of ULA is

COMPONENT LOGIC IS

Port (A, B : in std_logic_vector ( 7 downto 0);

Sel : in std_logic_vector ( 2 downto 0);

Y: out std_logic_vector ( 7 downto 0));

END COMPONENT LOGIC;

Page 8: Unidade Lógica e Aritmética

COMPONENT ARITMETICO IS

port( A,B : in std_logic_vector ( 7 downto 0);

Cin :in std_logic;

Y: out std_logic_vector (7 downto 0);

Cout: out std_logic;

Sel: in std_logic_vector ( 2 downto 0));

END COMPONENT ARITMETICO;

COMPONENT MUX IS

port ( Y_LOGIC: IN std_logic_vector ( 7 downto 0);

Y_ARITH: IN std_logic_vector ( 7 downto 0);

SEL: IN std_logic ;

Y: OUT std_logic_vector (7 downto 0));

END COMPONENT MUX;

SIGNAL SL, SA : STD_LOGIC_VECTOR (7 DOWNTO 0);

begin

UNIDADE_LOGICA: LOGIC PORT MAP ( A => A, B => B, SEL => SEL (2 DOWNTO 0) , Y => SL);

UNIDADE_ARITMETICA: ARITMETICO PORT MAP ( A => A, B=>B, Cin=>cin, COUT=>COUT, Y=> SA,

sel => sel (2 DOWNTO 0));

UNIDADE_MUX: MUX PORT MAP ( Y_LOGIC => SL, Y_ARITH => SA, SEL => SEL(3), Y => Y);

end unit;

2ª IMPLEMENTAÇÃO – SOLUÇÃO ALTERNATIVA DESCARTADA POR COMPROVADAMENTE SER MENOS EFICIENTE

ENTIDADA SOMA1

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Soma1 is

port( A,B,Cin :in std_logic;

Y, Cout: out std_logic);

end Soma1;

architecture Behavioral of Soma1 is

begin

Y <= (A Xor B) Xor Cin;

Cout <= ((A and B)or (Cin and (A xor B)));

end Behavioral;

ENTIDADA SOMA8 library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity soma8 is

Port ( A, B: in std_logic_vector ( 7 downto 0);

Cin: in std_logic;

Page 9: Unidade Lógica e Aritmética

Cout: out std_logic;

Y : out std_logic_vector ( 7 downto 0));

end soma8;

architecture Behavioral of soma8 is

component soma1 is

port( A,B,Cin :in std_logic;

Y, Cout: out std_logic);

end component soma1;

Signal C0, c1, c2, c3, c4,c5, c6: std_logic;

Begin

somador1: soma1 port map ( A =>A(0), B=>B(0), Cin=>cin, cout=>c0, Y=>Y(0));

somador2: soma1 port map ( A =>A(1), B=>B(1), Cin=>c0, cout=>c1, Y=>Y(1));

somador3: soma1 port map ( A =>A(2), B=>B(2), Cin=>c1, cout=>c2, Y=>Y(2));

somador4: soma1 port map ( A =>A(3), B=>B(3), Cin=>c2, cout=>c3, Y=>Y(3));

somador5: soma1 port map ( A =>A(4), B=>B(4), Cin=>c3, cout=>c4, Y=>Y(4));

Somador6: soma1 port map ( A =>A(5), B=>B(5), Cin=>c4, cout=>c5, Y=>Y(5));

Somador7: soma1 port map ( A =>A(6), B=>B(6), Cin=>c5, cout=>c6, Y=>Y(6));

Somador8: soma1 port map ( A =>A(7), B=>B(7), Cin=>c6, cout=>cout,Y=>Y(7));

end Behavioral;

ENTIDADE ARITH_2

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Arith_2 is

port( A,B : in std_logic_vector (7 downto 0 );

Cin :in std_logic;

Y: out std_logic_vector ( 7 downto 0);

Cout: out std_logic;

Sel: in std_logic_vector ( 2 downto 0));

end Arith_2;

architecture alternativa of Arith_2 is

component soma8 is

Port ( A, B: in std_logic_vector ( 7 downto 0);

Cin: in std_logic;

Cout: out std_logic;

Y : out std_logic_vector ( 7 downto 0));

end COMPONENT soma8;

SIGNAL S1, S2, S3, SA1, SB1: std_logic_vector (7 downto 0);

SIGNAL SIN, SOUT1, SOUT2, SOUT3: std_logic;

begin

Y <= A WHEN SEL = "000" ELSE

B WHEN SEL = "001" ELSE

S1 WHEN SEL = "010" ELSE

S2 WHEN SEL = "011" ELSE

Page 10: Unidade Lógica e Aritmética

A + B WHEN SEL = "100" ELSE

S3 WHEN SEL = "101" ELSE

A - 1 WHEN SEL = "110" ELSE

B - 1;

SA1 <= "00000001";

SB1 <= "00000001";

SIN <= CIN WHEN SEL = "101" ELSE

'0';

COUT <= SOUT1 WHEN SEL = "010" ELSE

SOUT2 WHEN SEL = "011" ELSE

SOUT3;

somador1: soma8 port map (A=> A ,B=> SB1, Cin=> Sin, cout=> SOUT1, Y => S1);

somador2: soma8 port map (A=> SA1 ,B=> B, Cin=> Sin, cout=> SOUT2, Y => S2);

somador3: soma8 port map (A=> A ,B=> B, Cin=> Sin, cout=> SOUT3, Y => S3);

end alternativa;

ENTIDADE LOGIC

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity logic is

Port (A, B : in std_logic_vector ( 7 downto 0);

Sel : in std_logic_vector ( 2 downto 0);

Y: out std_logic_vector ( 7 downto 0));

end logic;

architecture nova of logic is

begin

Y <= A AND B WHEN SEL = "000" ELSE

A OR B WHEN SEL = "001" ELSE

NOT A WHEN SEL = "010" ELSE

NOT B WHEN SEL = "011" ELSE

A XOR B WHEN SEL = "100" ELSE

A NAND B WHEN SEL = "101" ELSE

"00000001" WHEN SEL = "110" AND A = B ELSE

"00000000" WHEN SEL = "110" AND A /= B ELSE

"00000001" WHEN SEL = "111" AND A > B ELSE

"00000000";

end nova;

ENTIDADE MUX

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

Page 11: Unidade Lógica e Aritmética

entity mux is

port ( Y_LOGIC: IN std_logic_vector ( 7 downto 0);

Y_ARITH: IN std_logic_vector ( 7 downto 0);

SEL: IN std_logic ;

Y: OUT std_logic_vector (7 downto 0));

end mux;

architecture solar of mux is

begin

Y <= Y_ARITH WHEN SEL = '0' ELSE

Y_LOGIC;

end SOLAR;

ENTIDADE ULA_2

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ULA_2 is

port( A,B : in std_logic_vector ( 7 downto 0);

Cin :in std_logic;

Y: out std_logic_vector (7 downto 0);

Cout: out std_logic;

Sel: in std_logic_vector ( 3 downto 0));

end ULA_2;

architecture alternate of ULA_2 is

COMPONENT LOGIC IS

Port (A, B : in std_logic_vector ( 7 downto 0);

Sel : in std_logic_vector ( 2 downto 0);

Y: out std_logic_vector ( 7 downto 0));

END COMPONENT LOGIC;

COMPONENT ARITH_2 IS

port( A,B : in std_logic_vector ( 7 downto 0);

Cin :in std_logic;

Y: out std_logic_vector (7 downto 0);

Cout: out std_logic;

Sel: in std_logic_vector ( 2 downto 0));

END COMPONENT ARITH_2;

COMPONENT MUX IS

port ( Y_LOGIC: IN std_logic_vector ( 7 downto 0);

Y_ARITH: IN std_logic_vector ( 7 downto 0);

SEL: IN std_logic ;

Y: OUT std_logic_vector (7 downto 0));

END COMPONENT MUX;

SIGNAL SL, SA : STD_LOGIC_VECTOR (7 DOWNTO 0);

begin

Page 12: Unidade Lógica e Aritmética

UNIDADE_LOGICA: LOGIC PORT MAP ( A => A, B => B, SEL => SEL (2 DOWNTO 0) , Y => SL);

UNIDADE_ARITMETICA: ARITH_2 PORT MAP ( A => A, B=>B, Cin=>cin, COUT=>COUT, Y=> SA, sel =>

sel (2 DOWNTO 0));

UNIDADE_MUX: MUX PORT MAP ( Y_LOGIC => SL, Y_ARITH => SA, SEL => SEL(3), Y => Y);

end alternate;