Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Programacion en WinCupl

16,729 views

Published on

Una pequeña introducción para empezar a programar PLD'S en WinCupl.

Published in: Education
  • Be the first to comment

Programacion en WinCupl

  1. 1. Tema 5. 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 enconcreto 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. Enconcreto, en todos los ejemplos nos centraremos en la PAL22V10, que será sobre la que versaránlas prácticas de la asignatura.
  2. 2. Tema 5. Programación en CUPL. 2 5.2. Ficheros y extensiones importantes. El lenguaje de programación CUPL se basa en ficheros con la extensión PLD, que con-tienen la definición del programa que se desea que ejecute el dispositivo programable. Cuandoson abiertos, desde el programa WinCUPL, como “proyecto”, se abrirán además los ficheros desimulación y compilación que tengan su mismo nombre. Si la compilación se produce con éxito, y si se ha seleccionado un dispositivo físico con-creto (distinto de virtual), entonces se generarán una serie de ficheros, dependiendo de las op-ciones de compilación elegidas. De entre ellos, destacamos: *Fichero de mapa de fusibles: Con extensión .JED, incluye la información necesaria paraque el programador de dispositivos lógicos pueda programar la PLD correspondiente. La in-formación contenida, en ASCII, representa la matriz de fusibles con lo que resulta, de algunamanera, legible. *Fichero de documentación: Con extensión .DOC incluye, según las opciones quehayamos elegido, información de las ecuaciones expandidas y minimizadas, el número de tér-minos producto usado para cada variable, el mapa de fusibles, e incluso el pin-out del dispositi-vo una vez programado. En caso de simular el circuito, se generarán los ficheros con extensión .SI, en el que seguardan los estímulos definidos, y el fichero .SO, en el que se almacena el resultado de la simu-lación. 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ñalescomo las intermedias que quiera definir para simplificar la notación, deberán tener nombresválidos de variables. El lenguaje de programación tiene una serie de nombres reservados, queno pueden ser usados como nombres de variables, como son:APPEND ASSEMBLY ASSY COMPANY CONDITIONDATE DEFAULT DESIGNER DEVICE ELSEFIELD FLD FORMAT FUNCTION FUSEGROUP IF JUMP LOC LOCATIONMACRO MIN NAME NODE OUTPARTNO PIN PINNNODE PRESENT REVREVISION SEQUENCE SEQUENCED SEQUENCEJK SEQUENCERSSEQUENCET TABLE Igualmente, hay una serie de símbolos que no podrán formar parte de nombres de va-riables:& # ( ) - @* + [ ] / $: . .. /* */ ^; , ! =
  3. 3. Tema 5. Programación en CUPL. 3 Teniendo esto en cuenta, cualquier otro nombre es válido. Como ejemplos de nombresvá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í quepodrí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 enun primer carácter, entre comillas simples:Número Base Valor decimalb0 Binario 0b1101 Binario 13o663 Octal 435D 92 decimal 92h BA hexadecimal 186b[001..100] binario rango de 1 a 4 5.4. Esquema de un programa en CUPL. Un fichero .PLD, que contiene un programa en CUPL, tiene siempre la misma estructu-ra, compuesto de un encabezamiento, en el que se da información acerca del diseño, un bloquede definición de variables, en el que se nombran los pines y se definen conjuntos de variables, yel bloque central de definición de funcionamiento. 5.5. Encabezamiento El encabezamiento sigue una estructura totalmente estandar. De todas las líneas delmismo, 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é alfichero 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 indicandootro 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. Ennuestro 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, usandopara ello un dispositivo virtual, que especificaremos como: Device virtual
  4. 4. 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 ; 5.6. Declaración de pines Tras la cabecera, se incluye la sección en la que se nombran los diferentes pines de E/Sque se vayan a usar. Para ello, la sintaxis es: PIN <nº> = <nombre> ; Se puede definir un nombre común para una serie de pines. Igualmente se puede indi-car la polaridad de la señal, esto es si se activa a nivel alto o bajo. A todos los efectos, la señal secambia de sentido lógico, y operaríamos con ella negada. Algunos ejemplos serían: Pin 1 = entrada1; Pin [2..4] = [Q0..Q2]; Pin 10 = !Reset; En esta sección también se definirán las variables de más de un bit que posteriormentese usarán en el código. Estas variables, llamadas FIELD, se usarán para definir tablas de verdady máquinas de estado, entre otras cosas. Para definir un Field, simplemente tendré que darle unnombre y asignarle variables: FIELD estado = [Q0..Q2]; FIELD entradas = [entrada1, entrada2, entrada3]; FIELD salidas = [sube, baja, paro, marcha]; 5.6.1. Comandos de preprocesado El compilador tiene una serie de comandos de preprocesado para ayudar a la confec-ción de los programas. Así, puedo definir etiquetas, que me servirán para poder usarlas dentrodel programa, de la misma manera que en lenguaje C estándar: $define DIR_BASE ‘h’2000 $define SI ‘b’1 Estas líneas no acaban en punto y coma. Otro tipo de comandos de preprocesado sonlos bucles REPEAT. Con estos bucles puedo escribir de forma cómoda una serie de líneas quede otra manera sería más tedioso. Se define un índice, con un rango de variación, y posterior-mente se incluyen líneas de código que se expandirán las veces que haga falta para tomar todoslos valores especificados del índice, como se ve en el ejemplo:
  5. 5. Tema 5. Programación en CUPL. 5 $repeat i = [0..7] $define point{i} b{i} $repend Esto sería lo mismo que poner: $define point0 b000 $define point1 b001 $define point2 b010 $define point3 b011 $define point4 b100 $define point5 b101 $define point6 b110 $define point7 b111 Dentro de los bucles REPEAT, se pueden usar operaciones aritméticas para definir va-lores. Por ejemplo, para definir un contador ascendente-descendente, en cada estado tendré queir al anterior o al siguiente, lo que puedo expresar muy cómodamente 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. Cuerpo principal del programa En esta parte del fichero será en la que, propiamente, codificaré el funcionamiento quedeseo de mi sistema. Aquí podré incluir tanto ecuaciones lógicas que definan sistemas combi-nacionales o secuenciales, como definiciones de máquinas de estados complejas. 5.7.1. Ecuaciones combinacionales Para definir un circuito combinacional, tan solo habrá que escribir las ecuaciones lógicasque lo forman. Ello se hará usando los operadores lógicos básicos, pudiendo usar paréntesis, odividir una ecuación en varias partes, por medio del comando APPEND.Operador Ejemplo Función lógica! !A NOT& A&B AND# A#B OR$ A$B XOR Como ejemplo de ecuaciones lógicas, podemos ver las siguientes, que reproducen lacodificació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óniló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 delos bits centrales de una PAL22V10 pueden ser hasta 16 sumandos), se puede hacer uso de la
  6. 6. Tema 5. Programación en CUPL. 6sentencia 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); 5.7.2. Tablas de verdad Otra forma más sencilla, a veces, de establecer ecuaciones lógicas es definir directamen-te la tabla de verdad que relaciona los valores lógicos a la entrada y a la salida del circuito com-binacional que se quiere diseñar. Para ello, deberemos definir previamente, con la sentenciaFIELD, los dos grupos de variables (entradas y salidas) en le orden en que va a ser definida latabla. En el siguiente ejemplo, vemos cómo se definiría el circuito anteriormente descrito, peroutilizando tablas. Primero, con las dos sentencias FIELD defino las entradas (ins) y las salidas(outs), para posteriormente ir especificando los valores de las salidas en función de las entradas:FIELD ins=[s2, s1, s0];FIELD outs=[Z3, Z2, Z1];TABLE ins => outs { b000 => b000; b001 => b001; b010 => b100; b011 => b010; b100 => b100; b101 => b100; b110 => b100; b111 => b011;} El compilador WinCUPL incluye además una herramienta para rellenar las tablas demanera semi-automática, generando todas las combinaciones de entrada, y permitiendo cam-biar los valores con un simple click de raton. 5.7.3. Máquinas de estado Sin duda, una de las aplicaciones fundamentales de los dispositivos programables es larealización de máquinas de estado, bien sean máquinas explícitas (con sus entradas, estados ysalidas) o implícitas (como puede ser un contador reversible). Para diseñar máquinas de estado, necesitaremos previamente definir las señales queformarán mi “estado”, los biestables que vaya a utilizar. Esto lo haremos con la sentenciaFIELD, de manera similar a lo ya visto, asignando en este caso pines de salida que tengan regis-tro asociado, obviamente. Resulta cómodo, aunque no es obligatorio, definir los nombres de losestados asignando a cada nombre un valor binario del estado, usando para ello la orden depreprocesado $DEFINE. Tras esto, definiremos la Tabla de transición de estados, simplemente escribiendo las dis-tintas transiciones que pueden ocurrir desde un estado dado. Para ello, puedo definir previa-mente una serie de condiciones de transición, para simplificar la notación, que serán posterior-mente simplificadas. También será frecuente el uso de transiciones por defecto, esto es, si no secumple ninguna de las condiciones especificadas previamente. Veamos esto con un ejemplo: diseñamos una máquina de estado para el control de una barrera de un garaje. Tiene dos senso- res, y debe empezar a abrir la barrera cuando detecta un coche en el sensor 1, y mantenerla arriba hasta que pase por ambos y finalmente sólo toque al segundo sensor, momento en el que empeza- rá a bajar la barrera. Cuando el coche acabe de pasar, se dará un pulso de un ciclo de reloj para “contar” el coche.
  7. 7. Tema 5. Programación en CUPL. 7field estado=[Q1..0] ; /* Estado: bits Q1 y Q0*/$define S0 b00 /* Defines para asignar nombre*/$define S1 b01 /* a los estados. */$define S2 b10$define S3 b11entrando=In1&(!In2)&Res_in; /* Variables intermedias */debajo=In1&In2&Res_in; /* no son necesarias pero */saliendo=!In1&In2; /* ayudan a definir las transiciones*/nada=!(In1#In2)&Res_in;algo=(In1#In2);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 condición: quédate*/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 */}Up=!Q1&Q0; /*Salidas de la M.Est. como combinacion del estado*/Down=!Q1&!Q0;Count=Q1&Q0; 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 completoshechos con WINCUPL. Los propios comentarios del programa sirven a modo de explicación delos mismos. Se incluyen asimismo algunas simulaciones. 5.8.1. Control de volumen. Se desea controlar el volumen de un equipo, para lo que se dispone de un botón de UP,otro de DOWN, y uno de MUTE. El sistema deberá filtrar generando señales de un sólo pulsocada vez que se pulse Up o DOWN, siendo estas señales las que hagan que crezca o decrezca undeterminado registro (contador) de 4 bits. La señal MUTE hará que el sistema entre o salga delestado de mute, que se define como todas las salidas a “0”. Tras salir de él debe recordar el últi-mo valor asignado.Name vol ;PartNo 00 ;Date 20/10/2004 ;
  8. 8. Tema 5. Programación en CUPL. 8Revision 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 estup = [Q1U, Q0U];FIELD estdn = [Q1D, Q0D];FIELD estmt = [Q1M, Q0M];FIELD Cont = [Q3, Q2, Q1, Q0];sequence estup { /* maquina UP: cada vez que se activa */ Present b00 /* la entrada, se da un solo pulso. */ if Up & Reset Next b01; if !Reset Next b00; default next b00; Present b01 if Up & Reset Next b10; if !Reset Next b00; default next b10; Present b10 if !Up & Reset Next b00; if !Reset Next b00; default next b10; } /* la salida es Q0U*/sequence estdn { /* maquina DOWN: cada vez que se activa */ Present b00 /* la entrada, se da un solo pulso. */ if Dn & Reset Next b01; if !Reset Next b00; default next b00; Present b01 if Dn & Reset Next b10; if !Reset Next b00; default next b10; Present b10
  9. 9. Tema 5. Programación en CUPL. 9 if !Dn & Reset Next b00; if !Reset Next b00; default next b10; }/* la salida es Q0D*/sequence estmt { /* Maquina mute: cada vez que se activa*/ Present b00 /* la entrada, cambia de estado: se apaga */ if Mute & Reset Next b01; /* o se enciende */ if !Reset Next b00; /* Codificado: 00, 01, 11, 10*/ default next b00; /* con lo que la salida es Q1*/ Present b01 if !Mute & Reset Next b11; if !Reset Next b00; default next b01; Present b11 if Mute & Reset Next b10; if !Reset Next b00; default next b11; Present b10 if !Mute & Reset Next b00; if !Reset Next b00; default next b11; }Sequence Cont{ /* contador 4 bits reversible */ Present D0if Q0U & !Q0D & Reset next D1; /* Q0U: salida maquina up (bit 0)*/if Q0D & Reset next D15; /* Q0D: salida maquina down (bit 0)*/default next D0;$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 D15 if Q0U & !Q0D & Reset next D0; if Q0D & Reset next D14; default next D0;}Q1.oe=!Q1M; /*activacion del MUTE*/Q2.oe=!Q1M;Q3.oe=!Q1M;Q0.oe=!Q1M;
  10. 10. Tema 5. Programación en CUPL. 10 5.8.2. Control de barrera de aparcamiento Este ejemplo ha sido comentado previamente. Aquí se desarrolla íntegro el programade control de la barrera, y se incluye finalmente unas gráficas de simulación:Name Prueba2 ;Partno pru2-1 ;Revision 1 ;Date 27/10/2003 ;Designer mape ;Company GTE ;Assembly 1 ;Location aqui ;Device p22v10 ;Format c: ;/******************************************************************//* Programa de las barreras, en PAL22V10 *//******************************************************************//** Inputs **/Pin 1 = clk ;Pin 2 = In1 ;Pin 3 = In2 ;Pin 4 = Res_in;/** Outputs **/Pin 14 = Up;Pin 15 = Down;Pin 16 = Count;/** Declarations and Intermediate Variables **/Pin 17 = Q0 ;Pin 18 = Q1 ;/** Logic Equations **/field estado=[Q1..0] ;$define S0 b00$define S1 b01$define S2 b10$define S3 b11entrando=In1&(!In2)&Res_in;debajo=In1&In2&Res_in;
  11. 11. Tema 5. Programación en CUPL. 11saliendo=!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 = b11;Up=!Q1&Q0;Down=!Q1&!Q0;Count=Q1&Q0;

×