Vous êtes sur la page 1sur 20

BENEMERITA UNIVERSIDAD AUTONOMA DE PUEBLA

FACULTAD DE CIENCIAS DE LA ELECTRONICA

ARQUITECTURA DE COMPUTADORAS

PRACTICA:
ALU (4 BITS, 8 OPERACIONES BASICAS)

PROFESOR:
RICHARD TORREALBA MELENDEZ

INTEGRANTES: GONZALEZ GONZALEZ ABRIL RUBIN ALVARADO ABEL ALEJANDRO SANCHEZ HERNANDEZ FERNANDO ISRAEL

ALU
La unidad aritmtico lgica, tambin conocida como ALU ( Arithmetic Logic Unit), es un circuito digital que calcula operaciones aritmticas (suma, resta) y operaciones lgicas (OR, AND, XOR, etc), entre dos nmeros binarios. Es parte fundamental de un microprocesador. Los elementos que componen la ALU son los siguientes:

Circuito Operacional: Formado por los circuitos necesarios para la realizacin de las operaciones con los datos procedentes del registro de entrada. Tambin acepta como entrada rdenes para seleccionar el tipo de operacin que debe realizar. Registros de Entradas: Contiene los datos u operandos que intervienen en una instruccin antes de que se realice la operacin por parte del circuito operacional. Tambin se emplea como almacenamiento de resultados intermedios o finales de las operaciones. Registro de Estados: Engloba un conjunto de biestables en los que se deja constancia de condiciones que se dieron en la ltima operacin realizada y que habrn de ser tenidas en cuenta en operaciones posteriores (indicadores de signo, de cero, de desbordamiento, etc.). Registro Acumulador: Contiene los datos que se estn tratando en cada momento. Almacena los resultados de las operaciones realizadas por el circuito operacional. Esta conectado con los registros de entrada para retroalimentacin en el caso de operaciones encadenadas. Tambin tiene conexin directa con los dispositivos de salida para el envi de resultados. La mayora de las acciones de la computadora son realizadas por la ALU. Esta toma datos de los registros del procesador los cuales son procesados y los resultados de esta operacin se almacenan en los registros de salida. Otros mecanismos mueven datos entre estos registros y la memoria . Una unidad de control controla a la ALU, al ajustar los circuitos que le dicen a la ALU qu operaciones realizar. Muchos tipos de circuitos electrnicos necesitan realizar algn tipo de operacin aritmtica, as que incluso el circuito dentro de un reloj digital tendr una ALU minscula que se mantiene sumando 1 al tiempo actual, y se mantiene comprobando si debe activar el pitido del temporizador, etc. Por mucho, los ms complejos circuitos electrnicos son los que estn construidos dentro de los chips de microprocesadores modernos como la familia de los Pentium. Por lo tanto, estos procesadores tienen dentro de ellos un ALU muy complejo y poderoso. De hecho, un microprocesador moderno pueden tener mltiples ncleos, cada ncleo con mltiples unidades de ejecucin, cada una de ellas con mltiples ALU.

OBJETIVO:
Implementar una ALU de manera estructural por medio del lenguaje VHDL, que realice operaciones aritmticas y lgicas bsicas. Realizar las operaciones basicas. Los datos de entrada son de 3 bits adems de contar con signo independiente a las operaciones. El resultado de las operaciones es de 4 bits con su signo. Identificar Acarreo de las operaciones realizadas.

Implementaremos una ALU de 4 bits con un selector de 3 bits que ejecutara 8 operaciones. Basados en el funcionamiento de esta. Se implementara estructuralmente en lenguaje VHDL el funcionamiento de una ALU, se tendr en cuenta un indicador de acarreo , segn el resultado de la operacin ejecutada.

DESARROLLO:
Para que la unidad aritmtica y lgica sea capaz de realizar una operacin aritmtica, se le deben proporcionar, los siguientes datos: 1. 2. 3. 4. 5. El cdigo que indique la operacin a efectuar. La direccin donde est almacenado el primer sumando. La direccin del segundo sumando. La operacin a realizar La direccin de la celda de memoria donde se almacenar el resultado.

Los operandos sern A y B con un cdigo desde la unidad de control indicando qu operacin se realizara. Su salida es el resultado del cmputo de la operacin. En muchos diseos la ALU tambin toma o genera como entradas o salidas un conjunto de cdigos de condicin desde o hacia un registro de estado. Estos cdigos son usados para indicar casos como acarreo entrante o saliente

