Programacion en CUPL
Programacion en CUPL
Programación en CUPL
5.1. Introducción ................................................................................................................1
5.2. Ficheros y extensiones importantes...........................................................................2
5.3. Notación.......................................................................................................................2
5.3.1. Nombres de variables ...............................................................................................2
5.3.2. Números....................................................................................................................3
5.4. Esquema de un programa en CUPL. ........................................................................3
5.5. Encabezamiento ..........................................................................................................3
5.6. Declaración 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. Máquinas 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. Introducción
Con este tema se cubre lo relativo a la programación de dispositivos de baja capacidad,
centrándonos 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 día Brian War-
neke, encontrado a través de Internet. Sirvan estas líneas como agradecimiento.
El lenguaje CUPL es un compilador universal para sistemas lógicos programables, y se-
rá el utilizado para programar dispositivos lógicos de baja capacidad, principalmente pal’s. En
concreto, en todos los ejemplos nos centraremos en la PAL22V10, que será sobre la que versarán
las prácticas de la asignatura.
Tema 5. Programación en CUPL. 2
5.3. Notación
5.3.1. Nombres de variables
Para programar el funcionamiento requerido del sistema, tendremos que definir una se-
rie de ecuaciones que manejarán las señales de entrada y salida. Para ello, tanto esas señales
como las intermedias que quiera definir para simplificar la notación, deberán tener nombres
válidos de variables. El lenguaje de programación tiene una serie de nombres reservados, que
no pueden ser usados como nombres de variables, como son:
& # ( ) - @
* + [ ] / $
: . .. /* */ ^
; , ! ' =
Tema 5. Programación en CUPL. 3
Teniendo esto en cuenta, cualquier otro nombre es válido. Como ejemplos de nombres
válidos de variables podrían ser:
ENTRADA_1. De esta manera defino nombres. Pueden contener números y subrayados,
pero no guiones ni espacios.
Ent0..3 definirá un conjunto de variables que se nombrarán 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
podríamos agrupar nombres o índices no correlativos: [sube, baja, para, reset]
5.3.2. Números
Cuando queramos asignar un valor a una variable, o establecer una comparación, po-
demos usar números expresados en binario, decimal, hexadecimal y octal. Se diferenciarán en
un primer carácter, entre comillas simples:
5.5. Encabezamiento
El encabezamiento sigue una estructura totalmente estandar. De todas las líneas del
mismo, las dos únicas que tienen un efecto real sobre el diseño son la primera y la última.
En la primera, name, se especifica el nombre del diseño, y será el nombre que se le dé al
fichero de salida *.JED que se produzca. Debe ser un nombre válido de fichero, por tanto.
En la última línea, Device, se introduce el nombre del dispositivo que se va a usar por de-
fecto. Esta asignación se puede, en teoría, sobreseer en el momento de la compilación indicando
otro dispositivo. En la práctica, como el programa presenta un problema justamente en la elec-
ción de dispositivos, es necesario fijar en esta línea el dispositivo concreto que vamos a usar. En
nuestro caso, utilizaremos casi siempre el dispositivo PAL22V10, que se especifica como:
Device p22v10
Aunque también podemos hacer un primer diseño sin restricciones de tamaño, usando
para ello un dispositivo virtual, que especificaremos como:
Device virtual
Tema 5. Programación en CUPL. 4
Esto tiene la ventaja de que evitaremos quedarnos sin términos para sintetizar ecuacio-
nes, y nos permite comprobar a posteriori en el archivo .DOC qué salidas requieren más térmi-
nos productos, para asignar convenientemente los pines.
Un ejemplo de cabecera sería como sigue:
Name prueba3 ;
PartNo 00 ;
Date 30/10/2003 ;
Revision 01 ;
Designer Engineer ;
Company Atmel ;
Assembly None ;
Location ;
Device p22v10 ;
$repeat i = [0..7]
$define point{i} 'b'{i}
$repend
Esto sería lo mismo que poner:
Como ejemplo de ecuaciones lógicas, podemos ver las siguientes, que reproducen la
codificación del nivel de llenado de un depósito(Z2-Z1) en función de los sensores (S2-S1-S0)
que estén activos, así como la generación de una señal de error (Z3) en caso de combinación
ilógica (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 términos (en el caso de
los bits centrales de una PAL22V10 pueden ser hasta 16 sumandos), se puede hacer uso de la
Tema 5. Programación en CUPL. 6
sentencia APPEND, que me permite ir añadiendo sumandos a una determinada ecuación. Así,
la segunda ecuación la puedo escribir como:
APPEND Z2 = (!s0 & !s1 & s2);
APPEND Z2 = (s0 & s1 & s2);
El compilador WinCUPL incluye además una herramienta para rellenar las tablas de
manera semi-automática, generando todas las combinaciones de entrada, y permitiendo cam-
biar los valores con un simple click de raton.
Si quisiéramos definir una máquina de Mealy, deberíamos incluir en las diferentes tran-
siciones (en todas las líneas if), la especificación de la salida deseada, usando la orden OUT,
seguida de las señales que se activarán en ese estado o transición:
present S3 next S0 OUT Count ; /* Estado inestable: ve a S0 */
5.8. Ejemplos
A continuación, se incluyen una serie de ejemplos básicos de programas completos
hechos con WINCUPL. Los propios comentarios del programa sirven a modo de explicación de
los mismos. Se incluyen asimismo algunas simulaciones.
Name vol ;
PartNo 00 ;
Date 20/10/2004 ;
Tema 5. Programación en CUPL. 8
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 */
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;
}
/******************************************************************/
/* Programa de las barreras, en PAL22V10 */
/******************************************************************/
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;
Tema 5. Programación en CUPL. 11
saliendo=!In1&In2;
nada=!(In1#In2)&Res_in;
algo=(In1#In2);
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;
Up=!Q1&Q0;
Down=!Q1&!Q0;
Count=Q1&Q0;