Universidad de El Salvador Sistemas Digitales I
Universidad de El Salvador Facultad de Ingeniería y Arquitectura Guía 1: “Introducción a los Lenguajes HDL” Francisco Cruz Juárez
RESUMEN: Esta guía pretende ser una introducción a los lenguajes HDL (Hardware Description Language), específicamente para trabajar con AHDL (Altera Hardware Description Language) de Altera y VHDL (Very high speed integrated circuit Hardware Description Language) del estándar IEEE (Institute of Electrical and Electronics Engineers) std 1076-1987. Se explicará con mayor detalle VHDL para minimizar el contenido de la guía, pero el estudiante puede trabajar en el lenguaje que prefiera, además usar el sistema operativo de su preferencia. Para Windows (se necesita licencia) existen muchos IDE´s (Integrated Development Environment o Ambiente de Trabajo Integrado) y compiladores como lo son Max Plus de Altera, Active HDL y muchos otros. Con software libre se tiene GHDL para LINUX, y para visualizar resultados GTKWave. INTRODUCCIÓN: Los lenguajes HDL son muy variados, están desde los Netlist como Ada (lenguaje de programación nombrado en honor a Ada Lovelace, conocida popularmente como la primera programadora computacional y en este fue basado VHDL) hasta lenguajes tan potentes en los
Introducción a Lenguajes HDL
Sasi Ramírez
que muchas veces el circuito ya no se ve claramente y más bien es un lenguaje de programación, esto tiene sus grandes ventajas aunque también existen desventajas, la más notable desventaja es que a la hora de implementar el circuito no es fácil pasar del programa de descripción al Hardware que lo implementa, este proceso es conocido como síntesis (Diseño). VENTAJAS DEL USO DE VHDL: VHDL permite diseñar, modelar, y comprobar un sistema desde un alto nivel de abstracción bajando hasta el nivel de definición estructural de compuertas. Al estar basado en un estándar (IEEE Std 10761987) los ingenieros de toda la industria de diseño pueden usar este lenguaje para minimizar errores de comunicación y problemas de compatibilidad. Modularidad: VHDL permite dividir o descomponer un diseño hardware y su descripción en unidades más pequeñas.
I
Universidad de El Salvador Sistemas Digitales I Instalación de las herramientas programación y Simulación VHDL:
de
Para Windows: Descargar un IDE. Uno muy bueno se encuentra en www.altera.com, instalarlo al igual que se instalan todos los programas en Windows. Para Linux: Descargar los archivos GHDL y GTKWave, hay diferentes versiones para cada sistema operativo, en la guía se usa Ubuntu. Una forma muy sencilla de instalarlos es desde el synaptic pero en esta ocasión se hará con los comandos apt-get o dpkg, abra una consola y escriba: apt-get install ghdl Si en cambio, los instaladores se encuentran en una carpeta, se debe utilizar el comando dpkg –i *.deb Se instalarán todos los archivos que estén en la carpeta actual. Para escribir el código se puede utilizar cualquier editor de texto plano como Vi, Vim, Geany, Gedit, etc. Creación del primer programa: En Windows: Si se utilizará el software de Altera. 1.0. Cree nuevo proyecto file -> Name… como se muestra en la imagen 1 (flecha 1), se le dará el nombre de comp_and como se muestra en la imagen 2. 2.0. Luego seleccione la opción “nuevo archivo” como lo indica la flecha 2 en la imagen 1.
Introducción a Lenguajes HDL
Imagen 1
Imagen 2 3.0. Aparecerá una nueva ventana, seleccione Text Editor File como se muestra en la imagen
Imagen 3. 4.0. Luego aparecerá una ventana donde podrá editar texto, guárdela con el mismo nombre del proyecto, en este caso comp_and. Es importante que la extensión del archivo sea .vhd.
I
Universidad de El Salvador Sistemas Digitales I 5.0. Escriba el siguiente código en el editor y guárdelo.
Imagen 5.
6.0.Luego compile el código, la opción Max + Plus II -> compiler se muestra en la imagen 4, aparecerá una ventana, vaya a la opción Processing ->Funtional SNF Stractor, esto se muestra en la imagen 5 y por último en la ventana que apareció presione Start y luego ok.
Imagen 6. 7.0. Para ver si funciona correctamente se hará una simulación, para esto vaya al menú Max + Plus II -> Wave Form Editor, como se muestra en la imagen 7, aparecerá otra imagen solo pulse ok.
Imagen 4.
Imagen 7
Introducción a Lenguajes HDL
I
Universidad de El Salvador Sistemas Digitales I 8.0. Guarde el editor de forma de onda con el nombre de comp_and.scf. 9.0. Luego vaya al menú Node -> Enter Nodes from SNF, como se muestra en la imagen 8.
menú Options -> Grid size, dele un valor de 100 ns como se muestra en la imagen 11, por último seleccione el menú view -> Fit in 4indows, con eso ya está configurada la ventana.
Imagen 10.
Imagen 11.
Imagen 8.
12.0. Con los Botones del lado izquierdo se modifican las señales de entrada (solo se pueden modificar las entradas) de forma que queden como se muestra en la imagen 12.
10.0. Agregue las señales como se muestra en la imagen 9, presionando List y la flecha que indica hacia la derecha.
Imagen 12.
Imagen 9. 11.0. Luego se hacen los ajustes de el archivo de simulación File -> End Time.., coloque 2.0 us como se muestra en la imagen 10, luego en el
Introducción a Lenguajes HDL
13.0. Luego vaya al menú Max Plus II -> Simulator, en la ventana que aparece presione start, luego ok, el resultado y todo lo anterior se muestra en la imagen 12.
I
Universidad de El Salvador Sistemas Digitales I Como se puede observar la salida obedece el comportamiento de una compuerta and, esto se muestra con mayor detalle en la imagen 13.
Imagen 13. En la imagen se muestra el resultado del código ingresado, que corresponde a una compuerta AND. Explicación del código.
Líneas 1, 7, 12: El compilador ignora todo lo que sigue después de dos guiones medios“--”, pues lo que sigue son comentarios. Es una muy buena práctica de programación comentar siempre los códigos, para que otros los puedan entender. Líneas 2 y 6: En primer lugar, sea el tipo de descripción que sea, hay que definir el símbolo o entidad del circuito. En efecto, lo primero es definir las entradas y salidas del circuito, es decir, la caja negra que lo
Introducción a Lenguajes HDL
define. Se le llama entidad y se declara con la palabra clave ENTITY nombre_asignado. Se finaliza este bloque con la palabra clave END nombre_asignado. Línea 3: En esta se define el puerto “PORT()” que son las entradas y salidas que tendrá, en este caso dos entradas a y b, y una salida y. Líneas 4 y 5: El lenguaje VHDL tiene varios tipos de variables un tipo es “BIT”, estas líneas declaran a las variables “a” y “b” como entradas tipo BIT “IN/OUT BIT” y “y” como salida del mismo tipo. Líneas 8 y 11: Se declara la arquitectura designándole un nombre como sigue, “ARCHITECTURE nombre_arch”, luego le sigue la palabra clave “OF nombre_asignado” (nombre_asignado es el nombre que se le dio a la entidad). Esto quiere decir que la arquitectura pertenece a la entidad dada. Se finaliza la arquitectura con la palabra clave “END nombre_arch” Línea 9 y 10: Después de la línea 9 “BEGIN” y antes de la 11 “END” se declaran las operaciones a realizar, estas operaciones se ejecutan de manera concurrente, esto quiere decir que no importa el orden en que se coloquen las instrucciones, en este caso solo hay una “y <= a AND b”, la entrada “a” y “b” se operan con la instrucción “AND”, el resultado se le asigna a la salida “y”, con el operador “<=”. También se puede ingresar en esta línea procesos secuenciales, es decir operaciones que se ejecutan una después de la otra con la palabra clave “PROCESS”. Nota: las palabras clave se han escrito con mayúsculas para diferenciarlas, pero esto no es una regla.
I
Universidad de El Salvador Sistemas Digitales I END COMPONENT comp_and;
En Linux: Una vez instalados los dos programas mencionados anteriormente, la creación de programas VHDL se resume a trabajar en el editor de texto de su preferencia. Para ejemplificar esto a continuación se muestra el mismo programa creado para Windows con el cual se ejemplificará el método para comprobar, compilar, ejecutar y simular los resultados utilizando un editor de texto y principalmente la consola de Linux, así como también el GTKWave para ver resultados. Se comenzará escribiendo el código: ENTITY comp_and IS PORT( a,b :IN BIT; y :OUT BIT); END comp_and; ARCHITECTURE arch_and OF comp_and IS BEGIN y <= a AND b; END arch_and;
Luego se guarda con el nombre de comp_and.vhd. El código es exactamente igual al que se utilizó en Windows por lo tanto la explicación es la misma expuesta en la sección anterior. A continuación se escribirá el testbench, el cual es un archivo que funciona como generador de estímulos, es decir, en él se definirán las señales de entrada necesarias para conseguir la tabla de verdad del circuito y saber si éste funciona correctamente. El código es el siguiente: ENTITY tb_comp_and IS END tb_comp_and; ARCHITECTURE arch_and OF tb_comp_and IS COMPONENT comp_and IS PORT( a,b :IN BIT; y :OUT BIT);
Introducción a Lenguajes HDL
SIGNAL ent1:bit:='0'; SIGNAL ent2:bit:='0'; SIGNAL sal:bit; BEGIN ckt1:comp_and PORT MAP ( a => ent1, b => ent2, y => sal ); PROCESS BEGIN WAIT FOR 20 ns; ent1 <= '1'; WAIT FOR 20 ns; ent1 <= '0'; ent2 <= '1'; WAIT FOR 20 ns; ent1 <= '1'; WAIT FOR 20 ns; ent1 <= '0'; ent2 <= '0'; END PROCESS; END ARCHITECTURE arch_and;
Este código será guardado con el nombre de tb_comp_and.vhd. Explicación del código testbench.
Como se explicó en el código anterior la palabra clave ENTITY define la caja negra que contiene el circuito. ARCHITECTURE define las acciones que realizará el testbench. COMPONENT relaciona el testbench con las variables y las acciones del circuito en sí, el cual ha sido guardado con el nombre de arch_and y como se puede observar dentro de COMPONENT se definen nuevamente las
I
Universidad de El Salvador Sistemas Digitales I
entradas y salidas del circuito utilizando la función PORT. SIGNAL se utiliza para definir las señales que se utilizarán para estimular el circuito, también se les da valores iniciales a las señales de entrada, como se puede observar, en este caso se le da valor inicial de 0 lógico a las señales de entrada. BEGIN es una palabra clave que se utiliza dentro del bloque ARCHITECTURE para indicar el inicio de la descripción de la arquitectura. ckt1:comp_and define la iniciación del componente que relaciona el testbench con el circuito creado. PORT MAP define en bloque que une las señales que se utilizarán durante la simulación a las variables de entrada y salida del circuito. PROCESS contiene el bloque de señalización, en este bloque como se puede ver se utilizan las palabras clave WAIT FOR de modo que los cambios de 0 a 1 lógico en las señales de entrada nombradas ent1 y ent2 son controlados definiendo el tiempo que debe esperar cada variable antes de hacer el siguiente cambio. Finalmente END PROCESS y END ARCHITECTURE definen el final de los bloques de proceso y arquitectura.
Imagen 14. En la primera línea por medio del comando ls se puede ver que en la carpeta solo están los dos archivos creados, se procede a utilizar el siguiente comando para realizar un análisis en ambos los códigos: ghdl –a comp_and.hdl tb_comp_and.hdl
Si hay algún error, este será mostrado luego de la ejecución de los comandos anteriores. Ahora se utilizará el comando ls y se verá hay 3 archivos más. Luego se creará el ejecutable con el siguiente comando: ghdl –e tb_comp_and
Siguiendo la estructura básica del ejemplo anterior es posible definir y simular circuitos con muchas entradas y salidas y con diferentes niveles de complejidad.
Es importante notar que para crear el ejecutable se utiliza solo el nombre de tb_comp_and sin su extensión. Si utiliza una vez más el comando ls verá que se ha creado el archivo tb_div (letras color verde). Para ejecutarlo se utilizará la siguiente línea de comando:
Luego de haber guardado ambos archivos en una carpeta se puede proceder a su compilación y ejecución en la consola, este proceso se muestra paso a paso en la figura 14:
./tb_comp_and --vcd=tb_comp_and.vcd -–stoptime=100ns
Como se puede observar al ejecutar el programa se definen como parámetros el nombre del archivo en
Introducción a Lenguajes HDL
I
Universidad de El Salvador Sistemas Digitales I el cual se guardarán los resultados de la ejecución del programa: --vcd=tb_comp_and.vcd
Así como también el tiempo de ejecución, en este caso es de 100ns: -–stop-time=100ns
Nótese la importancia de que el tiempo de ejecución sea suficiente para que todas las combinaciones definidas en las señales de entrada se ejecuten. Si se duplica el tiempo de ejecución, las indicaciones se repetirán una vez más de modo que si se amplía el tiempo de ejecución de forma considerada o se disminuye el tiempo que debe durar cada cambio de variable se pueden obtener señales periódicas. Si se utiliza el comando ls se verá que un archivo nuevo ha sido creado como resultado de la ejecución del programa. Para ver e interpretar estos resultados se utilizará el gtkwave por medio del siguiente comando:
Imagen 15. Pueden compararse los resultados que se obtienen con el software de Windows, que son prácticamente los mismos. Cabe mencionar que pueden utilizarse otros software a elección del estudiante que trabajen con lenguajes VHDL. En la guía se explica el uso de un programa para Windows y uno para Linux (Ubuntu) para facilidad. Se recomienda trabajar con los software descritos en la guía.
gtkwave tb_comp_and.vcd
Y como resultado el gtkwave se abrirá, se deberán seleccionar las entradas y salidas que se desean ver. Es importante mencionar que para ver correctamente los resultados es necesario utilizar los botones de zoom in o zoom out. Se puede apreciar el resultado en la figura 15:
Introducción a Lenguajes HDL
I
Universidad de El Salvador Sistemas Digitales I ASIGNACIÓN 1. Realizar el código VHDL para las compuertas: AND, NAND, OR, NOR, EXOR, EXNOR y NOT, simular en VHDL. 1.1 Explicar paso a paso como es el proceso de instalación del software VHDL usado. 1.2 Realizar el código VHDL para el problema que se le plantea: Un circuito lógico tiene cuatro entradas A, B, C y D. Determine las ecuaciones lógicas para el circuito, si la salida será alta solo cuando un número impar de entradas sean altas. Trace un diagrama de circuito con las compuertas que desee
1.3 Una alarma contra robos esa diseñada de modo que percibe cuatro líneas de señal de entrada. La línea A es del interruptor secreto de control, la línea B es del sensor de presión bajo una caja fuerte en un gabinete cerrado, la línea C es de un reloj alimentado por baterías y la línea D está conectada a un interruptor en la puerta cerrada del gabinete. Las siguientes condiciones producen un voltaje de 1 lógico en cada línea. A: El interruptor de control está cerrado. B: La caja está en su posición normal en el gabinete. C: El reloj marca entre las 1000 y las 1400 horas. D: la puerta del gabinete está cerrada. Escriba en código VHDL la expresión que active la alarma cuando la caja se mueve y el interruptor de control está cerrado, o cuando el gabinete se abre después de las horas hábiles, o el gabinete está abierto con el interruptor de control abierto. Trace un Diagrama de circuito.
Introducción a Lenguajes HDL
1.4 Circuito 3: “Un automóvil a prueba de choques”. Descripción: Se trata de un automóvil con tres sensores, uno al frente y dos a los costados. Al arrancar, se dirige hacia adelante y si encuentra un obstáculo, gira a uno de los costados, esquivándolo. La posición de los sensores se muestra en la siguiente figura.
Para girar a los lados, se hace que las llantas giren en distintas direcciones, por ejemplo para girar a la izquierda, las llantas “X” rotaran hacia atrás mientras las llantas “Y” hacia adelante. Para hacer que el par de llantas “X” giren hacia adelante se deberá poner en una variable de control llamada “X” el bit 0, para que giren hacia atrás X=1, igual para el par de llantas “Y”, con su respectiva variable de control “Y”, la lógica de control de las llantas es la siguiente.
I
Universidad de El Salvador Sistemas Digitales I X
Y
Descripción
0
0
Hacia adelante
0
1
Hacia la derecha
1
0
Hacia la izquierda
1
1
Hacia atrás
Si los tres sensores A, B y C están en “1”, es decir, detecta obstáculo en las tres direcciones, empezará a retroceder. De lo contrario girará en la dirección que esté libre de obstáculos. Si existe la posibilidad de girar hacia la derecha o hacia la izquierda se girará a la derecha. 1.3.1 Encontrar la tabla de verdad que representa la lógica de control. 1.3.2. Implementar el circuito con código VHDL. 1.3.3. Obtener graficas de simulación, en las que se muestren las entradas (A, B y C) y las salidas (X y Y), con todas las posibilidades de entrada.
2.
Preguntas de Investigación.
2.1 Uso y sintaxis de las instrucciones IF… THEN. 2.2 Uso y sintaxis de la instrucciones CASE… WHEN. 2.3 Uso de las instrucciones anteriores para implementar el código VHDL directamente desde las tablas de verdad. 2.4 Tipos de datos de entrada y salida que soporta VHDL. 2.5 ¿Cómo se crean arreglos en VHDL? 2.6 ¿Cómo declarar un componente en VHDL? Mostrar un ejemplo. 2.7 ¿Cuáles son los operadores en VHDL?
Introducción a Lenguajes HDL
3. Acerca de la tarea: 3.1 Un reporte impreso 70% 3.1.1 Contenido del reporte Portada. 5% Objetivos (General y específicos). 5% Introducción (máx. 1 página). 5% Marco teórico (máx. 5 páginas). 5% Obtención del software de simulación VHDL (dirección de descarga) y pasos de instalación. 10% Desarrollo de los circuitos: o Descripción de los pasos seguidos para la solución. 10% o Código VHDL. 10% o Gráficos obtenidos para cada circuito (3 a 5 imágenes por circuito). 10% o Observaciones. 5 % Respuesta a las preguntas de investigación. 10% Conclusiones (máx. 1 página). 20% Bibliografía. 5% 3.2 Un CD 30% 3.2.1 Contenido del CD. Software utilizado. 20% Reporte en formato PDF y WORD. 15% Códigos utilizados (*.vhd) y todos los que genera el proceso de compilación y ejecución. 40% Imágenes de los resultados. 25% NOTA: El reporte se entregara en un sobre manila rotulado con los nombres y carnet, dentro deberá ir el CD rotulado de la misma forma y el nombre del CD tendrá los carnet. El contenido del CD deberá ir ordenado, con carpetas individuales para cada ítem mencionado ejemplo: IMÁGENES, CIRCUITO1, etc.
I
Universidad de El Salvador Sistemas Digitales I
Fecha de entrega: 24 Marzo de 2015. Hora máxima 10:00 am, después de las 10 se calificará en base 9, después de ese día la base de calificación bajará 2 puntos por día de atraso.
Bibliografía: VHDL Lenguaje para descripción y modelado de circuitos, Fernando Pardo Carpio, Universidad de Valencia 1997. DIGLENSY SAC Primera Empresa del Perú Dedicada al Desarrollo Electrónico, tutorial VHDL, http://www.diglensy.com/ Simulando VHDL con herramientas GNU: GHDL+GTKWAVE, Roberto Aragón. http://www.iearobotics.com/personal/juan/p ublicaciones/art6/html/ghdl.html
Análisis y diseño de circuitos lógicos digitales, Víctor Nelson, 1ª Ed.
Introducción a Lenguajes HDL
I