CODIGO EN VHDL
TOP
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity top is port ( clk :in std_logic; rst :in std_logic; A : in STD_LOGIC_VECTOR (3 downto 0); B : in STD_LOGIC_VECTOR (3 downto 0); op : in STD_LOGIC; signo : in STD_LOGIC_VECTOR (1 downto 0); dato :inout std_logic_vector(7 downto 0); anodos : out std_logic_vector(3 downto 0)); end top; architecture Behavioral of top is component Conta0 is Port ( rst : in STD_LOGIC; op : in STD_LOGIC; opera : inout STD_LOGIC_VECTOR (2 downto 0)); end component; component tim is Port ( rst : in STD_LOGIC; clk50mhz : in STD_LOGIC; clk5ms : inout STD_LOGIC); end component; component Mux4a2 is port ( --Se mandan a llamar los componentes(Conta0,tim --,Mux4a2,MEF)con sus entradas y salidas --Se declaran las entradas y salidas --Librerias a ocupar

opera : in std_logic_vector (2 downto 0); A : in STD_LOGIC_VECTOR (3 downto 0); B : in STD_LOGIC_VECTOR (3 downto 0); signo : in STD_LOGIC_VECTOR (1 downto 0); flag : out STD_LOGIC; res : out std_logic_vector(3 downto 0)); end component; component MEF is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; res : in STD_LOGIC_VECTOR (3 downto 0); flag : in STD_LOGIC; opera : in STD_LOGIC_VECTOR (2 downto 0); an : out STD_LOGIC_VECTOR (3 downto 0); dato : out STD_LOGIC_VECTOR (7 downto 0)); end component; signal cableopera:STD_LOGIC_vector(2 downto 0); signal cableres:std_logic_vector(3 downto 0); signal alambre5ms, cableflag :std_logic; begin CI1 : Conta0 port map (rst,op,cableopera); --Se hacen las conecciones con CI2 : tim port map (rst,clk,alambre5ms); --sus seales antes declaradas --Se declaran los conectores --internos para implementar --el circuito

CI3 : mux4a2 port map (cableopera,a, b,signo,cableflag,cableres); CI4 : mef port map(alambre5ms,rst,cableres,cableflag,cableopera,anodos,dato); end Behavioral; --como se mostrara en la vista RTL

CONTA0
library IEEE; --Se declaran las librerias a usar use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Conta0 is --Se declaran las entradas y salidas de acuerdo a su tipo Port ( rst : in STD_LOGIC; op : in STD_LOGIC; opera : inout STD_LOGIC_VECTOR (2 downto 0)); end Conta0;

architecture Behavioral of Conta0 is

