VHDL






 Los circuitos descritos en VHDL pueden ser simulados utilizando herramientas de simulación que reproducen el funcionamiento del circuito descrito. Para la realización de la simulación existe un estándar aprobado por el ieee, en el cual se explican todas las expresiones propias de VHDL y cómo se simulan. Además, existen herramientas que transforman una descripción VHDL en un circuito real (a este proceso se le denomina síntesis). La sintaxis para síntesis y su implementación final, aunque sigue unas normas generales, depende en gran medida de la herramienta de síntesis seleccionada. En este manual utilizaremos la herramienta de síntesis proporcionada de manera gratuita por Xilinx (Xilinx ISE Web Pack), que se puede conseguir en la siguiente dirección URL: http://www.xilinx.com/support/download/index.htm. Todos los ejemplos del manual que presenten una codificación que sea particular para la herramienta de Xilinx aparecerán en un recuadro similar a éste. CONSEJO A lo largo de este manual se utilizarán recuadros como este para recalcar los consejos para una programación eficiente en VHDL. Estos consejos son una serie de normas básicas que ayudan a que los resultados de la simulación sean independientes de la forma de programación y el código desarrollado pueda ser sintetizado, y por lo tanto, implementado físicamente en una plataforma, con el mínimo esfuerzo.




 Elementos Básicos de VHDL Un sistema digital está descrito por sus entradas y sus salidas y la relación que existe entre ellas. En el caso de VHDL por un lado se describirá el aspecto exterior del circuito: entradas y salidas; y por otro la forma de relacionar las entradas con las salidas. El aspecto exterior, cuántos puertos de entrada y salida tenemos, es lo que denominaremos entity. Y la descripción del comportamiento del circuito architecture, toda architecture tiene que estar asociada a una entity. Además, aunque no es estrictamente necesario, podemos definir también las bibliotecas y paquetes que vamos a utilizar, lo que nos indicará que tipos de puertos y operadores podemos utilizar. Siempre ha de aparecer la definición de las bibliotecas y paquetes antes de la definición de la entity.

 library IEEE; use IEEE.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; La biblioteca ieee y estos tres paquetes asociados (más adelante se explicará su significado) aparecen por defecto al generar un módulo VHDL en Xilinx ISE

