Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INGENIERÍA ELECTRÓNICA
INTEGRANTES:
PRESENTADO A:
FECHA DE ENTREGA:
04-11-2019
BOGOTÁ DC
I. Especificaciones preliminares del diseño.
La propuesta recibida tiene como objetivo diseñar un dispositivo que tenga la capacidad de sumar dos
números, donde cada uno de estos dos únicos números no debe sobrepasar el valor de 999, es decir,
cada número a digitar puede tener un valor entre 0 a 999. Estos números serán ingresados por medio
de un teclado matricial 4x4. Además de esto, se debe mostrar el resultado de la suma de los dos
números en un display siete segmentos de cuatro dígitos. El sistema cogerá el primer valor de entrada,
luego se necesitará presionar el botón “confirmar” para dar paso al ingreso del segundo valor de
entrada y nuevamente se presiona el botón “confirmar” para que se prosiga a realizar la suma de estos
dos valores mencionados atrás. El número máximo de mostrar en este dispositivo de suma es de 1998,
es decir, en el display solo se podrá mostrar valores entre 0 y 1998. Cabe mencionar que, si algún
valor se ha ingresado de forma errónea, es decir que excedan los limites indicados anteriormente, se
dará una advertencia de que no es correcto y que se deberá volver a ingresar el valor o número que
fue advertido.
La figura 1 muestra la caja negra del sistema, en donde se encuentran señaladas las entradas y salidas
que componen a todo nuestro sistema.
3 LED_RGB
EntradaTeclado1
SalidaTeclado1
EntradaTeclado2
SalidaTeclado2
EntradaTeclado4
EntradaTeclado3
Dispositivo SalidaTeclado3
BotonConfirmar SalidaTeclado4
sumador 4
Display1
4 Display2
4 Display3
4 Display4
Teniendo en cuenta la figura 1, se prosigue a hablar sobre la descripción de las características de las
entradas y salidas, para esto, lo vamos a dividir en dos partes; entradas y salidas, cómo se mostrará a
continuación. Primero se hablará de las entradas:
EntradaTeclado: Corresponden a los 4 cables de salida del teclado, estos ingresan a la FPGA. Por
medio de estos el sistema es capaz de detectar la fila donde se encuentra la tecla presionada.
BotónConfirmar: Permite al usuario avanzar en el proceso, es decir, después de digitado el primer
número, continuar con el segundo, y por último visualizar el resultado.
Por otro lado, también tenemos las salidas, las cuales son:
Display: Corresponde a la combinación de bits que hará visible en el display el número necesario.
Sabiendo que nuestra tarjeta tiene 4 displays de 7 segmentos, utilizaremos estos cuatro para visualizar
cualquier sumatoria en estos Displays, misma que puede ir de 0 a 1998, y como cada uno de estos se
componen de 7 bits para expresar cada segmento, se emplearan en total 28 cables.
SalidaTeclado: Estas corresponden a las columnas del teclado numérico, y al igual que para la
entrada teclado, necesitaremos 4 cables de esta.
LED_RGB: Corresponde a un led RGB que fungirá como señal visual para indicar al usuario en qué
parte del proceso se encuentra.
c. Diagrama de tiempos.
clk
SalidaTeclado1
SalidaTeclado2
SalidaTeclado3
SalidaTeclado4
EntradaTeclado1
EntradaTeclado2
EntradaTeclado3
EnreadaTeclado4
a. Diagrama en bloques del sistema, entradas y salidas generales del sistema. Descripción
de las entradas y salidas de cada bloque y sus interfaces entre bloques.
Se prosigue a hablar sobre lo que se hace dentro de la “caja negra”, es decir, en el interior del sistema
de seguridad, se representará con ayuda de un diagrama en bloques en la figura 4 y después, su
respectiva descripción para mayor comprensión.
Básicamente nuestro sistema funciona de la siguiente manera: el usuario cuenta con una interfaz
compuesta por un teclado matricial de 4x4 y 4 display de 7 segmentos. El dispositivo permite realizar
una suma de dos cantidades y visualizar el resultado en los displays. Cada cantidad por sumar puede
tener un valor de 0 a 999, así el mayor resultado posible a obtener es 1998.
Como primer paso el usuario digita la primera cantidad, esto lo realiza presionando los números que
desee en el teclado matricial de 4x4, este valor es visualizado por el usuario para que, en caso de que
sea correcto presione la letra A del teclado matricial para avanzar en el proceso, y en caso de que se
haya equivocado presione la letra B y vuelva a digitar la primera cifra.
Completado el primer paso el usuario puede digitar la segunda cifra siguiendo el mismo proceso
usado para digitar la primera cifra. Con la diferencia de que, en este caso, de ser correcto el segundo
número y ser presionada la letra A, el proceso finaliza mostrando al usuario el resultado de la
operación de suma realizado con los dos números ingresados.
b. Explique el funcionamiento de cada bloque propuesto y cómo interactúa con los demás
bloques y el exterior (interfaces).
--Programa--
--Caja negra--
Entity calculadora is
Port(
--Entradas--
BC_P : in std_logic; --Boton confirmar
clk_P : in std_logic; --Reloj de la tarjeta
rst_P : in std_logic; --Reset de la máquina de estados
col_P : in std_logic_vector(3 downto 0); --Columnas del teclado matricial
--Salidas--
Ind : out std_logic_vector(4 downto 0); --Señales indicadoras del estado de la máquina de
estados
fil_P : out std_logic_vector(3 downto 0); --Filas del teclado matricial
D1, D2, D3, D4 : out std_logic_vector(6 downto 0)); --Displays para visualización
end calculadora;
--Diagramas en bloques--
Architecture gateLevel of calculadora is
-Señales internas
SIGNAL flag_s : STD_logic; --señl de bandera
SIGNAL N1_s : STD_logic_vector (2 downto 0);
SIGNAL N2_s : STD_logic_vector (2 downto 0);
SIGNAL EN1_S, EN2_S, ENS_S : STD_logic; --SEÑALES HABILITADORAS DE
DISPLAY
SIGNAL N1_D, N2_D : STD_logic_vector (11 downto 0); --Contenido de los bloques N
SIGNAL S_D : STD_logic_vector (12 downto 0); --Contenido del bloque sum
SIGNAL F_S : STD_logic_vector (3 downto 0); --FILAS DEL TECLADO MAATRICIAL
SIGNAL D_N1, D_N2 : STD_logic_vector (3 downto 0);--NUMERO EN BINARIO 0-9
SIGNAL N1_Sum, N2_Sum : STD_logic_vector (11 downto 0); --Contenido de los bloque
N
BEGIN
--Este programa es la estructura principal, ya que, conecta cada bloque de acuerdo a lo requerido.
En el se mandan a llamar todos los bloques y por medio de las entradas y salidas del sistema,
además de señales internas, se realizan las conexiones necesarias.
Control
--Iniciación de Librerías--
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
LIBRARY altera;
USE altera.altera_primitives_components.all;
-------------------------------------------
ENTITY control IS
PORT( --Entradas
flag : IN STD_LOGIC; --Señal de bander
BC : IN STD_LOGIC; --BOTON CONFIRMAR
clk : IN STD_LOGIC; --Reloj del sistema
rst : IN STD_LOGIC; --Reset de la maquina de estados
I: OUT STD_LOGIC_VECTOR(4 downto 0); --Indicador de cada estado
N1, N2: OUT STD_LOGIC_VECTOR(2 downto 0);--Habilitadores para
los bloques n EN1, EN2, ES: OUT STD_LOGIC); --Habilitadores para el display
END ENTITY control;
-------------------------------------------
ARCHITECTURE functional OF control IS
SIGNAL C1 : STD_LOGIC;
SIGNAL C2 : STD_LOGIC;
SIGNAL C3 : STD_LOGIC;
SIGNAL C4 : STD_LOGIC;
SIGNAL C5 : STD_LOGIC;
SIGNAL C6 : STD_LOGIC;
SIGNAL C7 : STD_LOGIC;
SIGNAL C8 : STD_LOGIC;
SIGNAL C9 : STD_LOGIC;
SIGNAL C10 : STD_LOGIC;
SIGNAL C11 : STD_LOGIC;
SIGNAL C12 : STD_LOGIC;
SIGNAL C13 : STD_LOGIC;
SIGNAL C14 : STD_LOGIC;
SIGNAL C15 : STD_LOGIC;
SIGNAL C16 : STD_LOGIC;
SIGNAL C17 : STD_LOGIC;
SIGNAL C18 : STD_LOGIC;
SIGNAL C19 : STD_LOGIC;
SIGNAL C20 : STD_LOGIC;
SIGNAL C21 : STD_LOGIC;
SIGNAL C22 : STD_LOGIC;
SIGNAL C23 : STD_LOGIC;
SIGNAL C24 : STD_LOGIC;
SIGNAL BCN : STD_LOGIC;
BEGIN
BCN<= not BC; --Los botones de la tarjeta son activos en bajo, aquí se utiliza una compuerta not
para que el BC sea activo en alto
--Declaración de los Flip Flop, uno por cada estado
f_f1: dffe PORT MAP(C1, clk, not rst, '1', '1', s1);
f_f2: dffe PORT MAP(C2, clk, not rst, '1', '1', s2);
f_f3: dffe PORT MAP(C3, clk, not rst, '1', '1', s3);
f_f4: dffe PORT MAP(C4, clk, not rst, '1', '1', s4);
f_f5: dffe PORT MAP(C5, clk, not rst, '1', '1', s5);
f_f6: dffe PORT MAP(C6, clk, not rst, '1', '1', s6);
f_f7: dffe PORT MAP(C7, clk, not rst, '1', '1', s7);
f_f8: dffe PORT MAP(C8, clk, not rst, '1', '1', s8);
f_f9: dffe PORT MAP(C9, clk, not rst, '1', '1', s9);
f_f10: dffe PORT MAP(C10, clk, not rst, '1', '1', s10);
f_f11: dffe PORT MAP(C11, clk, not rst, '1', '1', s11);
f_f12: dffe PORT MAP(C12, clk, not rst, '1', '1', s12);
f_f13: dffe PORT MAP(C13, clk, not rst, '1', '1', s13);
f_f14: dffe PORT MAP(C14, clk, not rst, '1', '1', s14);
f_f15: dffe PORT MAP(C15, clk, not rst, '1', '1', s15);
f_f16: dffe PORT MAP(C16, clk, not rst, '1', '1', s16);
f_f17: dffe PORT MAP(C17, clk, not rst, '1', '1', s17);
f_f18: dffe PORT MAP(C18, clk, not rst, '1', '1', s18);
f_f19: dffe PORT MAP(C19, clk, not rst, '1', '1', s19);
f_f20: dffe PORT MAP(c20, clk, not rst, '1', '1', s20);
f_f21: dffe PORT MAP(C21, clk, not rst, '1', '1', s21);
f_f22: dffe PORT MAP(C22, clk, not rst, '1', '1', s22);
f_f23: dffe PORT MAP(C23, clk, not rst, '1', '1', s23);
f_f24: dffe PORT MAP(C24, clk, not rst, '1', '1', s24);
Corrimiento
--Iniciación de Librerías--
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
LIBRARY altera;
USE altera.altera_primitives_components.all;
-------------------------------------------
ENTITY corrimiento IS
PORT( --Entradas
E : IN STD_LOGIC;
clk : IN STD_LOGIC;
--Salidas
S, Sb : OUT STD_LOGIC_Vector(3 downto 0));
END ENTITY corrimiento;
-------------------------------------------
ARCHITECTURE functional OF corrimiento IS
--Señales internas
SIGNAL S1 : STD_LOGIC;
SIGNAL S2 : STD_LOGIC;
SIGNAL S3 : STD_LOGIC;
SIGNAL S4 : STD_LOGIC;
SIGNAL S5 : STD_LOGIC;
BEGIN
S5<=S4 or (not s1 and not s2 and not s3 and not s4);
--Declaración de los Flip Flop
f_f1: dffe PORT MAP(s5, clk, '1', '1', E, S1);
f_f2: dffe PORT MAP(s1, clk, '1', '1', E, s2);
f_f3: dffe PORT MAP(s2, clk, '1', '1', E, S3);
f_f4: dffe PORT MAP(s3, clk, '1', '1', E, S4);
--Declaración de las salidas
S(3)<=S1;
S(2)<=S2;
S(1)<=S3;
S(0)<=S4;
Sb(3)<=S1;
Sb(2)<=S2;
Sb(1)<=S3;
Sb(0)<=S4;
END ARCHITECTURE functional;
--Este bloque es el encargado de realizar un barrido a través de las 4 filas del teclado matricial, para
esto se conectan 4 Flip Flop de manera cíclica, sin ninguna condición para el avance entre uno y
otro, así, con cada cilclo de reloj sólo una de las 4 salidas está en alto, mientras las demás están en
bajo.
Detector
--Iniciación de Librerías--
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
-------------------------------------------
ENTITY detector IS
PORT( --Entradas
F, C : IN STD_LOGIC_VECTOR(3 downto 0);
--Salidas
FlagO : OUT STD_LOGIC;
S1, S2 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END ENTITY detector;
-------------------------------------------
ARCHITECTURE functional OF detector IS
signal flag : std_LOGIC;
BEGIN
--Declaración de las salidas
S1(3)<=(F(2)and(C(1) or C(2))) and flag;
S1(2)<=((F(1)and(C(0) or C(1) or C(2))) or (F(2) and C(0))) and flag;
S1(1)<=((F(0)and(C(1) or C(2))) or (F(1) and C(2)) or (F(2) and C(0))) and flag;
S1(0)<=((F(0)and(C(0) or C(2))) or (F(2)and(C(0) or C(2))) or (F(1) and C(1))) and flag;
S2(3)<=(F(2)and(C(1) or C(2))) and flag;
S2(2)<=((F(1)and(C(0) or C(1) or C(2))) or (F(2) and C(0))) and flag;
S2(1)<=((F(0)and(C(1) or C(2))) or (F(1) and C(2)) or (F(2) and C(0))) and flag;
S2(0)<=((F(0)and(C(0) or C(2))) or (F(2)and(C(0) or C(2))) or (F(1) and C(1))) and flag;
Flag<=((F(0)and(C(0) or C(1) or C(2))) and not F(1) and not F(2) and not F(3))
or((F(1)and(C(0) or C(1) or C(2)))and not F(0) and not F(2) and not F(3))
or((F(2)and(C(0) or C(1) or C(2)))and not F(0) and not F(1) and not F(3))
or((F(3) and C(1))and not F(0) and not F(1) and not F(2));
FLagO<=Flag;
END ARCHITECTURE functional;
--Este bloque se encarga de enviar la combinación binaria de acuerdo con la tecla que se detecta que
es presionada en el teclado, además, al presionar una tecla, cualquiera que sea, se envía una señal de
bandera al bloque Control, lo que le indica el ingreso de datos.
N
--Iniciación de Librerías--
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
Entity N is
Port(
--Entradas--
Enable_1, Enable_2, Enable_3 : in std_logic;
X : in std_logic_vector(3 downto 0);
--Salidas--
Y1, Y2 : out std_logic_vector(11 downto 0));
end N;
Architecture gateLevel of N is
BEGIN
--Se declaran tres bloques para almacenar 4 bits en cada uno
N_1: ENTITY work.caracter
PORT MAP ( x1 => X(0),
x2 => X(1),
x3 => X(2),
x4 => X(3),
x5 => Enable_1,
y_1(3) => Y1(11),
y_1(2) => Y1(10),
y_1(1) => Y1(9),
y_1(0) => Y1(8),
y_2(3) => Y2(11),
y_2(2) => Y2(10),
y_2(1) => Y2(9),
y_2(0) => Y2(8));
Entity sumador is
Port(
--Entradas--
NP1,NP2 : in std_logic_vector(11 downto 0);
--Salidas--
Suma : out std_logic_vector(12 downto 0));
end sumador;
BEGIN
--Este bloque recibe los valores almacenados en ambos bloques N y los suma por medio de
sumadores de 3 bits, la suma permite enviar el resultado en bloques de 4 bits por digito.
Control Display
--Iniciación de Librerías--
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
Entity controldisplay is
Port(
--Entradas--
N1,N2 : in std_logic_vector(11 downto 0);
S : in std_logic_vector(12 downto 0);
E1, E2, E3 : in std_logic;
--Salidas--
Y1, Y2, Y3, Y4 : out std_logic_vector(6 downto 0));
end controldisplay;
BEGIN
selector_1: ENTITY work.selector
PORT MAP ( N_1(0) => N1(0),
N_1(1) => N1(1),
N_1(2) => N1(2),
N_1(3) => N1(3),
N_2(0) => N2(0),
N_2(1) => N2(1),
N_2(2) => N2(2),
N_2(3) => N2(3),
Sum(0) => S(0),
Sum(1) => S(1),
Sum(2) => S(2),
Sum(3) => S(3),
E(0) => E1,
E(1) => E2,
E(2) => E3,
Y => S1);
conversor_1: ENTITY work.conversor
PORT MAP ( x1 => S1(0),
x2 => S1(1),
x3 => S1(2),
x4 => S1(3),
Y => Y1);
selector_2: ENTITY work.selector
PORT MAP ( N_1(0) => N1(4),
N_1(1) => N1(5),
N_1(2) => N1(6),
N_1(3) => N1(7),
N_2(0) => N2(4),
N_2(1) => N2(5),
N_2(2) => N2(6),
N_2(3) => N2(7),
Sum(0) => S(4),
Sum(1) => S(5),
Sum(2) => S(6),
Sum(3) => S(7),
E(0) => E1,
E(1) => E2,
E(2) => E3,
Y => S2);
conversor_2: ENTITY work.conversor
PORT MAP ( x1 => S2(0),
x2 => S2(1),
x3 => S2(2),
x4 => S2(3),
Y => Y2);
selector_3: ENTITY work.selector
PORT MAP ( N_1(0) => N1(8),
N_1(1) => N1(9),
N_1(2) => N1(10),
N_1(3) => N1(11),
N_2(0) => N2(8),
N_2(1) => N2(9),
N_2(2) => N2(10),
N_2(3) => N2(11),
Sum(0) => S(8),
Sum(1) => S(9),
Sum(2) => S(10),
Sum(3) => S(11),
E(0) => E1,
E(1) => E2,
E(2) => E3,
Y => S3);
conversor_3: ENTITY work.conversor
PORT MAP ( x1 => S3(0),
x2 => S3(1),
x3 => S3(2),
x4 => S3(3),
Y => Y3);
selector_4: ENTITY work.selector2
PORT MAP ( Sum => S(12),
E => E3,
Y => S4);
conversor_4: ENTITY work.conversor
PORT MAP ( x1 => S4(0),
x2 => S4(1),
x3 => S4(2),
x4 => S4(3),
Y => Y4);
--Este bloque recibe los datos almacenados en los dos bloques N y en el bloque sumador,
dependiendo de la señal recibida del bloque control permite la visualización de un de los tres grupos
de bits. Esto permite visualizar el proceso en tres parte, el primer número ingresado, el segundo y el
resultado.
VI. Simulaciones en la herramienta QUARTUS II donde se cubran varios
comportamientos del sistema.
El trabajo realizado durante el proyecto fue excelente, se reforzó lo aprendido en cuanto a compuertas
básicas (AND, NAND, OR, NOR, XOR, EQUI, NOT) y el uso de flip-flops, en cuanto a la suma de
los números binarios: tuve la capacidad de entender como decirle a un procesador (en este caso la
tarjeta de desarrollo) que efectué esta suma. En un principio encontré dificultades en cuanto a la suma
de binarios, y en el diseño del proyecto en Quartus hubo problemas con la máquina de estados por lo
que se le hicieron pequeños ajustes al AHPL. El proyecto fue enriquecedor y sería buena idea
continuar con este, pero agregándole otras operaciones (resta, división y multiplicación).
Juan Manuel López Hernández.
Desarrollar este proyecto tuvo un impacto en la concepción que tenía acerca de operaciones entre
números binarios, e integrar todo un sistema para la suma de dos números fue enriquecedor a mis
conocimientos. Como dificultad personal resalto la lógica que se tuvo que emplear para la
visualización del dato requerido en los displays, ya que involucró una secuencia lógica distinta a la
que se había usado en el proyecto anterior. Sin duda el proyecto podría ser complementado con nuevas
cosas, como la suma de más de dos números, o la suma de números más grande.
Brian Emmanuel Ascención Martínez.
El trabajo hecho alrededor de todo este proyecto fue bueno, debido a que no sólo aprendí a cómo
realizar una calculadora de forma teórica, sino también el proceso que esto conlleva. Se puede decir
que reforcé lo que es la operación entre números binarios más específicamente, y todo lo que conlleva
la suma de dos números, algo quizás especifico que no sabía, pero es fundamental para que este
proyecto funcionará es cuando es mayor a 9, ya que había que usar, por decirlo de alguna forma, la
ley de sumarle “6”. Algunas dificultades que tuve fue entender bien el funcionamiento de la máquina
de estados de este proyecto y AHPL. Pero aun así el proyecto en general fue de carácter muy
enriquecedor, pero queda cómo esa duda de; cómo sería el proceso de restar, multiplicar y dividir.
Cristhiam Felipe González Méndez.