Académique Documents
Professionnel Documents
Culture Documents
DISEÑO DIGITAL
LABORATORIO No1 - 2
1. Unidades de diseño.
Entidad: La entidad, nos sirve para relacionar nuestro diseño con el mundo exterior, es decir,
analizamos lo que tratamos de crear como una "caja negra", de la que sólo conocemos sus
entradas, salidas y la disposición de las mismas.
Sintaxis:
entity identificador is
[genéricos]
[puertos]
end [identificador];
Cada señal en una declaración de entidad está referida a un puerto (o grupo de señales), el cual
es análogo a un(os) pin(es) del símbolo esquemático. Un puerto es un objeto de información, el
cual puede ser usado en expresiones y a la vez se le pueden asignar valores. A cada puerto se le
debe asignar un nombre válido.
El modo determina como las sentencias de la arquitectura pueden acceder al puerto. Tenemos 4
tipos de modos:
- in: es de sólo lectura (no se puede escribir).
- out: es de sólo escritura (no se puede leer).
- buffer: se comporta como un puerto de salida (out) que se puede leer.
- Inout: es de tipo bidireccional, quiere decir que se puede leer y escribir.
Sólo para fines de simulación todo puerto puede tener un valor por defecto que determina el
valor inicial de la señal, los puertos de entrada pueden dejarse desconectados si tienen un valor
por defecto.
Sintaxis:
architecture nombre of entidad is
- - Zona de declaración
begin
sentencias concurrentes;
sentencias concurrentes;
sentencias concurrentes;
end nombre;
Para describir una arquitectura podemos utilizar tres estilos, teniendo cada uno su propio nivel de
abstracción:
- Estilo algorítmico (behavioral)
- Estilo flujo de datos (dataflow)
- Estilo estructural (structure)
Cada estilo está basado en sentencias concurrentes que determinan el grado de abstracción del
circuito a diseñar, así tenemos que el estilo algorítmico se caracteriza por utilizar las sentencias de
los lenguajes de alto nivel, el estilo flujo de datos basado en sentencias que asignan valores a una
señal y el estilo estructural que permite interconectar componentes ya elaborados.
En cada uno de los estilos de modelado se utiliza la sentencia de asignación de señales: <=, para
esto hay que tener en cuenta que:
- Las señales a ambos lados del operador de asignación (<=) deben ser del mismo tipo.
- Si hay varias asignaciones a la misma señal en un mismo proceso, prevalece el valor de la
última asignación.
- Las asignaciones a señales pueden aparecer en sentencias concurrentes (estilo flujo de
datos) o sentencias secuenciales (estilo algorítmico).
El retardo de tipo inercial filtra los cambios de la señal a la entrada del circuito siempre que duren
un tiempo menor al retardo de propagación de la compuerta y después retraza la señal. El
retardo de tipo transporte no filtra sólo retraza la señal.
En el gráfico anterior se puede apreciar que la respuesta de la compuerta sale retrazada 5ns. Si la
entrada A o B cambia en un tiempo menor a 5ns, ese cambio no afectará a la salida Z.
En el gráfico anterior se puede apreciar que la señal B llega retrazada a C en 5 ns. La expresión :
Z <= A and C; no tiene la cláusula after, por lo que el modelo de retardo asociado es el de tipo
delta, que es un tipo de retardo inercial cuyo retrazo de la señal es muy pequeño
(aproximadamente 0).
Tipo: El VHDL es un lenguaje de programación donde los objetos a utilizar (señales, variables,
constantes) deben tener asignado un tipo. El tipo define el conjunto de valores que pueden
tomar los objetos. Así tenemos por ejemplo el tipo bit (declarado en el paquete Standard de la
biblioteca STD) como:
Indica que el tipo bit sólo puede tomar los valores: '0' y '1'. Este es un tipo básico y con el ya
podemos crear puertos y nodos internos para interconectar los circuitos digitales. Pero hay un
inconveniente: este tipo no permite implementar componentes cuya salida pueda tomar un
valor de alta impedancia (Z), no se pueden realizar operaciones aritméticas (sólo lógicas) ya que
no hay implementadas funciones para tal fin con este tipo y tampoco pueden unirse más de una
señal sobre salidas de varios circuitos porque el tipo bit tampoco tiene asociado una función que
permita resolver las múltiples asignaciones a un mismo objeto. Por esta razón es preferible utilizar
el tipo de dato std_logic que se encuentra en el paquete STD_LOGIC_1164 de la biblioteca IEEE.
El tipo std_logic es un tipo de dato multivaluado como se muestra en parte de la descripción del
paquete:
El tipo de dato utilizado por lo general std_logic (que es un sub-tipo del tipo std_ulogic) por las
ventajas que hemos mencionado en el párrafo anterior. Para poder utilizar este tipo de dato en
el programa VHDL debemos declarar previamente en que paquete se encuentra y a que
biblioteca pertenece el paquete, para esto utilizamos las siguientes sentencias:
Con ello tenemos la posibilidad de utilizar todos los elementos que se encuentran declarados en
los paquetes: STD_LOGIC_1164, STD_LOGIC_ARITH y STD_LOGIC_UNSIGNED. En el paquete
STD_LOGIC_1164 encontramos la declaración de tipos y subtipos de datos, funciones de
conversión de un tipo a otro. En el paquete STD_LOGIC_ARITH encontramos funciones
aritméticas, lógicas y de relación que se puede utilizar entre los objetos declarados con tipos de
datos STD_LOGIC ó STD_LOGIC_VECTOR. El paquete STD_LOGIC_UNSIGNED complementa al
paquete STD_LOGIC_ARITH con operaciones aritméticas sin tener en cuenta los bits de signo.
Este estilo se caracteriza por utilizar las asignaciones concurrentes a señales (ACS). Tenemos 3
tipos de ACS:
- ACS única
- ACS condicional
- ACS selectiva
Estas sentencias terminan asignando un valor a una señal después de evaluar toda una
expresión, esta evaluación se realiza cuando ocurre un evento en una de las señales que se
encuentran a la derecha del símbolo de asignación a señal (<=).
ACS única: se basa en expresiones muy parecidas a las ecuaciones booleanas, en la mayoría de
los casos se expresan en suma de términos producto.
Sintaxis:
señal <= expresión;
ACS condicional: se basa en expresiones que deben evaluar una condición y dependiendo de la
respuesta terminan asignando el resultado de la expresión a la señal.
Sintaxis:
señal <= expresión1 when condición1 else expresión2;
En la declaración anterior se nota que hay una prioridad en la asignación a señal, por ejemplo
para que la señal tome el resultado de la expresión3 debe cumplirse que la condición1 y
condición2 sean falsas y la condición3 sea verdadera. La prioridad la tiene la condición1, si esta
no se cumple se pasa a evaluar la condición2, si esta no se cumple se pasa a evaluar la
condición3 y así sucesivamente se evalúan todas las condiciones hasta que cumpla alguna de
ellas.
Hay que aclarar que siempre se termina evaluando una expresión y asignando la respuesta a la
señal así no se cumpla ninguna condición.
ACS selectivo: se utiliza mucho para implementar tablas de verdad de pequeños circuitos. Se
evalúa una expresión (la que sigue a la palabra with) y de acuerdo al valor que tome se le asigna
a la señal la respuesta de una expresión. Veamos su sintaxis:
Esta sentencia requiere que se especifique todos los posibles valores que puede tomar la
expresión a evaluar, por lo que generalmente la sentencia se escribe de la siguiente manera:
Con la palabra others se está cubriendo el resto de valores que no han sido especificados en la
sentencia. Veamos algunos ejemplos:
- compuerta AND:
Si es que indica algún tipo de error debe corregirlos antes de pasar al siguiente punto. A
continuación vamos a simular el circuito diseñado.
Pulse el botón List y los nodos disponibles selecciónelos pulsando el botón: => Pulse OK.
Debe tener la siguiente forma de señales de entrada y salida:
Como puede notar todas las entrada se les asigna por defecto el valor 0 y las salidas
tienen un valor indeterminado. Debemos asignar los valores que deseamos que tomen las
entradas en función del tiempo. Para esto contamos con los siguientes botones:
Invierte la señal.
Señal de reloj.
Asigna un valor de cuenta a un nodo o grupo tomando como referencia el tamaño del paso.
Para asignar un valor en un determinado tiempo para un nodo, sólo debemos de arrastrar el
ratón pulsando el botón izquierdo por todo el intervalo de tiempo que deseamos fijar y
posteriormente pulsar uno de los botones descritos anteriormente.
Pulse este botón para ajustar todo el tiempo de simulación (por defecto es de 0ns
a 1us).
Con esta opción separa el grupo e en bits de manera individual mostrándose la siguiente
ventana:
Para saber cual es el menor tiempo que podemos asignar un valor seleccionamos del
menú Options el comando: Grid Size mostrándose la siguiente ventana:
Para lograr los valores que toma el nodo sel se utilizó el botón
Pulse Aceptar y luego en la ventana del Simulador pulse el botón Open SCF Mostrádose
el resultado de la simulación:
Como puede apreciar la señal z de salida toma el valor de la señal e0 cuando el valor de
la señal sel toma el valor de 00. Lo mismo pasa para las otras señales.
entity DEC3A8_ENA is
Port ( A : in std_logic;
B : in std_logic;
C : in std_logic;
ENA : in std_logic;
Y : out std_logic_vector(7 downto 0));
end DEC3A8_ENA;
end Behavioral;
2. ALU de 8 bits.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ALU_8BITS is
Port ( A,B : in std_logic_vector(7 downto 0);
OPER : in std_logic_vector(2 downto 0);
Z : out std_logic_vector(7 downto 0));
end ALU_8BITS;
entity LOAD_SHIFT is
Port ( DATA : in std_logic_vector(7 downto 0);
SEL : in std_logic_vector(1 downto 0);
Q : buffer std_logic_vector(7 downto 0));
end LOAD_SHIFT;
end Behavioral;
entity binario_bcd is
Port ( DATA : in std_logic_vector(3 downto 0);
BCD0 : out std_logic_vector(3 downto 0);
BCD1 : out std_logic);
end binario_bcd;
end Behavioral;
entity DEC7SEG is
Port ( DATA : in std_logic_vector(3 downto 0);
DISPLAY : out std_logic_vector(6 downto 0));
end DEC7SEG;
entity DET_IMPAR is
Port ( DATA : in std_logic_vector(7 downto 0);
Z : out std_logic);
end DET_IMPAR;
end Behavioral;
7. Comparador de 4 bits
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity comparador is
Port ( A : in std_logic_vector(3 downto 0);
B : in std_logic_vector(3 downto 0);
IGU : out std_logic;
MAY : out std_logic;
MEN : out std_logic);
end comparador;