





















































































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Programación VHDL para sistemas embebidos
Tipo: Resúmenes
1 / 93
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!






















































































Dentro de la secuencia de diseño electrónico (fig. 1.1), la primera tarea, después de concebir la idea, es realizar una descripción de lo que se pretende hacer. Las computadoras personales ofrecen hoy día herramientas para la creación y verificación de diseños. Con dichas herramientas es posible describir tanto un circuito sencillo que represente una compuerta como un circuito complejo que defina un procesador digital de señales o un microprocesador.
Al principio, las herramientas CAD (Diseño Asistido por Computadora) se limitaban a servir de meros instrumentos de dibujo para poder realizar el diseño. Con la incorporación de herramientas de fabricación de circuitos impresos e integrados, simuladores, etc., la descripción del circuito empieza a desempeñar un papel más importante, ya que sirve como entrada de información a las herramientas posteriores en el flujo de diseño. Esto, junto con la metodología Top-Down de diseño de circuitos electrónicos (proceso de capturar una idea en un alto nivel de abstracción e implementarla partiendo de esta descripción abstracta y después ir hacia abajo incrementando el nivel de detalle según sea necesario), en contraposición a la metodología bottom-up, llevó a la aparición de herramientas de descripción que permiten al diseñador definir el problema de una forma abstracta, utilizando a la PC para materializar la idea.
Las herramientas CAD actuales permiten las siguientes posibilidades de abordar la descripción de una idea o diseño electrónico:
Descripción Estructural. Consiste en enumerar los componentes de un circuito y sus interconexiones. De acuerdo a la herramienta que se utilice se tienen dos formas de hacerlo:
Esquemas. Consiste en la descripción gráfica de los componentes de un circuito (método tradicional).
Lenguaje. Se realiza una enumeración de los componentes de un circuito así como su conexión.
Descripción Comportamental. Es posible describir un circuito electrónico (generalmente digital) simplemente describiendo como se comporta, utilizando un lenguaje de descripción de hardware apropiado.
Figura 1.1. Flujo de diseño para sistemas electrónicos y digitales.
IDEA
DESCRIPCIÓN MODELADO
PRUEBA SIMULACIÓN
CORRECTO
SINTESIS MAPEADO TENOLOGICO
EXTRACCIÓN DE PROPIEDADES
SIMULACIÓN
CORRECTO
FABRICACIÓN
PRUEBA DEPURADO
FUNCIONA
PRODUCTO TERMINADO
SI
SI
SI
NO
NO
NO
en distintos estilos, del comportamiento de un sistema digital conocido y el desarrollo de modelos de simulación.
Los objetivos del lenguaje VHDL son el modelado (desarrollo de un modelo para la simulación de un circuito o sistema) y la síntesis (proceso en donde se parte de una especificación de entrada con un determinado nivel de abstracción y se llega a una realización más detallada, menos abstracta) de circuitos y sistemas electrónicos y digitales.
2. SINTAXIS DEL VHDL.
VHDL es verdaderamente un lenguaje, por lo que tiene sus elementos sintácticos, sus tipos de datos y sus estructuras como cualquier otro tipo de lenguaje.
Comentarios. Cualquier línea que empieza por dos guiones “-- “ es un comentario.
Símbolos especiales. De un solo carácter: + - / * ( ). , : ; & ´ “ < > = | # De dos caracteres: ** => := /= >= <= --
Identificadores. Se utilizan para dar nombre a variables, señales, nombres de rutinas, etc. puede ser cualquier nombre compuesto por letras y números, incluyendo el símbolo del subrayado “_”; nunca puede contener símbolos especiales o palabras claves del VHDL ni empezar por un número o subrayado; tampoco se permite que el identificador acabe con un subrayado ni que haya dos seguidos. Las mayúsculas o minúsculas son consideradas iguales.
Números. Cualquier número se considera que se encuentra en base 10. Se admite la notación científica convencional para números en punto flotante. Es posible manejar números en otras bases utilizando el símbolo del sostenido “#”. Ejemplo: 2#11000100# y 16#c4# representan el entero 196.
Caracteres. Es cualquier letra o carácter entre comillas simples: ´1´, ´3´, ´t´.
Cadenas. Son un conjunto de caracteres englobados por comillas dobles: “esto es una cadena”.
Cadenas de bits. Los tipos bit y bit_vector son de tipo carácter y matriz de caracteres respectivamente. En VHDL se tiene una forma elegante de definir números con estos tipos y es mediante la cadena de bits. Dependiendo de la base en que se especifique el número, se puede poner un prefijo B (binario), O (octal), o X (hexadecimal). Ejemplos: B”11101001”, O”126”, X”FE”.
Palabras reservadas. Son aquellas que tienen un significado especial. Son las instrucciones, órdenes y elementos que permiten definir sentencias. La tabla 1 muestra las palabras clave del VHDL87 y la tabla 2 las que se agregaron en el VHDL93.
abs( ) (valor absoluto). Devuelve el valor absoluto de su argumento.
***** (multiplicación). Multiplica dos números de cualquier tipo numérico.
/ (división). Funciona con cualquier dato numérico.
mod (módulo). Calcula el módulo de dos números.
rem (resto). Calcula el resto de una división entera.
+ (suma y signo positivo). Indica suma o signo.
- (resta y signo negativo). Indica resta y signo negativo.
Estos operadores solo existen en el VHDL`93.
sll, srl (desplazamiento lógico, a la izquierda o a la derecha). Desplaza un vector un número de bits a izquierda o derecha rellenando con ceros los huecos libres. Ejemplo: dato sll 2, desplaza a la izquierda dos posiciones al vector dato, es decir, lo multiplica por 4.
sla, sra (desplazamiento aritmético a la izquierda o a la derecha). La diferencia con el anterior es que este desplazamiento conserva el signo, es decir, conserva el valor que tiene el bit más significativo del vector.
rol, ror (rotación a la izquierda o a la derecha). Es como el desplazamiento, pero los huecos que se forman son ocupados por los bits que van saliendo.
Devuelven siempre un valor de tipo booleano (true o false). Los tipos con los que pueden operar dependen de la operación.
=, /= (igualdad, desigualdad). El primero devuelve true si los operandos son iguales y false en caso contrario. El segundo indica desigualdad, así que funciona al revés. Los operandos deben ser del mismo tipo.
<, <=, >, >= (menor, mayor) Tienen el significado habitual. Los tipos de datos que pueden manejar son escalares o matrices de una sola dimensión de tipos discretos.
Son not , and , nand , or , nor , xor y en el VHDL`93 se añadió xnor. Actuan sobre los tipos bit, bit_vector y boolean. En un vector, las operaciones son bit a bit.
La siguiente tabla muestra la precedencia de los operadores. Los operadores que se encuentran en la misma fila tienen la misma precedencia, por lo tanto, en una expresión, se evaluarán primero siguiendo el orden de izquierda a derecha de la expresión. El uso de paréntesis altera la precedencia a conveniencia del programador.
Mayor | ** abs not | * / mod rem | + (signo) - (signo) | + - & | = /= < <= > >= Menor | and or nand nor xor xnor
Tabla 3. Precedencia de los operadores en VHDL.
La sintaxis del VHDL es estricta con respecto a los tipos. Cualquier objeto en VHDL debe tener un tipo. Aquí no existen tipos propios del lenguaje, lo que tiene son los mecanismos para poder definir cualquier tipo. Normalmente al compilar un programa, se cargan los tipos de datos que se encuentran en una librería. A continuación se presentan las declaraciones de los dos grupos de tipos de datos del VHDL: los escalares y los compuestos.
Son tipos simples que contienen algún tipo de magnitud. Se muestra a continuación la forma de declararlos, así como algunos predefinidos.
Enteros. Datos cuyo contenido constituye un valor numérico entero. Se definen con la palabra range. No se dice que es un dato entero, sino que está comprendido en cierto intervalo especificando los límites de dicho intervalo con valores enteros. Ejemplos:
A los elementos de una matriz se accede mediante el índice: dato(3) es el elemento 3 de la matriz dato. De la misma manera se puede acceder a un rango: datobyte <= datoword(2 to 9). También se pueden utilizar en las asignaciones lo que se conoce como agregados o conjuntos ( aggregate ), que no es más que una lista separada por comas de manera que al primer elemento de la matriz se le asigna el primer elemento de la lista y así sucesivamente. Ejemplos.
semaforo <= (apagado, encendido, apagado); dato <= (datohigh, datolow); triestado <= ( others => ´z´);
En este último se ha empleado la palabra others para poner todos los bits del triestado a ´z´, de esta forma se puede poner un vector a un valor sin necesidad de saber cuántos bits tiene la señal.
Registros. Es equivalente al tipo registro o record de otros lenguajes. Ejemplo.
type trabajador is record Nombre: string; Edad: integer; end record ;
Para referirse a un elemento dentro del registro se utiliza la misma nomenclatura que en Pascal, es decir, se usa un punto entre el nombre del registro y el nombre del campo: persona.nombre = “Carlos”.
VHDL permite la definición de subtipos que son restricciones o subconjuntos de tipos existentes. Se tienen dos alternativas. La primera son los subtipos obtenidos a partir de la restricción de un tipo escalar a un rango. Ejemplos:
subtype raro is integer range 4 to 7; subtype digitos is character range ´0´ to ´9´; subtype natural is integer range 0 to entero_mas _alto; -- Predefinido. subtype positive is integer range 1 to entero_mas_alto; -- Predefinido.
La segunda alternativa de subtipos son los formados por aquellos que restringen el rango de una matriz. Ejemplos:
subtype id is string (1 to 20); subtype word is bit_vector(31 downto 0);
La ventaja de utilizar subtipos es que las mismas operaciones que sirven para el tipo también sirven para el subtipo. Esto tiene especial importancia cuando se describe un
circuito para ser sintetizado, ya que si se utiliza integer sin más, esto se interpretará como un bus de 32 líneas (según la herramienta que se utilice) y lo más probable es que se requieran muchas menos.
Los elementos en VHDL, como señales, variables, etc. pueden tener información adicional llamada atributos. Estos atributos están asociados a estos elementos del lenguaje y se manejan en VHDL mediante la comilla simple ´. Por ejemplo, t´left indica el atributo ´left de t que, en este caso, es un tipo escalar (este atributo indica el límite izquierdo del rango).
Algunos de estos atributos están predefinidos en el lenguaje, mostrándose a continuación los más interesantes. Suponiendo que t es un tipo enumerado, entero, flotante o físico, se tienen los siguiente atributos:
t´left Límite izquierdo del tipo t.
t´right Límite derecho del tipo t.
t´low Límite inferior del tipo t.
t´high Límite superior del tipo t.
Suponiendo un tipo t como el anterior, un miembro x de ese tipo y un entero N, se pueden utilizar los siguientes atributos.
t´pos(x) Posición de x dentro del tipo t.
t´val(N) Elemento N del tipo t.
t´leftof(x) Elemento que está a la izquierda de x en t.
t´rightof(x) Elemento que está a la derecha de x en t.
t´pred(x) Elemento que está delante de x en t.
t´succ(x) Elemento que está detrás de x en t.
Si a es un tipo matriz, u un elemento de éste y N es un entero desde 1 hasta el número de dimensiones de la matríz, se pueden usar los siguientes atributos:
a´left(N) Límite izquierdo del rango de dimensión N de a.
attribute pin: integer; attribute encapsulado: string; attribute pin of control: signal is 5; attribute encapsulado of ne555: component is “dip8”; begin if control´pin > 4 then ... if ne555´encapsulado = “dip8” then ... end ;
Un elemento en VHDL contiene un valor de un tipo especificado. Hay tres tipos de elementos en VHDL: las variables, las señales y las constantes. Las variables y constantes son similares a lo que se encuentra en otros lenguajes. Las señales, en cambio, son elementos con un significado enfocado a la descripción de hardware.
Una constante es un elemento que se inicializa a un valor determinado y que no puede ser cambiado una vez inicializado. Ejemplos:
constant e : real := 2.71828; constant retraso : time := 10 ns; constant max_size : natural;
En la última sentencia la constante max_size no tiene nungún valor asociado. Esto se permite siempre y cuando el valor sea declarado en algún otro sitio y se hace así para las declaraciones en paquetes que se verán más adelante.
Una variable en VHDL es similar al concepto de variable en otros lenguajes. Ejemplos:
variable contador : natural := 0; variable aux : bit_vector(31 downto 0);
Es posible, dado un elemento previamente definido, cambiarle el nombre o ponerle nombre a una parte. Esto se realiza mediante la instrucción alias que suele resultar muy útil. Ejemplos:
variable instrucción : bit_vector(31 downto 0); alias codigo_op : bit_vector(7 downto 0) is instrucción(31 downto 24);
Las señales se declaran igual que las constantes y variables, con la diferencia de que las señales pueden ser normal , register o bus. Si en la declaración no se especifica nada, se entiende que la señal es de tipo normal ; para que sea de tipo bus o register se debe declarar explícitamente con las palabras clave bus o register.
Una señal no es lo mismo que una variable, La señal no es exactamente un objeto del lenguaje que guarda un valor, sino que lo hace en realidad es guardar un valor (o varios como se verá más adelante) y hacerlo visible en el momento adecuado. Esto es, se puede decir que la señal tiene dos partes, una donde se escribe y que almacena el valor y otra que se leé y que no tiene por qué coincidir con lo que se acaba de escribir.
Internamente se establece una conexión entre la parte que se escribe y la que se lee. Es posible en VHDL desconectar una parte de la otra, de manera que al leer la señal no se tenga acceso a lo que se escribió. La desconexión de una señal se hace asignándole el valor null. La diferencia entre una señal normal , register o bus viene del comportamiento al desconectarse. Las de tipo normal no se pueden desconectar. Las de clase bus y register se pueden desconectar, ya que o bien se trata de señales de tipo resuelto, que admiten varios o ningún valor escrito a un tiempo, o bien de tipo vigiladas, que tienen una condición de desconexión. La diferencia entre ambas es que la señal de tipo bus tiene un valor por defecto cuando todas las fuentes de la señal están desconectadas y las de clase register no tienen un valor por defecto pero conservan el último valor que se escribió.
Al igual que en variables y constantes, a las señales también se les puede dar un valor inicial si se quiere. Ejemplos:
signal selec: bit := ´0´; signal datos: bit_vector(7 downto 0) bus := B”00000000”;
Constantes, señales y variables, son cosas diferentes. Las variables sólo tienen sentido dentro de un process o subprograma, es decir, solo tienen sentido en entornos de programación donde las sentencias son ejecutadas en serie. Las señales pueden ser declaradas únicamente en las arquitecturas, paquetes ( package ) o en los bloques concurrentes ( block ). Las constantes pueden ser habitualmente declaradas en los mismos sitios que las variables y señales.
Las variables son elementos abstractos del lenguaje, lo que significa que no tienen por qué tener una concordancia física real inmediata. Las señales poseen un significado físico inmediato y es el de representar conexiones reales en el circuito; son visibles por
Existe una biblioteca que es la más empleada en la industria de los semiconductores y que prácticamente también es estándar, la biblioteca IEEE, con sus paquetes std_logic_1164 y std_logic_1164_ext. El primero contiene la definición de tipos y funciones para trabajar con un sistema de nueve niveles lógicos que incluyen los de tipo bit con sus fuerzas correspondientes, así como los de desconocido, alta impedancia, etc. El segundo paquete, el cual es una extensión del anterior, incorpora alguna función de resolución más, así como operaciones aritméticas y relacionales.
Es por ello que la primera parte de una descripción VHDL contiene la declaración de librerías utilizadas en el proyecto. Con el objeto de respetar la definición IEEE del VHDL se tratara lo más posible de utilizar solo la librería estándar 1164. Existen muchas otras librerías, pero solo se aplican para los dispositivos de algunas empresas, por lo que no son estándar.
Todas las descripciones del texto incluyen las siguientes dos líneas en la sección de librerías:
library IEEE; use IEEE.std_logic_1164. all
Una excepción a lo anterior es cuando se describen memorias, donde se necesita utilizar dos librerías adicionales que también son parte del estándar 1164.
La segunda sección de la descripción VHDL, la entidad, define la interfaz con el entorno del sistema, ya que contiene las terminales de entrada y salida que lleva un diseño. La entidad es la estructura que permite realizar diseños jerárquicos en VHDL (colección de módulos interconectados entre sí). La forma de declarar una entidad es:
entity nombre is [ generic (lista de parámetros);] [ port (lista de puertos);] [declaraciones] [ begin sentencias] end [ entity ] [nombre];
Las sentencias generic y port son muy importantes a pesar de que son opcionales. Generic sirve para definir y declarar propiedades o constantes del módulo que está siendo declarado en la entidad. Con la palabra clave port , se definen las entradas y salidas del módulo que está siendo definido.
Existen cuatro tipos de terminales que pueden ser declaradas:
1 Entradas simples. 2 Salidas simples. 3 Salidas retroalimentadas. 4 Terminales bidireccionales.
Para ejemplificar la forma de dar de alta las terminales de un circuito, se toma como ejemplo la caja negra que aparece en la figura 2.
Figura 2. Caja negra con terminales de E/S.
La declaración de esta caja negra en VHDL, con sus correspondientes terminales, utilizando los tipos de la librería IEEE con su paquete std_logic_1164 es:
entity Caja_Negra is port ( a ,b : in std_logic; -- Entradas simples. c : out std_logic; -- Salida simple. d : inout std_logic; -- Terminal bidireccional. e : buffer std_logic -- Salida retroalimentada. ); end Caja_Negra;
La descripción de terminales inicia con la palabra reservada entity, continua con el nombre del circuito (en este caso, Caja_Negra) y la palabra reservada is y finaliza con la palabra reservada end y nuevamente el nombre del circuito con punto y coma. Las terminales son declaradas dentro de una estructura que comienza con la palabra reservada port seguida de paréntesis “(“ y termina con otro paréntesis y punto y coma “);”. Las entradas simples se declaran como in , las salidas simples como out , las terminales bidireccionales como inout y las salidas retroalimentadas como buffer.
CAJA NEGRA
b
d
e
a
c
Ejemplo 1. Compuerta NAND de dos entradas.
Realizar la descripción VHDL del circuito de la figura Ej.1.
Figura Ej.1. Circuito simple.
Solución:
-- Libreria estandar
library IEEE; use IEEE.std_logic_1164. all ;
-- Descripcion en caja negra
entity Compuerta_NAND is port ( A, B : in std_logic; -- Entradas simples F: out std_logic -- Salida simple ); end Compuerta_NAND;
-- Descripcion del circuito
architecture simple of Compuerta_NAND is begin F <= A NAND B; -- Compuerta NAND end simple;
Ejemplo 2. Operadores lógicos.
Realizar la descripción VHDL del circuito combinacional de la figura Ej.2.
Figura Ej.2. Circuito combinacional con compuertas básicas.
Solución:
-- Libreria estandar
library IEEE; use IEEE.std_logic_1164. all ;
-- Descripcion en caja negra
entity Compuertas_basicas is port ( A, B : in std_logic; -- Entradas simples F: out std_logic_vector(1 to 7)-- 7 Salidas simples ); end Compuertas_basicas;