Práctica #15.
Nombre de la práctica : Sumador/Restador BCD ingresado por teclado matricial (2 dígitos).
Nombre: David Santiago Martínez Molina
Código: 20181005164
Asignatura: Fundamentos de circuitos digitales
Programa : Ingeniería Electrónica
Docente : César Andrey Perdomo Charry
INTRODUCCIÓN:
En el presente informe se mostrará el desarrollo de la práctica #15. Para esta práctica se tiene como finalidad implementar un Sumador/Restador de dos números BCD de 2 dígitos, con desplazamiento a la izquierda al ingresar los datos, y desplazamiento a la derecha para borrar algún número, los dígitos serán ingresados por un teclado matricial en Psoc 5LP. Cómo se venía manejando en los anteriores informes, también se utilizará la visualización dinámica en los displays 7 segmentos para visualizar el resultado de la suma o resta, y los números A y B ingresados. Para esta práctica fue importante utilizar algunos componentes de prácticas anteriores que fueron modificados según la conveniencia.
Un registro capaz de desplazar su información binaria en una dirección o en la otra se llama registro de desplazamiento. La configuración lógica de un registro de desplazamiento consiste en una cadena de flip-flops en cascada, con la salida de un flip-flop conectada a la entrada del siguiente flip-flop. Todos los flip-flops reciben pulsos de reloj comunes, que activan el desplazamiento de una etapa a la siguiente.
Resta BCD:
La resta en el sistema BCD se puede realizar de una forma similar al sistema de base dos, sumando al minuendo el complemento a 10^n (complemento a 10) o el complemento a 10^n-1 (complemento a nueve) del sustraendo. En los sistemas BCD se utiliza corrientemente el convenio del complemento a nueve porque permite reducir la complejidad del sistema.
Si se quiere realizar la resta del número b del a se representa por:
Observando la anterior ecuación se puede deducir que, si el resultado es negativo, no se produce acarreo y el número obtenido queda representado mediante su complemento a nueve. Si el resultado es positivo, se produce un acarreo que ha de sumarse a aquél para obtener la suma correcta.
Complemento a 9:
El complemento de un número es el número que falta para llegar a completar otro número. El complemento a 9, es cuando el número que se desea completar, tiene tantos nueves como cifras tiene el número que le falta para alcanzarlo. De esta manera el complemento a 9 del número 4(0100) sería 5(0101).
MATERIALES Y EQUIPOS:
-Psoc 5LP
-Computador con Psoc Creator
-Tarjeta desarrolladora.
-Cables con conectores.
-Teclado Matricial.
-Display 7 segmentos.
METODOLOGÍA:
Primeramente para desarrollar este laboratorio, implementamos el decodificador de teclado matricial, realizado en la práctica #11. Dicho decodificador es el siguiente:
Cabe recordar que a las salidas de este decodificador se encuentra una salida denominada "Led", esta salida es el pulso que se genera al presionar cualquier tecla del teclado, que va a ser muy importante más adelante. Para las otras salidas se tiene que crear un decodificador que me genere la conversión a binario natural, dicho decodificador fue implementado por el LUT del simulador. Entonces el decodificador de teclado matricial completo esta compuesto por el LUT y el circuito mostrado anteriormente, de la siguiente manera:
Con el decodificador de teclado matricial completo, ahora lo siguiente es diseñar el registro de desplazamiento de los números A y B ingresados, teniendo en cuenta que también se deben guardar los datos al pasar de un banco a otro. Para este registro, me base en un registro bidireccional utilizando Flip-Flops tipo D, y Multiplexores 2 a 1. El funcionamiento es muy sencillo, ya que los selectores del Mux van conectados, y son los que me van a permitir desarrollar el desplazamiento a la izquierda o hacia la derecha. Cuando el selector se encuentre en 0(LOW) y se ingresa un número se va a realizar el desplazamiento hacia la izquierda, y para realizar el desplazamiento hacia la derecha(borrar) el selector tiene que estar en 1(HIGH). Para poder habilitar un banco y luego el otro, se utilizaron los Flip-Flops con enable que nos permite el simulador. Entonces cada banco de memoria queda de la siguiente manera:
Como se observa en el circuito anterior, se tiene un registro de desplazamiento por cada dato de entrada, dicho registro se conforma de 2 Mux 2 a 1, como mencione anteriormente. La salida del primer Flip-Flop corresponde a las Unidades, y la salida del segundo corresponde a las decenas, ya que se tiene que nuestro circuito funcionará con 2 dígitos de entrada. Entonces para cada banco de memoria se usa dicho circuito, igual que en el laboratorio anterior, se busca la manera de que solo se permita la entrada de números mayores que 9, esto se realiza con un comparador que me indica cuando el número ingresado es mayor que 9 (M9), y con el clock(que es el pulso generado al oprimir cualquier tecla) se inhabilita la entrada de estos números. También en el circuito diseñado al oprimir la tecla C del teclado matricial se tiene que realizar un corrimiento hacia la derecha, o sea un borrado del último dígito ingresado. Como mencione anteriormente, los selectores de los Mux son los que me permiten realizar el desplazamiento a la izquierda o derecha, a este selector se le nombra "Desplaz" y es controlado por un identificador de la tecla C, esto quiere decir que "Desplaz" es 1, únicamente cuando se oprime la tecla C. La entrada habilitador es la que va me va a permitir habilitar el banco de memoria y deshabilitar para cambiar al otro banco, sin que se pierdan los datos ingresados. De esta manera se realizaron los registros para A y para B, el resultado es el siguiente:
Identificador tecla C:
Para habilitar cada banco se tiene en cuenta las instrucciones dadas por el docente sobre el inicio del modo de operación, que se realiza de la siguiente manera:
1).Inicialmente el sistema tiene habilitado el ingreso de A el cual debe ser un numero entre 0-9. Durante este paso se debe visualizar el dato A en el display. De tal forma que el registro A está compuesto por A_Unidades y por A_Decenas, cuando se ingrese el primer dato (entre 0-9) este será cargado en A_Unidades y cuando se ingrese el segundo dato A_Unidades se desplaza a A_decenas y el segundo dato es cargado en A_Unidades. En caso de presionar la tecla C se hará un borrado que será un desplazamiento en el otro sentido es decir de A_Decenas a A_Unidades. Durante este paso se debe visualizar el dato A en los displays.
2).Luego de ingresado se debe presionar * para suma o # para resta, al hacer esto se confirma el dato A y se habilita el banco de memoria B. Se ingresa B (B_Unidades y B_Decenas) con la misma lógica usada en A.
Esto quiere decir que el banco de memoria B se habilita si se presiona * o #, y el banco de memoria A esta habilitado a penas se inicie el sistema. Entonces para poder habilitar estos bancos hay que hacer un detector de cuando se presione * o #, que a su vez me indican si se va a realizar una suma o una resta. Para ello se realizo el siguiente circuito que me permite detectar cuando se oprime * o # (teniendo en cuenta el número binario asociado a estas teclas, que son 1110 para * y 1111 para #):
Al presionar cualquiera de estas teclas se tiene que habilitar el banco de memoria B y confirmar el dato ingresado al banco de memoria A, por ende se realiza lo siguiente:
En la anterior imagen se observa que las salidas del detector de código realizado anteriormente son las entradas de una puerta OR, que es la que me permite saber si se oprimió alguna de las dos teclas. La salida de esta puerta OR va conectada a la entrada S de un Flip-Flop tipo SR, y tiene su entrada R en 0 en todo momento, y la salida es la que me va a permitir habilitar el banco de memoria B y con una compuerta NOT, habilitar el banco A.
Ahora para realizar un SUMADOR/RESTADOR BCD con los datos de los bancos de memoria, primeramente se implementa el sumador BCD de 1 dígito, este se realiza con dos sumadores binarios de 4 bits y además realizando la corrección cuando el resultado es mayor que 9. Entonces queda así:
Pero como ingresamos dos dígitos, se utilizan dos sumadores BCD y se conectan de la siguiente manera, para obtener un SUMADOR BCD de 2 dígitos:
En la anterior imagen se puede ver que en el Carry de entrada del primer sumador BCD tiene una puerta AND y una puerta NOT en donde sus entradas son "Cin" y "L", y esto se debe al proceso de la suma y resta BCD. Cómo se pudo ver en la introducción, se da una breve explicación de la resta en BCD, y de esta manera se implementará en el circuito, entonces teniendo en cuenta el acarreo que se debe tener en la resta solamente cuando A>B, se realiza un comparador de A y B, donde su salida me indica cuando A es menor que B, y esta salida se denomina "L", entonces con una puerta AND se logra que se tenga este acarreo únicamente en ese caso. El comparador que se utilizo es el proporcionado por el simulador, que es el siguiente:
Entonces de esta manera ya se implementó el complemento a 9 para realizar la resta. Pero como se realizará la resta de dos dígitos BCD, se tienen que utilizar dos de estos bloques de complemento a 9, para realizar el complemento a todo el número B, en este caso Unidades y Decenas. Ahora hay que analizar un aspecto, y es cuando se va a realizar la suma y pues por ende no se necesita este complemento a 9 si no que se suma el número A y el número B por lo que ya están en sistema BCD. Para solucionar este problema se utiliza un Mux 2 a 1, en donde cada entrada es un bus de 4 bits, o sea en realidad es un Mux 8 a 4, de esta manera en la entrada 0 del Mux estarán los datos de B provenientes del banco de memoria, y en la entrada 1 estarán los datos del complemento a 9, por ende el selector que se tiene es el que me va indicar si se tiene una resta o una suma, ya que si el selector es 1, o sea resta, pasarán los datos del complemento a 9 y por ende se realizará la resta. Teniendo en cuenta todo lo anterior, sin olvidar que el proceso se realiza para las Unidades y Decenas del número B la implementación queda de esta manera:
Siguiendo con el sumador/restador, ahora se tiene que las salidas de estos Mux van al sumador de 2 dígitos BCD mostrado anteriormente, y quedaría así:
Se observa que en el carry de salida se encuentra una puerta AND, esto se debe al bit de más que se genera al realizar una resta y por ende se realiza la correción de este bit.
Hasta este punto ya se tiene el SUMADOR/RESTADOR BCD, pero la resta solo se tiene cuando A>B. Entonces para poder realizar la resta cuando A<B, como mencione anteriormente los pasos son casi que los mismos, solo que no se genera un acarreo y el resultado que se tiene se debe complementar otra vez a 9, y de esta manera ya se arregla la resta. La parte del acarreo ya se soluciono anteriormente colocando la puerta AND en el sumador de 2 dígitos, entonces para solucionar la parte del último complemento a 9, se coloca un bloque de complemento a 9 a la salida de este sumador de la siguiente manera:
Igual que en la práctica anterior, la suma se va a realizar cuando se oprime la tecla *, y la resta se va a realizar cuando se oprime la tecla #. Esto quiere decir que cuando se oprime * se tiene un 0 en el Cin, y cuando se oprime # se tiene un 1 en Cin. Para lograr esto lo realice con un Flip- Flop SR, en donde la entrada R va conectada a la salida Suma del componente Selector_Suma_Resta mostrado anteriormente y la entrada S va conectada a la salida Resta del componente mencionado, y en el clock va la salida de la puerta OR cuando se presiona cualquier tecla, teniendo en cuenta que el funcionamiento de un Flip-Flop SR es de la siguiente manera:
De esta manera ya se tiene cuando va a realizarse una suma o una resta. Entonces para el signo cuando se realiza una resta, se tiene que tener en cuenta Cin y la salida del comparador, o sea si A<B y con esto se sabe si es positivo o negativo, utilizando una puerta AND. Entonces el circuito del SUMADOR/RESTADOR de dos números BCD de 2 dígitos queda de la siguiente manera:
Visualización dinámica:
Para la implementación de la visualización en los displays 7 segmentos, se tiene que según las indicaciones del docente, al ingresar el dato del banco de memoria A este se tiene que visualizar en el display, al oprimir la operación que se desea, se confirma el dato A y se prosigue a introducir el dato del banco de memoria B. Dicho dato también se debe visualizar en el display. Si se presiona la tecla D se tiene que visualizar el resultado o sea funciona como un igual. Si se presiona A se visualiza A, si se presiona B se visualiza B, y por último si se presiona C se realiza el borrado.
Entonces para poder realizar esto utilicé un Mux de 4 a 1, pero en cada entrada va un bus de 9 bits, o sea en realidad se tiene un Mux de 36 a 9, con dos selectores. Para la primera entrada de este Mux (00) se tienen los datos de la respuesta de la suma o resta, en la segunda entrada (01) se tienen los datos del registro A, en la tercera entrada (10) se tienen los datos del registro B.
Pero según las indicaciones ya mencionadas, al presionar las teclas A o B o D se tiene que visualizar su correspondiente. Para lograr esto, primero se hace un detector de código, que me detecte las teclas mencionadas, teniendo en cuenta su correspondiente en la salida del teclado matricial (A=1010, B=1011, D=1101), entonces se realiza de la siguiente manera:
Entonces de esta manera se manejan los selectores del Mux, dependiendo de la tecla que se oprima y a la salida se tiene el dato que se quiera visualizar. Por ende el circuito completo para esta parte queda de esta manera:
Las salidas denominadas "Salida" del bit 0 al bit 3, corresponden a las unidades, las salidas del bit 4 al bit 7 a las decenas y la salida del bit 8 corresponde al bit menos significativo de las centenas. Ahora para implementar la visualización dinámica la realizare igual que en las prácticas anteriores con un contador de dos bits, que se encuentra en Psoc como BasicCounter, que va tener un 1 en la entrada enable y para el Reset se va a tener en cuenta las salidas y con una compuerta AND se logrará que el contador llegué a los bits 10 y después se resetee. También sus salidas van conectadas a un decodificador 2 a 4, que me permitirá poner en 0 los pines comunes para cada display, que corresponden a Unidades, Decenas y Centenas ya que se tienen 4 displays de cátodo común. Para poder percibir de una mejor manera la visualización dinámica el clock implementado tiene una frecuencia de 600Hz, y esto nos permite que el ojo humano no sea capaz de percibir el cambio. Entonces el circuito implementado es:
Y el circuito del decodificador:
Ahora para pasar los datos de las unidades,decenas, y centenas a los displays, es necesario realizar un Mux de 16 a 4, para esto igual que antes, se utiliza un Mux 4 a 1 poniendo en cada entrada un bus de 4 bits. Los selectores de este Mux van conectados con las salidas del contador mencionado anteriormente. Teniendo en cuenta esto, las salidas del Mux van conectadas a un decodificador de BCD a 7 segmentos y ya se tiene la visualización dinámica deseada. De esta manera el circuito para realizar la visualización en los displays queda así:
Hay que tener en cuenta que en la visualización también se tiene que poder ver el signo del resultado cuando es una resta y el número A es menor que el número B. En la imagen anterior se puede ver que se encuentra un componente adicional conectado a las salidas del decodificador BCD a 7 segmentos, este componente es el que me permite visualizar el resultado, el número A, y el número B con su signo correspondiente. Para realizar este componente, hay que tener en cuenta que cuando algún número es negativo se deben des-habilitar las salidas de los segmentos, excepto la salida del segmento g, ya que este es el que permite visualizar el signo - . Analizando esto, el caso donde únicamente se mostraría el signo sería el siguiente:
Teniendo en cuenta que los selectores de visualización (Se1 y Se0) cuando están en 00, se tiene que visualizar el resultado y que las salidas del contador (Sel1 y Sel0), que a su vez son los selectores del Mux, cuando están en 10 se tienen las centenas y en ese display es donde se requiere que se visualice el signo según corresponda. Cabe recordar que también hay que des-habilitar los otros segmentos y solo se tiene activo el segmento g. Esto se realiza con compuertas AND y colocando una entrada común que va a ir a la función de SALIDA negada. Quiere decir que cuando SALIDA sea 1, o sea se visualiza el signo, los segmentos del a al f serán des-habilitados.
Implementando el circuito se tiene:
Finalmente, ya se obtiene la visualización dinámica del resultado, número A y número B, con el respectivo signo, según la operación. Por ende, el circuito total del SUMADOR/RESTADOR de dos números BCD de dos dígitos ingresado por teclado matricial con visualización dinámica es:
ANÁLISIS DE RESULTADOS:
Con el circuito ya realizado en Psoc, ahora solo queda comprobar su funcionamiento, utilizando la tarjeta desarrolladora. Por ende las conexiones necesarias para probar este circuito requeridas por el docente son:
Siguiendo este montaje, las conexiones realizadas en la tarjeta desarrolladora quedan de la siguiente manera:
Entonces con el montaje ya realizado y con las conexiones adecuadas, en el siguiente vídeo se muestra su funcionamiento:
CONCLUSIONES:
-Terminando el laboratorio se pudo comprobar que funciona de manera adecuada y se tiene el funcionamiento requerido por el docente. Aunque hubo algunas confusiones con el tema de la resta BCD, se logró implementar con éxito.
-Para este diseño de este laboratorio, si se presento problemas con los recursos utilizados, ya que en los primeros intentos se ocupaba más memoria de la disponible, entonces por ende se tuvo que recurrir a otras opciones para disminuir los recursos utilizados y que el programa funcionará correctamente.
-Después de ejecutar el programa, se pudo ver los recursos utilizados de UDB son:
Macrocells: 47.40%
Unique P-terms: 80.73%
FUENTES:
- Simulador utilizado : Psoc 5LP.- Floyd, T. (2006). Fundamentos de Sistemas Digitales (9.a ed., Vol. 1). Madrid, España: PEARSON EDUCACIÓN.