viernes, 17 de mayo de 2013

Lógica combinatoria con GAL y WinCUPL

LÓGICA COMBINATORIA CON GAL
En esta publicación se explicar como se utiliza y programa un dispositivo GAL para realizar circuitos digitales empleando lógica digital combinatoria.
Actualmente este dispositivo es muy económico y relativamente fácil de conseguir, ademas es reprogramable y fácil de montar en un protoboard.
Para programar el dispositivo GAL se empleara el WinCupl de Atmel, se pude descargar después de registrarse en la pagina.
Una vez descargado se introduce el código de activación dado por el soporte técnico de Atmel el cual es 60008009
ENLACES DE INTERÉS

Descargas

GAL22V10
En la GAL22v10 tendremos que 22 terminales pueden ser utilizados como entradas, en el esquema están marcados como In, que 10 terminales se pueden utilizar como salidas, en el esquema están marcados como Out ademas que estas salidas pueden ser Q lo que representa la salida de un flip flop. Se puede observar que los 10 terminales comparten la opción de entrada o salida y que esta salida puede ser el Q de un flip flop. También el terminal 1 que es una entrada comparte la opción de ser la entrada de la señal de reloj Clk para los flip flop internos de la GAL siendo esto útil al diseñar circuitos digitales secuenciales.

WINCUPL
En las siguientes tablas se resumen las instrucciones mas frecuentes para la realización de aplicaciones digitales combinatorias.

Formatos Numéricos

Se utilizan los prefijos entre comillas simples para indicar el formato numerico que se esta utilizando.

Asignación De Terminales, Variables Y Constantes

Son las instrucciones que se utilizan para definir y asignar terminales a variables, o asignar a variables operaciones con variables o constantes.
Ejemplos de asignaciones de terminales:
PIN 2 = a; /*asigna al terminal 2 la variable a*/
PIN 2 = !a; /*asigna al terminal 2 la variable a negada*/
PIN [2,3,4,5,6,7,8,9]= [A0,A1,A2,A3,A4,A5,A6,A7];
PIN [2..9] = [A0,A1,A2,A3,A4,A5,A6,A7];
PIN [2..9] = [A0..A7];
Ejemplos de asignaciones con variables intermedias: Las variables intermedias no tiene terminales asignados y son útiles para simplificar las ecuaciones que generan las salidas.
X0 = A0&A1 # A1&A2;
FIELD entradas = [D,C,B,A];
Ejemplos de ecuaciones booleanas de salida: Son las ecuaciones asociadas a las varibles declaradas para los terminales de salida.
El simbolo => utilizado en las tablas significa asignación de un ecuación booleana.
S = X0#Y0;
Table input=>output {
‘d’00 => ‘d’000;
‘d’01 => ‘d’001;
‘d’02 => ‘d’004;
}

Operadores Lógicos

La jerarquía hacer referencia a que operador se tendrá en cuenta primero al hacer una operación, por ejemplo si tenemos S=!A&B, se tendrá en cuenta primero la operación de negar A y luego se hará la operación AND.

Operadores Aritméticos

Los operadores aritméticos se utilizan para realizar operaciones entre valores que sean de tipo numérico y no con variables de tipo booleano como las asignadas a lo terminales por medio de la instrucción PIN. Normalmente lo que se hace es que el resultado de una operación aritmética se asigna a una variable o registro.

Instrucciones Adicionales

Instrucción De Repetición REPEAT: Esta instuccion no es formalmente igual a la que se utiliza en otros lenguajes de programacion como BASIC por ejemplo. Esta instrucción se utiliza en WinCupl para ahorrar escritura de lineas de código y no para implimentar una estructura ciclica en el dispositvo GAL
Ejemplo:
$repeat i = [0..3]
$define D(i) 'b'(i)
$repend
esto equivale a escribir el siguiente código:
$define D0 'b'000
$define D1 'b'001
$define D2 'b'010
$define D3 'b'011

EJEMPLOS
Ejemplo 1
Implementar una compuerta AND de dos entradas en una GAL22V10.

