Baixe o app para aproveitar ainda mais
Prévia do material em texto
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 giovanipivato@gmail.com, vcoliveira@rge-rs.com.br 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. 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, 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çãode 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 1ª Implementação (ULA) 71 4656 1% 2° 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 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. 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; 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 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; 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; 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 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; 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 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;
Compartilhar