0% encontró este documento útil (0 votos)
4 vistas14 páginas

Diseño de ALU en VHDL para Microcontroladores

El informe del laboratorio presenta el diseño de una unidad aritmética lógica (ALU) utilizando VHDL, con el objetivo de realizar operaciones aritméticas y lógicas entre dos operandos de 4 bits. Se detallan los objetivos, el marco teórico, el planteamiento del problema y el desarrollo del diseño, incluyendo la implementación de módulos para operaciones aritméticas y lógicas, así como un test bench para simular el funcionamiento de la ALU. El documento también incluye el código VHDL para la ALU y su estructura, así como un diagrama de bloques que ilustra la organización de los componentes.

Cargado por

yaselgajhonatan
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
4 vistas14 páginas

Diseño de ALU en VHDL para Microcontroladores

El informe del laboratorio presenta el diseño de una unidad aritmética lógica (ALU) utilizando VHDL, con el objetivo de realizar operaciones aritméticas y lógicas entre dos operandos de 4 bits. Se detallan los objetivos, el marco teórico, el planteamiento del problema y el desarrollo del diseño, incluyendo la implementación de módulos para operaciones aritméticas y lógicas, así como un test bench para simular el funcionamiento de la ALU. El documento también incluye el código VHDL para la ALU y su estructura, así como un diagrama de bloques que ilustra la organización de los componentes.

Cargado por

yaselgajhonatan
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

UNIVERSIDAD DE LAS FUERZAS ARMADAS – ESPE

DEPARTAMENTO DE ELÉCTRICA, ELECTRÓNICA Y


TELECOMUNICACIONES

CARRERA DE INGENIERÍA EN TELECOMUNICACIONES

LABORATORIO DE SISTEMAS BASADOS EN


MICRONCONTROLADOR

NRC: 24144

Informe Laboratorio Nro. 1

TEMA: Unidad aritmética

lógica

Integrantes:

 Tnte. Moreno G. Mishell C.


 Tnte. Sánchez M. José
 Tnte. Yaselga A. Jonathan F.

Docente: Ing. Ramos Vargas Pablo Francisco

Fecha: 30 de abril de 2025


UNIVERSIDAD DE LAS FUERZAS ARMADAS
‘’ESPE’’

LABORATORIO 01 DE SISTEMAS BASADOS EN


MICROCONTROLADORES

1. TEMA: Unidad aritmética lógica

2. OBJETIVOS

 GENERAL: Diseñar una unidad aritmética lógica ALU que permita


realizar operaciones entre dos operandos A y B, cada uno de 4 bits,
mediante el uso en lenguaje de descripción de hardware VHDL en el
software Vivado.

 ESPECÍFICOS:
a. Diseñar una ALU que permite realizar 8 operaciones lógicas
entre dos operandos A y B, cada uno de 4 bits.
b. Diseñar una ALU que permite realizar 8 operaciones
aritméticas entre dos operandos A y B, cada uno de 4 bits.
c. Diseñar un bloque Top que mediante programación estructural
permita invocar a los sub-bloques lógico y aritmético que se
encuentran en comportamental.
d. Controlar el acceso de los códigos que permiten la selección
del tipo de operación.

3. MARCO TEÓRICO
Una unidad aritmética lógica ALU es un circuito que permite realizar
operaciones con números binarios. Existe un selector en código binario
que permite escoger el tipo de operación a realizarse. (Tocci, 2007).
El símbolo esquemático de una ALU en general es:

Figura 1. Símbolo de la ALU


Donde:
 A y B son operandos
 R es la salida
 F es la entrada de la unidad de control
 D es un estado de la salida
2
Partiendo de esta premisa de funcionamiento de una ALU, es
importante mencionar que se puede utilizar VHDL que es un lenguaje
de descripción del hardware para describir el comportamiento y la
estructura de un circuito digital. Existe dos tipos de programación en
VHDL que son comportamental, en la cual se describe el
funcionamiento del circuito y programación estructural, en la cual se
definen los componentes y la conexión entre ellos pudiendo incluso
instanciar bloques de código que pueden ser invocados para reutilizar
código.

4. PLANTEAMIENTO DEL PROBLEMA


OPERACIONES ARITMÉTICAS OPERACIONES LÓGICAS
A+B A and B
A +B + 1 A or B
A+1 A nand B
A–1 A nor B
A–B A xor B
A-B–1 A xnor B
Complemento a 2 de A not A
Complemento a 2 de B not B
En esta práctica de laboratorio se diseña una unidad aritmética lógica
que tiene 2 operandos de 4 bits con signo y que cumple con las
siguientes funciones:

Figura 2. Funciones de la ALU

1. Realice el diseño utilizando un módulo lógico y aritmético por