Name Ejem01 ;
PartNo   00 ;
Date     17/05/2013 ;
Revision 01 ;
Designer Julio ;
Company  UNIAJC ;
Assembly None ;
Location  ;
Device   G22V10 ;
/*Terminales de entrada de la compuerta AND*/
PIN 3 = a ; PIN 4 = b; 
/*Terminales de salida para las compuertas*/ 
PIN 17 = s; 
s = a&b; /*Compuerta AND*/ 
Ejemplo 2

Implementar una compuerta OR y una compuerta AND de dos entradas en una GAL22V10.

Name Ejem02 ;
PartNo   00 ;
Date     17/05/2013 ;
Revision 01 ;
Designer Julio ;
Company  UNIAJC ;
Assembly None ;
Location  ;
Device   G22V10 ;
/*Terminales de entrada de la compuerta AND*/
PIN 2 = A0 ;
PIN 3 = A1; 
/*Terminales de entrada de la compuerta OR*/
PIN 4 = B0;
PIN 5 = B1;
/*Terminales de salida para las compuertas*/ 
PIN 23 = S0; /*Salida compuerta AND*/
PIN 22 = S1 ;/*Salida compuerta OR*/
/*Operaciones Logicas*/ 
S0 = A1&A0; /*Compuerta AND*/ 
S1 = B1#B0; /*Compuerta OR*/ 
Ejemplo 3

Implementar un decodificador de binario a decimal con la GAL22V10
Tabla de la verdad correspondiente al decodificador, que se empleara en el programa.
En este ejemplo no se esta empleando el punto decimal dp a pesar de que esta conectado en el esquema mostrado.

CARACTERES EN UN DISPLAY 7 SEGMENTOS

Para otras aplicaciones puede ser útil generar caracteres alfanuméricos con un display de 7 segmentos, aqui se deja una tabla con su respectivo valor decimal teniendo en cuenta que el segmento a es el menos significativo y el segmento g el mas significativo
Mapa de caracteres
Name Ejem03 ;
PartNo 00 ;
Date 17/05/2013 ;
Revision 01 ;
Designer Julio ;
Company UNIAJC ;
Assembly None ;
Location ;
Device G22V10 ;
/*Terminales de entrada */
PIN [2..5] = A, B, C, D;
/*Terminales de salida */
PIN [13..20] = sa,sb,sc,sd,se,sf,sg,sdp;
/*Declaraciones */
FIELD entradas = [D,C,B,A];
FIELD salidas = [sdp,sg,sf,se,sd,sc,sb,sa]; 
/*Ecuaciones booleanas */
TABLE entradas => salidas {
'b'0000 => 'b'00111111;
'b'0001 => 'b'00000110;
'b'0010 => 'b'01011011;
'b'0011 => 'b'01001111;
'b'0100 => 'b'01100110;
'b'0101 => 'b'01101101;
'b'0110 => 'b'01111101;
'b'0111 => 'b'00000111;
'b'1000 => 'b'01111111;
'b'1001 => 'b'01100111;
'b'1010 => 'b'00000000;
'b'1011 => 'b'00000000;
'b'1100 => 'b'00000000; 
'b'1101 => 'b'00000000;
'b'1110 => 'b'00000000; 
'b'1111 => 'b'00000000;
 }

5 comentarios:

  1. no entendi el ejemplo 3 ... es decir es necesario añandir una formula booleana para que en la slida aparesca el respectivo numero?? o asi tal cual esta el codigo que se veria en la salida ..???

    ResponderEliminar
  2. solo hay un error que en la gal22v10 el pin 13 solo funciona como entrada no como salida solo debes recorrer las salidas
    DE ESTA MANERA
    /*Terminales de salida */
    PIN [14..21] = sa,sb,sc,sd,se,sf,sg,sdp;

    ResponderEliminar
    Respuestas
    1. amm ok muchas gracias auqnue tengo una duda con respecto a por que en esta parte es necesario invertir las pociciones de cada entrada y salida??
      FIELD entradas = [D,C,B,A];
      FIELD salidas = [sdp,sg,sf,se,sd,sc,sb,sa];

      Eliminar
  3. Disculpa tengo que diseñar un multiplexor 4 a 1 en una GAL, sera que puedas ayudarme?

    ResponderEliminar