Con este post comienzo con una serie de apuntes sobre el lenguaje de definición de hardware VHDL. Para los nuevos, VHDL no es un lenguaje de programación, sino un lenguaje de definición. Me explico, no lo confundamos o hablaremos piedras. Algunos lo llaman Very Hight Difficult Language 😀 difícil es, pero en realidad las siglas vienen del VHSIC (Very High Speed Integrated Circuit) y HDL (Hardware Description Language).
Resumiendo, VHDL es un lenguaje de descripción de hardware, con el que podemos definir y probar hardware, antes de pedir su fabricación a mayor escala. También podemos inyectar el diseño generado en FPGAs para usar directamente en los prototipos, ya viendo después si conviene sintetizarlo o no, y con qué tecnología.
VHDL se puede usar para trabajar con FPGAs, PLDs, ASICs, etcétera.. Podríamos jugar con las definiciones de hardware de procesadores, placas madre, memorias.. o cualquier circuito que podamos encontrar en cualquier dispositivo. Recalco el tema de las FPGAs, porque desde hace pocos años que están comenzando a hacer furor entre la comunidad maker y entre los grandes fabricantes de hardware. Si dispones de una FPGA, podrás «sintetizar» el hardware en minutos, tantas veces como necesites sin costosos procesos en tiempo y dinero.
Por otro lado, con estas herramientas puedes también independizarte de la tecnología y fabricante, y puedes así probar a describir y comprobar el funcionamiento en tu PC, de tantos circuitos como quieras sin tener que trabajar físicamente el hardware comprando nada todavía.
Instalando GHDL
Con GHDL podemos chequear la sintaxis, analizar los circuitos definidos, elaborar circuitos de pruebas para probar otros circuitos a modo de caja negra, hacer correr esas pruebas en el tiempo, guardando los tiempos y señales para luego visualizarlos.
En la página tenemos enlaces de descarga e instrucciones: http://ghdl.free.fr/
Este es el software que simula el funcionamiento de estos circuitos. Es importante tener en mente que no todas las definiciones de circuitos son sintetizables, y hay partes en VHDL que sólo se usan para simular, con lo que el circuito final puede comportarse de forma diferente. Habrá que probar y probar, pero la parte de la simulación virtual con esto que lo tenemos resuelto.
Instalando GTKWave
Con GTKWave finalmente podremos analizar las señales de entrada y salida de los circuitos descritos en VHDL. Es decir, con GHDL podremos simular el funcionamiento de los circuitos, guardando los resultados, para finalmente poderlos visualizar en nuestro escritorio.
Su página oficial la tenemos aquí: http://gtkwave.sourceforge.net/
Construyendo con VHDL
La secuencia de órdenes de comandos para sintetizar, generar pruebas y visualizar en GTKWave los resultados, es la secuencia del shell script siguiente. Si ya tenemos dos ficheros .vhd, uno con el circuito a sintetizar y otro con el circuito de pruebas, podemos lanzar el script. El circuito a sintetizar puede ser por ejemplo circuito1.vhd, y el de pruebas circuito1_tb.vhd, entonces habría que lanzar este script de la forma:
./shellScript.sh circuito1
El contenido del fichero shellScript.sh es:
#!/bin/bash
# Exit if a command do not returns 0
set -e
printf "Checking the sintax.. "
ghdl -s $1.vhd
ghdl -s $1_tb.vhd
printf "ok\n"
printf "Analyzing.. "
ghdl -a $1.vhd
ghdl -a $1_tb.vhd
printf "ok\n"
printf "Elaborating UNIT with test bench.. "
ghdl -e $1_tb
printf "ok\n"
printf "Runnig UNIT with test bench.. "
ghdl -r $1_tb --vcd=$1_out.vcd --stop-time=1000ns
#ghdl -r $1_tb --wave=$1_out.ghw --stop-time=100ns
printf "ok\n"
printf "Showing the results into Gtkwave with test bench..\n"
gtkwave $1_out.vcd --rcvar 'do_initial_zoom_fit yes'
#gtkwave $1_out.ghw
printf "All done!\n"
Este shell script, probado en GNULinux, se puede transcribir a otros sistemas operativos, pero los pasos serán los mismos. Finalmente el resultado de la definición de una puerta AND, con un test que le genera las señales de entrada es la siguiente imagen. Viendo las entradas y salidas sobre dicho circuito, tendremos algo como esto:
En siguientes posts trataré de dejar apuntes con códigos fuentes de ejemplo. Ya con esto, tenemos el punto de partida para diseñar circuitos, y probarlos virtualmente, en nuestros PCs.