separado. Utilizar descripción comportamental para los módulos.
2. Implementar un módulo llamado Top_ALU con código VHDL con
descripción estructural que llame a los componentes lógico y
aritmético.
3. Crear un test bench y realizar la simulación que contenga todas
las operaciones de la ALU con los diferentes casos de la suma y
realizar las capturas de pantalla de las simulaciones claras y
3
completas donde se observe las 16 operaciones.

5. DESARROLLO DEL DISEÑO

VARIABLES DE ENTRADA
A0 El dígito con peso 20 del número A toma el valor
de 1.
A1 El dígito con peso 21 del número A toma el valor
de 1.
A2 El dígito con peso 22 del número A toma el valor
de 1.
A3 El dígito con peso 23 del número A toma el valor
de 1.
B0 El dígito con peso 20 del número B toma el valor
de 1.
B1 El dígito con peso 21 del número B toma el valor
de 1.
B2 El dígito con peso 22 del número B toma el valor
de 1.
B3 El dígito con peso 23 del número B toma el valor
de 1.
Los números A y B son operandos de 4 bits

4
Para la selección de la operación se define de la siguiente manera:

S0 La entrada de control de peso 20 toma el valor de


1.
S1 La entrada de control de peso 21 toma el valor de
1.
S2 La entrada de control de peso 22 toma el valor de
1.
S3 La entrada de control de peso 23 toma el valor de
1.

Figura 3. Operaciones de la ALU

En cuanto a la ALU lógica las operaciones se realizan bit a bit, por


lo tanto, se requieren 4 bits para almacenar el resultado, de cada
una de las compuertas lógicas.

VARIABLES DE SALIDA (ALU Lógica)


RL0 El dígito con peso 20 del resultado toma el valor
de 1.
1
RL1 El dígito con peso 2 del resultado toma el valor
de 1.
2
RL2 El dígito con peso 2 del resultado toma el valor
de 1
3
RL3 El dígito con peso 2 del resultado toma el valor
de 1

Es importante mencionar que las operaciones aritméticas y


lógicas se realizan al mismo tiempo, solo depende del selector de
5
operación para mostrar el resultado de una operación específica.
Las operaciones aritméticas como suma, resta complemento a2
etc., requieren más que solo 4 bits de salida.

VARIABLES DE SALIDA TOP_ALU

Signo El resultado tiene signo negativo.


Acarreo El resultado tiene overflow con valor de 1.

6. DIAGRAMA DE BLOQUES
Cada una de las secciones se crean en lenguaje VHDL por separado
utilizando un lenguaje comportamental para la ALU lógica y aritmética,
posterior a ello se crea un TOP_Alu que mediante un lenguaje
estructural nos permite instanciar al bloque aritmético y lógico

Figura 4. Diagrama de bloques de la ALU

En el bloque sabiendo que al ser una ALU Este diagrama muestra los principales
componentes de la ALU:
1. alu_aritmética_inst: Este bloque realiza las operaciones aritméticas, como
suma, resta, etc. Toma como entradas los operandos A y B, y produce un
resultado de 6 bits.
2. alu_logica_inst: Este bloque realiza las operaciones lógicas, como AND,
OR, etc. También toma los operandos A y B, y produce un resultado de 4
bits.
3. mux: Este es un mutiplexor que selecciona entre los resultados de las
operaciones aritméticas y lógicas, según el valor del selector.
4. alu_aritmética y alu_lógica: Estos son los bloques principales que
6
contienen la lógica para las operaciones aritméticas y lógicas,
respectivamente.
5. Los selectores selector[3:0] y selector[2:0] se utilizan para controlar la
selección de las operaciones a realizar.
Este diagrama muestra la estructura básica de una ALU, con bloques separados
para las operaciones aritméticas y lógicas, y un mutiplexor para seleccionar el
resultado final

7
CAPTURA TEST BENCH

8
7. Código_ Alu_top

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity top_alu is
Port (
A : in STD_LOGIC_VECTOR(3 downto 0);
B : in STD_LOGIC_VECTOR(3 downto 0);
selector : in STD_LOGIC_VECTOR(3 downto 0);
resultado : out STD_LOGIC_VECTOR(5 downto 0);
signo : out STD_LOGIC;
acarreo : out STD_LOGIC
);
end top_alu;

architecture Structural of top_alu is


signal resultado_logico : STD_LOGIC_VECTOR(5 downto 0);
signal resultado_arit : STD_LOGIC_VECTOR(5 downto 0);
signal resultado_mux : STD_LOGIC_VECTOR(5 downto 0);
begin

alu_logica_inst: entity work.alu_logica


port map (
A => A,
B => B,
selector => selector(2 downto 0),
resultado => resultado_logico
);

alu_aritmetica_inst: entity work.alu_aritmetica


