Vous êtes sur la page 1sur 66

Others, soporte para síntesis.

 Los agregados tienen la


habilidad de usar la signal Z_BUS: bit_vector (3 downto 0);
sentencia others, la cual signal A,B,C,D: bit;
signal BYTE:bit_vector(7 downto 0);
asignará un valor a todos los
otros elementos de un X<= (3=>’1’, 1 =>’0’, others=>B)
arreglo que no han sido
especificados. Finalmente,
no todas las 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

RONP
U

Output=Vdd ROFFP H
=H
Input=L ROFFPD + RONP
ROFFPD U

VDD
RONP
U
Output=Vdd RONP L
D =L
Input=H RONPD + RONP
RONP U
D
Compuerta inversora NMOS Estática

0 1

1 VDD

c Output
c
input
OBJETOS MANIPULABLES

 Los objetos que se pueden manipular en VHDL son:

1 SEÑALES: Los “ports” declarados dentro


de una entidad son señales.
2 CONSTANTES: permiten definir valores
permanentes
3 VARIABLES: utilizados solamente dentro de los
procesos(instrucciones secuénciales).
4 ARCHIVOS (FICHEROS)
Declaraciòn de Objetos
La formula de declaraciòn de constantes,
variables y señales es:

Tipo_de_Objeto Nombre_de_Objeto Tipo_de_Dato:=Valor Inicial

Por ejemplo:

SIGNAL nodno1: BIT:='1';


VARIABLE var1:BIT;
CONST pi: REAL:=3.14159;
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).
Sintaxis general de una señal

signal id {,...} : tipo [:= expresion ];


port ( { id {, ...} : direccion tipo [:= expresion];}]

Signal Reloj : std _logic :='0';


signal Comparacion: bit;
signal Resultado : integer range 0 to 7;
port ( a,b : in integer range 0 to 7;
c : out integer range 0 to 7;
d : inout std_logic );
Señales

 Forma de declarar una señal:


signal identificator: tipo: [rango];

Ejemplo:
signal vcc: bit: ´1´;
signal suma: bit_vector: (3 downto 0);
Señales

 las señales pueden declararse en una entidad,


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

 Escalar: signal name(s):=type


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

Ejemplos:
 signal count: integer range 1 to 50; (el valor inicial será
1)
 signal GROUND: BIT:='0';
 signal YS_BUS std_logic_vector (7 downto 0);
 port (B,A: in integer range 0 to 9);
 signal bogus: bit_vector; (Errónea, no hay dimensión)
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, el
cual consta de una colección de parejas (tuplas)
valor/tiempo llamadas transacciones.
Asignación múltiple o concurrente

 Los “conductores” son creados por sentencias de


asignación de señales.
 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.
Creación de un driver

ARCHITECTURE t1 OF d1 IS
BEGIN
a <= b AFTER 10 ns ;
a <= c AFTER 10 ns ;
END t1;
Función de resolución

 La señal ´”a” está siendo manejada por dos fuentes, b y


c.
 Cada asignación concurrente creará un conductor para
la señal a, 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.
Atributos función de las señales
S´EVENT Retorna verdadero si ocurrió un evento
en S durante el corriente delta, de lo
contrario devuelve falso.
S´ACTIVE Retorna verdadero si ocurrió una
transición en S durante el
corriente delta, else falso.
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´LAST_ACTIVE Retorna el tiempo transcurrido
desde la transacción previa de la
señal.
Señales de tipo definido

 Habiendo definido el tipo, podemos definir señales de


este tipo. Aquí hemos declarado la señal STATE de tipo
MY_STATE. 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, IDLE, RW_CYCLE, INT_CYCLE);

Signal STATE: MY_STATE;
Signal TWO_BIT: bit_vector (0 to 1);

STATE<=RESET;
STATE<=“00”;
STATE<=TWO_BIT;
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];


Ejemplos

Constant Pi: real : =3.1415;


constant BitsPalabra : integer :=8;
constant NumPalabras : integer :=64;
constant NumBits : integer :=BitsPalabras * NumPalabras;
constant RetardoAND2 , RetardoOR2 : time := 2 ns
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.
Sintaxis general de un archivo

file id {,....} : tipo [is direcciòn “nombre” ;]


file id {,....} : tipo [ [ open tipo_acceso] is “nombre”;]

Ejemplos

file Estimulos : FicheroEnteros open read_mode is “datos.in”;


file Salida : FicheroEnteros open write_mode id “datos.out”;
ASIGNACION DE UN VALOR

 A una señal se le asigna


un valor, en VHDL, por
medio de una sentencia
de Asignación de señal.
 Una Asignación a una