Entity Una entidad es la abstracción de un circuito, ya sea desde un complejo sistema electrónico o una simple puerta lógica. La entidad únicamente describe la forma externa del circuito, en ella se enumeran las entradas y las salidas del diseño. Una entidad es análoga a un símbolo esquemático en los diagramas electrónicos, el cual describe las conexiones del dispositivo hacia el resto del diseño. - Define externamente al circuito o subcircuito. - Nombre y número de puertos, tipos de datos de entrada y salida. - Tienes toda la información necesaria para conectar tu circuito a otros circuitos. entity nombre is generic (cte1: tipo := valor1; cte2: tipo:= valor 2; …); port (entrada1, entrada2, … : in tipo; salida1, salida2, …: out tipo; puertoi : modo tipo); end nombre; Los puertos pueden ser de entrada in, salida out, entrada-salida inout o buffer. Los puertos de entrada sólo se pueden leer y no se puede modificar su valor internamente en la descripción del comportamiento del circuito (architecture), sobre los puertos de salida sólo library IEEE; use IEEE.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; La biblioteca ieee y estos tres paquetes asociados (más adelante se explicará su significado) aparecen por defecto al generar un módulo VHDL en Xilinx ISE Introducción a la Programación en VHDL 10 F. Informática (UCM) se puede escribir pero nunca tomar decisiones dependiendo de su valor (esto implica una lectura). Si es estrictamente necesario escribir sobre un puerto a la vez que se tiene que tener en cuenta su valor el tipo sería inout o buffer. Además, en la entity se pueden definir unos valores genéricos (generic) que se utilizarán para declarar propiedades y constantes del circuito, independientemente de cual sea la arquitectura. A nivel de simulación utilizaremos generic para definir retardos de señales y ciclos de reloj, estas definiciones no serán tenidas en cuenta a nivel de síntesis. También se puede utilizar generic para introducir una constante que será utilizada posteriormente en la architecture, utilizaremos esa constante para hacer nuestro circuito más general. Por ejemplo, podemos definir el comportamiento de un banco de registros teniendo en cuenta que puede tener cualquier número de registros, fijando el número de registros particular que queremos simular e implementar a través de una constante del generic. Esto implica que en toda la parte de nuestro código (el que vamos a escribir dentro de architecture) donde haga falta el número de registros utilizaremos el nombre de la constante definida en generic, de manera análoga a como se haría en cualquier lenguaje de programación convencional. La sentencia generic no es necesaria, en caso de que no vayamos a utilizarla puede desaparecer de la entity. A continuación se presenta un ejemplo de descripción externa del circuito (entity). Para el ejemplo sabemos que el circuito presentará dos entradas de tamaño N bits y una salida de tamaño un bit, particularizamos la entidad para N igual a 8. Como hemos advertido anteriormente, aunque la función de generic es permitirnos generar un código más general, una vez que definimos el circuito, tenemos que particularizarlo, por lo que siempre debe darse un valor a las constantes del campo generic. 2.2 Architecture Los pares de entidades y arquitecturas se utilizan para representar la descripción completa de un diseño. Una arquitectura describe el funcionamiento de la entidad a la que hace referencia, es decir, dentro de architecture tendremos que describir el funcionamiento de la entidad a la que está asociada utilizando las sentencias y expresiones propias de VHDL. - Define internamente el circuito. - Señales internas, funciones, procedimientos, constantes … - La descripción de la arquitectura puede ser estructural o por comportamiento. F A B Y entity F is generic (N: natural :=8); port (A, B: in bit_vector(N-1 downto 0); Y: out bit); end F;

architecture arch_name of entity_name is -- declaraciones de la arquitectura: -- tipos -- señales -- componentes begin -- código de descripción -- instrucciones concurrentes -- ecuaciones booleanes -- componentes process (lista de sensibilidad) begin -- código de descripción end process; end arch_name; El código VHDL propiamente dicho se escribe dentro de architecture. Cada architecture va asociada a una entity y se indica en la primera sentencia. A continuación, y antes de begin se definen todas las variables (señales) internas que vas a necesitar para describir el comportamiento de nuestro circuito, se definen los tipos particulares que necesitamos utilizar y los componentes, otros circuitos ya definidos y compilados de los cuales conocemos su interfaz en VHDL (su entity). Desde begin hasta end escribiremos todas las sentencias propias de VHDL, pero no todas pueden utilizarse en cualquier parte del código. Así pues aquellas sentencias de VHDL que tengan definido un valor para cualquier valor de la entrada (y que nosotros denominamos sentencias concurrentes) podrán ir en cualquier parte del código pero fuera de la estructura process. Aunque no es el fin de este manual, puede afirmarse que todas las sentencias concurrentes se traducirán en subcircuitos combinacionales. También fuera de la estructura process, se instanciarán los componentes, subcircuitos ya definido sutilizados por el circuito actual, indicando cuáles son sus entradas y sus salidas de entre las señales del circuito del que forman parte. El process es una estructura particular de VHDL (que se describe con mucho más detalle más adelante) que se reserva principalmente para contener sentencias que no tengan obligatoriamente que tener definido su valor para todas las entradas (el ejemplo más común es una estructura if-else incompleta). Esto obliga a que la estructura process almacene los valores de sus señales y pueda dar lugar (no siempre) a subcircuitos secuenciales. Además, en simulación sólo se ejecutan las sentencias internas a esta estructura cuando alguna de las señales de su lista de sensibilidad cambia de valor.



Comentarios

Entradas populares de este blog

Software Xilinx ISE

Calculara la capacidad de carga dinámica

Compuertas Lógicas y Algebra de Boole clase 13 de septiembre