0% encontró este documento útil (0 votos)
72 vistas32 páginas

Modelo VHDL para Función Lógica f

1. VHDL es un lenguaje de descripción de hardware estandarizado que permite describir y simular sistemas digitales complejos. Se pueden representar sistemas en diferentes niveles de abstracción como el nivel conductista y el nivel estructural. 2. En VHDL, cada sistema digital se compone de una entidad principal que puede contener otras entidades como componentes. Cada entidad se define mediante una declaración de entidad que especifica las señales de entrada/salida y un cuerpo arquitectónico que describe la entidad. 3. La declar

Cargado por

davidhc
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
72 vistas32 páginas

Modelo VHDL para Función Lógica f

1. VHDL es un lenguaje de descripción de hardware estandarizado que permite describir y simular sistemas digitales complejos. Se pueden representar sistemas en diferentes niveles de abstracción como el nivel conductista y el nivel estructural. 2. En VHDL, cada sistema digital se compone de una entidad principal que puede contener otras entidades como componentes. Cada entidad se define mediante una declaración de entidad que especifica las señales de entrada/salida y un cuerpo arquitectónico que describe la entidad. 3. La declar

Cargado por

davidhc
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

1.

La introducción
VHDL respalda Idioma de Descripción del Hardware VHSIC (Velocidad Muy Alto
Integrated Circunvala). En las mid-1980 _ s el U.S. Department de Defensa y el IEEE
fiaron el desarrollo de este idioma de descripción del hardware con la meta para desarrollar
circuito integrado muy de alta velocidad. Se ha convertido ahora uno de idiomas del
estándar de _ s de la industria usados para describir sistemas digitales. El otro idioma de
descripción del hardware ampliamente usado es Verilog. Ambos son idiomas poderosos
que le permiten describir y simulan complique sistemas digitales. Un tercer idioma HDL es
ABEL (Boolean Adelantado Idioma Equation) que fue específicamente diseñado para
Dispositivos Lógicos Programables (el dispositivo lógico programable). ABEL es menos
poderoso que los otros dos idiomas y es menos popular en industria. Este manual de
instrucción trata con VHDL, tan descrito por el 1076-1993 del estándar del IEEE.
Aunque estos idiomas se ven similares como lenguajes de programación convencionales,
hay algo de diferencias importantes. Un idioma de descripción del hardware es
intrínsecamente paralelo, o sea órdenes, cuál corresponde a las portillas lógicas, es
ejecutado (computado) adentro paralelamente, tan pronto como un aporte nuevo llega. Un
programa HDL imita el comportamiento de un sistema físico, usualmente digital. También
consiente incorporación de cronometrar especificaciones (la portilla se demora) así como
también para describir un sistema como una interconexión de componentes diferentes.

2. Los niveles de representación y


abstracción
Un sistema digital puede ser representado en niveles de abstracción diferentes 1 . Esto
mantiene la descripción y diseño de sistemas complejos dóciles. Creo niveles de
abstracción de 1 funciones de diferente.

 
Figura 1: Los niveles de abstracción: El Conductista, el de Structural y
Reconocimiento Médico

El nivel de abstracción más alto es el nivel conductista que describe un sistema en


términos de lo que hace (o cómo se comporta) en vez de en términos de sus componentes e
interconexión entre ellos. Una descripción conductista especifica la relación entre el aporte
y las señales de salida. Ésta podría ser una expresión Boolean o una descripción más
abstracta como el nivel de Registro de Reembarque o Algorithmic. Por poner un ejemplo,
consideremos un circuito simple que le advierte pasajeros del coche cuando la puerta está
abierta o el seatbelt no son usados cada vez que la llave del coche es insertada en el cerrojo
de ignición En el nivel conductista que ésta podría ser expresada tan,
Advirtiéndole a = Ignition _ en el operador booleano AND (_ claro de la Puerta Oregon
Seatbelt _ fuera de)
El nivel estructural, por otra parte, describe un sistema como una colección de portillas y
componentes que están interconectados para realizar una función deseada. Una descripción
estructural podría ser comparada con uno esquemático de portillas lógicas interconectadas.
Es una representación que está usualmente más cercana para la realización física de un
sistema. Para el ejemplo arriba, la representación estructural es demostrado en Figura 2 de
abajo.

Figura 2: La representación estructural de un "timbre" circuito.

VHDL le permite uno describir un sistema digital en lo estructural o el nivel conductista. El


nivel conductista puede estar más allá dividido en dos clases de estilos: El flujo de datos y
Algorithmic. La representación de flujo de datos describe cómo los movimientos de datos
a través del sistema. Esto se hace típicamente en términos del flujo de datos entre los
registros (el nivel de Reembarque de Registro). El modelo de flujo de datos hace uso de
declaraciones concurrentes que son ejecutadas adentro paralelamente tan pronto como los
datos logra el aporte. Por otra parte, las declaraciones secuenciales son ejecutadas en la
secuencia que son especificadas. VHDL consiente ambas asignaciones concurrentes y
secuenciales de la señal que determinarán la manera en la cual son ejecutadas. Los
ejemplos de ambas representaciones serán dados más tarde.

3. La estructura básica de un archivo


VHDL
Un sistema digital en VHDL consta de una entidad del diseño que puede contener a otras
entidades que son luego considerados componentes de la entidad del más alto nivel. Cada
entidad es modelada por una declaración de entidad y un cuerpo de arquitectura. Uno
puede considerar la declaración de entidad como la interfaz para el mundo exterior que
define el aporte y las señales de salida, mientras el cuerpo de arquitectura contiene la
descripción de la entidad y está compuesta de interconectado entidades, procesos y
componentes, todo funcionando concurrentemente, como esquemáticamente mostrado en
Figura 3 debajo. En un diseño típico habrá muchos a que tales entidades se conectaron
conjuntamente realizan la función deseada.

Figura 3: Una entidad VHDL consistente en una interfaz (la declaración de entidad) y un
cuerpo (la descripción arquitectónica).