señal define un driver
sobre esa señal.
 Se pueden tener
multilples drivers.
DEFINICION DE PUERTOS

Señales que relacionan una entidad


con otra
Forma genérica de designar un puerto

nombre_variable: modo tipo;

Ejemplos:

puertoa: in bit;
puertob: in bit_vector(0 to 7);
puertoc: out bit_vector(3 downto 0);
puertod: buffer bit;
puertoe:inout std_logic;
Modo de Puerto
in
Un puerto es de modo in si la información correspondiente al mismo, entra a la entidad y se suele
usar para relojes, entradas de control (como las típicas load, reset y enable), y para datos de
entrada unidireccionales.

out
Un puerto es de modo out si la información fluye hacia fuera de la entidad.
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.

buffer
Este modo es similar al modo out, pero además, permite la realimentación y no es bidireccional,
y solo puede ser conectado directamente a una señal interna, o a un puerto de modo buffer de
otra entidad. Una aplicación muy común de este modo es la de salida de un contador, ya que
debemos saber la salida en el momento actual para determinar la salida en el momento
siguiente.

inout
Es usado para señales bidireccionales, es decir, si necesitamos que por el mismo puerto fluya
información tanto hacia dentro como hacia afuera de la entidad. Este modo permite la
realimentación interna y puede reemplazar a cualquiera de los modos anteriores, pudiéndose
usar este modo para todos los puertos.
Tipos Nativos para VHDL

boolean
Puede tomar dos valores: verdadero/true o falso/false. 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", según se prefiera). Es el tipo más usado
de los nativos

bit_vector
Es un vector de bits. Debemos tener cuidado al definir el peso de los bits que lo integran, 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, respectivamente..

numero : bit_vector (0 to 7);


numero : bit_vector (7 downto 0);

integer
Para mantenerr números enteros. Hay que advertir que el uso de enteros consume muchos recursos
del dispositivo de lógica programable, siempre y cuando sea sintetizable, debido a que está
prácticamente creado para la simulación.
• Definir un modelo de comportamiento sintetizable (ARCHITECTURE)
Usando el juego de instrucciones soportado por las herramientas de síntesis

architecture archpro of programa is

-- Declaración de señales y otros accesorios

Begin

-- Núcleo del programa

End archpro;

Para describir una arquitectura podremos usar cuatro estilos


Estilo behavioral
Estilo dataflow
Estilo structural
Estilo mixto
Estilo behavioral Estilo dataflow

entity compa is architecture dataflow1 of compa is


port ( begin
a,b: in bit_vector(3 downto 0); igual<='1' when (a=b) else '0';
igual: out bit end dataflow1;
);
end compa;

architecture dataflow2 of compa is


architecture behavioral of compa is begin
begin igual<= not(a(0) xor b(0))
comp: process (a, 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));
igual<='1'; end dataflow2;
else
igual<='0';
end if;
end process comp;
end behavioral;
Estilo structural
Estilo mixto

architecture struct of compa is


signal x: bit_vector(0 to 3);

Component xnor2
Port (e1,e2:in bit; y:out bit);
End component;

Component and4
Port (e1,e2,e3,e4:in bit; y:out bit);
End component;

begin
u0: xnor2 port map (a(0),b(0),x(0));
u1: xnor2 port map (a(1),b(1),x(1));
u2: xnor2 port map (a(2),b(2),x(2));
u3: xnor2 port map (a(3),b(3),x(3));
u4: and4 port map (x(0),x(1),x(2),x(3),igual);
end struct;
Estilo de Escritura RTL (Register Transfer Level)

Netlist Describe los componentes que posee y las conexiones


entre ellos (Estilo Estructural)

RTL Describe el comportamiento de cada entidad


CONCEPTO DE TIPO DE DATO

 Todos los objetos en VHDL son de un tipo dado.


 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.
TIPO

 El tipo define un conjunto de valores y una asignación a


esa señal debe ser un valor definido por ese conjunto.
 Cuando hacemos una asignación a una señal, los tipos
en ambos lados del operador de asignación de señal
deben corresponder.
Declaraciòn de tipos de datos
Sintaxis general

type id is definiciòn_tipo;

Ejemplos

type DiaMes is range 1 to 31 ;


type Dela31 is range 1 to 31;
type Orientacion is (norte,sur,este,oeste);

Uso

constant DiasEnero : DiasMes :=31;


variable DiaHoy : DiaMes;
signal Direcciòn : Orientacion;
Los tipos deben corresponder

 Cuando hacemos una asignaciòn a una señal,


 los tipos en ambos lados del operador de
 asignaciòn de señal deben corresponder.

