Others, soporte para síntesis.

 Los agregados tienen la habilidad
de usar la sentencia others, la signal Z_BUS: bit_vector (3 downto 0);
cual asignará un valor a todos los signal A,B,C,D: bit;
otros elementos de un arreglo que signal BYTE:bit_vector(7 downto 0);
no han sido especificados.
Finalmente, no todas las X<= (3=>’1’, 1 =>’0’, others=>B)
herramientas de síntesis soportan
el uso de agregados, por lo que
puede ser necesario usar
concatenación para realizar
manipulaciones sobre arreglos.

Necesidad de mas que el “0” y el “1”
 El tipo bit tiene unas limitaciones, puede solo representar el 0 y el 1. En
simulación puede ser útil el poder representar otros valores, por ejemplo:
desconocido, no inicializado, alta impedancia. Mientras para la síntesis
puede ser útil representar una condición: don’t care
Unknown El valor era conocido pero ya no lo es. A menudo denota
dos compuertas manejando el mismo nodo de salida, con
conflicto entre valores.
Un-initialised El valor nunca fue conocido (prepower-up)
High Impedance La red no tiene driver

Drive strengths Maneja diferentes drivers de salida

Don’t care Implementación en sintesis. No estamos interesados en el
comportamiento de la entrada/salida, la salida no esta
siendo monitoreada bajo ciertas condiciones de entrada o
ciertas condiciones de entrada que nunca se espera que
ocurran

Lógica de valores múltiples
 La idea de una lógica de valores múltiples, o un sistema LVM
lleva un tipo de señal enumerado definido por todos los valores,
junto con un grupo de funciones que realizan operaciones
lógicas tales como: AND y OR sobre objetos de ese tipo.

Logic 0 Logic 1 Unknown
“0” “1” “X”

Don’t care Un-initialised High impedance
“-” “U” “Z”

Compuerta inversora NMOS Estática VDD 0 1 ? c Output c 1 input 0 .

Compuerta inversora NMOS Estática VDD VDD RONPU Output=Vdd ROFFP H =H Input=L ROFFPD + RONPU ROFFPD VDD RONPU Output=Vdd RONPD L =L Input=H RONPD + RONPU RONPD .

Compuerta inversora NMOS Estática 0 1 0 1 VDD 0 c Output c input .

2 CONSTANTES: permiten definir valores permanentes 3 VARIABLES: utilizados solamente dentro de los procesos(instrucciones secuénciales).OBJETOS MANIPULABLES  Los objetos que se pueden manipular en VHDL son: 1 SEÑALES: Los “ports” declarados dentro de una entidad son señales. 4 ARCHIVOS (FICHEROS) .

.14159. CONST pi: REAL:=3. VARIABLE var1:BIT. variables y señales es: Tipo_de_Objeto Nombre_de_Objeto Tipo_de_Dato:=Valor Inicial Por ejemplo: SIGNAL nodno1: BIT:='1'. Declaraciòn de Objetos La formula de declaraciòn de constantes.

Señales  Son objetos que permiten simular la interconexión de componentes dentro de la arquitectura de diseño. .  Permiten representar entradas o salidas de entidades.

