Professional Documents
Culture Documents
Programacin en CUPL
5.1. 5.2. Introduccin ................................................................................................................1 Ficheros y extensiones importantes...........................................................................2
5.3. Notacin.......................................................................................................................2 5.3.1. Nombres de variables ...............................................................................................2 5.3.2. Nmeros....................................................................................................................3 5.4. 5.5. Esquema de un programa en CUPL. ........................................................................3 Encabezamiento ..........................................................................................................3
5.6. Declaracin de pines ...................................................................................................4 5.6.1. Comandos de preprocesado ......................................................................................4 5.7. Cuerpo principal del programa.................................................................................5 5.7.1. Ecuaciones combinacionales ....................................................................................5 5.7.2. Tablas de verdad .......................................................................................................6 5.7.3. Mquinas de estado...................................................................................................6 5.8. Ejemplos ......................................................................................................................7 5.8.1. Control de volumen. .................................................................................................7 5.8.2. Control de barrera de aparcamiento........................................................................10
5.1.
Introduccin
Con este tema se cubre lo relativo a la programacin de dispositivos de baja capacidad, centrndonos en la PAL22V10 como dispositivo de referencia. Se usar el lenguaje CUPL, y en concreto el compilador gratuito suministrado por Atmel, llamado AWINCUPL. Este tema est basado en el Tutorial que sobre CUPL desarrollara en su da Brian Warneke, encontrado a travs de Internet. Sirvan estas lneas como agradecimiento. El lenguaje CUPL es un compilador universal para sistemas lgicos programables, y ser el utilizado para programar dispositivos lgicos de baja capacidad, principalmente pals. En concreto, en todos los ejemplos nos centraremos en la PAL22V10, que ser sobre la que versarn las prcticas de la asignatura.
5.2.
El lenguaje de programacin CUPL se basa en ficheros con la extensin PLD, que contienen la definicin del programa que se desea que ejecute el dispositivo programable. Cuando son abiertos, desde el programa WinCUPL, como proyecto, se abrirn adems los ficheros de simulacin y compilacin que tengan su mismo nombre. Si la compilacin se produce con xito, y si se ha seleccionado un dispositivo fsico concreto (distinto de virtual), entonces se generarn una serie de ficheros, dependiendo de las opciones de compilacin elegidas. De entre ellos, destacamos: *Fichero de mapa de fusibles: Con extensin .JED, incluye la informacin necesaria para que el programador de dispositivos lgicos pueda programar la PLD correspondiente. La informacin contenida, en ASCII, representa la matriz de fusibles con lo que resulta, de alguna manera, legible. *Fichero de documentacin: Con extensin .DOC incluye, segn las opciones que hayamos elegido, informacin de las ecuaciones expandidas y minimizadas, el nmero de trminos producto usado para cada variable, el mapa de fusibles, e incluso el pin-out del dispositivo una vez programado. En caso de simular el circuito, se generarn los ficheros con extensin .SI, en el que se guardan los estmulos definidos, y el fichero .SO, en el que se almacena el resultado de la simulacin.
5.3.
Notacin
SEQUENCET TABLE Igualmente, hay una serie de smbolos que no podrn formar parte de nombres de variables: & # ( * + [ : . .. ; , ! ) ] /* ' / */ = @ $ ^
Teniendo esto en cuenta, cualquier otro nombre es vlido. Como ejemplos de nombres vlidos de variables podran ser: ENTRADA_1. De esta manera defino nombres. Pueden contener nmeros y subrayados, pero no guiones ni espacios. Ent0..3 definir un conjunto de variables que se nombrarn correlativamente Ent0, Ent1, Ent2 y Ent3. Siempre tiene que empezar por 0. [Ent0,Ent1,Ent2, Ent3] esta es otra forma de definir lo mismo que antes, pero aqu s que podramos agrupar nombres o ndices no correlativos: [sube, baja, para, reset]
5.3.2. Nmeros
Cuando queramos asignar un valor a una variable, o establecer una comparacin, podemos usar nmeros expresados en binario, decimal, hexadecimal y octal. Se diferenciarn en un primer carcter, entre comillas simples: Nmero 'b'0 'b'1101 'o'663 'D' 92 'h' BA 'b'[001..100] Base Binario Binario Octal decimal hexadecimal binario Valor decimal 0 13 435 92 186 rango de 1 a 4
5.4.
Un fichero .PLD, que contiene un programa en CUPL, tiene siempre la misma estructura, compuesto de un encabezamiento, en el que se da informacin acerca del diseo, un bloque de definicin de variables, en el que se nombran los pines y se definen conjuntos de variables, y el bloque central de definicin de funcionamiento.
5.5.
Encabezamiento
El encabezamiento sigue una estructura totalmente estandar. De todas las lneas del mismo, las dos nicas que tienen un efecto real sobre el diseo son la primera y la ltima. En la primera, name, se especifica el nombre del diseo, y ser el nombre que se le d al fichero de salida *.JED que se produzca. Debe ser un nombre vlido de fichero, por tanto. En la ltima lnea, Device, se introduce el nombre del dispositivo que se va a usar por defecto. Esta asignacin se puede, en teora, sobreseer en el momento de la compilacin indicando otro dispositivo. En la prctica, como el programa presenta un problema justamente en la eleccin de dispositivos, es necesario fijar en esta lnea el dispositivo concreto que vamos a usar. En nuestro caso, utilizaremos casi siempre el dispositivo PAL22V10, que se especifica como: Device p22v10 Aunque tambin podemos hacer un primer diseo sin restricciones de tamao, usando para ello un dispositivo virtual, que especificaremos como: Device virtual
Esto tiene la ventaja de que evitaremos quedarnos sin trminos para sintetizar ecuaciones, y nos permite comprobar a posteriori en el archivo .DOC qu salidas requieren ms trminos productos, para asignar convenientemente los pines. Un ejemplo de cabecera sera como sigue: Name PartNo Date Revision Designer Company Assembly Location Device prueba3 ; 00 ; 30/10/2003 ; 01 ; Engineer ; Atmel ; None ; ; p22v10 ;
5.6.
Declaracin de pines
Tras la cabecera, se incluye la seccin en la que se nombran los diferentes pines de E/S que se vayan a usar. Para ello, la sintaxis es: PIN <n> = <nombre> ; Se puede definir un nombre comn para una serie de pines. Igualmente se puede indicar la polaridad de la seal, esto es si se activa a nivel alto o bajo. A todos los efectos, la seal se cambia de sentido lgico, y operaramos con ella negada. Algunos ejemplos seran: Pin 1 = entrada1; Pin [2..4] = [Q0..Q2]; Pin 10 = !Reset; En esta seccin tambin se definirn las variables de ms de un bit que posteriormente se usarn en el cdigo. Estas variables, llamadas FIELD, se usarn para definir tablas de verdad y mquinas de estado, entre otras cosas. Para definir un Field, simplemente tendr que darle un nombre y asignarle variables: FIELD estado = [Q0..Q2]; FIELD entradas = [entrada1, entrada2, entrada3]; FIELD salidas = [sube, baja, paro, marcha];
$repeat i = [0..7] $define point{i} 'b'{i} $repend Esto sera lo mismo que poner:
Dentro de los bucles REPEAT, se pueden usar operaciones aritmticas para definir valores. Por ejemplo, para definir un contador ascendente-descendente, en cada estado tendr que ir al anterior o al siguiente, lo que puedo expresar muy cmodamente as: $repeat i=[1..14] Present 'D'{i} if SUBE next 'D'{i+1}; if BAJA next 'D'{i-1}; default next 'D'{i}; $repend
5.7.
En esta parte del fichero ser en la que, propiamente, codificar el funcionamiento que deseo de mi sistema. Aqu podr incluir tanto ecuaciones lgicas que definan sistemas combinacionales o secuenciales, como definiciones de mquinas de estados complejas.
Como ejemplo de ecuaciones lgicas, podemos ver las siguientes, que reproducen la codificacin del nivel de llenado de un depsito(Z2-Z1) en funcin de los sensores (S2-S1-S0) que estn activos, as como la generacin de una seal de error (Z3) en caso de combinacin ilgica (por ejemplo, 110) Z1 = s1 & s2; Z2 = (!s0 & !s1 & s2) # (s0 & s1 & s2); Z3 = !s0 & s1 # s2 & !s1; Cuando las ecuaciones son muy complejas, o incluyen muchos trminos (en el caso de los bits centrales de una PAL22V10 pueden ser hasta 16 sumandos), se puede hacer uso de la
sentencia APPEND, que me permite ir aadiendo sumandos a una determinada ecuacin. As, la segunda ecuacin la puedo escribir como: APPEND Z2 = (!s0 & !s1 & s2); APPEND Z2 = (s0 & s1 & s2);
field estado=[Q1..0] ; /* Estado: bits Q1 y Q0*/ $define S0 'b'00 /* Defines para asignar nombre*/ $define S1 'b'01 /* a los estados. */ $define S2 'b'10 $define S3 'b'11
sequenceD estado { /*Comienzo de una M.Est: SequenceD <nombre> {*/ /* sintaxis de las transiciones: */ /* Present <estado> if <condicion> next <estado>;*/ present S0 if entrando next S1; default next S0; /* si no se da la condicin: qudate*/ present S1 if nada next S0; if debajo next S2; if !Res_in next S0; if entrando next S1; present S2 if nada next S3; if algo next S2; if !Res_in next S0; present S3 next S0 ; /* Estado inestable: ve a S0 */ }
Si quisiramos definir una mquina de Mealy, deberamos incluir en las diferentes transiciones (en todas las lneas if), la especificacin de la salida deseada, usando la orden OUT, seguida de las seales que se activarn en ese estado o transicin: present S3 next S0 OUT Count ; /* Estado inestable: ve a S0 */
5.8.
Ejemplos
A continuacin, se incluyen una serie de ejemplos bsicos de programas completos hechos con WINCUPL. Los propios comentarios del programa sirven a modo de explicacin de los mismos. Se incluyen asimismo algunas simulaciones.
Revision 01 ; Designer MAPE ; Company GTE ; Assembly None ; Location ; Device p22v10 ; /************************************************************/ /* Sistema de control de volumen. Incluye: */ /* Maquina de estado para filtrar entrada Up */ /* Maquina de estado para filtrar entrada Dn */ /* Maquina de estado para convertir Mute en conmutador */ /* Contador reversible de 4 bits para guardar estado */ /* El Mute se realiza con la opcion .OE */ /************************************************************/ /* *************** INPUT PINS *********************/ PIN 1 = Clk ; /* Reloj*/ PIN 2 = Up ; /* Sube */ PIN 3 = Dn ; /* Baja */ PIN 4 = Mute ; /* Mute */ PIN 5 = Reset ; /* Reset act. a nivel bajo */ /* *************** OUTPUT PINS *********************/ PIN 14 = Q0 ; /* Contador de 4 bits. LSB */ PIN 15 = Q1 ; /* Contador de 4 bits. */ PIN 16 = Q2 ; /* Contador de 4 bits. */ PIN 17 = Q3 ; /* Contador de 4 bits. MSB */ PIN 18 = Q0U ; /* M.estados up */ PIN 19 = Q1U ; /* M.estados up */ PIN 20 = Q0D ; /* M.estados down */ PIN 21 = Q1D ; /* M.estados down */ PIN 22 = Q0M ; /* M.estados mute */ PIN 23 = Q1M ; /* M.estados mute */ FIELD FIELD FIELD FIELD estup = [Q1U, Q0U]; estdn = [Q1D, Q0D]; estmt = [Q1M, Q0M]; Cont = [Q3, Q2, Q1, Q0];
sequence estup { /* maquina UP: cada vez que se activa */ Present 'b'00 /* la entrada, se da un solo pulso. */ if Up & Reset Next 'b'01; if !Reset Next 'b'00; default next 'b'00; Present 'b'01 if Up & Reset Next 'b'10; if !Reset Next 'b'00; default next 'b'10; Present 'b'10 if !Up & Reset Next 'b'00; if !Reset Next 'b'00; default next 'b'10; } /* la salida es Q0U*/ sequence estdn { /* maquina DOWN: cada vez que se activa */ Present 'b'00 /* la entrada, se da un solo pulso. */ if Dn & Reset Next 'b'01; if !Reset Next 'b'00; default next 'b'00; Present 'b'01 if Dn & Reset Next 'b'10; if !Reset Next 'b'00; default next 'b'10; Present 'b'10
if !Dn & Reset Next 'b'00; if !Reset Next 'b'00; default next 'b'10; }/* la salida es Q0D*/ sequence estmt { /* Maquina mute: cada vez que se activa*/ Present 'b'00 /* la entrada, cambia de estado: se apaga */ if Mute & Reset Next 'b'01; /* o se enciende */ if !Reset Next 'b'00; /* Codificado: 00, 01, 11, 10*/ default next 'b'00; /* con lo que la salida es Q1*/ Present 'b'01 if !Mute & Reset Next 'b'11; if !Reset Next 'b'00; default next 'b'01; Present 'b'11 if Mute & Reset Next 'b'10; if !Reset Next 'b'00; default next 'b'11; Present 'b'10 if !Mute & Reset Next 'b'00; if !Reset Next 'b'00; default next 'b'11; } Sequence Cont{ /* contador 4 bits reversible */
Present 'D'0 if Q0U & !Q0D & Reset next 'D'1; /* Q0U: salida maquina up (bit 0)*/ if Q0D & Reset next 'D'15; /* Q0D: salida maquina down (bit 0)*/ default next 'D'0; $repeat i=[1..14] Present 'D'{i} if Q0U & !Q0D & Reset next 'D'{i+1}; if Q0D & Reset next 'D'{i-1}; default next 'D'{i}; $repend Present 'D'15 if Q0U & !Q0D & Reset next 'D'0; if Q0D & Reset next 'D'14; default next 'D'0; } Q1.oe=!Q1M; /*activacion del MUTE*/ Q2.oe=!Q1M; Q3.oe=!Q1M; Q0.oe=!Q1M;
/******************************************************************/ /* Programa de las barreras, en PAL22V10 */ /******************************************************************/ /** Pin Pin Pin Pin /** Pin Pin Pin Inputs **/ 1 = clk ; 2 = In1 ; 3 = In2 ; 4 = Res_in; Outputs **/ 14 = Up; 15 = Down; 16 = Count; **/
/** Declarations and Intermediate Variables Pin 17 = Q0 ; Pin 18 = Q1 ; /** Logic Equations **/ field estado=[Q1..0] ; $define S0 'b'00 $define S1 'b'01 $define S2 'b'10 $define S3 'b'11
entrando=In1&(!In2)&Res_in; debajo=In1&In2&Res_in;
sequenceD estado { present S0 if entrando next S1; if !entrando next S0; present S1 if nada next S0; if debajo next S2; if !Res_in next S0; if entrando next S1; present S2 if nada next S3; if algo next S2; if !Res_in next S0; present S3 next S0 ; } estado.oe = 'b'11;