Circuitos complejos de lógica programable - CPLD (Introducción)

Un CPLD (del inglés Complex Programmable Logic Device), es un chip que puede emular el comportamiento de miles de puertas lógicas interconectadas entre sí y junto con algunos bits de estado, registros o flip-flops –como quieras llamarlo– y cuenta con bastantes pines de entrada y salida, de forma que puedes implementar un circuito combinacional con algo de memoria (estados) bastante complejo (de ahí la C de complex) Además es reprogramable, de forma que se puede configurar una y otra vez la función que emula el chip.


Los CPLD son la evolución de lo que fueron los PLD, circuitos con el mismo funcionamiento pero más simples. Las PAL16V8 (PLD) que usábamos en la universidad corresponden a la mitad de una sola macrocelda de las 72 que tiene un XC9572XL, que es el CPLD que voy a usar dentro de poco.


Los CPLD llevan ya bastantes años entre nosotros, pero no por ello se han quedado obsoletos. Sin embargo, más recientemente aparecieron las FPGA, que viene a ser lo mismo pero con esteroides, y eso sí, no tan rápidos. Una FPGA tiene cientos de pines en contraposición a las pocas decenas hasta el centenar que puede tener un CPLD, y de potencia de emulación ya ni hablemos: se pueden implementar procesadores enteros dentro de una FPGA.


Centrándonos en los CPLD, contienen una matriz programable que configura la función que desempeña el chip. Esta matriz recibe por entradas los valores eléctricos de los pins y los valores anteriores del estado. Según esa entrada se generan los valores de la función para los pines de salida y los nuevos valores de los bits de estado, y así sucesivamente, sincronizado todo por un reloj que puede llegar a los 200 MHz.


Los CPLD se programan desde el ordenador pero hace falta un dispositivo programador compatible JTAG. Cómo no, ha aparecido un proyecto que convierte el Arduino en un programador JTAG, esperemos que funcione, el tipo dice que le ha funcionado con el mismo CPLD que voy a usar yo.


Veamos los CPLD que he elegido para hacer pruebas. Me he decantado por la marca Xilinx, que ofrece un entorno de programación o IDE con versión para Linux, y es de las casas más populares. Concretamente la familia XC9500. En realidad he comprado dos modelos de CPLD: el moderno XC9572XL, y el más antiguo pero que funciona a 5 voltios, XC9572 a secas.


Bueno, las nomenclaturas son concretamente:


XC9572XL VQG64 10I - éste tiene 64 pines, 52 de ellos configurables como entrada/salida. También es bastante rápido, con 10 ns de retraso, o 100 MHz de operación. Lo malo es que se ha de alimentar a 3.3V, aunque los pines son tolerantes a 5V y creo que podré programarlos con un Arduino. Me he pedido 5 de ellos por Ebay, a 3 euros me ha salido cada uno.


XC957215PCG44C - éste es más antiguo, va a 5V y tiene menos pins (36 de E/S) me han costado 5 euros y pico cada uno, y me he comprado 3 de ellos hoy mismo en RS, aunque no tenían stock y hasta el día 2 no los enviarán.


Ambos tienen el 72 en su nombre, que significa que tienen 72 macroceldas o bits de estado, de los cuales 52 están disponibles en pines de salida, en el modelo de 3.3V, y 36 están disponibles en el de 5V. 72 macroceldas es un término medio-bajo, hay CPLD en esta misma gama con 4 veces más, y los hay con la mitad.


1 CPLD Intro2 CPLD Intro


Ya veremos cómo se me da hacer una placa de pruebas para estos monstruitos y luego soldarlos… afortunadamente los otros (viejos) son encapsulados tipo PLCC, y se pueden meter en un zócalo con pines through-hole con espaciado estándar de 2.54 mm (compatible protoboard), así que seguro que haré las primeras pruebas con esos.


Y… ¿Cómo se programan estos bichos? Pues es un arte entre la programación imperativa y el diseño de circuitos lógicos. El entorno de programación de Xilinx provee un editor gráfico para diseñar el comportamiento del CPLD como si estuvieras realmente construyendo un circuito. Añades lógica estándar, flip flops, y cualquier circuito clásico combinacional o con estado, y lo interconectas todo entre sí y a los pines de E/S como te convenga.


Sin embargo yo prefiero la otra vertiente, que es programar el CPLD en un lenguaje de programación de toda la vida, es decir en ficheros de texto. En este caso hay dos opciones: Verilog o VHDL, yo prefiero éste último por ser más moderno y estructurado. Un programa en VHDL consta de una definición de las entradas y salidas del circuito, y una serie de bloques de código o procesos que son realmente eso, procesos que se ejecutan con concurrencia real dentro del CPLD (no como la concurrencia de los procesos en un ordenador, que es por compartición de tiempo). Los procesos se pueden comunicar entre sí como quieran usando variables que representan las macroceldas o bits del CPLD. Puedes mezclar procesos puramente combinacionales con procesos que usen bits de estado, dividiendo así el CPLD en circuitos que hacen varias cosas para un mismo fin.


¿Y para qué los voy a usar? Pues tengo tres usos posibles, dos de ellos usarán un chip de memoria además del CPLD. He comprado dos chips de 512KB de SRAM, a 12 ns (83 MHz de funcionamento)


El primero que haré será lógicamente una placa de prueba, sin memoria, en un protoboard, con el reloj de sistema accionado por un botón, y mostrando resultados en LEDs. Luego pasaré a un reloj generado por un resonador, a algunos MHz. Cuando esto funcione añadiré un chip de memoria de 512 KB y un resonador de 80 MHz, para tener así un analizador lógico, que simplemente muestrea señales digitales a mucha frecuencia y las almacena en la memoria, para luego mostrarlas en el ordenador –se puede implementar incluso un puerto serie en el CPLD– Un analizador lógico es como un osciloscopio digital, pero que se puede programar para que empiece a muestrear o incluso que genere señales, cuando se da una cierta condición compleja.


Cuando me funcione el analizador, lo podré usar para debuguear el segundo proyecto, de generar señal de vídeo VGA con uno de estos CPLD, una memoria de 512KB y un microcontrolador (la SRAM en este caso será la videoram) La señal VGA estándar tiene una frecuencia de píxel de 25.125 MHz, más que manejable por los XC9572 y por la memoria.


Y el tercer proyecto podría ser hacer un interfaz con un Spectrum (por el bus de E/S) para controlar por ejemplo un robot a distancia…


Nada más, hasta la próxima!