Señales  X0 y x1 no tienen asignada una terminal en la entidad de diseño (funcionan como un medio de interconexión). .

} : tipo [:= expresion ].}] Signal Reloj : std _logic :='0'.} : direccion tipo [:= expresion]. port ( { id {. d : inout std_logic ). . c : out integer range 0 to 7. Sintaxis general de una señal signal id {... signal Comparacion: bit. ..b : in integer range 0 to 7.. port ( a.. signal Resultado : integer range 0 to 7.

Ejemplo: signal vcc: bit: ´1´.Señales  Forma de declarar una señal: signal identificator: tipo: [rango]. signal suma: bit_vector: (3 downto 0). .

el valor es inicializado al valor mas bajo del tipo de variable definido. en una arquitectura o en un paquete.Señales  las señales pueden declararse en una entidad.  si se quiere inicializar una señal hay que indicar un valor en [:=expression]  por ejemplo: signal s: bit:='1'. .  de otra manera.

 Vectorial: signal name(s): array_type[index_constraint] [:=expression]. .Señales  Escalar: signal name(s):=type [range_contraint] [:=expression].  Entidad: port (name(s): direction type [range_constraint] [:=expression]).

 signal bogus: bit_vector.  signal YS_BUS std_logic_vector (7 downto 0). (Errónea. no hay dimensión) .  port (B. (el valor inicial será 1)  signal GROUND: BIT:='0'.A: in integer range 0 to 9).Señales Ejemplos:  signal count: integer range 1 to 50.

el cual consta de una colección de parejas (tuplas) valor/tiempo llamadas transacciones.Driver de señal • Un conductor (driver) para una señal se define por el proceso que asigna valores a la señal. • Los valores que viajan por los caminos de datos en un tiempo dado están contenidos en dicho conductor. .

 Una asignación concurrente de señal dentro de una arquitectura produce un “conductor” para cada asignación de señal. Asignaciones múltiples producirán “conductores” múltiples de señal. .Asignación múltiple o concurrente  Los “conductores” son creados por sentencias de asignación de señales.

a <= c AFTER 10 ns . END t1.Creación de un driver ARCHITECTURE t1 OF d1 IS BEGIN a <= b AFTER 10 ns . .

b y c. esto no es admitido a menos que se defina una función de resolución (resolved signals).  La forma en que esto se resuelve queda a cargo del diseñador. .Función de resolución  La señal ´”a” está siendo manejada por dos fuentes.  Cada asignación concurrente creará un conductor para la señal a.

S´LAST_EVENT Retorna el tiempo transcurrido desde la transición previa de la señal S. S´LAST_VALUE Retorna el valor previo de S antes del último evento. S´ACTIVE Retorna verdadero si ocurrió una transición en S durante el corriente delta. S´LAST_ACTIVE Retorna el tiempo transcurrido desde la transacción previa de la señal. else falso. de lo contrario devuelve falso.Atributos función de las señales S´EVENT Retorna verdadero si ocurrió un evento en S durante el corriente delta. .

Signal TWO_BIT: bit_vector (0 to 1). STATE<=TWO_BIT. … STATE<=RESET. . podemos definir señales de este tipo. IDLE.Señales de tipo definido  Habiendo definido el tipo. INT_CYCLE). STATE<=“00”. Debemos observar las reglas estrictas cuando usemos estas señales: no podemos asignar nada a la señal STATE que no sea del tipo MY_STATE type MY_SATE is (RESET. RW_CYCLE. Aquí hemos declarado la señal STATE de tipo MY_STATE. … Signal STATE: MY_STATE.

. CONSTANTES Una constante es un objeto que se inicializa a un determinado valor y no puede ser cambiado una vez inicializado. . Sintaxis general de una constante constant id {...} : tipo [:= expresion].

constant BitsPalabra : integer :=8.1415. RetardoOR2 : time := 2 ns . constant NumBits : integer :=BitsPalabras * NumPalabras. Ejemplos Constant Pi: real : =3. constant RetardoAND2 . constant NumPalabras : integer :=64.

VARIABLES

Una variable es un objeto que se inicializa a un
determinado valor y a diferencia de una constante
su valor puede ser alterado en cualquier instante.

Sintaxis general de una variable

variable id {,....} : tipo [expresion];

Ejemplos

Variable Indice1, Indice2, Indice3 : integer := 0;
variable Comparacion : boolean;
variable Resultado : real;

ARCHIVOS (FICHEROS)

Permiten comunicar un diseño VHDL con el exterior, el modelo
lee y escribe datos persistentes.

En el paquete texti o de la biblioteca standar hay
tipos de datos y operaciones de lectura/escritura de archivos de
texto.

VHDL soporta subprogramas para leer y escribir
archivos en forma secuencial.

file Salida : FicheroEnteros open write_mode id “datos...] file id {. Sintaxis general de un archivo file id {... ..} : tipo [is direcciòn “nombre” .} : tipo [ [ open tipo_acceso] is “nombre”..] Ejemplos file Estimulos : FicheroEnteros open read_mode is “datos.out”...in”.

por medio de una sentencia de Asignación de señal.  Se pueden tener multilples drivers.  Una Asignación a una señal define un driver sobre esa señal.ASIGNACION DE UN VALOR  A una señal se le asigna un valor. . en VHDL.

DEFINICION DE PUERTOS Señales que relacionan una entidad con otra .

puertod: buffer bit. puertoe:inout std_logic.Forma genérica de designar un puerto nombre_variable: modo tipo. puertoc: out bit_vector(3 downto 0). . puertob: in bit_vector(0 to 7). Ejemplos: puertoa: in bit.

si necesitamos que por el mismo puerto fluya información tanto hacia dentro como hacia afuera de la entidad. Modo de Puerto in  Un puerto es de modo in si la información correspondiente al mismo. Una aplicación muy común de este modo es la de salida de un contador. out  Un puerto es de modo out si la información fluye hacia fuera de la entidad. es decir. inout Es usado para señales bidireccionales. Este modo permite la realimentación interna y puede reemplazar a cualquiera de los modos anteriores. ya que debemos saber la salida en el momento actual para determinar la salida en el momento siguiente. entra a la entidad y se suele usar para relojes. . entradas de control (como las típicas load. Este modo no permite realimentación ya que al declarar un puerto como out estamos indicando al compilador que el estado lógico en el que se encuentra no es leíble. pero además. reset y enable). pudiéndose usar este modo para todos los puertos. y solo puede ser conectado directamente a una señal interna. permite la realimentación y no es bidireccional. y para datos de entrada unidireccionales. o a un puerto de modo buffer de otra entidad. buffer  Este modo es similar al modo out.

ya que según pongamos la palabra reservada downto o to estaremos diciendo que el bit más significativo es el número más alto o el más bajo del vector. debido a que está prácticamente creado para la simulación. Hay que advertir que el uso de enteros consume muchos recursos del dispositivo de lógica programable. Un ejemplo típico es la salida de un comparador que da verdadero si los números comparados son iguales y falso si no lo son bit Puede tomar dos valores: 0 ó 1 ( o también "low" o "high". numero : bit_vector (7 downto 0). Debemos tener cuidado al definir el peso de los bits que lo integran. integer Para mantenerr números enteros. Es el tipo más usado de los nativos bit_vector Es un vector de bits. . según se prefiera). siempre y cuando sea sintetizable. respectivamente. numero : bit_vector (0 to 7).. Tipos Nativos para VHDL boolean Puede tomar dos valores: verdadero/true o falso/false.

• Definir un modelo de comportamiento sintetizable (ARCHITECTURE) Usando el juego de instrucciones soportado por las herramientas de sín architecture archpro of programa is -. Para describir una arquitectura podremos usar cuatro estilos Estilo behavioral Estilo dataflow Estilo structural Estilo mixto .Declaración de señales y otros accesorios Begin -.Núcleo del programa End archpro.

). end behavioral. end dataflow2.Estilo behavioral Estilo dataflow entity compa is architecture dataflow1 of compa is port ( begin a. igual: out bit end dataflow1.    igual<='1' when (a=b) else '0'. architecture dataflow2 of compa is architecture behavioral of compa is begin begin    igual<= not(a(0) xor b(0)) comp: process (a.b: in bit_vector(3 downto 0). b)        and not(a(1) xor b(1))   begin        and not(a(2) xor b(2))    if a= b then        and not(a(3) xor b(3)). end compa.     igual<='1'. .    end if.    else     igual<='0'.   end process comp.

x(1)).x(2)). begin u0: xnor2 port map (a(0).b(2). End component.e2:in bit.e3.x(3)). u2: xnor2 port map (a(2).b(1). u3: xnor2 port map (a(3). u4: and4 port map (x(0). y:out bit). End component. u1: xnor2 port map (a(1). .igual).e4:in bit.e2. Component xnor2 Port (e1. end struct.x(2).x(1). y:out bit).x(3).b(3). Component and4 Port (e1.x(0)).b(0).Estilo structural Estilo mixto architecture struct of compa is signal x: bit_vector(0 to 3).

Estilo de Escritura RTL (Register Transfer Level) Netlist Describe los componentes que posee y las conexione entre ellos (Estilo Estructural) RTL Describe el comportamiento de cada entidad .

 Un tipo de dato se caracteriza por el conjunto de  valores que puede tomar y los operadores que  se le puede aplicar a un objeto.CONCEPTO DE TIPO DE DATO  Todos los objetos en VHDL son de un tipo dado. .

.  Cuando hacemos una asignación a una señal.TIPO  El tipo define un conjunto de valores y una asignación a esa señal debe ser un valor definido por ese conjunto. los tipos en ambos lados del operador de asignación de señal deben corresponder.

este.Declaraciòn de tipos de datos Sintaxis general type id is definiciòn_tipo. signal Direcciòn : Orientacion. type Orientacion is (norte. variable DiaHoy : DiaMes. . Uso constant DiasEnero : DiasMes :=31. Ejemplos type DiaMes is range 1 to 31 .sur. type Dela31 is range 1 to 31.oeste).

B : in bit. CARRY : out bit). Ejemplo:  Entity HALFADD is  port (A.  SUM.  los tipos en ambos lados del operador de  asignaciòn de señal deben corresponder.  end HALFADD. .Los tipos deben corresponder  Cuando hacemos una asignaciòn a una señal.

BIT.BIT_VECTOR  .CHARACTER  Enteros  INTEGER  Físicos  TIME  Flotantes  REAL  Compuestos  Arrays  STRING.Tipos predefinidos  Escalares  Enumerados  BOOLEAN.

• Otros Puntero ACCESS Archivos FILE .

.TIPO BOOLEAN Este tipo de dato puede tomar un valor falso o verdadero  TRUE  FALSO Cuando se comparan dos valores de tipo boolean el resultado también es de tipo boolean.

TIPO BIT El tipo BIT sirve para modelar niveles lógicos. ‘/=‘.or. ‘<=‘. ‘>=‘  Concatenación: & type bit is (‘0’. ‘1’) .nor.and.nand. ‘>’.xor y xnor  Comparación: ‘=‘. Conjunto de valores ‘0’ y ‘1’ Operaciones definidas sobre el:  Lógicas: not.’<‘.

‘A’ ‘b’ ‘x’ .TIPO CHARACTER Se utiliza para definir un solo carácter.

483. TIPO INTEGER Un tipo integer es un dato cuyo contenido es un valor numerico entero que esta dentro del siguiente rango : 2.647.147. Ejemplos +1 682 -139 +239 TYPE Integer IS 0 TO 255.647 a +2.483.147. TYPE index IS RANGE 7 DOWNTO 1. .

type time is orange -2147483647 to 2147483647 units fs. ps = 1000 fs. min = 60 sec. TIPO TIME El tipo TIME sirve para especificar valores de tiempo en los modelos Se define la unidad básica y las derivadas de ellas. end units. . us = 1000 ns. ns = 1000 ps.

.TIPO REAL Conocidos también como coma flotante. son los tipos que definen un numero real. con la diferencia de que los límites son números reales. Al igual que los enteros se definen mediante la palabra clave RANGE.

TIPO STRING El tipo string se define como un arreglo de cadenas de caracteres. Ejemplos “error en sincronia” “Hola Mundo” .

.TIPO BIT_VECTOR El tipo bit_vector es un arreglo de bit:  Permite modelar buses con un solo driver  Solo admite valores ‘0’ y ‘1’ "0101_1001" x"00AF" type bit_vector is array (natural range <>) of bit.

SUBTIPOS DE DATOS VHDL permite la definición de subtipos que son restricciones o subconjuntos de tipos existentes. el primero son subtipos obtenidos a partir de la restricción de un tipo escalar a un rango. . Hay dos tipos.

SUBTYPE digitos IS character RANGE '0' TO '9'. El segundo tipo de subtipos son aquellos que restringen el rango de una matriz: Ejemplo: SUBTYPE id IS string(1 TO 20). . SUBTYPE word IS bit_vector(31 DOWNTO 0).Ejemplo: SUBTYPE raro IS integer RANGE 4 TO 7.

Lo más común es definir los tipos dentro de un paquete.  Un tipo de datos definido por el usuario es conocido en VHDL como un tipo enumerated. y la mayoría de las herramientas de síntesis son capaces de sintetizar VHDL que contiene tipos enumerated. arquitectura o proceso. . Tipos enumerated.

Usualmente la señal tiene el número mínimo de bits requerido para representar el número de valores posibles. Este ejemplo muestra cada como cada valor es usualmente codificado en la implementación del hardware. IDLE. Codificación de derecha a izquierda en secuencia binaria RESET “00” IDLE “01” RW “10” INT_CYCLE “11” Mínimo número de bits . INT_CYCLE). RW_CYCLE. type MY_SATE is (RESET.Síntesis de tipo enumerated  La mayoría de las herramientas de síntesis pueden construir lógica desde una señal del tipo enumerated.

TIPO PREDEFINIDO (enumerated)  Son especificados como código fuente de VHDL. y se encontran en un paquete llamado STANDARD:  Boolean  Time  Bit  Character  Bit_vector  String  Integer  real .

.STANDARD_LOGIC  El Estándar 1164 está definido en código fuente VHDL puro y describe un tipo de dato llamado “std_ulogic”. el cual define los nueve estados posibles.

. y puede tener un solo driver. la “u” se refiere al hecho de que es de tipo unresolved. De hecho.TIPO STD_ULOGIC  El tipo std_ulogic es un tipo de dato unresolved.

llamado “std_logic”. .  El tipo std_logic tiene los mismos nueve estados de std_ulogic.  el cual es una versión tipo resolved de std_ulogic y puede tener mas de un driver.TIPO STD_LOGIC  Hay otro tipo definido.

son los recomendados para usar en los diseños.VECTORES TIPO STD_LOGIC Y STD_ULOGIC  El paquete también contiene la definición de los arreglos de std_logic y std_ulogic. estos tipos tienden a ser usados para describir estructuras de bus en la forma como el tipo bit_vector. conocidos como std_logic_vector y std_ulogic_vector.  Los tipos std_logic y std_logic_vector. .  La razón para esto es que hay otros estandares para usar VHDL que están basados en estos tipos en lugar de std_ulogic y std_ulogic_vector.

. signal A.Asignar std_logic a std_ulogic. A<=RES_Z.Z: std_ulogic.B. y viceversa. signal RES_Z: std_logic Z<=A.  Como se muestra en el diagrama es posible asignar objetos de tipo std_logic a objetos del tipo std_ulogic. RES_Z<=A.

RES_Z<= A. signal A. ya que no es valido tener mas de un driver en un tipo de dato unresolved. RES_Z<= B.B. Z o RES_Z ? Z<= A. Z<= B.Z: std_ulogic. . signal RES_Z: std_logic.std_logic para drivers múltiples  Si hay múltiples drivers en una señal se debe usar el tipo std_logic.

library IEEE. Es necesario hacer referencia tanto a la biblioteca como al paquete.Logic_1164. end MVLS.B: in std_ulogic. . Se deben usar estas líneas de código antes de describir las entidades que usan en el Standard Logic.Cláusulas library y use  El paquete de definiciones está contenido en una biblioteca llamada IEEE. --hace todo el contenido del paquete visible entity MVLS is port (A. Z: out std_ulogic). --hace visible la biblioteca use IEEE. como es mostrada en el diagrama.all.Std.

.OPERADORES LOGICOS  Tienen la misma precedencia. y se ejecutan de izquierda a derecha en la sentencia.

. pero el número de bits comparados puede ser diferentes.OPERADORES RELACIONALES  Los operadores deben ser del mismo tipo.

OPERADORES ARITMETICOS  Operan sobre objetos de tipo INTEGER. .  Pueden igualmente operar sobre STD_LOGIC_VECTOR utilizando los paquetes STD_LOGIC_UNSIGNED y STD_LOGIC_ARITH.

std_ulogic_vector .OPERADORES DE DESPLAZAMIENTO  rol ( rotate left )  ror ( rotate right )  sll ( shift left logical )  srl ( shift rigth logical )  sla ( shift left arithmetic )  sra ( shift right arithmetic )  Operan sobre objetos de tipo:  bit_vector  std_logic_vector.