port map (
A => A,
B => B,
selector => selector(2 downto 0),
resultado => resultado_arit
);

mux_inst: entity [Link]


port map (
alu_logica => resultado_logico,
alu_arit => resultado_arit,
selector => selector(3),
resultado => resultado_mux
);

-- Asignación de salida
resultado <= resultado_mux;
signo <= resultado_mux(5); -- MSB = signo
acarreo <= resultado_mux(4); -- Bit 4 = acarreo

end Structural;

9
ALU_aritmética

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity alu_aritmetica is
Port (
A : in STD_LOGIC_VECTOR(3 downto 0);
B : in STD_LOGIC_VECTOR(3 downto 0);
selector : in STD_LOGIC_VECTOR(2 downto 0);
resultado : out STD_LOGIC_VECTOR(5 downto 0) -- [5]=signo, [4]=acarreo,
[3:0]=binario puro
);
end alu_aritmetica;

architecture Behavioral of alu_aritmetica is


signal tempA, tempB : signed(4 downto 0); -- Ampliación de A y B a 5 bits
signal temp_result : signed(5 downto 0); -- Resultado ampliado a 6 bits
signal bit_signo : std_logic := '0';
signal bit_acarreo : std_logic := '0';
begin
-- Ampliación de A y B evitando interpretación de signo
tempA <= signed('0' & A);
tempB <= signed('0' & B);

-- Operaciones de la ALU
with selector select
temp_result <=
resize(tempA + tempB, 6) when "000", -- A + B
resize(tempA + tempB + 1, 6) when "001", -- A + B + 1
resize(tempA + 1, 6) when "010", -- A + 1
resize(tempA - 1, 6) when "011", -- A - 1
resize(tempA - tempB, 6) when "100", -- A - B
resize(tempA - tempB - 1, 6) when "101", -- A - B - 1
resize(-tempA, 6) when "110", -- -A
resize(-tempB, 6) when others; -- "111" => -B

-- Bit de signo: se activa solo si el resultado es verdaderamente negativo (MSB = 1)


bit_signo <= '1' when (
(selector = "100" and tempA < tempB) or -- A - B
(selector = "101" and tempA <= tempB) or -- A - B - 1
(selector = "011" and A = "0000") -- A - 1
) else '0';

-- Bit de acarreo: solo en operaciones de suma


bit_acarreo <= '1' when (
(selector = "000" or selector = "001" or selector = "010") and
(tempA(4) = tempB(4)) and
(temp_result(5) /= tempA(4))
) else '0';

-- Resultado final: signo | acarreo | resultado puro


resultado <= bit_signo & bit_acarreo & std_logic_vector(temp_result(3 downto 0));
end Behavioral;

1
0
ALU_Logica

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity alu_logica is
Port (
A : in STD_LOGIC_VECTOR(3 downto 0);
B : in STD_LOGIC_VECTOR(3 downto 0);
selector : in STD_LOGIC_VECTOR(2 downto 0);
resultado : out STD_LOGIC_VECTOR(5 downto 0) -- [5]=signo (0), [4]=acarreo (0),
[3:0]=resultado lógico
);
end alu_logica;

architecture Behavioral of alu_logica is


signal logic_out : STD_LOGIC_VECTOR(3 downto 0);
begin
with selector select
logic_out <=
(A and B) when "000",
(A or B) when "001",
(A nand B) when "010",
(A nor B) when "011",
(A xor B) when "100",
(A xnor B) when "101",
(not A) when "110",
(not B) when others;

resultado <= "00" & logic_out; -- signo = 0, acarreo = 0


end Behavioral;

MUX

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity mux is
Port (
alu_logica : in STD_LOGIC_VECTOR(5 downto 0); -- [5]=signo, [4]=acarreo
alu_arit : in STD_LOGIC_VECTOR(5 downto 0);
selector : in STD_LOGIC; -- S3
resultado : out STD_LOGIC_VECTOR(5 downto 0)
);
end mux;

architecture Behavioral of mux is


begin
resultado <= alu_logica when selector = '0' else alu_arit;
end Behavioral;

TEST BENCH

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity test_bench_top_alu is
end test_bench_top_alu;
1
1
architecture Behavioral of test_bench_top_alu is
signal A, B : STD_LOGIC_VECTOR(3 downto 0);
signal selector : STD_LOGIC_VECTOR(3 downto 0);
signal resultado : STD_LOGIC_VECTOR(5 downto 0);
signal signo : STD_LOGIC;
signal acarreo : STD_LOGIC;
begin

uut: entity work.top_alu


port map (
A => A,
B => B,
selector => selector,
resultado => resultado,
signo => signo,
acarreo => acarreo
);

process
begin
A <= "1000"; -- 8
B <= "1000"; -- 8

-- Ejecución completa de operaciones lógicas y aritméticas