Los usos VHDL reservaron palabras claves que no pueden ser utilizadas como nombres de
la señal o identificadores. Las palabras claves y los identificadores creados por el usuario
son caso insensible. Las líneas con comentarios comienzan con dos guiones adyacentes (-)
y estarán ignoradas por el compilador. VHDL también ignora suspensiones de la línea y
espacios adicionales. VHDL es un idioma fuertemente escrito que significa que uno tiene
siempre que declarar el tipo de cada propósito que puede tener un valor, como señales,
constantes y variables.
uno. La Declaración de Entidad
La declaración de entidad define el NOMBRE de la entidad y lista el aporte y terminales de
salida. La forma general es como sigue,
La entidad NAME_OF_ENTITY es [generic generic _ declarations ) ; ]
El puerto (_ los nombres de la señal: El tipo de modo;
_ los nombres de la señal: El tipo de modo;
:
_ los nombres de la señal: El tipo de modo);
El fin NAME _ OF _ ENTITY ;
Una entidad siempre comienza con la entidad de palabra clave, seguida por su nombre y la
palabra clave es. Después es las declaraciones del puerto usando el puerto de palabra clave.
Una declaración de entidad siempre acaba con el fin de palabra clave, optionally [ ]
entendió por el nombre de la entidad.
· el NAME_OF_ENTITY es un identificador seleccionado por usuario
· la señal _ nombra consta de una coma separado lista de uno o más identificadores
seleccionados por usuario que especifican que la interfaz externa hace señales.
· el modo: Es una de las palabras confidenciales para indicar la dirección de la señal:
O de adentro señala que la señal es un aporte
O expulsa señala que la señal es una salida de la entidad a cuyo valor sólo le puede ser
leída por otras entidades que uso él.
El amortiguador o señala que la señal es una salida de la entidad a cuyo valor le puede ser
leída dentro de la arquitectura de _ s de entidad
El inout o _ la señal puede ser un aporte o una salida.
· el tipo: Un tipo de la señal incorporada o creada por el usuario. Los ejemplos de tipos son
_ lógica mordida, del pedacito de _ vector, Boolean, de carácter, std, y std ulogic.
El pedacito o _ puede tener el valor 0 y 1
O mordió _ vector _ es un vector de valores mordidos (por ejemplo _ el vector mordido (0
para 7)
_ la lógica del std o, std ulogic, _ vector, _ vectorial _ lógico std std ulogic: Pueden tener 9
valores para indicar el valor y la fuerza de una señal. Std ulogic y _ lógica std son
preferidos sobre el pedacito o _ el vector mordido mecanografía.
El boolean o _ puede tener el valor TRUE y FALSE
El entero o _ puede tener un rango de valores de entero
O realmente _ puede tener un rango de valores reales
El carácter o _ cualquier carácter del estampado
O cronometra _ para indicar el tiempo

· genérico: Las declaraciones genéricas son optativas y determinan las constantes locales
destinadas para cronometrar y dimensionando a (por ejemplo las anchuras del autobús) la
entidad. Uno genérico puede tener un valor de defecto. La sintaxis para uno genérico sigue,
Genérico (
El constante _ nombre: Escriba [: = value ];
El constante _ nombre: Escriba [: = value ];
:
El constante _ nombre: Categorice a [: = value ]);
Para el ejemplo de Figura 2 de arriba, la declaración de entidad mira como sigue.

- Los comentarios: El ejemplo del circuito del timbre de higo. 2


El TIMBRE de entidad es
El puerto (la PUERTA, la IGNICIÓN, SBELT: En _ la lógica del std;
La ADVERTENCIA: Fuera de _ la lógica del std);
El TIMBRE de fin;
La entidad es TIMBRE designado y tiene tres terminales de entrada, la PUERTA, la
IGNICIÓN y SBELT y una terminal de salida, la ADVERTENCIA. ¡Note el uso y la
colocación de puntos y comas! El TIMBRE de nombre es un identificador. Los aportes son
denotados por la palabra clave adentro, y las salidas por la palabra clave fuera. Desde que
VHDL es un idioma fuertemente escrito, cada puerto tiene un tipo definido. En este caso,
especificamos el tipo de _ lógica del std. Éste es el tipo preferido de señales digitales. En
contraste al tipo mordido que sólo puede hacer los valores _ 1 _ y _ 0 _, el std _ lógica y los
tipos std ulogic puede tener nueve valores. Esto es importante para describir un sistema
digital exactamente incluyendo los valores binarios 0 y 1, así como también la incógnita
aprecia la Letra X, el valor del uninitialized U, "-" para la cautela de la _ t del catedrático, Z
para la impedancia alta, y varios símbolos indicar la intensidad de señal (e.g. La L para
débil H 0, para débil W 1, para la incógnita débil - vea sección en los Tipos Enumerados).
El tipo de _ lógica del std está definido en la _ lógica del std _ 1164 paquete de la biblioteca
del IEEE. El tipo define el set de valores que un propósito puede tener. Esto tiene la ventaja
que ayuda con la creación de modelos y que las ayudas reducen errores. Por ejemplo, si uno
trata de asignarle un valor ilegal a un objeto, el compilador señalará con una bandera el
error.
Algunos otros ejemplos de declaraciones de entidad siguen
Cuatro para un dispositivo de control de diferentes operaciones del cual cada aporte es una
palabra de 8 pedacitos.
El mux4 de entidad _ para _ 1 es
El puerto (I0, I1, I2, I3: En _ el vector de _ lógica del std (7 downto 0);
SEL: En _ el vector de _ lógica del std (1 downto 0);
El OUT1: Fuera de _ el vector de _ lógica del std (7 downto 0));
El mux4 de fin _ para _ 1;
Un ejemplo de la declaración de entidad de un circuito biestable D con aportes
determinados y puestos a cero es
La entidad dff sr es
El puerto (D, CLK, S, acto inapropiado: En _ la lógica del std;
Q, Qnot: Fuera de _ la lógica del std );
El fin dff sr;
b. El cuerpo de arquitectura
El cuerpo de arquitectura especifica cómo funciona el circuito y cómo es implementado.
Como discutida anterior, una entidad o circuito puede ser especificada de diversos modos,
tan conductista, estructural (los componentes interconectados), o una combinación de lo
antedicho.
El organismo de arquitectura mira como sigue,
_ el nombre de arquitectura de arquitectura de NAME_OF_ENTITY es
- Las declaraciones
- Las declaraciones de componentes
- Las declaraciones de la señal
- Las constantes declaraciones
- Las declaraciones de función
- Las declaraciones de procedimiento
- Escriba declaraciones
:
Comience
- Las declaraciones
:
_ el nombre de arquitectura de fin;

el modelo conductista
El cuerpo de arquitectura para el ejemplo de Figura 2, descrito en el nivel conductista, es
dado debajo,
La arquitectura conductista de TIMBRE es
Comience
La ADVERTENCIA < = (no la PUERTA y la IGNICIÓN) o (no SBELT e IGNICIÓN);
El fin conductista;
La línea del encabezado del cuerpo de arquitectura define el nombre de arquitectura, por
ejemplo conductista, y le asocia con la entidad, TIMBRE. El nombre de arquitectura puede
ser cualquier identificador legal. El cuerpo principal de los principios de arquitectura con la
palabra clave empiece y da la expresión Boolean de la función. Veremos más tarde que un
modelo conductista puede estar descrito en varias otras formas. El símbolo representa un
operador de asignación y asigna el valor de la expresión a la derecha para la señal a la
izquierda. La arquitectura que el cuerpo destruye con una palabra clave de fin siguió por el
nombre de arquitectura.
Algunos otros ejemplos siguen. La descripción conductista de una portilla de operador
booleano AND de dos aportes es mostrada debajo.
El AND2 de entidad es
El puerto (in1, in2: En _ la lógica del std;
El out1: Fuera de _ la lógica del std);
El AND2 de fin;
La arquitectura conductista _ 2 de AND2 es
Comience
Out1 in1 e in2;
El fin conductista _ 2;
Un ejemplo de una portilla XNOR de dos aportes es demostrado debajo.
El XNOR2 de entidad es
El puerto (Una, B: En _ la lógica del std;
Z: Fuera de _ la lógica del std);
El XNOR2 de fin;
La arquitectura _ que el xnor conductista de XNOR2 es
- La declaración de la señal (de Letra X interna de señales, Y)
La letra x de la señal, Y: _ la lógica del std;
Comience
La letra x < = Uno y B;
Y < = (no Uno) y (no B);
Z< =X o Y;
Acabe _ xnor conductista;
Las declaraciones en el cuerpo de la arquitectura hacen uso de operadores lógicos. Los
operadores lógicos que están permitidos son: Y, o, nand, ni, xor, xnor y no. Además, otros
tipos de operadores incluyendo cambio de relaciones,, aritmética son admitidos igualmente
(vea sección en Operadores). Para mayor información sobre el modelado conductista la
sección de la sede en el Modelado Conductista.

La Concurrencia
Es digno de señalar que las asignaciones de la señal en los anteriormente citados ejemplos
son declaraciones concurrentes. Esto significa que las declaraciones son ejecutadas cuando
una o más de las señales en el lado derecho cambian su valor (o sea un acontecimiento
ocurre en una de las señales). Por ejemplo, cuando el aporte que la A cambia, la Letra X
interna de señales y Y cambian valores que esa a su vez causa que la última declaración
actualice la Z de salida. Puede haber un retraso de propagación asociado con este cambio.
Los sistemas digitales son básicamente conducidos en datos y un acontecimiento que ocurre
en una señal conducirá a un acontecimiento en otra señal, etc. La ejecución de las
declaraciones es determinada por el flujo de señal aprecia. Como consecuencia, la orden en
la cual a estas declaraciones les es dada no tiene importancia (i.e., Mover la declaración
para la Z de salida delante de que para Letra X y Y no cambia el resultado). Esto está en
contraste para los programas convencionales del software, que ejecutan las declaraciones en
una manera secuencial o procesal.

la descripción estructural
El circuito de Figura 2 también puede estar descrito usando un modelo estructural que
especifica qué las portillas es usado y cómo están interconectadas. El siguiente ejemplo lo
ilustra.
La arquitectura estructural de TIMBRE es
- Las declaraciones
El AND2 componente
El puerto (in1, in2: En _ la lógica del std;
El out1: Fuera de _ la lógica del std);
El componente de fin;
El OR2 componente
El puerto (in1, in2: En _ la lógica del std;
El out1: Fuera de _ la lógica del std);
El componente de fin;
El NOT1 componente
El puerto (in1: En _ la lógica del std;
El out1: Fuera de _ la lógica del std);
El componente de fin;
- La declaración de señales usó interconectar portillas
La señal DOOR_NOT, SBELT_NOT, B1, B2: _ la lógica del std;
Comience
- Las declaraciones Componentes de instanciaciones
U0: El mapa del puerto del NOT1 (la PUERTA, DOOR_NOT);
U1: El mapa del puerto del NOT1 (SBELT, SBELT_NOT);
U2: El mapa del puerto del AND2 (la IGNICIÓN, DOOR_NOT, B1);
U3: El mapa del puerto del AND2 (la IGNICIÓN, SBELT_NOT, B2);
U4: El mapa del puerto del OR2 (B1, B2, la ADVERTENCIA);
El fin estructural;
Después del encabezado está la parte declarativa que da los componentes (las portillas)
que va a ser usada en la descripción de los circuitos. En nuestro ejemplo, usamos una
PUERTA AND de dos aportes, PUERTA O LÓGICO de dos aportes y un negador. Estas
portillas tienen que ser primeros definidas, o sea necesitarán un cuerpo de entidad (como se
muestra en el ejemplo previa) de declaración y de arquitectura. Estos pueden guardarse en
uno de los paquetes a que uno se refiere en el encabezado del archivo (vea Biblioteca y
Paquetes debajo). Las declaraciones para los componentes dan los aportes (por ejemplo in1,
in2) y la salida (por ejemplo out1). Después, uno tiene que definir redes internas (la señal
nombra). En nuestro ejemplo estas señales son DOOR_NOT designado, SBELT_NOT, B1,
B2 (vea Figura 2). Echo de ver que uno siempre tiene que declarar el tipo de la señal.
Las declaraciones después de lo empiezan palabra clave da las instanciaciones de los
componentes y describe cómo están interconectadas éstas. Una declaración componente de
instanciación crea un nivel nuevo de jerarquía. Cada línea comienza con un nombre de
instancia (e.g. U0) seguido por unos dos puntos y un nombre componente y el puerto de
palabra clave hace mapas. Esta palabra clave define cómo están conectados los
componentes. En el ejemplo arriba, esto se hace asociación posicional directa: La PUERTA
corresponde al aporte, in1 de la portilla del NOT1 y DOOR_NOT TO para la salida. De
modo semejante, para la portilla del AND2 donde las primeras dos señales (la IGNICIÓN y
DOOR_NOT) corresponden al in1 de aportes e in2, respectivamente, y la señal B1 para el
out1 de salida. Una forma alternativa es usar relación explícita entre los puertos, como se
muestra debajo.
La etiqueta: El mapa del puerto de nombre (port1 signal1, port2 signal2, ⁹†port3 signaln)
componente;
U0: El mapa del puerto del NOT1 (= > la PUERTA in1, out1 DOOR_NOT);
U1: El mapa del puerto del NOT1 (in1 = > SBELT, out1 SBELT_NOT);
U2: El mapa del puerto del AND2 (= > la IGNICIÓN in1, in2 DOOR_NOT, out1 = >
B1);
U3: El mapa del puerto del AND2 (= > la IGNICIÓN in1, in2 SBELT_NOT, B2);
U4: El mapa del puerto del OR2 (in1 B1, in2 B2, out1 = > DANDO AVISO);
Note que la orden en la cual estas declaraciones están escritas no tiene tener relación con la
ejecución desde que estas declaraciones son concurrente y por consiguiente ejecutado de
adentro iguala. Ciertamente, lo esquemático ese está descrito por estas declaraciones es lo
mismo independiente de la orden de las declaraciones.
El modelado estructural de diseño se presta a sí mismo para diseño jerárquico, en cuál
pueden definir componentes de unidades que son usadas repetidas veces. Una vez que estos
componentes están definidos pueden ser utilizados como bloques, celdas o macros en una
entidad nivelada más alta. Esto significativamente puede reducir la complejidad de diseños
grandes. Los acercamientos jerárquicos del diseño están todo el tiempo preferidos sobre
diseños planos. Ilustraremos el uso de un acercamiento jerárquico del diseño para un
sumador de 4 pedacitos, demostrado en Figura 4 debajo. Cada sumador total puede estar
descrito por las expresiones Boolean para la suma y puede cargar fuera señales,
La suma = (AÅB) Å C
Lleve a = AB + C (AÅB)
 

 
Figura 4: Esquemático de un sumador de 4 pedacitos consistente en los módulos llenos del
sumador.
En el archivo VHDL, hemos definido un componente para el sumador total primero.
Usamos varias instanciaciones del sumador total para construir la estructura del sumador de
4 pedacitos. Hemos incluido la biblioteca y cláusula de uso así como también las
declaraciones de entidad.
Cuatro Mordieron Sumador _ Ilustrando un modelo jerárquico VHDL
- El ejemplo de un sumador de cuatro pedacitos
El ieee de la biblioteca;
_ [Link] de _ lógica del [Link] de uso;
- La definición de un sumador total
La entidad FULLADDER es
El puerto (una, b, c: En _ la lógica del std;
La suma, el arrastre: Fuera de _ la lógica del std);
El fin FULLADDER;
La arquitectura fulladder behav de FULLADDER es
Comience
La suma < = (un xor b) xor c;
Lleve < = (uno y b) o (c y (un xor b));
El fin fulladder behav;
- El sumador de 4 pedacitos
El ieee de la biblioteca;
_ [Link] de _ lógica del [Link] de uso;
La entidad FOURBITADD es
El puerto (una, b: En _ el vector de _ lógica del std (3 downto 0);
Cin: En _ la lógica del std;
La suma: Fuera de _ el vector de _ lógica del std (3 downto 0);
Cout, V: Fuera de _ la lógica del std);
El fin FOURBITADD;
_ la estructura del fouradder de arquitectura de FOURBITADD es
c de la señal: _ el vector de _ lógica del std (4 downto 0);
FULLADDER componente
El puerto (una, b, c: En _ la lógica del std;
La suma, el arrastre: Fuera de _ la lógica del std);
El componente de fin;
Comience
El FA0: FULLADDER
Ponga a babor mapa (uno (0), b (0), Cin, suma (0), c (1));
El FA1: FULLADDER
Ponga a babor mapa (uno (1), b (1), C (1), suma (1), c (2));
El FA2: FULLADDER
Ponga a babor mapa (uno (2), b (2), C (2), suma (2), c (3));
El FA3: FULLADDER
Ponga a babor mapa (uno (3), b (3), C (3), suma (3), c (4));
V < = c xor (3) c (4);
Cout c (4);
_ la estructura del fouradder de fin;

Echo de ver que el mismo aporte nombra uno y b para los puertos del sumador total y el
sumador de 4 pedacitos fuera usada. Esto no plantea un problema en VHDL desde ellos
refiérase a los niveles diferentes. Sin embargo, para la legibilidad, puede ser más fácil usar
nombres diferentes. Necesitamos definir la señales interna c (4:0) para indicar las redes que
asocian el arrastre de salida para el arrastre de aporte del siguiente sumador total. Para el
primer aporte destinamos a la señal de aporte Cin. para el último arrastre nosotros definido
c (4) como una señal interna desde lo último lleva es necesario como el aporte para la
portilla del xor. ¡ No podríamos usar la señal de salida Cout desde que VHDL no consienta
el uso de salidas como señales internas! Por esta razón tuvimos que definir el arrastre
interno c (4) y asignar a c (4) a la señal de arrastre de salida Cout.
Vea también la sección en Structural Modelando.
c. La Biblioteca y los Paquetes: La biblioteca y las palabras claves de uso
Una biblioteca puede ser considerada como un lugar donde el compilador almacena
información acerca de un proyecto del diseño. Un paquete VHDL es un archivo o el
módulo que contiene declaraciones de objetos comúnmente usados, los datos determinan el
tipo sanguíneo, declaraciones componentes, señal, procedimientos y funciones que se
compartió entre los modelos diferentes VHDL.
Mencionamos más temprano que _ la lógica del std está definida en la _ lógica del [Link]
del paquete _ 1164 en la biblioteca del ieee. Para usar la _ lógica del std un necesita
especificar la biblioteca y el paquete. Esto se hace al principio del archivo VHDL usando la
biblioteca y las palabras claves de uso como sigue:
El ieee de la biblioteca;
_ [Link] de _ lógica del [Link] de uso;
La extensión del .all indica usar toda la _ lógica del [Link] _ 1164 paquete.
El Xilinx Foundation Exprés viene con varios paquetes.
El ieee Library:
_ la lógica del std _ 1164 el paquete: Define los datatypes estándar
El paquete del _ arith de _ lógica del std: Provee aritmética, conversión y la
comparación funciona para el firmado, sin firmar, entero, std ulogic, std _ lógica y _
el vector _ lógico std mecanografía
_ la lógica del std _ sin firmar
El paquete del misc de _ lógica del std: Define tipos suplementarios, subtipos,
constantes y funciones para la _ lógica del std _ 1164 paquete.
Para usar cualquiera de estos que uno debe incluir la biblioteca y cláusula de uso:
El ieee de la biblioteca;
_ [Link] de _ lógica del [Link] de uso;
_ [Link] de _ lógica del [Link] de uso;
[Link] de _ lógica del [Link] de uso;
Además, la biblioteca de la sinopsis tiene el paquete de atributos:
La biblioteca SYNOPSYS;
[Link] de uso;
Uno puede sumar otras bibliotecas y otros paquetes. La sintaxis para declarar un paquete es
como sigue:
- La declaración del Paquete
El nombre del paquete _ de _ paquete es
Las declaraciones del paquete
El nombre del paquete de fin _ de _ paquete;
- Las declaraciones del cuerpo del Paquete
El nombre del cuerpo del paquete _ de _ paquete es
Las declaraciones del cuerpo del paquete
El nombre del cuerpo del paquete de fin _ de _ paquete;
Por ejemplo, las funciones básicas del AND2, OR2, NAND2, NOR2, XOR2, los
componentes de etc. necesitan estar definidos antes de que uno los puede usar. Esto puede
hacerse en un paquete, por ejemplo _ func antiácido para cada uno de estos componentes,
como sigue:
- La declaración del Paquete
El ieee de la biblioteca;
_ [Link] de _ lógica del [Link] de uso;
El paquete _ que el func antiácido es
- La declaración AND2
El AND2 componente
Genérico (el RETRASO: El tiempo:=5ns);
El puerto (in1, in2: En _ la lógica del std; El out1: Fuera de _ la lógica del std);
El componente de fin;
- La declaración OR2
El OR2 componente
Genérico (el RETRASO: El tiempo:=5ns);
El puerto (in1, in2: En _ la lógica del std; El out1: Fuera de _ la lógica del std);
El componente de fin;
El paquete de fin _ el func antiácido;
- Las declaraciones del cuerpo del Paquete
El ieee de la biblioteca;
_ [Link] de _ lógica del [Link] de uso;
El cuerpo del paquete _ que el func antiácido es
- 2 introducen en la computadora PUERTA AND
El AND2 de entidad es
Genérico (el RETRASO: El tiempo);
El puerto (in1, in2: En _ la lógica del std; El out1: Fuera de _ la lógica del std);
El AND2 de fin;
_ el conc de modelo de arquitectura de AND2 es
Comience
Out1 in1 e in2 de después SE DEMORAN;
_ el conc de modelo de fin;
- 2 introducen en la computadora PUERTA O LÓGICO
El OR2 de entidad es
Genérico (el RETRASO: El tiempo);
El puerto (in1, in2: En _ la lógica del std; El out1: Fuera de _ la lógica del std);
El OR2 de fin;
_ el conc2 de modelo de arquitectura de AND2 es
Comience
Out1 in1 o in2 de después SE DEMORA;
_ el conc2 de modelo de fin;
El cuerpo del paquete de fin _ el func antiácido;
Echo de ver que incluimos un retraso de 5 ns. Sin embargo, debería ser notado que las
especificaciones de retraso están ignoradas por la herramienta de síntesis de la Fundación.
Hicimos uso de la _ lógica predefinida del std de tipo que se declaró en la _ lógica del std
del paquete _ 1164. Hemos incluido la biblioteca y cláusula de uso para este paquete. Este
paquete necesita ser compilado y colocado en una biblioteca. Los alquileres llaman esta
biblioteca mi _ func. Usar los componentes de este paquete un tiene que declararlo usando
la biblioteca y cláusula de uso:
La biblioteca ieee, mi _ func;
_ la lógica del [Link] de uso _ [Link], mi [Link] [Link];
Uno puede concatenar una serie de nombres separados por los períodos para seleccionar un
paquete. La biblioteca y declaraciones de uso están relacionadas a la subsiguiente
declaración de entidad. La biblioteca y declaraciones de uso tienen que ser repetidas para
cada declaración de entidad.
Uno tiene que incluir la biblioteca y cláusula de uso para cada entidad como se muestra
para el ejemplo del sumador de cuatro pedacitos arriba.

4. Los elementos léxicos de VHDL


uno. Los identificadores
Los identificadores son palabras creadas por el usuario usadas para nombrar objetos en los
modelos VHDL. Hemos visto ejemplos de identificadores para el aporte y las señales de
salida así como también el nombre de un el cuerpo de diseño de entidad y de arquitectura.
Al escoger un identificador necesita seguir estas reglas básicas:
· pueden contener sólo caracteres numéricos en alfa (Uno para Z, uno para z, 0-9) y el
carácter de la línea subrayada (_ )
· el primer carácter debe ser una carta y lo último no puede ser una línea subrayada.
· un identificador no puede incluir dos líneas subrayadas consecutivas.
· un identificador es caso insensible (el equis. And2 y AND2 o and2 se refiere al mismo
objeto)
· un identificador puede ser de cualquier longitud.
Los ejemplos de identificadores válidos son: X10, letra x _ 10, Mi _ gate1.
Algunos identificadores inválidos son: _X10, mi @ inputmailto de la _ portilla, el aporte de
portilla
Los anteriormente citados identificadores son identificadores básicos designados. Las
reglas para estos identificadores básicos son a menudo demasiadas restrictivas a indicar
señales. Por ejemplo, si se desea para indicar una señal baja en ejecución como una
REANUDACIÓN de punto bajo en ejecución, uno no le puede llamar / REANUDACIÓN.
Para vencer estas limitaciones, allí es un set de reglas extendidas de identificador que
consienten identificadores con cualquier secuencia de personajes.
· un identificador extendido está adjunto por la barra inversa,, el carácter.
· un identificador extendido es caso sensitivo.
· un identificador extendido es diferente a las palabras confidenciales (las palabras claves) o
cualquier identificador básico (por ejemplo la \ identidad de identificador es admitida)
· dentro de las dos barras inversas uno puede usar cualquier carácter en cualquier orden,
excepto que una barra inversa como parte de un identificador extendido debe estar indicada
por una barra inversa adicional. Por poner un ejemplo, para usar el identificador BUS:\data,
uno escribe: \El BUS:\data\
· los identificadores extendidos son dejados entrar en la versión VHDL-93 pero no en
VHDL-87
Algunos ejemplos de identificadores legales son:
El aporte, \ el Aporte \, \input #1 \, \Rst \\ tan
b. Las palabras claves (las palabras Confidenciales)
Ciertos identificadores son usados por el sistema como las palabras claves para el uso
especial como las construcciones específicas. Estas palabras claves no pueden ser utilizadas
como identificadores para señales u objetos que definimos. Hemos visto varios de estas
palabras confidenciales ya como adentro, fuera de, o, y, ponga a babor, haga mapas, acabe,
etc. Las palabras claves están a menudo impresas en letra negra, como está cansado al
extremo este manual de instrucción. Para una lista de todas las palabras claves da un clic
sobre lista completa de palabra clave. Los identificadores extendidos pueden hacer uso de
palabras claves desde que éstas son consideradas palabras diferentes (por ejemplo el \ fin
extendido de identificador es admitido.
c. Los números
La representación predeterminada de número es el sistema decimal. VHDL consiente
literals de entero y literals verdaderos. Los literals de entero constan de números enteros sin
un punto decimal, mientras los literals verdaderos siempre incluyen un punto decimal. La
notación exponencial es admitida usando la carta "E" o "e". Para literals de entero el
exponente siempre debe ser positivo. Los ejemplos son:
Los literals de entero: 12 10 256E3 12e +6
Los literals verdaderos: 1.2 256.24 3.14E-2
El número _ 12 es una combinación de un operador de negación y un entero literal.
Para expresar un número en una base desemejante de los usos de base "10", un la siguiente
convención: Base a #number #. Algunos ejemplos siguen.
Base 2: 2 #10010 # (representando el decimal número "18")
Base 16: 16 #12 #
Base 8: 8 #22 #
Base 2: 2 #11101 # (representando el decimal número "29")
Base 16: 16 #1D #
Base 8: 8 #35 #
Para hacer la legibilidad de números grandes más fácil, uno puede insertar líneas
subrayadas en los números con tal de que la línea subrayada no sea usada al comienzo o el
fin.
2 #1001_1101_1100_0010 #
El 215_123
d. Los Personajes , las Cuerdas y las Cadenas de Bits
Para usar un carácter literal en un código VHDL, uno lo mete en una comilla sola, como se
muestra en los ejemplos debajo:
_ una _, _ B _, _,
Por otra parte, una cadena de caracteres son comillas dobles colocadas como se muestra en
los siguientes ejemplos:
"Ésta es una cuerda",
"Para usar una" comilla "doble dentro de una cuerda, use dos" comillas "dobles"
"Ésta es una Cuerda" ""
Cualquier carácter del estampado puede ser incluido interior una cuerda.
Una cadena de bits representa una secuencia de valores mordidos. Para señalar que esto es
una cadena de bits, uno pone adelante la _ B de la cuerda: B "1001". Uno también puede
usar cuerdas en el hexagonal u octal bajo usando la Letra X o la O specifiers,
respectivamente. Algunos ejemplos son:
Binario: B "1100_1001", b "1001011"
Hexagonal: X"C9 ", Letra X" 4b "
Octal: La O "311", oh "113"
Note eso en el sistema hexadecimal, cada dígito representa exactamente 4 pedacitos. Como
consecuencia, la número b "1001011" no equivale a la Letra X "4b" desde lo anterior tiene
sólo 7 pedacitos mientras lo más reciente representa una secuencia 8 pedacitos. Por la
misma razón, la O "113" (representa 9 pedacitos) no es la misma secuencia como Letra X
"4b" (representa 8 pedacitos).

5. Los Objetos de Datos: Las Señales, las


Variables y las Constantes
Un objeto de datos es creado por una declaración del objeto y tiene un valor y el tipo se
asoció con él. Un objeto puede ser una Variable Constante,, Señal o un Archivo. Hasta
ahora hemos visto las señales que fueron utilizadas como aporte o las terminales de salida o
las redes internas. Las señales pueden ser consideradas alambres en uno esquemático ese
pueden tener que un valor corriente y valores futuros, y eso están en función de las
declaraciones de asignación de la señal. Por otra parte, las Variables y las Constantes se
usan para modelar el comportamiento de un circuito y son usadas en procesos,
procedimientos y funciones, de modo semejante como estarían en un lenguaje de
programación. El grupo de seguidores es un debate breve de cada clase de objetos.

la constante
Una constante puede tener un valor del soltero de un tipo dado y no puede variarse durante
la simulación. Una constante es declarada como sigue,
La constante lista _ de _ nombre _ de _ constante: Escriba [: = initial value ];
Donde el valor inicial es optativo. Las constantes pueden ser declaradas en el principio de
una arquitectura y luego pueden ser usadas dondequiera dentro de la arquitectura. Las
constantes declaradas dentro de un proceso sólo pueden ser interior usado que el proceso
específico.
RISE_FALL_TME constante: El tiempo:= 2 ns;
El constante DELAY1: El tiempo:= 4 ns;
RISE_TIME constante, FALL_TIME: El tiempo:= 1 ns;
DATA_BUS constante: El entero:= 16;

la variable
Una variable puede tener un valor del soltero, como con una constante, pero una variable
puede estar actualizada usando una declaración variable de asignación. La variable está
actualizada sin cualquier retraso tan pronto como la declaración sea ejecutada. Las
variables deben ser declaradas dentro de un proceso (y es local para el proceso). La
declaración variable es como sigue:
La lista variable _ de _ nombres _ variables: Escriba [: = initial value ];
Algunos ejemplos siguen:
CNTR_BITE variable: El pedacito:=0;
El VAR1 variable: El boolean:=FALSO;
La SUMA variable: El rango de entero 0 para 256:=16;
STS_BITE variable: _ el vector mordido (7 downto 0);
La SUMA variable, en el ejemplo arriba, es un entero que tiene un rango de 0 para 256 con
valor inicial de 16 en el principio de la simulación. El cuarto ejemplo define un vector
mordido o 8 elementos: STS_BITE (7), STS_BITE (6), ⁙†STS_BITE (0).
Una variable puede estar actualizada usando una declaración variable de asignación tan
_ el nombre variable:= La expresión;
Tan pronto como la expresión es ejecutada, la variable está actualizada sin cualquier
retraso.

la señal
Las señales son declaradas fuera del proceso usando la siguiente declaración:
La lista de la señal _ de _ nombres de la _ señal: Escriba [: = initial value ];
La SUMA de la señal, el ARRASTRE: _ la lógica del std;
El RELOJ de la señal: El pedacito;
El GATILLO de la señal: El entero:=0;
La señal DATA_BUS: _ el vector mordido (0 para 7);
El VALOR de la señal: El rango de entero 0 para 100;
Las señales están actualizadas cuando su declaración de asignación de la señal es ejecutada,
después de un cierto retraso, tan ilustrado debajo,
SUME < = (Un xor B) después de 2 ns;
Si ningún retraso es especificado, la señal estará actualizada después de un retraso del
delta. Uno también puede especificar formas de onda múltiples usando acontecimientos
múltiples tan ilustrado debajo,
El wavefrm de la señal: _ la lógica del std;
Wavefrm < = _ 0 _, _ 1 _ después de 5ns, _ 0 _ después de 10ns, _ 1 _ después de 20 ns;
Es importante para entender la diferencia entre las variables y hace señales, en particular
cómo tiene relación para cuando sus cambios de valor. Una variable cambia
instantáneamente cuando la asignación variable es ejecutada. Por otra parte, una señal
cambia un retraso después de que la expresión de asignación sea evaluada. Si ningún
retraso es especificado, la señal cambiará después de un retraso del delta. Esto tiene
consecuencias importantes para los valores actualizados de variables y hace señales. Los
alquileres comparan los dos archivos en los cuales un proceso se usa para calcular el
RESULTADO de la señal 7 .

El ejemplo de un proceso usando a Variables


El volt-ampere reactivo de arquitectura de EJEMPLO es
El GATILLO de la señal, el RESULTADO: El entero:= 0;
Comience
El proceso
El variable1 variable: El entero:=1;
El variable2 variable: El entero:=2;
El variable3 variable: El entero:=3;
Comience
Espere en GATILLO;
El variable1:= El variable2;
El variable2:= Variable1 + variable3;
El variable3:= El variable2;
El RESULTADO variable1 + variable2 + variable3;
El proceso de fin;
El volt-ampere reactivo de fin

El ejemplo de un proceso usando a Signals


El SIGNO de arquitectura de EJEMPLO es
El GATILLO de la señal, el RESULTADO: El entero:= 0;
El signal1 de la señal: El entero:=1;
El signal2 de la señal: El entero:=2;
El signal3 de la señal: El entero:=3;
Comience
El proceso
Comience
Espere en GATILLO;
Signal1 signal2;
Signal2 signal1 + signal3;
Signal3 signal2;
El RESULTADO signal1 + signal2 + signal3;
El proceso de fin;
El SIGNO de fin;

En el primer caso, las variables "variable1, variable2 y variable3" son computados


secuencialmente y sus valores actualizados instantáneamente después de que el GATILLO
hagan señales llega. Después, el RESULT, cuál es una señal, es computada usando los
valores nuevos de las variables y actualizado un delta de tiempo después de que el
GATILLO llega. Esto da como resultado los siguientes valores (después de un GATILLO
de tiempo): Variable1 = 2, variable2 = 5 (= 2 +3), variable3 = 5. Desde que el
RESULTADO es una señal será computada a la hora que PROVOCARÁ y se pondrá al
corriente a la hora que PROVOCARÁ Delta del +. Su valor será RESULTADO = 12.
Por otra parte, en el segundo ejemplo, las señales serán computadas a la hora que SE
ACCIONARÁN. Todo estas señales son computadas al mismo tiempo, usando los valores
viejos de signal1, 2 y 3. Todas las señales estarán actualizadas en el tiempo del Delta
después de que el GATILLO haya llegado. Así las señales tendrán estos valores: Signal1 =
2, signal2 = 4 (= 1 +3), signal3=2 y RESULTADO = 6.

6. Los tipos de datos


Cada datos objetan tiene un tipo asociado con él. El tipo define el set de valores que el
objeto puede tener y el set de operaciones que se le permitió en eso. La noción de tipo es
llave para VHDL desde que sea un idioma fuertemente escrito que requiere que cada objeto
sea de un cierto tipo. En general uno no tiene permiso de asignarle un valor de un tipo a un
objeto de otro tipo de datos (por ejemplo asignándole un entero a un tipo mordido no es
admitido). Hay cuatro clases de tipos de datos: Scalar, mezcla, acceso y tipos del archivo.
Los tipos del scalar representan un valor solo y son ordenados a fin de que las operaciones
de relaciones pueden ser realizadas en ellos. El tipo del scalar incluye entero, tipos
verdaderos, y enumerados de Boolean y el Carácter. Los ejemplos de estos serán dados más
adelante.
uno. Los tipos de datos definidos en el Paquete Estándar
VHDL tiene varios tipos predefinidos en el paquete estándar como se muestra en la mesa
debajo. Usar este paquete un tiene que incluir la siguiente cláusula:
La biblioteca std, trabajo;
[Link] de uso;

Mecanografía definido en el Paquete Estándar del std Library


Mecanografíe El rango de valores El ejemplo
bit ‘0’, ‘1’ A de la señal: El bit:=1;

bit_vector Un conjunto imponente con La señal INBUS: _ el vector


cada elemento de tipo bit
bit (7 downto 0);
boolean TRUE FALSO La PRUEBA variable:
Boolean:=FALSO
character Cualquier carácter legal (vea VAL variable: El carácter:=_El
estándar del paquete) VHDL; $;
Los personajes imprimibles
deben ser colocados entre
citas solas (e.g. _# _ )
file_open_kind* Lea _ el modo, escriba _
modo, anexe _ modo
file_open_status*
Abra al público _ error de _
visto bueno, de estatus de _
error, de nombre de _ error,
de modo

integer El rango es implementación El constante CONST1: El


dependiente pero incluye al
entero:=129;
menos _ (231- _ 1) a + (231 _
-1)
natural El entero comenzando con 0 El VAR1 variable: La nota
hasta lo llegue al límite natural:=2;
especificado en la
implementación

positive El entero a partir de 1 arriba El VAR2 variable: El


de lo llegue al límite
positivo:=2;
especificado en la
implementación
real* El número flotante del punto El VAR3 variable:
en el rango de _ 1.0 la letra x Realmente:=+64.2E12;
1038 para +1.0x 1038 (puede
ser dependiente de
implementación. Sin apoyo
por el programa de síntesis de
la Fundación.
severity_level La nota, la advertencia, el
error, el fracaso
string Forme en orden del cual cada El VAR4 variable: La cuerda (1
elemento es del carácter de para 12):= "$ #ABC * () _ %Z";
tipo
time* Un número entero del cual el El RETRASO variable: El
rango es implementación
tiempo:=5 ns;
definida; Las unidades pueden
ser expresadas en sec, ms, en
nosotros, ns, ps, fs, min y hr..
Sin apoyo por el programa de
síntesis de la Fundación
El * Sin Apoyo por el programa de síntesis de la Fundación

b. Los tipos creados por el usuario


Uno puede introducir tipos nuevos usando la declaración de tipo, lo cual nombra el tipo y
especifica su rango de valor. La sintaxis es
El identificador de tipo es _ definición de tipo;
Aquí hay algunos ejemplos de definiciones de tipo,

los tipos de datos de números enteros


_ el int de la parte pequeña de tipo es rango 0 para 1024;
Escriba mi _ longitud de _ palabra es rango 31 downto 0;
El subtipo que los datos _ expresan es mi rango de _ longitud de _ palabra 7 downto 0;
Un subtipo es un subconjunto de un tipo previamente definido. El último ejemplo de arriba
ilustra el uso de subtipos. Define un tipo designado _ la palabra de datos que es un sybtype
de mi _ longitud de _ palabra de la cual el rango está restringido de 7 para 0. Otro ejemplo
de un subtipo es,
_ la parte pequeña del int de subtipo es rango de entero - 1024 para +1024;

La coma flotante mecanografía


Escriba _ nivel de cmos es rango 0.0 para 3.3;
Escriba _ nivel de pmos es rango - 5.0 para 0.0;
La probabilidad de tipo es rango 0.0 para 1.0;
_ la V de _ punto bajo de cmos de subtipo es rango del _ nivel de cmos 0.0 para +1.8;
Reparo en que los tipos flotantes de datos del punto no son soportados por el programa de
síntesis Xilinx Foundation.

el reconocimiento médico mecanografía


La definición física de tipo incluye un identificador de unidades como sigue,
La conductancia de tipo es rango 0 para 2E-9
Las unidades
El mho;
Mmho 1E 3 el mho;
Umho 1E 6 el mho;
Nmho 1E 9 el mho;
Pmho 1E 12 el mho;
La conductancia de unidades de fin;
Aquí hay algunas declaraciones del objeto que usan los anteriormente citados tipos,
BUS_WIDTH variable: _ el int pequeño:=24;
La señal DATA_BUS: Mi _ longitud de _ palabra;
El VAR1 variable: Los cmos el rango del _ nivel 0.0 para 2.5;
LINE_COND constante: La conductancia:= 125 umho;
Echo de ver que un espacio debe quedarse antes del nombre de la unidad.
Los tipos físicos de datos no son soportados por el programa Expreso Xilinx Foundation de
síntesis.
Para usar lo nuestro escribe, necesitamos ya sea incluir la definición de tipo dentro de un
cuerpo de arquitectura o declarar el tipo en un paquete. Lo más reciente puede hacerse
como sigue pues un paquete llamó "mis _ tipos".
Empaquete mis _ tipos son
_ el int de la parte pequeña de tipo es rango 0 para 1024;
Escriba mi _ longitud de _ palabra es rango 31 downto 0;
El subtipo que los datos _ expresan es mi _ longitud de _ palabra es rango 7 downto 0;
Escriba _ nivel de cmos es rango 0.0 para 3.3;
La conductancia de tipo es rango 0 para 2E-9
Las unidades
El mho;
Mmho 1E 3 el mho;
Umho 1E 6 el mho;
Nmho 1E 9 el mho;
Pmho 1E 12 el mho;
La conductancia de unidades de fin;
El paquete de fin mis _ tipos;
c. Los Tipos Enumerados
Un tipo enumerado consta de listas de literals de carácter o los identificadores. El tipo
enumerado puede ser muy conveniente al escribir modelos en un nivel del extracto. La
sintaxis para un tipo enumerado es,
Escriba _ nombre de tipo es (la lista de identificador o el carácter literal);
Aquí hay algunos ejemplos,
Escriba mis _ 3values son (_ 0 _, _ 1 _, _ Z _ );
El tipo PC_OPER es (la carga, la tienda, añádase, funja como substituto, div, mult, shiftl,
shiftr);
El tipo _ que el dígito hexadecimal es (_ 0 _, _ 1 _, _ 2 _, _ 3 _, _ 4 _, _ 5 _, _ 6 _, _ 7 _, 8
_, _ 9 _, _ Una _, _ B _, _ C _, _ D _, _ E _, _ F _ );
El tipo _ que el tipo estatal es (S0, S1, S2, S3);
Los ejemplos de objetos que usan los anteriormente citados tipos:
El SIG1 de la señal: Mis _ 3values;
La unidad aritmética y lógica variable _ OP: Pc oper;
_ el dígito primero variable: _ el dígito hexadecimal:=_0;
El ESTADO de la señal: Indique _ tipo:=S2;
Si uno no le da un reset a la señal, la inicialización predeterminada es el elemento del
leftmost de la lista.
Los tipos enumerados tienen que estar definidos en el cuerpo de arquitectura o dentro de un
paquete como se muestra en la sección arriba.
Un ejemplo de un tipo enumerado que ha estado definido en la _ lógica del std _ que 1164
empaquetan es el tipo std ulogic, definido como sigue
El tipo STD_ULOGIC es (
_ U _, - uninitialized
_ la letra x _, - obteniendo a la fuerza incógnita
_ 0 _, - forzando 0
_ 1 _, - forzando 1
_ Z _, - la impedancia alta
_ W _, - la incógnita débil
_ L _, - débil 0
_ H. - Débil 1
_ - _ ); - Asuma cautela de la _ t
Para usar este tipo un tiene que incluir la cláusula antes de cada declaración de entidad.
El ieee de la biblioteca; _ [Link] de _ lógica del [Link] de uso;
Es posible que los conductores múltiples andan conduciendo una señal. En ese caso podrían
haber un conflicto y la señal de salida estaría indeterminada. Por ejemplo, las salidas de una
PUERTA AND y la PUERTA NO están conectadas conjuntamente en el OUT1 de la red de
salida. Para resolver el valor de la salida, uno puede evocar una función de resolución.
Éstas son usualmente una función escrita por usuario que separará en sus partes la señal. Si
la señal es del tipo std ulogic y tiene a los conductores múltiples, uno necesita usar una
función de resolución. La _ lógica del std _ 1164 el paquete hace tal resolución funcionar,
designado RESUELTO predefinido. Uno luego puede destinar la siguiente declaración para
OUT1 de la señal
El OUT1 de la señal: Resuelto: Std ulogic;
Si hay argumentación, la función RESUELTA se usará para intermediar el conflicto y
titular la señal. Alternativamente, uno puede declarar la señal directamente como un tipo de
_ lógica del std desde la _ lógica del std de subtipo ha estado definido en la _ lógica del std
_ 1164 paquete.
El OUT1 de la señal: _ la lógica del std;
d. La Mezcla Determina el Tipo Sanguíneo: El Conjunto Imponente y el Registro
Los datos complejos de los que los objetos consisten de una colección relataron elementos
de datos en forma de un conjunto imponente o el registro. Antes de que podamos usar tales
objetos un tienen que declarar el tipo complejo primero.

El Tipo de Conjunto Imponente


Un tipo de conjunto imponente es declarado como sigue:
_ el nombre de conjunto imponente de tipo es conjunto imponente (indexando esquema)
de _ tipo del elemento;
El tipo MY_WORD es conjunto imponente (15 downto 0) de _ lógica del std;
El tipo YOUR_WORD es conjunto imponente (0 para 15) de _ lógica del std;
El volt-ampere reactivo de tipo es conjunto imponente (0 para 7) de entero;
_ el 1D de tipo STD_LOGIC es conjunto imponente (std _ ulogic) de _ lógica del std;
En los primeros dos ejemplos por encima de ha definido un orden lineal de elementos del
tipo _ que la lógica del std indexó de 15 hasta 0, y 0 hasta 15, respectivamente. El último
ejemplo define un orden lineal de los elementos de _ lógica del std de tipo que usa el tipo
std ulogic para definir la restricción del índice. Así de este personal del jurado mira como
sigue:
El índice: _U_ _X _ _ 0 _ _ 1 Z_ _W_ _L_ _H _ _ -
El elemento:
Nosotros ahora podemos declarar propósitos de estos tipos de datos. Algunos ejemplos son
dados
La señal MEM_ADDR: MI _ PALABRA;
La señal DATA_WORD: SU _ PALABRA:= B "1101100101010110";
El constante TRASFONDO: El volt-ampere reactivo:= (2,4,6,8,10,12,14,16);
En el primer ejemplo, la señal MEM_ADDR es un montón de 16 pedacitos, a la que se dio
un reset para todas las _ 0 _ s. Para acceder a los elementos individuales de un conjunto
imponente especificamos el índice. Por ejemplo, MEM_ACCR (15) accede al izquierdo la
mayoría de pedacito del conjunto imponente, mientras DATA_WORD (15) accede a lo
directamente más mordido del conjunto imponente con valor _ 0. Para acceder a un
subrango, uno especifica el rango del índice, MEM_ADDR (15 downto 8) o
DATA_WORD (0 para 7).
Las matrices multidimensionales pueden estar declaradas tan sanas usando una sintaxis
similar tan de arriba,
_ el MATRIX3X2 de tipo MY es conjunto imponente (1 para 3, 1 para 2) de nota
natural;
_ el MATRIX4X2 de tipo YOUR es conjunto imponente (1 para 4, 1 para 2) de entero;
_ el 2D de tipo STD_LOGIC es conjunto imponente (std _ ulogic, std _ ulogic) de _
lógica del std;
DATA_ARR variable: MI _ MATRIZ:=((0,2), (1,3), (4,6), (5,7));
El conjunto imponente variable DATA_ARR luego será inicializado,
02
13
46
57
Acceder a un elemento un especifica el índice, e.g. DATA_ARR (3,1) devuelve el valor 4.
El último ejemplo define un conjunto imponente del 9x9 o posponga con un índice que los
elementos del std ulogic escriben.
Algunas veces es más conveniente no especificar la dimensión del conjunto imponente
cuando el tipo de conjunto imponente es declarado. Éste es designado un tipo espontáneo
de conjunto imponente. La sintaxis para el conjunto imponente que la declaración es,
_ el nombre de conjunto imponente de tipo es conjunto imponente (escriba rango < > )
de _ tipo del elemento;
Algunos ejemplos son
La MATRIZ de tipo es conjunto imponente (el rango de entero < > ) de entero;
El tipo VECTOR_INT es conjunto imponente (el rango natural < > ) de entero;
El VECTOR2 de tipo es conjunto imponente (el rango natural < >, el rango natural < > )
de _ lógica del std;
El rango es ahora especificado cuando uno declara el propósito de conjunto imponente,
El MATRIX8 variable: La MATRIZ (2 downto - 8):= (3, 5, 1, 4, 7, 9, 12, 14, 20, 18);
El ARRAY3x2 variable: VECTOR2 (1 para 4, 1 para 3)):= ((_ 1 _, _ 0 _ ), (_ 0 _, _ - _ ),
(1, _ Z _ ));
Registre Tipo
Un segundo tipo complejo es el tipo de registros. Un registro consta de elementos múltiples
que pueden ser de tipos diferentes. La sintaxis para un tipo sin precedente es lo siguiente:
El nombre de tipo es
El registro
El identificador:_ la indicación de subtipo;
:
El identificador:_ la indicación de subtipo;
El registro de fin;
Por poner un ejemplo,
El tipo MY_MODULE es
El registro
_ EL TIEMPO DE SUBIDA:El tiempo;
_ EL TIEMPO DE CAÍDA: El tiempo;
El TAMAÑO: El rango de entero 0 para 200;
Los DATOS: _ el vector mordido (15 downto 0);
El registro de fin;
Dé señas de A, B: MI _ MÓDULO;
Acceder a los valores o asignar aprecia para registros, uno puede usar uno de los siguientes
métodos:
[Link] _ CRONOMETRE < = 5ns;
[Link] < = 120;
B< =A;
e. Escriba Conversiones
Desde que VHDL es un idioma fuertemente escrito un no puede asignar un valor de una
información mecanografíe para una señal de una información diferente mecanografíe. En
general, es preferido los mismos tipos de datos para las señales en un diseño, como _ la
lógica del std (en lugar de _ la lógica una mezcla de del std y el pedacito determina el tipo
sanguíneo). Algunas veces uno no puede evitar usar tipos diferentes. Para permitirle asignar
datos entre objetos de tipos diferentes, uno necesita convertir un tipo al otro.
Afortunadamente hay funciones disponibles en varios paquetes en la biblioteca del ieee,
como la _ lógica del std _ 1164 y los paquetes del _ arith de _ lógica del std. Por poner un
ejemplo, la _ lógica del std _ 1164 el paquete consiente las siguientes conversiones:

Las conversiones soportaron por _ la lógica del std _ 1164 paquete


Conversión Función
std_ulogic to bit to_bit(expression)
std_logic_vector to bit_vector to_bitvector(expression)

std_ulogic_vector to bit_vector to_bitvector(expression)

bit to std_ulogic To_StdULogic(expression)

bit_vector to std_logic_vector To_StdLogicVector(expression)

bit_vector to std_ulogic_vector To_StdUlogicVector(expression)

std_ulogic to std_logic_vector To_StdLogicVector(expression)

std_logic to std_ulogic_vector To_StdUlogicVector(expression)

La _ lógica del std del IEEE _ sin firmar y los paquetes del _ arith de _ lógica del std del
IEEE consienten conversiones adicionales tan de un entero para _ el vector de _ lógica del
std y viceversa.
Un ejemplo sigue.
_ el NAND2 del CUADRÁNGULO de entidad es
El puerto (Una, B: En _ el vector mordido (3 downto 0);
El out4: Fuera de _ el vector de _ lógica del std (3 downto 0));
_ el NAND2 del CUADRÁNGULO de fin;
La arquitectura conductista _ 2 de _ NAND2 del CUADRÁNGULO es
Comience
El out4 < = para _ StdLogicVector (Uno y B);
El fin conductista _ 2;
La expresión "A y B" que es del tipo _ vector mordido tiene que ser convertido a la _ lógica
del std de tipo _ vectorial para ser del mismo tipo como el out4 de señal de salida.
La sintaxis de una conversión de tipo es como sigue:
Escriba _ nombre (la expresión);
Para que la para conversión sea legal, la expresión debe devolver un tipo que puede
convertirse en el _ nombre de tipo de tipo. Aquí están las condiciones que deben cumplirse
que la conversión sea posible.
· las conversiones de tipo entre los tipos de datos de números enteros o entre los tipos
similares de conjunto imponente son posibles
· la conversión entre los tipos de conjunto imponente es posible si tienen la misma longitud
y si tienen tipos idénticos del elemento o el elemento convertible determina el tipo
sanguíneo.
· los tipos enumerados no pueden convertirse.
f. Los atributos
VHDL soporta 5 tipos de atributos. Los atributos predefinidos están todo el tiempo
aplicados a un prefijo como un nombre de la señal, nombre variable o un tipo. Los atributos
se usan para devolver tipos diversos de información acerca de una señal, variable o
mecanografiar. Los atributos constan de una marca de cita (_ ) seguida por el nombre del
atributo.

los atributos de la señal


La siguiente mesa da varios atributos de la señal.

Atributo Funcion
signal_name’event Devuelve el valor Boolean True si un
acontecimiento en la señal ocurrió, de otra
manera le da un False

signal_name’active Regresos el valor Boolean True allí ha sido


una transacción (la asignación) en la señal,
de otra manera le da a un False

signal_name’transaction Regresos una señal del tipo "pedacito" que


alterna el interruptor de un estado a otro (0
para 1 o 1 para 0) cada vez que hay una
transacción en la señal.

signal_name’last_event Los regresos el espacio de tiempo desde el


último acontecimiento en la señal
signal_name’last_active Los regresos el espacio de tiempo desde la
última transacción en la señal
signal_name’last_value Da que el valor de la señal antes del último
acontecimiento ocurrió en la señal
signal_name’delayed(T) gives a signal that is the delayed version (by
time T) of the original one. [T is optional,
default T=0]

signal_name’stable(T) Devuelve un valor Boolean, Verdadero, si


ningún acontecimiento ha ocurrido en la
señal durante el intervalo T, de otra manera
regresos un False. T is optional, default T =
0
signal_name’quiet(T) returns a Boolean value, True, if no
transaction has occurred on the signal
during the interval T, otherwise returns a
False. [T is optional, default T=0]

Un ejemplo de un atributo es
Si (_ el acontecimiento del RELOJ y RELOJ = _ 1 _ ) luego
Estos cheques de expresión para la llegada de un reloj del positivo avanzan ligeramente.
Enterarse cuánto el tiempo ha pasado desde el último borde del reloj, uno puede usar el
siguiente atributo:
CRONOMETRE _ último _ acontecimiento

los atributos Scalar


Varios atributos de un tipo del scalar, scalar-type, son soportados. La siguiente mesa
demuestra una cierta cantidad de estos atributos.
Atributo Valor
_ el tipo del scalar _ a la izquierda Devuelve la primera parte o el valor leftmost de
scalar-type en su rango definido
_ el derecho de _ tipo del scalar Devuelve lo último o valor de la extrema
derecha de scalar-type en su rango definido
_ el punto bajo de _ tipo del scalar Devuelve el valor mínimo de scalar-type en su
rango definido
_ el alto de _ tipo del scalar

Devuelve el máximo valor de scalar-type en


su rango definido
_ el tipo del scalar _ ascendiendo La verdadera si la T es un rango ascendiente, de
otra manera False
_ el valor de _ tipo del scalar (s) Devuelve el valor en T que es representada por
s (las posiciones s para cuerda aprecian).

Aquí hay algunos ejemplos.


La conductancia de tipo es rango 1E-6 para 1E3
El mho de unidades;
La conductancia de unidades de fin;
Escriba mi _ índice es rango 3 para 15;
Escriba mis _ niveles son (muja, alto, dontcare, highZ);
La conductancia _ el derecho regresa: El 1E3
El 1E3 de _ alto de conductancia
_ el punto bajo de conductancia 1E-6
Mi _ índice _ dejó 3
Mi _ valor del _ índice (5) "5"
Mis _ niveles _ dejaron punto bajo
Mis _ niveles _ mugen punto bajo
Mi highZ de _ alto de _ niveles
Mis _ niveles _ aprecian a (dontcare) "dontcare"

los atributos de conjunto imponente


Por el conjunto imponente utilizador atribuye uno puede devolver un valor del índice
correspondiente al rango de conjunto imponente.
Los siguientes atributos son soportados.

Atributos Los regresos


La MATRIZ _ a la izquierda (N) El índice la mayoría de en la izquierda del
_ el derecho MATRICIAL (N) elemento
_ el alto MATRICIAL (N) El índice que se endereza más
_ el punto bajo MATRICIAL (N) El salto superior
_ la longitud MATRICIAL (N) Aminore salto
_ el rango MATRICIAL (N) El número de elementos
_ el rango _ inverso MATRICIAL (N) El rango
La MATRIZ _ ascendiendo (N) Ponga al revés rango
Un valor Boolean TRUE si el índice fuera
un rango ascendiente, de otra manera
FALSE

La N de número entre paréntesis se refiere a la dimensión. Para un orden lineal, uno puede
omitir la N de número como se muestra en los ejemplos debajo. Los alquileres asumen los
siguientes conjuntos imponentes, declararon como sigue:
El MYARR8x4 de tipo es conjunto imponente (8 downto 1, 0 para 3) de boolean;
El MYARR1 de tipo es conjunto imponente (- 2 para 4) de entero;
_ la izquierda del MYARR1 regresa: - 2
_ el derecho del MYARR1 4
_ el alto del MYARR1 4
_ el rango del _ reverso del MYARR1 4 downto para - 2
El MYARR8x4 _ dejó (1) 8
El MYARR8x4 _ dejó (2) 0
_ el derecho del MYARR8x4 (2) 3
_ el alto del MYARR8x4 (1) 8
_ el punto bajo del MYARR8x4 (1) 1
El MYARR8x4 _ ascendiendo a (1) False

7. Los operadores
VHDL soporta clases diferentes de operadores que intervienen quirúrgicamente señales,
variables y constantes. Las clases diferentes de operadores están resumidas debajo.

Clase
1. Los operadores lógicos and or nand nor xor xnor
= /= < <= > >=
2. Los operadores relacionales

sll srl sla sra rol ror


3. Cambie de posición a los
operadores

+ = &
4. Los operadores de Addición

5. Los operadores unarios + -

6. Multiplicando op. * / mod Rem


7. Op. misceláneo ** abs not

El orden de precedencia es lo más alto para los operadores de clase 7, seguida por la clase 6
con la precedencia mínima para la clase 1. A menos que los paréntesis son usados, los
operadores con la precedencia más alta son primeros aplicados. Los operadores de la misma
clase tienen la misma precedencia y son aplicados de izquierda a derecha en una expresión.
Por poner un ejemplo, considere a los siguientes _ vectores std ulogic, Letra X (= _ 010 _ ),
Y (= _ 10 _ ), y Z (_ 10101 _ ). La expresión
No la Letra X y Y xor Z rol 1
Es equivalentes para ((no la Letra X) y Y) xor (Z rol 1) = ((101) y 10) xor (01011) =
(10110) xor (01011) = 11101. El xor es ejecutado en un pedacito por base mordida.
uno. Los operadores lógicos
Los operadores lógicos (y, o, nand, ni, xor y xnor) están definidos para el "pedacito",
"boolean", _ "lógica std" y "std ulogic" mecanografía y sus vectores. Están acostumbrados
a definir expresión lógica Boolean o actuar pedacito por operaciones mordidas forma en
orden de pedacitos. Dan un resultado del mismo tipo como el operando (el Pedacito o
Boolean). Estos operadores pueden ser aplicados a señales, variables y constantes.

Note ese el nand y ni los operadores no son asociativos. Uno debería usar paréntesis en una
secuencia de nand o ni los operadores para impedir un error de sintaxis:

La letra x nand Y nand Z dará un error de sintaxis y debería ser escrita como (la Letra X
nand Y) nand Z.
b. los operadores de relaciones
Los operadores relacionales prueban los valores relativos de dos tipos del scalar y dan
como el resultado una salida Boolean de "TRUE" o "FALSE".

También podría gustarte