Beruflich Dokumente
Kultur Dokumente
de las unidades que forman parte de la Unidad Central de Procesos (es decir, del Procesador,
Microprocesador o CPU Central Processor Unit, por sus siglas en ingls) mediante la cual es
posible realizar una gran cantidad de operaciones aritmticas bsicas (Suma, Resta, Divisin y
Multiplicacin) adems de realizar algunas operaciones Lgicas (Yes, Or, Not, And Es decir, si; y,
o, no) entre dos nmeros o dos conjuntos de nmeros.
Estructura Bsica
Las cuatro entradas de A se combinan con las de B generando una operacin de salida de cuatro
bits en F. La entrada de seleccin de modo S2 distingue entre las operaciones aritmticas y lgicas.
Las entradas de seleccin S0 y S1 determinan la operacin aritmtica o lgica. Con las entradas S0
y S1 se pueden elegir cuatro operaciones aritmticas. Los acarreos de entrada y salida tienen
sentido nicamente en las operaciones aritmticas. El diseo de una ALU implica el diseo de la
seccin aritmtica, la seccin lgica y la modificacin de la seccin aritmtica para realizar las
operaciones aritmticas y lgicas.
No todas las unidades centrales de procesamiento tienen una FPU dedicada. En ausencia de FPU,
la CPU puede utilizar programas en microcdigo para emular una funcin en coma flotante a
travs de la unidad aritmtico lgica (ALU), la cual reduce el coste del hardware a cambio de una
sensible prdida de velocidad.
Seccin Lgica
Los datos de entrada en una operacin lgica son manipulados en forma separada y los bits son
tratados como variables binarias. En la tabla se listan cuatro operaciones lgicas OR, OR -
Exclusiva, AND y NOT. En el circuito, las dos lneas de seleccin (S1, S0) permiten seleccionar una
de las compuertas de entrada, correspondientes a la funcin Fi.
Seccin Aritmtica
Cabe resaltar, que una unidad aritmtica lgica debe procesar nmeros usando el mismo formato
que el resto del circuito digital. Hoy en da, este formato para los procesadores modernos, casi
siempre es la representacin del nmero binario de complemento a dos, es decir, el complemento
de dos de un nmero N que expresado en el sistema binario est compuesto por n dgitos. Las ALU
para cada uno de estos sistemas numricos mostraban diferentes diseos, lo cual influencio la
preferencia actual por el complemento a dos, debido a que sta es la representacin ms simple
para el circuito electrnico de la ALU para cualquier adicin y sustraccin, entre otros tipos de
operaciones matemticas.
Tambin, las unidades de aritmtica lgicas pueden realizar operaciones como operaciones
aritmticas de nmeros enteros (adicin, sustraccin, en algunos casos multiplicacin y divisin),
operaciones lgicas de bits (AND, NOT, OR, XOR, XNOR), operaciones de desplazamiento de bits
(los cuales son interpretados como multiplicaciones o divisiones por 2). Adems, los profesionales
como los ingenieros pueden disear una ALU para as calcular cualquier operacin sin importar lo
compleja que sea, de modo que el problema es que cuanto ms compleja sea la operacin ser
ms costosa la ALU, ya que a la vez usara ms espacio en el procesador y ms energa disipara. En
conclusin, las entradas de unidad aritmtica lgica son los datos en los que se harn las
operaciones llamados operandos y un cdigo de control indicando que operacin desea realizar el
usuario.
Sumador
entity Sum4Bits is
port(
A_in: in std_logic_vector (3 downto 0);
B_in: in std_logic_vector (3 downto 0);
S_out: out std_logic_vector (4 downto 0)
);
end Sum4Bits;
begin
process(A_in, B_in)
--=========================================================
variable Cin: std_logic_vector(2 downto 0);
variable Cout: std_logic;
variable A: std_logic_vector (3 downto 0);
variable B: std_logic_vector (3 downto 0);
variable S: std_logic_vector (4 downto 0);
--=========================================================
begin
A:= A_in;
B:= B_in;
port(
A_in: in std_logic_vector (3 downto 0);
B_in: in std_logic_vector (3 downto 0);
S_out: out std_logic_vector (4 downto 0)
);
end;
begin
process(A_in, B_in)
--==============================================================
variable Cin: std_logic_vector(4 downto 0);
variable A: std_logic_vector (3 downto 0);
variable B: std_logic_vector (3 downto 0);
variable S: std_logic_vector (4 downto 0);
--==============================================================
begin
A := A_in;
B := B_in;
Cin(0) := '0';
--==============================================================
S(0) := (A(0) xor B(0)) xor Cin(0);
Cin(1) := (not(A(0) xor B(0)) and Cin(0)) or (not A(0) and B(0));
--==============================================================
S(1) := (A(1) xor B(1)) xor Cin(1);
Cin(2) := (not(A(1) xor B(1)) and Cin(1)) or (not A(1) and B(1));
--==============================================================
S(2) := (A(2) xor B(2)) xor Cin(2);
Cin(3) := (not(A(2) xor B(2)) and Cin(2)) or (not A(2) and B(2));
--==============================================================
S(3) := (A(3) xor B(3)) xor Cin(3);
S(4) := (not(A(3) xor B(3)) and Cin(3)) or (not A(3) and B(3));
-- Cin(4) := (not(A(3) xor B(3)) and Cin(3)) or (not A(3) and B(3));
-- S(4) := Cin(4);
--==============================================================
S_out <= not S;
end process;
end arq;
Muliplicador
entity Mutiplicador_4Bits is
port(
A_in: in std_logic_vector (3 downto 0);
B_in: in std_logic_vector (3 downto 0);
R: out std_logic_vector (7 downto 0)
);
end Mutiplicador_4Bits;
begin
--======================================================================
--== Ecuaciones para un sumador de 1 bit, entradas A y B con acarreo
--== S=(A xor B) xor (C_in)
--== C_out=((A xor B) and C_in )or (A and B)
Process(A_in, B_in)
begin
--======================================================================
A := A_in;
B := B_in;
--======================================================================
C(0) := A(1) and B(0);
C(1) := A(2) and B(0);
C(2) := A(3) and B(0);
C(3) := A(0) and B(1);
C(4) := A(1) and B(1);
C(5) := A(2) and B(1);
C(6) := A(3) and B(1);
C(7) := A(0) and B(2);
C(8) := A(1) and B(2);
C(9) := A(2) and B(2);
C(10):= A(3) and B(2);
C(11):= A(0) and B(3);
C(12):= A(1) and B(3);
C(13):= A(2) and B(3);
C(14):= A(3) and B(3);
--======================================================================
C_in(0) :='0';
--======================================================================
--=================== Primer rengln sumadores =========================
--======================================================================
S(0) := (C(0) xor C(3)) xor C_in(0);
R(1) <= not S(0);-------------------------------------- Resultado 1
C_out(0) := ((C(0) xor C(3)) and C_in(0)) or (C(0) and C(3));
C_in(1) := C_out(0);
S(1) := (C(1) xor C(4)) xor C_in(1);
C_out(1) := ((C(1) xor C(4)) and C_in(1)) or (C(1) and C(4));
C_in(2) := C_out(1);
S(2) := (C(2) xor C(5)) xor C_in(2);
C_out(2) := ((C(2) xor C(5)) and C_in(2)) or (C(2) and C(5));
C_in(3) := C_out(2);
S(3) := (C(6) xor '0') xor C_in(3);
C_out(3) :=((C(6) xor '0') and C_in(3)) or (C(6) and '0');
--======================================================================
--=================== Segundo rengln sumadores ========================
--======================================================================
C_in(4) := '0';
S(4) := (C(7) xor S(1)) xor C_in(4);
C_out(4) := ((C(7) xor S(1)) and C_in(4)) or (C(7) and S(1));
R(2) <= not S(4);-------------------------------------- Resultado 2
C_in(5) := C_out(4);
S(5) := (C(8) xor S(2)) xor C_in(5);
C_out(5) := ((C(8) xor S(2)) and C_in(5)) or (C(8) and S(2));
C_in(6) := C_out(5);
S(6) := (C(9) xor S(3)) xor C_in(6);
C_out(6) := ((C(9) xor S(3)) and C_in(6)) or (C(9) and S(3));
C_in(7) := C_out(6);
S(7) := (C(10) xor C_out(3)) xor C_in(7);
C_out(7) := '0';
--======================================================================
--=================== Tercer rengln sumadores ========================
--======================================================================
C_in(8) := '0';
S(8) := (C(11) xor S(5)) xor C_in(8);
C_out(8) := ((C(11) xor S(5)) and C_in(8)) or (C(11) and S(5));
R(3) <= not S(8); -------------------------------------- Resultado 3
C_in(9) := C_out(8);
S(9) := (C(12) xor S(6)) xor C_in(9);
C_out(9) := ((C(12) xor S(6)) and C_in(9)) or (C(12) and S(6));
R(4) <= not S(9); -------------------------------------- Resultado 4
C_in(10) := C_out(9);
S(10) := (C(13) xor S(7)) xor C_in(10);
C_out(10):= ((C(13) xor S(7)) and C_in(10)) or (C(13) and S(7));
R(5) <= not S(10); ------------------------------------- Resultado 5
C_in(11) := C_out(10);
S(11) := (C(14) xor '0') xor C_in(11);
C_out(11):= ((C(14) xor '0') and C_in(11)) or (C(14) and '0');
end process;
--======================================================================
end rtl;
Divisor
entity divider is
port (
numerador_out : in std_logic_vector(3 downto 0);
denominador : in std_logic_vector(3 downto 0);
cociente_out : out std_logic_vector(3 downto 0)
);
end divider;
--===============================================================
procedure div(
num : in std_logic_vector(7 downto 0);
denom: in std_logic_vector(3 downto 0);
coc : out std_logic_vector(3 downto 0);
res : out std_logic_vector(3 downto 0)) is
if n1 >= d then
n1 := n1 - d;
n2(0):= '1';
end if;
end loop;
--===============================================================
coc := n2;
res := n1(3 downto 0);
end procedure;
--===============================================================
begin
numerador(7 downto 4) <= "0000";
numerador(3 downto 0) <= numerador_out(3 downto 0);
cociente(7 downto 4) <= "0000";
cociente_out(3 downto 0) <= not cociente(3 downto 0);
--===============================================================
process(numerador, denominador)
begin