selector <= "0000"; wait for 100 ns; -- AND
selector <= "0001"; wait for 100 ns; -- OR
selector <= "0010"; wait for 100 ns; -- NAND
selector <= "0011"; wait for 100 ns; -- NOR
selector <= "0100"; wait for 100 ns; -- XOR
selector <= "0101"; wait for 100 ns; -- XNOR
selector <= "0110"; wait for 100 ns; -- NOT A
selector <= "0111"; wait for 100 ns; -- NOT B

selector <= "1000"; wait for 100 ns; -- A+B


selector <= "1001"; wait for 100 ns; -- A+B+1
selector <= "1010"; wait for 100 ns; -- A+1
selector <= "1011"; wait for 100 ns; -- A-1
selector <= "1100"; wait for 100 ns; -- A-B
selector <= "1101"; wait for 100 ns; -- A-B-1
selector <= "1110"; wait for 100 ns; -- -A
selector <= "1111"; wait for 100 ns; -- -B

wait;
end process;

end Behavioral;

8. DIFICULTADES ENCONTRADAS

 En la parte aritmética, verificar bien el bit de overflow y el bit de signo ya que en las
operaciones que se realiza especialmente en las restas se encuentra un error en
vista que debemos analizar como representamos la respuesta ya sea que esta nos
venga incluidos en los bits de respuesta el signo y el acarreo, para realizar la
programación tomando en consideración estos detalles.
 Al realizar nuestro código pudimos darnos cuenta que la sintaxis del programa
VHDL es muy compleja y al no entenderlo bien el concepto de process, podemos
realizar mal nuestro código.
 En la realización del código, nos dimos cuenta en la parte esquemática que
estábamos colocando mal los bits que contenían cada uno de los bloques que
1
2
realizan las operaciones aritméticas y lógicas.

9. SOLUCIONES

 Realizamos el bit de acarreo y de signo de manera individual y aparte para que se


pueda diferenciar de manera correcta la respuesta.
 Revisamos el funcionamiento del programa VHDL y sus diferentes sintaxis para
utilizar los códigos en la arquitectura de los diferentes programas y que su
funcionamiento sea correcto.
 Corregimos los errores de los bits que se han utilizado en el programa en su
arquitectura para que se muestre de manera correcta en la parte esquemática y en
el diagrama de bloques.

10. CONSIDERACIONES

 El lenguaje estructura permitió invocar a dos bloques denominados


unidad lógica y unidad aritmética que realizan sus operaciones
independientemente y al mismo tiempo, sin embargo, un
multiplexor permite seleccionar solo un resultado para mostrar en
pantalla.
 En el bloque aritmético la utilización de programación
comportamental permitió fácilmente la descripción de hardware ya
que se usa compuertas básicas que representan palabras
reservadas en lenguaje VHDL.
 El resultado final de la ALU (Top) se muestra en un arreglo de 6 bits
de la siguiente manera (Signo Overflow R3 R2 R1 R0), por lo tanto,
en las operaciones aritméticas los bits de Signo y Overflow serán
siempre [Link] definición de 4 bits de los números A y B indican
que estos siempre tendrán signo positivo, pudiendo ser el mayor
número ingresado 1111 que en formato decimal representa el
número 15.
 Para realizar la resta entre A-B se consideró convertir el número B a
su complemento a2 y posterior a ello realizar la respectiva suma,
descartando el acarreo.
 Para obtener el complemento a2 de debe negar el número y
posterior a ello sumar el número 0001.
 Para la resta se debe considerar el caso en que A < B ya que en este
caso el resultado siempre será negativo, es decir el bit de signo
tomará el valor de 1.
 Para la resta se debe considerar el caso en que A > B ya que en este
caso el resultado siempre será positivo, es decir el bit de signo
tomará el valor de 0.

11. CONCLUSIONES

1
3
 El diseño del sistema de la ALU, que consta de una unidad lógica y
una unidad aritmética interconectadas, permite realizar operaciones
tanto lógicas como aritméticas en números de 4 bits.
 El enfoque de programación estructural utilizado en el diseño de la
ALU permite la modularidad y reutilización de componentes
individuales, lo que facilita el desarrollo y la escalabilidad del
sistema. El enfoque comportamental nos ayuda a entender como es
el funcionamiento que está haciendo dicho elemento.
 Se implementó un módulo llamado ALU en código VHDL con
descripción estructural que invoca a los componentes lógico y
aritmético.
 Se realizó un test bench y la simulación respectiva que contiene
todas las operaciones de la ALU con los diferentes casos de la suma.

12. BIBLIOGRAFÍA

Tocci R., y Widmer N. (2007). Sistemas Digitales Principios y


Aplicaciones. Pearson Prentice Hall.

1
4

También podría gustarte