Programación de PLD y FPGA con VHDL
Programación de PLD y FPGA con VHDL
El lenguaje VHDL nació con el objetivo de describir circuitos digitales de forma textual. Su
uso permite representar desde simples compuertas lógicas hasta sistemas digitales
completos, como procesadores o controladores. A diferencia de un lenguaje de
programación tradicional, VHDL no está pensado para controlar un software, sino para
definir el comportamiento y la estructura del hardware. Esto significa que el resultado final
no es un programa que se ejecuta, sino un circuito físico que realiza las operaciones
descritas.
Existen tres niveles de descripción dentro del VHDL, cada uno con un propósito distinto:
El dominio de estos niveles permite que el diseñador elija la forma más adecuada de
describir un sistema, dependiendo de la complejidad o del tipo de aplicación.
Con el uso del lenguaje VHDL, los estudiantes y profesionales pueden experimentar con
ideas de diseño sin depender del hardware físico, lo que facilita el aprendizaje y la
innovación. Además, esta metodología se utiliza en la industria para crear prototipos
rápidos y probar sistemas antes de su fabricación definitiva. Por ejemplo, un ingeniero
puede diseñar un controlador de motor o un módulo de comunicación digital, verificar su
funcionamiento en simulación y luego implementarlo en un PLD para uso real.
Los circuitos digitales en FPGA representan una de las herramientas más avanzadas y
versátiles dentro del campo de la electrónica y la ingeniería mecatrónica. Las siglas FPGA
significan Field Programmable Gate Array, que se traduce como “arreglo de compuertas
programables en campo”. Esto quiere decir que el usuario puede configurar el circuito
directamente desde su computadora, programándolo para que realice diferentes funciones
sin necesidad de fabricar un chip físico cada vez que se hace un nuevo diseño.
Una FPGA está formada por miles de bloques lógicos programables interconectados entre
sí. Cada bloque puede comportarse como una compuerta lógica, un sumador, un registro o
un contador. Gracias a esto, se pueden construir sistemas digitales complejos dentro de un
solo dispositivo. Su principal característica es que es reconfigurable, lo que significa que se
puede borrar su programación y volver a cargar una nueva cuantas veces sea necesario. Esta
capacidad la convierte en una tecnología muy usada en investigación, desarrollo de
prototipos y en la industria, donde los cambios y mejoras son constantes.
Las FPGA permiten implementar circuitos de Mediana Escala de Integración (MSI), como
contadores, registros, multiplexores o sumadores. Estos circuitos son el punto intermedio
entre los de pequeña escala, formados por pocas compuertas, y los de gran escala, que
integran sistemas completos. En la práctica, esto significa que dentro de una FPGA se
pueden crear módulos que simulan el comportamiento de estos circuitos MSI, y después
conectarlos para formar sistemas más amplios y complejos.
El proceso de trabajo con FPGA sigue una secuencia bien definida. Primero, se analiza el
circuito que se quiere implementar, definiendo su función y sus componentes. Después se
escribe el código en VHDL, que describe el comportamiento del sistema. Una vez hecho esto,
se realiza la simulación, donde se verifica que el código funcione correctamente antes de
cargarlo al dispositivo físico. Luego se ejecuta la síntesis, en la cual el programa traduce el
código VHDL a un conjunto de compuertas y conexiones reales dentro de la FPGA.
Finalmente, se genera un archivo de configuración llamado bitstream, que se carga en la
tarjeta FPGA para que el diseño se ejecute de forma física.
4
En este proceso también se pueden usar herramientas gráficas como Quartus, Vivado o ISE,
dependiendo del fabricante. Estas plataformas permiten observar el comportamiento del
circuito, analizar el consumo de recursos, medir tiempos de respuesta y optimizar el diseño
para obtener mejores resultados. Con ellas, el estudiante o ingeniero puede visualizar cómo
su código se convierte en hardware real, lo cual ayuda a reforzar la relación entre la teoría y
la práctica.
Además, las FPGA no solo permiten construir circuitos digitales básicos. Con suficiente
conocimiento, se pueden implementar procesadores, filtros digitales, controladores de
comunicación, o incluso sistemas de inteligencia artificial embebidos. Esto demuestra que
las FPGA son una plataforma que combina el mundo del software con el del hardware, ya
que el diseñador puede escribir un código que termina funcionando como un circuito físico
real.
En un entorno de desarrollo con FPGA, el proceso inicia con la creación del código VHDL que
define el diseño. Luego se realiza una simulación para comprobar que la lógica funciona
correctamente antes de implementarla en el dispositivo físico. Si la simulación es exitosa, el
diseño se sintetiza y se carga al FPGA, permitiendo que el hardware adopte el
comportamiento descrito por el programador.
VHDL es un lenguaje fuertemente tipado, lo que significa que exige precisión en la definición
de señales, variables y estructuras. Esto asegura que los circuitos sean confiables y fáciles
de mantener. Además, permite trabajar con distintos niveles de abstracción, desde la
descripción de comportamientos lógicos sencillos hasta sistemas digitales complejos como
procesadores, controladores o módulos de comunicación.
Los circuitos SSI combinacionales son aquellos cuya salida depende exclusivamente del valor
actual de las entradas. No almacenan información ni tienen memoria. Ejemplos de ellos son
los sumadores, restadores, multiplexores o decodificadores. Por otro lado, los circuitos SSI
secuenciales sí poseen elementos de memoria, por lo que su salida depende tanto de las
entradas actuales como del estado anterior del sistema. Ejemplos típicos de estos son los
contadores, registros de desplazamiento y máquinas de estados finitos.
En cambio, los circuitos secuenciales requieren la inclusión de una señal de reloj (clock), ya
que dependen del tiempo y del almacenamiento de información. En VHDL, esto se logra
mediante el uso de procesos (process), los cuales definen el comportamiento del circuito en
cada ciclo de reloj. Dentro de estos procesos, se emplean estructuras de control como if
rising_edge(clock) para sincronizar las operaciones. De esta forma, se pueden programar
registros, contadores o máquinas de estado que cambian su salida con cada pulso del reloj.
Una vez descrito el circuito en VHDL, se procede a la simulación, etapa donde se verifica su
comportamiento antes de implementarlo en el hardware. Aquí se utiliza un testbench, que
es un código adicional que genera señales de prueba para observar cómo responde el
circuito. Si los resultados son correctos, se continúa con la síntesis, en la cual el software
traduce el código a un conjunto de compuertas y conexiones físicas. Después de la síntesis,
se realiza la implementación y programación del dispositivo, cargando el diseño al PLD o
FPGA correspondiente para probar su funcionamiento real.
Durante todo este proceso, es importante considerar aspectos como el uso eficiente de los
recursos del dispositivo, la sincronización adecuada del reloj y la correcta declaración de
señales y variables. Un error en cualquiera de estos puntos puede alterar el comportamiento
del circuito.
Comprender este procedimiento no solo permite crear diseños digitales funcionales, sino
también desarrollar una visión más completa de cómo se construyen los sistemas
electrónicos modernos. El estudiante aprende a transformar una idea o diagrama lógico en
un código estructurado, verificable y listo para implementarse. Además, este conocimiento
fortalece la capacidad de análisis y resolución de problemas, ya que cada paso —desde la
descripción hasta la simulación— exige atención al detalle y razonamiento lógico.
8
Una vez definido el circuito, procedo a escribir el código en VHDL. Creo un archivo VHDL que
contiene dos secciones principales: la entidad y la arquitectura. En la entidad declaro todas
las señales de entrada y salida del circuito, especificando sus tipos y tamaños. En la
arquitectura describo el comportamiento del circuito. Para esto, utilizo operadores lógicos,
instrucciones condicionales, estructuras secuenciales o concurrentes según la complejidad
del diseño. Cada línea de código refleja una función concreta del circuito, y evito
instrucciones innecesarias. La claridad y precisión en esta etapa facilitan la simulación y la
síntesis posterior.
Después, realizo la sintetización del diseño. Uso el software específico del PLD para convertir
el código VHDL en una red de puertas lógicas que el dispositivo puede interpretar. Durante
la síntesis, el programa analiza cada instrucción y genera un archivo de configuración,
también llamado bitstream, que contiene toda la información necesaria para que el PLD
implemente físicamente el circuito. Esta etapa permite detectar errores de compatibilidad
o restricciones de hardware antes de programar el dispositivo.
Finalmente, realizo pruebas en hardware. Aplico señales reales a las entradas del PLD y
observo el comportamiento de las salidas. Comparo los resultados con los obtenidos en
simulación para asegurar que el diseño funcione correctamente en condiciones reales. Si es
necesario, realizo ajustes en el código o en la configuración para corregir cualquier fallo. Esta
etapa confirma que el circuito SSI está listo para ser usado en aplicaciones prácticas,
cumpliendo con las funciones definidas y operando de manera confiable.
Todo el procedimiento, desde la definición del circuito hasta las pruebas en hardware,
asegura que el diseño en VHDL se traduzca en un circuito físico funcional dentro del PLD.
Cada paso tiene un objetivo concreto: garantizar precisión, funcionalidad y confiabilidad,
evitando errores de implementación y optimizando el rendimiento del dispositivo. La
práctica de seguir este procedimiento permite que los circuitos SSI sean implementados de
manera efectiva, repetible y segura, facilitando su uso en aplicaciones industriales o
educativas donde se requiera lógica secuencial y combinacional confiable.
Los circuitos de Mediana Escala de Integración (MSI) contienen varios elementos digitales
en un solo chip. Son más complejos que los SSI y permiten implementar funciones
combinacionales y secuenciales sin usar muchos componentes externos. Para comprender
su operación, se analizan sus entradas, salidas y comportamiento interno. Los MSI más
comunes incluyen decodificadores, multiplexores, sumadores, contadores y registros.
Los circuitos combinacionales generan salidas que dependen únicamente de las entradas
actuales. No almacenan información ni retienen estados previos. Ejemplos típicos incluyen
decodificadores, multiplexores y sumadores. Por ejemplo, el decodificador 74LS138 tiene 3
entradas y 8 salidas. Solo una salida se activa según la combinación de entradas. Si A2A1A0
= 010, la salida Y2 se pone en nivel bajo mientras el resto permanece alto. Se usa en
selección de memoria, enrutamiento de señales o activación de dispositivos. El multiplexor
74LS151 permite seleccionar una de ocho entradas y enviar su valor a la salida según tres
señales de selección. El sumador 74LS283 realiza sumas de 4 bits con acarreo; sus entradas
son A[3:0], B[3:0] y Carry-in, y la salida es S[3:0] y Carry-out. Para analizar su funcionamiento
se revisa el datasheet, se construye la tabla de verdad y se aplican señales en un simulador
o en hardware, verificando que las salidas coincidan con la función esperada.
Los contadores son circuitos secuenciales que cambian su estado con cada pulso de reloj.
Un MSI de contador integra varios flip-flops y lógica adicional para simplificar el diseño. Por
ejemplo, el contador 74LS90 de 4 bits puede funcionar como contador ascendente o
10
Los registros almacenan datos temporalmente y los entregan según señales de control. Los
registros MSI integran varios flip-flops y lógica de habilitación. Por ejemplo, el registro
paralelo 74LS175 tiene cuatro flip-flops que almacenan 4 bits de datos. La señal de Clock
sincroniza la carga de datos y la señal Enable permite actualizar o mantener los datos. El
registro de desplazamiento 74LS194 permite mover los datos hacia la izquierda o derecha
en cada pulso de reloj. Para reconocer su operación se aplica un valor de entrada, se activa
la señal de reloj y habilitación, y se observa cómo los datos se almacenan o se desplazan en
la salida.
Para todos los MSI se sigue un análisis práctico: se consulta el datasheet para identificar
entradas, salidas y señales de control; se construye un diagrama de bloques que muestre la
relación entre entradas, salidas y control; se aplican señales de prueba en un simulador o
en un protoboard; se verifica que las salidas correspondan con la operación esperada; y se
ajustan señales de control si es necesario.
Los circuitos de Mediana Escala de Integración (MSI) contienen varios elementos digitales
en un solo chip. Son más complejos que los SSI y permiten implementar funciones
combinacionales y secuenciales sin usar muchos componentes externos. Para comprender
su operación, se analizan sus entradas, salidas y comportamiento interno. Los MSI más
comunes incluyen decodificadores, multiplexores, sumadores, contadores y registros.
Los circuitos combinacionales generan salidas que dependen únicamente de las entradas
actuales. No almacenan información ni retienen estados previos. Ejemplos típicos incluyen
decodificadores, multiplexores y sumadores. Por ejemplo, el decodificador 74LS138 tiene 3
entradas y 8 salidas. Solo una salida se activa según la combinación de entradas. Si A2A1A0
= 010, la salida Y2 se pone en nivel bajo mientras el resto permanece alto. Se usa en
11
Los contadores son circuitos secuenciales que cambian su estado con cada pulso de reloj.
Un MSI de contador integra varios flip-flops y lógica adicional para simplificar el diseño. Por
ejemplo, el contador 74LS90 de 4 bits puede funcionar como contador ascendente o
descendente. Cada pulso de reloj incrementa o decrementa el valor binario, observándose
el ciclo completo: 0000 → 0001 → 0010 … → 1111 → 0000. Los contadores con control
permiten detener el conteo o cambiar la dirección mediante señales de habilitación. Para
reconocer su operación se conecta la entrada de reloj y señales de control, se monitorean
las salidas en cada pulso y se comparan los resultados con la tabla de estados.
Los registros almacenan datos temporalmente y los entregan según señales de control. Los
registros MSI integran varios flip-flops y lógica de habilitación. Por ejemplo, el registro
paralelo 74LS175 tiene cuatro flip-flops que almacenan 4 bits de datos. La señal de Clock
sincroniza la carga de datos y la señal Enable permite actualizar o mantener los datos. El
registro de desplazamiento 74LS194 permite mover los datos hacia la izquierda o derecha
en cada pulso de reloj. Para reconocer su operación se aplica un valor de entrada, se activa
la señal de reloj y habilitación, y se observa cómo los datos se almacenan o se desplazan en
la salida.
Para todos los MSI se sigue un análisis práctico: se consulta el datasheet para identificar
entradas, salidas y señales de control; se construye un diagrama de bloques que muestre la
relación entre entradas, salidas y control; se aplican señales de prueba en un simulador o
en un protoboard; se verifica que las salidas correspondan con la operación esperada; y se
ajustan señales de control si es necesario.
Los circuitos de Mediana Escala de Integración (MSI) contienen varios elementos digitales
en un solo chip. Son más complejos que los SSI y permiten implementar funciones
combinacionales y secuenciales sin usar muchos componentes externos. Para comprender
su operación, se analizan sus entradas, salidas y comportamiento interno. Los MSI más
comunes incluyen decodificadores, multiplexores, sumadores, contadores y registros.
Los circuitos combinacionales generan salidas que dependen únicamente de las entradas
actuales. No almacenan información ni retienen estados previos. Ejemplos típicos incluyen
decodificadores, multiplexores y sumadores. Por ejemplo, el decodificador 74LS138 tiene 3
entradas y 8 salidas. Solo una salida se activa según la combinación de entradas. Si A2A1A0
= 010, la salida Y2 se pone en nivel bajo mientras el resto permanece alto. Se usa en
selección de memoria, enrutamiento de señales o activación de dispositivos. El multiplexor
74LS151 permite seleccionar una de ocho entradas y enviar su valor a la salida según tres
señales de selección. El sumador 74LS283 realiza sumas de 4 bits con acarreo; sus entradas
son A[3:0], B[3:0] y Carry-in, y la salida es S[3:0] y Carry-out. Para analizar su funcionamiento
se revisa el datasheet, se construye la tabla de verdad y se aplican señales en un simulador
o en hardware, verificando que las salidas coincidan con la función esperada.
Los contadores son circuitos secuenciales que cambian su estado con cada pulso de reloj.
Un MSI de contador integra varios flip-flops y lógica adicional para simplificar el diseño. Por
ejemplo, el contador 74LS90 de 4 bits puede funcionar como contador ascendente o
descendente. Cada pulso de reloj incrementa o decrementa el valor binario, observándose
el ciclo completo: 0000 → 0001 → 0010 … → 1111 → 0000. Los contadores con control
permiten detener el conteo o cambiar la dirección mediante señales de habilitación. Para
reconocer su operación se conecta la entrada de reloj y señales de control, se monitorean
las salidas en cada pulso y se comparan los resultados con la tabla de estados.
Los registros almacenan datos temporalmente y los entregan según señales de control. Los
registros MSI integran varios flip-flops y lógica de habilitación. Por ejemplo, el registro
paralelo 74LS175 tiene cuatro flip-flops que almacenan 4 bits de datos. La señal de Clock
sincroniza la carga de datos y la señal Enable permite actualizar o mantener los datos. El
registro de desplazamiento 74LS194 permite mover los datos hacia la izquierda o derecha
en cada pulso de reloj. Para reconocer su operación se aplica un valor de entrada, se activa
la señal de reloj y habilitación, y se observa cómo los datos se almacenan o se desplazan en
la salida.
13
Para todos los MSI se sigue un análisis práctico: se consulta el datasheet para identificar
entradas, salidas y señales de control; se construye un diagrama de bloques que muestre la
relación entre entradas, salidas y control; se aplican señales de prueba en un simulador o
en un protoboard; se verifica que las salidas correspondan con la operación esperada; y se
ajustan señales de control si es necesario.
de 4 bits cambia su valor en uno cada vez que recibe un pulso de reloj, repitiendo el ciclo de
0000 a 1111, mientras que un registro paralelo de cuatro bits almacena los datos solo
cuando la señal de habilitación está activa, y mantiene el valor mientras no se reciba un
nuevo pulso de carga.
El segundo paso consiste en escribir el código en un lenguaje HDL, que puede ser VHDL o
Verilog. En el caso de circuitos combinacionales, se definen las entradas y salidas en la
entidad o módulo, y se describe el comportamiento lógico mediante asignaciones
concurrentes, operadores lógicos y estructuras de decisión. Por ejemplo, un decodificador
3 a 8 se puede programar asignando las salidas según las combinaciones binarias de las
entradas, asegurando que solo una salida esté activa a la vez. En los contadores y registros,
se utilizan procesos sincronizados con el reloj, flip-flops internos y señales de control. En un
contador, se puede implementar un proceso que incremente o decremente un registro
interno en cada flanco de subida del reloj, dependiendo de la señal de control que
determine la dirección del conteo. En un registro, se pueden implementar procesos que
carguen datos de manera paralela o desplacen los datos hacia la izquierda o derecha según
señales de habilitación y control, asegurando que los valores de entrada se almacenen
correctamente y se entreguen a la salida en el momento adecuado. Es importante que el
código HDL sea claro, preciso y libre de instrucciones innecesarias, ya que cualquier error
en esta etapa afectará la síntesis y el funcionamiento en hardware.
El tercer paso es sintetizar el diseño mediante el software de la FPGA, como Vivado, Quartus
o ISE. La síntesis consiste en traducir el código HDL en elementos físicos dentro de la FPGA,
incluyendo bloques lógicos, flip-flops, LUTs, multiplexores y conexiones internas. Durante
este proceso, el compilador analiza el código, verifica la compatibilidad con el hardware y
detecta posibles errores de diseño, como dimensiones incorrectas de vectores, conflictos
de señal, problemas de temporización o recursos insuficientes en el dispositivo. El resultado
de la síntesis es un archivo de configuración, generalmente llamado bitstream, que contiene
toda la información necesaria para que la FPGA configure sus recursos internos y replique
el comportamiento definido en el HDL. La síntesis también permite optimizar el uso de los
recursos, minimizando el consumo de bloques lógicos y asegurando que el circuito pueda
funcionar a la frecuencia deseada sin errores de temporización.
El quinto paso consiste en programar la FPGA. Una vez que el diseño ha sido sintetizado y
simulado correctamente, se conecta el dispositivo a la computadora mediante el
programador o interfaz correspondiente, y se carga el archivo de configuración generado
durante la síntesis. La FPGA configura internamente sus bloques lógicos, flip-flops y
conexiones para replicar exactamente el comportamiento definido en el HDL. Durante la
programación, el software verifica que la FPGA pueda aceptar la configuración sin errores y
que todos los recursos internos estén correctamente asignados. Una vez cargado el
bitstream, la FPGA está lista para operar según el diseño implementado.
Este procedimiento asegura que los circuitos MSI combinacionales, contadores y registros
implementados en FPGA sean funcionales, confiables y eficientes. Cada paso, desde la
definición de la función hasta la prueba en hardware, garantiza que el diseño cumpla con
las especificaciones y que los dispositivos digitales puedan integrarse correctamente en
sistemas más complejos, como controladores, computadoras, sistemas de comunicación o
cualquier aplicación que requiera lógica digital confiable y precisa. La implementación
cuidadosa, acompañada de simulación y verificación, permite aprovechar al máximo los
recursos de la FPGA, optimizar el rendimiento y reducir errores que podrían afectar el
funcionamiento de sistemas críticos.