Ejemplo:
 Entity HALFADD is
 port (A,B : in bit;
 SUM, CARRY : out bit);
 end HALFADD;
Tipos predefinidos

 Escalares
 Enumerados
 BOOLEAN,BIT,CHARACTER
 Enteros
 INTEGER
 Físicos
 TIME
 Flotantes
 REAL

 Compuestos
 Arrays
 STRING,BIT_VECTOR

• 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.


Conjunto de valores ‘0’ y ‘1’

Operaciones definidas sobre el:


 Lógicas: not,and,nand,or,nor,xor y xnor
 Comparación: ‘=‘, ‘/=‘,’<‘, ‘<=‘, ‘>’, ‘>=‘
 Concatenación: &

type bit is (‘0’, ‘1’)


TIPO CHARACTER

Se utiliza para definir un solo carácter.

‘A’
‘b’
‘x’
TIPO INTEGER
Un tipo integer es un dato cuyo contenido es un
valor numerico entero que esta dentro del siguiente rango :
2,147,483,647 a +2,147,483,647.

Ejemplos
+1
682
-139
+239

TYPE Integer IS 0 TO 255;


TYPE index IS RANGE 7 DOWNTO 1;
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.

type time is orange -2147483647 to 2147483647


units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
min = 60 sec;
end units;
TIPO REAL

Conocidos también como coma flotante,


son los tipos que definen un numero
real. Al igual que los enteros se definen
mediante la palabra clave RANGE, con la
diferencia de que los límites son números
reales.
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.
Hay dos tipos, el primero son subtipos
obtenidos a partir de la restricción de un
tipo escalar a un rango.
Ejemplo:

SUBTYPE raro IS integer RANGE 4 TO 7;


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);
Tipos enumerated.

 Un tipo de datos definido


por el usuario es conocido
en VHDL como un tipo
enumerated. Lo más
común es definir los tipos
dentro de un paquete,
arquitectura o proceso, y la
mayoría de las
herramientas de síntesis
son capaces de sintetizar
VHDL que contiene tipos
enumerated.
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. 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.
type MY_SATE is
(RESET, IDLE, RW_CYCLE, INT_CYCLE);

Codificación de derecha a izquierda en secuencia binaria


RESET “00”
IDLE “01”
RW “10”
INT_CYCLE “11”
Mínimo número de bits
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.
TIPO STD_ULOGIC

 El tipo std_ulogic es un tipo de dato unresolved, y puede


tener un solo driver. De hecho, la “u” se refiere al hecho
de que es de tipo unresolved.
TIPO STD_LOGIC

 Hay otro tipo definido, llamado “std_logic”.


 el cual es una versión tipo resolved de std_ulogic y
puede tener mas de un driver.
 El tipo std_logic tiene los mismos nueve estados de
std_ulogic.
VECTORES TIPO STD_LOGIC Y STD_ULOGIC
 El paquete también contiene la definición de los arreglos
de std_logic y std_ulogic, conocidos como
std_logic_vector y std_ulogic_vector. estos tipos tienden
a ser usados para describir estructuras de bus en la
forma como el tipo bit_vector.
 Los tipos std_logic y std_logic_vector, son los
recomendados para usar en los diseños.
 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.
Asignar std_logic a std_ulogic.

 Como se muestra en el diagrama es posible


asignar objetos de tipo std_logic a objetos del tipo
std_ulogic, y viceversa.

s
i
g
n
a
l
A
std_logic para drivers múltiples

 Si hay múltiples drivers en una señal se debe usar el


tipo std_logic, ya que no es valido tener mas de un
driver en un tipo de dato unresolved.

signal A,B,Z: std_ulogic;


signal RES_Z: std_logic;
Z o RES_Z ?

Z<= A; RES_Z<= A;
Z<= B; RES_Z<= B;
Cláusulas library y use

 El paquete de definiciones está contenido en una


biblioteca llamada IEEE. Es necesario hacer referencia
tanto a la biblioteca como al paquete, como es mostrada
en el diagrama. Se deben usar estas líneas de código
antes de describir las entidades que usan en el Standard
Logic.
library IEEE; --hace visible la biblioteca
use IEEE.Std.Logic_1164.all; --hace todo el contenido del paquete visible

entity MVLS is
port (A,B: in std_ulogic;
Z: out std_ulogic);
end MVLS;
OPERADORES LOGICOS

 Tienen la misma precedencia, y se ejecutan de


izquierda a derecha en la sentencia.
OPERADORES RELACIONALES

 Los operadores deben ser del mismo tipo, pero el


número de bits comparados puede ser diferentes.
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.
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, std_ulogic_vector

Vous aimerez peut-être aussi