begin --El proceso es un contador que incrementa opera cada vez process (rst,op) begin if rst = '1' then opera <= "000"; -- 1 <= SUMA elsif (op'event and op = '1') then opera <= opera+1; end if; end process; -- 2 <= RESTA -- 3 <= AND -- 4 <= OR -- 5 <= XOR -- 6 <= COMPARADOR A>B end Behavioral; -- 7 <= COMPLEMENTO A 2 (NOT A) -- 8 <= COMPLEMENTO A 1 --que se registra un evento en la seal de entrada op que --va a la el push button el cual indicar la operacion a -- realizar:

TIM
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; --Declaracion librerias

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity tim is salidas Port ( rst : in STD_LOGIC; clk50mhz : in STD_LOGIC; clk5ms : inout STD_LOGIC); end tim;

--Declaracion de seales de reloj con entradas y

architecture Behavioral of tim is signal cuenta,cuenta2:integer; signal i_clk,i_clk2 : std_logic; begin --Declaracion seales internas

process (rst, clk50mhz) begin if(rst='1') then cuenta2 <=0; elsif(clk50mhz'event and clk50mhz='1') then

--El proceso divide la frecuencia --por cada flanco de subida del reloj de 50mhz --de la tarjeta se incrementa cuenta hasta llegar

--al valor 12500000 y hay se activa i_clk if(cuenta2=125000) then cuenta2<=0; i_clk2<='1'; else cuenta2<=cuenta2+1; i_clk2<='0'; end if; end if; end process;

--Seal de reloj de 5 milisegundo

process (rst, i_clk2) begin

--En el proceso se manda la frecuencia de 5ms a clk5ms

if(rst='1') then clk5ms <= '0'; elsif (rising_edge(i_clk2)) then clk5ms <= not clk5ms; end if; end process; end Behavioral;

MUX4a2
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; --Librerias a ocupar en los arreglos

entity Mux4a2 is port (

--Se declaran los puertos de entrada y salida

opera : in std_logic_vector (2 downto 0); A : in STD_LOGIC_VECTOR (3 downto 0); B : in STD_LOGIC_VECTOR (3 downto 0); signo : in STD_LOGIC_VECTOR (1 downto 0); flag : out STD_LOGIC; res : out std_logic_vector(3 downto 0)); end Mux4a2;

architecture Behavioral of Mux4a2 is

signal temp,temp1,temp2 : std_logic_vector(3 downto 0); signal ig, may, men : STD_LOGIC;

begin --1=> 000 SUMA --2=> 001 RESTA --3=> 010 AND LOGICO --4=> 011 OR LOGICO --5=> 100 XOR LOGICO --6=> 101 COMPARACION N1 > N2 --7=> 110 NOT N1 c2 --8=> 111 NOT N1 c1

process (A,B) begin ig <= '0'; may <= '0'; men <= '0'; if (A = B) then ig <= '1'; elsif (A > B) then may <= '1'; else men <= '1'; end if; end process; --Se compara las entradas de signo (igual,mayor,menor)

process (opera) begin case opera is when "000" => if signo = "11" then temp <= A + B ; res <= temp ; --suma --Se efectua la suma mediande los bits, --comparando los signos de entrada --asignando mediante flag la salida del signo

if temp = "0000" then flag <= '0'; else flag <= '1'; end if; elsif signo = "00" then if ig = '1' then temp <= A + B ; res <= temp; flag <= '0'; elsif may = '1' then temp <= (A + B); flag <= '0'; else res <= (B + A); flag <= '0'; end if; elsif signo = "01" then if ig = '1' then res <= (A - B); flag <= '0' ; elsif may = '1' then res <= (A - B); flag <= '0' ; else res <= (B - A); flag <='1'; end if; elsif signo = "10" then if ig = '1' then res <= (B - A);

flag <= '0' ; elsif may = '1' then res <= (A - B); flag <= '1'; else res <= (B - A); flag <= '0'; end if; end if;

when "001" => if signo = "00" then if ig = '1' then

--resta -- Se hace la resta mediante los bits comparando el signo -- de entrada, mediante flag se asigna la salida del signo

temp <= "0000"; res <= temp; flag <= '0'; elsif may = '1' then temp <= A - B; res <= temp ; flag <= '0'; else temp <= B - A; res <= temp; flag <= '1'; end if; elsif signo = "11" then if ig = '1' then temp <= "0000" ; res <= temp;

flag <= '0'; elsif may = '1' then temp <= A - B; flag <= '1'; else res <= (B - A); flag <= '0'; end if; elsif signo = "01" then if ig = '1' then res <= (A + B); flag <= '0' ; elsif may = '1' then res <= (A + B); flag <= '0' ; else res <= (B + A); flag <='0'; end if; elsif signo = "10" then if ig = '1' then res <= (A + B); flag <= '1' ; elsif temp = "0000" then flag <= '0'; elsif may = '1' then res <= (A + B); flag <= '1'; else res <= (B + A); flag <= '1';

end if; end if;

when "010" => temp <= A and B; res <= temp;

--AND LOGICO --Operacion and logica bit a bit

when "011" => res <= A or B;

--OR LOGICO --Operacion or logica bit a bit

when "100" => res <= A xor B;

--XOR LOGICO --Operacion xor logica bit a bit

when "101" =>

--COMPARACION A > B if signo = "00" then --Operacion de comparacion --primero se compara el signo de entrada

if (A > B) then res <= "0001" ; flag <= '0'; elsif (A < B ) then res <= "0000" ; flag <= '0'; elsif (A = B ) then res <= "0000"; flag <= '0'; end if; elsif signo = "11" then if (A > B) then res <= "0000" ; flag <= '0'; elsif (A < B ) then

--y en cada comparacion se va asignando

res <= "0001" ; flag <= '0'; elsif (A = B ) then res <= "0000"; flag <= '0'; end if; elsif signo = "10" then res <= "0001"; flag <= '0'; elsif signo = "01" then res <= "0000"; flag <= '0'; end if;

when "110" => res <= not A;

--NOT N1 c2 --Complemento a 2 de el numero A

when "111" => temp <= not A; res <= temp + '1'; when others => null; end case; end process; end Behavioral;

--NOT N1 c1 --Complemento a 1 de el numero A

MEF

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;

--Declaracion de las librerias usar

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity MEF is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; res : in STD_LOGIC_VECTOR (3 downto 0); flag : in STD_LOGIC;

--Declaracion de los puertos entrada y salida

opera : in STD_LOGIC_VECTOR (2 downto 0); an : out STD_LOGIC_VECTOR (3 downto 0); dato : out STD_LOGIC_VECTOR (7 downto 0)); end MEF;

architecture Behavioral of MEF is signal conta : std_logic_vector (1 downto 0); type estados is (s0,s1,s2,s3); signal presente,siguiente : estados; --Se declara las seales internas a usar

begin

NEXT_STATE_DECODE: process (presente) begin siguiente <= s0; --declare default state for next_state to avoid latches --El proceso nos habilita los display alternando los catodos case (presente) is when s0 => siguiente <= s1; an <= "1110"; --el signo en el display 3 y la operacion a realizar en el display 4 if (res = "0000") then dato <= x"c0"; --con la ayuda de la seal de 5ms para dar un efecto --como si cada display fuera independiente asigandole --el valor de unidad en el display 1, decenas en el display 2

elsif (res = "0001") then dato <= x"F9"; elsif (res = "0010") then dato <= x"A4"; elsif (res = "0011") then dato <= x"B0"; elsif (res = "0100") then dato <= x"99"; elsif (res = "0101") then dato <= x"92"; elsif (res = "0110") then dato <= x"83"; elsif (res = "0111") then dato <= x"f8"; elsif (res = "1000") then dato <= x"80"; elsif (res = "1001") then dato <= x"98"; elsif (res = "1010") then dato <= x"c0"; elsif (res = "1011") then dato <= x"f9"; elsif (res = "1100") then dato <= x"a4"; elsif (res = "1101") then dato <= x"b0"; elsif (res = "1110") then dato <= x"99"; end if; when s1 => siguiente <= s2;

an <= "1101"; if (res >= "1010") then dato <= x"f9"; elsif (res <= "1010") then dato <= x"c0"; end if; when s2 => siguiente <= s3; an <= "1011"; if FLAG = '0' then dato <= x"ff"; elsif FLAG = '1' then dato <= x"bf"; end if; when others => siguiente <= s0; an <= "0111"; if opera = "000" then dato <= x"f9"; elsif opera = "001" then dato <= x"A4"; elsif opera = "010" then dato <= x"b0"; elsif opera = "011" then dato <= x"99"; elsif opera = "100" then dato <= x"92"; elsif opera = "101" then dato <= x"83"; elsif opera = "110" then dato <= x"F8";

elsif opera = "111" then dato <= x"80"; end if; end case; end process; SYNC_PROC: process (rst,clk) Begin --ciclo de contador de anillo para alternar los catodos --con la seal 5ms

if (rst = '1') then presente <= s0; elsif (clk'event and clk = '1') then presente <= siguiente; end if; end process; end Behavioral;

TOP.UCF
NET "A[2]" LOC = E2; NET "A[1]" LOC = F3; NET "A[0]" LOC = G3; NET "anodos[3]" LOC = K14; NET "anodos[2]" LOC = M13; NET "anodos[1]" LOC = J12; NET "anodos[0]" LOC = F12; NET "B[2]" LOC = K3; NET "B[1]" LOC = L3; NET "B[0]" LOC = P11; NET "dato[0]" LOC = L14; NET "dato[1]" LOC = H12; NET "dato[2]" LOC = N14;

NET "dato[3]" LOC = N11; NET "dato[4]" LOC = P12; NET "dato[5]" LOC = L13; NET "dato[6]" LOC = M12; NET "dato[7]" LOC = N13; NET "signo[0]" LOC = B4; NET "signo[1]" LOC = N3; NET "op" LOC = A7; # PlanAhead Generated physical constraints NET "clk" LOC = B8; NET "rst" LOC = G12;

VISTA RTL

BASYS 2:

CONCLUSIONES:
Como parte de nuestra formacin como Licenciados en Ciencias de la Electronica es muy importante conocer, la estructura, construccin y operacin de una unidad aritmtica lgica que es base de los microprocesadores. La elaboracin de la ALU nos permite realizar operaciones Aritmticas simples y lgicas simples de una forma rpida y confiable, ah la importancia de saber programar. En VHDL es un leguaje de descripcin de hardware que nos ofrecen posibilidades infinitas de aplicacin. La labor como Electrnicos es reducir la utilidad de recursos para poder implementar de manera ms fcil, dispositivos tan complejos como esta.

Vous aimerez peut-être aussi