Вы находитесь на странице: 1из 64

UNIVERSIDAD DE COLIMA

FACULTAD DE INGENIERA MECNICA Y ELCTRICA

Curso: Mdulo III - VHDL Bsico


OBJETIVO GENERAL: El participante disear circuitos electrnicos digitales bsicos
usando el lenguaje de descripcin de hardware VHDL, programando los diseos en
sistemas de desarrollo con dispositivos FPGA.
CONTENIDO TEMTICOS:
1. Conceptos bsicos VHDL bsico
2. Elementos de la sintaxis de VHDL
3. Operadores en VHDL
4. Operados de asignacin Concurrente
5. Operadores de asignacin en serie
INSTRUCTOR: Ramn Antonio Flix Cuadras.
2000-2003 - Doctorado en Ciencias con Especialidad en Ingeniera Elctrica, Centro de
Investigacin y Estudios Avanzados del IPN (CINVESTAV) Unidad Guadalajara.
1998-2000 - Maestra en Ciencias con Especialidad en Ingeniera Elctrica Opcin Control
Automtico, Centro de Investigacin y Estudios Avanzados del IPN (CINVESTAV) Unidad
Guadalajara.
1994-1998 - Ingeniera Electrnica con Especialidad en Sistemas Digitales, Instituto
Tecnolgico del Mar (ITMAR). Mazatln Sinaloa.
DURACIN:
20 horas contacto
DIRIGIDO A:

Egresados de Ingeniera en Comunicaciones y Electrnica

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA

CURSO: MDULO III: VDHL BSICO

ACTIVIDAD 1: Conceptos bsicos VHDL bsico

Instructor: Dr. Ramn Antonio Flix Cuadras.


_______________________________________________________
Esta actividad est planeada con un enfoque de aprendizaje colaborativo, en el cual lo ms
importante es el trabajo en equipo para lograr el objetivo de aprender significativamente. Para ello
se formarn grupos de 3 personas, que tendrn que leer este documento, siguiendo paso a paso las
instrucciones que se indican aqu. La calificacin de esta actividad va de 0 a 100 y se asignar
proporcionalmente al avance logrado al final de la sesin
Objetivo: Disear circuitos digitales bsicos con el Lenguaje VHDL.
_________________________________________________________________________

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

El VHDL fue desarrollado de forma muy parecida al lenguaje de programacin ADA debido a
que ste tiene una orientacin hacia sistemas en tiempo real y al hardware en general, por lo que se
le escogi como modelo para desarrollar el VHDL.
VHDL proviene de los acrnimos VHSIC (Very High Speed Integrated Circuit) y HDL
(Hardware Description Language); es un lenguaje de descripcin y modelado, diseado para
describir la funcionalidad y la organizacin de sistemas de hardware digital.
Algunas ventajas del uso de VHDL para la descripcin hardware son:
VHDL permite disear, modelar, y comprobar un sistema desde un alto nivel de
abstraccin, hasta el nivel de definicin estructural de puertas.
Los diseos son independientes con respecto a la tecnologa de donde se implementan
(ASIC, Gate Array, FPGA, CPLD, etc.) y de la compaa que la fabrica (Intel, Xilinx,
Altera, etc.).
Promueve una depuracin ms fcil del diseo, sobre todo en diseos muy complejos.
Facilita disear incrementalmente, es decir, disear, implementar y probar
separadamente las partes del diseo.
Permite el diseo concurrente o modular; varias personas pueden trabajar al mismo
tiempo en las partes de un diseo.
Un diseo lgico descrito con VHDL se compone de dos mdulos: la entidad y la
arquitectura. En la entidad (ENTITY) se definen las entradas, salidas, aqu es donde se declaran los
puertos del circuito, direccin (IN, OUT, INOUT) y el tipo de dato (INTEGER, BIT, STD_LOGIC,
BOOLEAN, etc.), es decir, la manera en que se ve el circuito desde fuera; su sintaxis es como se
muestra en la Figura 1.

Figura 1.1: Representacin grfica de una entidad.

En la arquitectura (ARCHITECTURE) es donde se describe el comportamiento que tendr


el circuito, esto es, lo que har con las seales de entrada para generar las seales de salida, aqu es
donde se define el funcionamiento interno del circuito.
La declaracin de la arquitectura debe constar de las siguientes partes como mnimo, aunque
suelen ser ms:

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

EJEMPLO 1.1: Descripcin de una compuerta or2_b1


El siguiente cdigo en VHDL describe el comportamiento de una compuerta OR de 2
entradas, con una de ellas negadas:
-- Los comentarios inician con dos guiones
ENTITY or2_b1 IS
PORT( entrada1: IN BIT; -- Puerto de entrada
entrada2: IN BIT; -- Puerto de entrada
salida1: OUT BIT); -- Puerto de salida
END or2_b1;
ARCHITECTURE behavioral OF or2_b1 IS
SIGNAL entrada_b: BIT; --Seal interna
BEGIN
-- A la seal entrada_b se le asigna en negado del puerto entrada2
entrada_b <= NOT entrada2;
-- Al puerto salida se le asigna en la OR entre el puerto entrada2 y la seal entrada_b
salida1 <= entrada1 OR entrada_b;
END behavioral;

La entidad or2_b1, que es el nombre dado al circuito, tiene 2 puertos de entrada (entrada1 y
entrada2) de tipo BIT y un puerto de salida (salida1) tambin del tipo BIT. Los tipos de datos en
VHDL, baste por el momento saber que el tipo BIT indica que el puerto o seal puede tomar los
valores '0' '1'.
La entidad de un circuito es nica, sin embargo, en VHDL puede haber varias arquitecturas
relacionadas con la misma entidad; su utilidad se ver en el futuro. La arquitectura de este ejemplo
se llama behavioral y est asociada con la entidad or2_b1, despus de esta definicin sigue la parte
declarativa de la arquitectura, donde se declaran las seales internas (SIGNAL), contantes
(CONSTANT) y tipos de datos definidos por el programador (TYPE). En este caso slo tenemos
una seal interna llamada entrada_b de tipo BIT, a la cual se tiene acceso, nicamente, en el interior
del circuito. Luego sigue la sentencia BEGIN, que indica que las siguientes lneas de cdigo deben
ser interpretadas como instrucciones, las cuales deben terminar en punto y coma (;). La primera de
las instrucciones es una asignacin concurrente; a la seal entrada_b se le asigna concurrentemente
en valor negado del puerto entrada2.
El operador de asignacin concurrente <= es muy importante en el VHDL, puede jugar el
papel de alambre o wire, anlogamente con los diagramas con esquemticos, en la
interconexin de componentes; en otro contexto, el smbolo <= tambin puede interpretarse como
un operador de comparacin menor o igual que, pero esto se analizar en el futuro. Del lado
izquierdo del operador debe estar una seal interna o un puerto de salida y del lado derecho una
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

operacin vlida entre seales internas o puertos de entrada. El hecho de que sea un operador
concurrente implica que no tenga importancia el lugar donde sea es usado este operador, puede ser
al principio, en medio o al final, pero despus del BEGIN y antes del fin de la arquitectura. Esta es
una de las caractersticas que causan ms confusin cuando se empieza a programar en VHDL, ya
que en un lenguaje convencional de programacin, el lugar donde se declare una asignacin de
variable es trascendental para el funcionamiento del programa. Por ejemplo el siguiente cdigo en
lenguaje C:
entrada_b = ~ entrada2;
salida1 = entrada1 | entrada_b;

Produce resultados muy diferentes al cdigo:


salida1 = entrada1 | entrada_b;
entrada_b = ~ entrada2;

Sin embargo, en VHDL el siguiente cdigo hace la misma funcin que el del diseo or2_b1, a
pesar que se cambien de lugar las instrucciones concurrentes:
salida1 <= entrada1 OR entrada_b;
entrada_b <= NOT entrada2;

La segunda instruccin tambin es una asignacin concurrente; a l puerto salida1 se le


asigna la OR lgica entre el puerto entrada2 y la seal entrada_b. En la Figura 1.1 se puede ver una
representacin grfica del circuito descrito por el cdigo.

Figura 1.2: Representacin en esquemticos del diseo del ejemplo 1.1.

El operador NOT tiene la funcin lgica de negar el contenido de operando que est despus
de l. Como es de esperarse el operador OR regresa dicha operacin lgica de los operandos que
estn entre l. En VHDL tambin estn definidos los operadores lgicos: AND, NAND, NOR y
XOR. Todos los operadores lgicos tienen la misma precedencia, por lo tanto muchas veces ser
necesario usar parntesis para especificar correctamente la operacin deseada. El funcionamiento es
el habitual para este tipo de operadores. VHDL es muy delicado en cuanto los tipos de datos y los
operadores permitidos, por ejemplo los operadores lgicos no estn definidos para tipos de datos
numricos (INTEGER, REAL), por otro lado, los operadores aritmticos (+, , *, /) no estn
permitidos para datos de tipo BIT.
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

EJEMPLO 1.2: Descripcin de una compuerta and4_b3


El siguiente cdigo en VHDL describe el comportamiento de una compuerta AND de 4
entradas, con 3 de ellas negadas:
ENTITY and4_b3 IS
PORT( a: IN BIT; -- Puerto de entrada
b: IN BIT; -- Puerto de entrada
c: IN BIT; -- Puerto de entrada
d: IN BIT; -- Puerto de entrada
z: OUT BIT); -- Puerto de salida
END and4_b3;
ARCHITECTURE comportamiento OF and4_b3 IS
BEGIN
z <= a AND (NOT b) AND (NOT c) AND (NOT d);
END comportamiento;

La entidad and4_b3, tiene 4 puertos de entrada (a, b, c, d) de tipo BIT y un puerto de salida
(z) del mismo tipo. La arquitectura de este ejemplo se llama comportamiento y est asociada con la
entidad and4_b3. En este caso no usamos ninguna seal interna, en una sola asignacin concurrente
realizamos todas las operaciones lgicas, usando parntesis para especificar correctamente dichas
operaciones. En la Figura 1.3 se aprecia una representacin en diagramas esquemticos del cdigo.

Figura 1.3: Representacin en esquemticos del diseo del ejemplo 1.2.

En el futuro sustituiremos el tipo BIT por el tipo STD_LOGIC, debido a que ste es ms
adecuado para la simulacin y sntesis de circuitos lgicos. Para poder usar este tipo de dato es
necesario incluir la librera IEEE y hacer visible el paquete STD_LOGIC_1164, para ello se deben
escribir este par de lnea de cdigo antes de definir la entidad :
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

Las caractersticas del tipo STD_LOGIC, del estndar IEEE 1164-1993, se analizarn en
futuras actividades.

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

PROBLEMA 1.1: Simulacin de un diseo en VHDL.


El siguiente cdigo en VHDL describe el comportamiento de un circuito dado:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY circuito IS
PORT(entrada: IN STD_LOGIC; -- Puerto de entrada
linea: IN STD_LOGIC; -- Puerto de entrada
salida0: OUT STD_LOGIC; -- Puerto de salida
salida1: OUT STD_LOGIC); -- Puerto de salida
END circuito;
ARCHITECTURE behavioral OF circuito IS
BEGIN
salida0 <= entrada AND (NOT linea);
salida1 <= entrada AND linea;
END behavioral;

Dibuje las seales de los puertos salida0 y salida1, en el testbench de la Figura 1.4. Llame al
instructor para registrar el avance. (10 puntos).

Figura 1.4: Cama de pruebas para el problema 1.1.

PROBLEMA 1.2:
Disee un multiplexor de 2 a 1 en VHDL, como el hecho en las actividades pasadas, utilice el
tipo STD_LOGIC en lugar del tipo BIT. Simule el diseo con el ISE Simulator e implemntelo en
el BASYS2. Llame al instructor para registrar el avance.
PROBLEMA 1.3:
Disee un decodificador de 2 a 4 en VHDL, utilice el tipo STD_LOGIC en lugar del tipo
BIT. Simule el diseo con el ISE Simulator e implemntelo en el BASYS2. Dicho diseo deber
tener una Entity con dos puertos de entrada (S0 y S1) y 4 se salida (Y0, Y1, Y2, Y3), que se
relacionarn con la siguiente tabla de verdad:
Tabla II. Tabla de verdad de un decodificador de 2 a 4 lneas.
S1 S0 Y3 Y2 Y1 Y0
0
0
0
0
0
1
0
1
0
0
1
0
1
0
0
1
0
0
1
1
1
0
0
0

Llame al instructor para registrar el avance


Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA

CURSO: MDULO III: VDHL BSICO

ACTIVIDAD 2: Elementos de la sintaxis de VHDL

Instructor: Dr. Ramn Antonio Flix Cuadras.


_______________________________________________________
Esta actividad est planeada con un enfoque de aprendizaje colaborativo, en el cual lo ms
importante es el trabajo en equipo para lograr el objetivo de aprender significativamente.
Para ello se formarn grupos de 3 personas, que tendrn que leer este documento, siguiendo
paso a paso las instrucciones que se indican aqu. La calificacin de esta actividad va de 0 a
100 y se asignar proporcionalmente al avance logrado al final de la sesin.
Objetivo: Aplicar la sintaxis de VHDL y detectar errores de sintaxis
_________________________________________________________________________

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

El VHDL es un lenguaje con reglas sintcticas muy particulares. El hecho de que sirva para la
descripcin hardware lo hace muy diferente de un lenguaje convencional. Una de estas diferencias
es la posibilidad de ejecutar varias instrucciones a la vez, de forma concurrente.
Algunos de estas reglas sintcticas son:
Comentarios: Cualquier lnea que empieza por dos guiones "--" es un comentario y
por lo tanto no es ejecutable, de tal forma que el programa al encontrar una
instruccin precedida por "--" la saltar ignorando su contenido.
Identificadores: Son cualquier cosa que sirve para identificar variables, seales,
nombres de rutina, etc. Puede ser cualquier nombre compuesto por letras incluyendo
el smbolo de subrayado "_". Las maysculas y minsculas son consideradas iguales,
as que JOSE, Jose y jose representan el mismo elemento, se permite el uso de
nmero pero no al principio de la palabra, como: entrada1, or4b3, etc.
LITERALES
Los literales son valores fijos de determinado tipo, sin un nombre asociado a ellos. Los tipos
pueden ser alguno de los siguientes:
Nmeros enteros: Cualquier nmero se considera que se encuentra en base 10. Es posible
poner nmeros en otras bases utilizando el smbolo del sostenido "#". Ejemplo:
2#11000100# y 16#C4# representan el nmero entero 196. Para nmeros grandes se
puede usar la notacin cientfica, 34.3e4 = 34.3104 = 343000, 1200e-2 = 1210-2 = 12.
Nmeros reales: Son nmeros con punto decimal, como: 2.4, 57.23, etc. stos admiten la
notacin cientfica convencional para nmeros en punto flotante, por ejemplo:
2.5498209e5=254982.09, 4.5e3=0.0045.
Caracteres ASCII: Es cualquier carcter ASCII entre comillas simples. Ejemplos: 'l', '3', 't',
'a', '$'.
Cadenas de caracteres: Son un conjunto de caracteres ASCII englobados por comillas
dobles ("): "Esto es una cadena", "Hola mundo".
Bits: Es un subconjunto del los caracteres ASCII y slo tiene dos posibles valores 'l' '0'.
Cadenas de bits: Es un arreglo de bits que se escriben entre comillas dobles y por lo tanto
es un subconjunto de las cadenas de caracteres, ejemplos "00000001", "1011". En
VHDL se puede definir nmeros con estos tipos y es mediante la cadena de bits.
Dependiendo de la base en que se especifique el nmero se puede poner un prefijo B
(binario), O (octal), o X (hexadecimal). Ejemplo: B"11101001", O"351" y X"E9"
representan el mismo valor. Si no se pone ningn prefijo toma el valor en binario.
PROBLEMA 2.1: Relacione con una lnea los elementos de la columna de literales con la
columna de tipos de literales. Llame al instructor para registrar el avance. (20 puntos).
LITERALES
23
34.0
2#11010110#
219e2
2.3462e4
56.3
"Cmo ests?"
"10101011"
'e'
'1'
'01'
"1"
"1012"
"0011"
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

TIPOS DE LITERALES
Real
Entero
Entero
Real
Entero
Entero
Error de sintaxis
Bit
Cadena de caracteres
Cadena de caracteres
Cadena de caracteres
Carcter
Carcter
Cadena de bits

'0'

Cadena de bits

PROBLEMA 2.2:
Relacione con una lnea los literales que sean equivalentes en las 2 columnas.
24
54.78
X"18"
5478e4
"10000011"
131
18

0.5478e2
16#18#
2#10000011#
X"83"
16#12#
"00011000"
0.00005478e4

Llame al instructor para registrar el avance. (10 puntos).


TIPOS DE DATOS BSICOS ESCALARES
La norma internacional IEEE 1076 define los siguientes tipos de datos escalares para VHDL.
BOOLEAN: Puede tomar dos valores: verdadero o falso (TRUE, FALSE), de este tipo
son las expresiones condicionales usadas en las instrucciones condicionales. Por
ejemplo:
IF (a > 4) THEN
Z := '1';
END IF;

donde (a > 4) es de tipo BOOLEAN.


BIT: Puede tomar slo dos valores: '0' '1'. Cuando se define un valor literal se hace
entre comillas sencillas ( ' ), por ejemplo si la seal data es de tipo BIT, se le asigna un
valor fijo de esta manera: data <= '0'
INTEGER: Son datos cuyo contenido es un valor numrico entero, se puede delimitar el
rango de un dato de este tipo declarando su rango con la sentencia RANGE n TO m, con
n<m, por ejemplo un dato es declarado de tipo INTEGER RANGE 0 TO 255, slo puede
tener valores entre 0 y 255.
REAL: Representan valores de punto flotante (slo vlido para simulacin), ejemplo:
A:= 5.3; Este tipo tambin acepta que el dato sea delimitado con la sentencia RANGE.
TIME: Toma valores de tiempo pero slo se aplica en simulacin, ejemplo: retraso:=
10ns;

OBJETOS EN VHDL
En VHDL los objetos sirven para almacenar datos de diferentes tipos. Existen 3 clases de
objeto: constantes, seales y variables.
Una constante es un elemento que se inicializa en un determinado valor y no puede ser
cambiado. Pueden ser de cualquier tipo de dato. Las constantes se declaran antes del BEGIN de la
arquitectura. Toda constante debe ser inicializada con un dato del mismo tipo con que es declarada,
en caso contrario se marcar error de sintaxis, Ejemplos:
CONSTANT final: INTEGER:=15;
CONSTANT inicio: BOOLEAN:= FALSE;

Una constante no puede cambiar de valor despus de ser declarada, por ejemplo la siguiente
lnea de cdigo es un error de sintaxis.
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

10

inicio <= TRUE --Intento de cambiar el valor de una constante: Error de sintaxis

Las seales se declaran igual que las constantes, con la diferencia de que las seales pueden
cambiar de valor dentro del programa. Al igual que constantes, las seales pueden ser de cualquier
tipo de dato y se les puede dar un valor inicial si se requiere. Las seales se declaran antes del
BEGIN de la arquitectura. Ejemplos:
SIGNAL selec: STD_LOGIC;
SIGNAL datos: INTEGER := 255;

La inicializacin de una seal slo es valida para simulacin, lo que significa que cuando se
implemente el diseo en un circuito integrado, las seales que inicializamos no tendrn
necesariamente esos valores en un tiempo inicial. Las seales se declaran antes del BEGIN de una
arquitectura y son asignadas despus del BEGIN. Para asignar un valor a una seal es necesario
usar el operador de asignacin concurrente <=. Ejemplos:
select <= entrada AND intro;
datos <= 0;

DIFERERENCIAS ENTRE PUERTOS Y SEALES


Dentro de la arquitectura, los puertos de entrada y salida son tratados como seales pero con
un carcter ms global que las seales internas y con restricciones de acceso, es decir los puertos de
entrada son seales de slo lectura y los puertos de salida son seales de slo escritura. Por lo tanto,
no se puede escribir en un puerto de entrada y los puertos de salida no pueden ser ledos
directamente, es decir, no pueden ser operandos en ninguna expresin ni estar en el lado derecho de
ninguna asignacin, si es as se marcar error de sintaxis. Por ejemplo en el siguiente cdigo, que es
de un latch SR, las 2 sentencias despus del BEGIN son errores de sintaxis:
ENTITY latchSR IS
PORT (S, R : IN STD_LOGIC;
--Entradas
Q, Qn: OUT STD_LOGIC);
--Salidas
END latchSR;
ARCHITECTURE behavioral OF latchSR IS
BEGIN
Q <= R NOR Qn;
-- Error de sintaxis no se puede leer directamente
-- un puerto de salida.
Qn <= S NOR Q;
-- Error de sintaxis no se puede leer directamente
-- un puerto de salida.
END behavioral;

Para tener acceso de lectura a un puerto de salida es necesario usar una seal interna como
auxiliar, y asignar concurrentemente la seal auxiliar al puerto de salida; leyendo y escribiendo en
el puerto de salida a travs de la seal auxiliar. Recuerde que una asignacin concurrente es como
un wire o alambre, por lo tanto el puerto de salida siempre tendr el mismo valor que su seal
auxiliar. Adicionalmente, se tiene la posibilidad de inicializar el puerto de salida en un valor dado,
inicializando su seal auxiliar. El siguiente cdigo est libre de errores de sintaxis, es de un latch
SR, donde los puertos salida tienen que ser ledas para realimentar el circuito:

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

11

ENTITY latchSR IS
PORT (S, R : IN STD_LOGIC;
--Entradas
Q, Qn: OUT STD_LOGIC);
--Salidas
END latchSR;
ARCHITECTURE behavioral OF latchSR IS
SIGNAL Q_aux : BIT:= '0'; -- Seal interna auxiliar para leer el puerto de salida Q.
SIGNAL Qn_aux: BIT:= '1'; -- Seal interna auxiliar para leer el puerto de salida Qn.
BEGIN
Q <= Q_aux;
-- Al puerto de salida Q se le asigna la seal Q_aux.
Qn <= Qn_aux;
-- Al puerto de salida Qn se le asigna la seal Qn_aux.
Q_aux <= R NOR Qn_aux;-- Escribiendo en Q y leyendo Qn de manera indirecta.
Qn_aux <= S NOR Q_aux; -- Escribiendo en Qn y leyendo Q de manera indirecta.
END behavioral;

TIPOS DE DATOS BSICOS VECTORIALES (ARREGLOS)


Un arreglo es un conjunto de datos del mismo tipo. VHDL permite declarar arreglos de
cualquier tipo dato escalar o incluso arreglos de arreglos, con el uso de la sentencia ARRAY. La
dimensin de un arreglo es el nmero de elementos que ste posee. Para acceder a algn elemento
del arreglo es necesario hacerlo a travs de un valor entero llamado ndice, que se pone entre
parntesis despus del nombre del arreglo, por ejemplo la sentencia: vector(3) hace referencia al
elemento que tiene el ndice 3 del arreglo llamado vector.
Cuando se declara un arreglo de debe especificar los lmites del arreglo, entre los cuales
deber variar el ndice. VHDL ofrece gran libertad para elegir los lmites de un arreglo, incluso
pueden ser valores negativos. Adems tambin se tiene la opcin de ordenar los elementos del
arreglo de derecha a izquierda usando la sentencia DOWNTO entre los lmites; o de derecha a
izquierda con la sentencia TO entre los lmites del arreglo.
El estndar IEEE 1076 de 1987 define 2 tipos de datos vectoriales para VHDL: STRING y
BIT_VECTOR.
STRING: Es un arreglo de caracteres, sus lmites deben se mayores a 0. Por Ejemplo:
CONSTANT frase: STRING (1 TO 17):= "Esto es una frase";

La constante frase tiene sus elementos ordenados de derecha a izquierda, porque sus lmites
estn entre la sentencia TO, por lo tanto los ndices estn relacionados con sus elementos de la
manera siguiente.
ndice
Valor de cada
elemento de frase

10

11

12

13

14

15

16

17

'E'

's'

't'

'o'

''

'e'

's'

''

'u'

'n'

'a'

''

'f'

'r'

'a'

's'

'e'

Por lo tanto, frase(1)= 'E', frase(10)= 'n', frase(5)= ' ', frase(1 TO 7)= "Esto es", frase(6 TO 11)= "es
una", frase(13 TO 17)="frase", etc.
BIT_VECTOR: es un arreglo de datos tipo BIT, sus lmites deben declararse mayores o
iguales a 0. Por Ejemplo:
SIGNAL byte: BIT_VECTOR (7 DOWNTO 0):= "11001101";

La seal byte tiene los elementos ordenados de izquierda a derecha, ya que sus lmites estn
entre la sentencia DOWNTO, los ndices estn relacionados con los elementos del arreglo de la
manera siguiente.

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

12

ndice
Valor de cada elemento de byte

'1'

'1'

'0'

'0'

'1'

'1'

'0'

'1'

Por lo tanto, byte(0)= '1', byte(7)= '1', byte(5)= '0', byte(7 DOWNTO 4)= "1100", byte(5
DOWNTO 2)= "0011", byte(5 DOWNTO 0)="001101", etc.
En el pasado, se ha sustituido el tipo BIT por el tipo STD_LOGIC, debido a que ste es ms
adecuado para la simulacin y sntesis de circuitos lgicos. Asimismo, en el futuro usaremos el tipo
STD_LOGIC_VECTOR en lugar del tipo BIT_VECTOR.
PROBLEMA 2.4
Los datos de un diseo se declaran de la manera siguiente
CONSTANT byte STD_LOGIC_VECTOR (7 DOWNTO 0):= "01101100";
CONSTANT nibble STD_LOGIC _VECTOR (0 TO 3):= "0100";
CONSTANT cadena1 STRING (1 TO 13):= "el gato negro";

Complete las celdas vacas en la siguiente tabla, en la columna de expresin utilice solamente
los datos mencionados en este problema:
Expresin

Valor de la expresin
'1'

nibble(1)
nibble(0 TO 2)

"1100"
byte (6 DOWNTO 4)
"gato negro"
cadena1(4 TO 10)
"negro"

Llame al instructor para registrar el avance. (20 puntos).

ERRORES DE SINTAXIS
El sintetizador es un programa que convierte el cdigo de VHDL en un conjunto de circuitos
lgicos para su implementacin, este programa debe verificar que el diseo este correcto, es decir
que no tenga errores de sintaxis. Cuando el sintetizador detecta una falla en sintaxis, manda un
mensaje de error, indicando el tipo de error y la lnea de cdigo donde se detecto el error, en muchas
el error es detectado en una lnea pero la correccin se debe hacer en otra. Como programador en
VHDL, uno debe ser capaz de interpretar ese mensaje para corregir ese error. El sintetizador por
defecto que usa el software ISE es el XST de Xilinx, pero existen otros en el mercado. Para facilitar
la comprensin de los mensajes de error, el XST tiene un conjunto de acrnimos para referirse a los
smbolos y operadores de VHDL, en la tabla siguiente se pueden ver los ms comunes.

SMBOLO
=
<
>
>=
<=
=>
)

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

ACRNIMO
EQ
LT
GT
GE
LE
ROW
CLOSEPAR

13

'
:
;
,
+
*
/
.
:=

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

OPENPAR
TICK
COLON
SEMICOLON
COMMA
PLUS
MULT
DIV
POINT
AFFECT

14

UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA

CURSO: MDULO III: VDHL BSICO

ACTIVIDAD 3: Operadores en VHDL

Instructor: Dr. Ramn Antonio Flix Cuadras.


_______________________________________________________
Esta actividad est planeada con un enfoque de aprendizaje colaborativo, en el cual lo ms
importante es el trabajo en equipo para lograr el objetivo de aprender significativamente.
Para ello se formarn grupos de 3 personas, que tendrn que leer este documento, siguiendo
paso a paso las instrucciones que se indican aqu. La calificacin de esta actividad va de 0 a
100 y se asignar proporcionalmente al avance logrado al final de la sesin
Objetivo: Aplicar operadores de VHDL para disear circuitos digitales
_________________________________________________________________________

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

15

OPERADORES, OPERANDOS Y EXPRESIONES EN VHDL


Un operador es un smbolo (ejemplos: <, >, =) o una palabra clave (ejemplos NOT,
OR, AND) que indica que un dato o varios (operandos) sern procesados para formar una expresin
(ejemplos: a < b, z OR x, NOT k,), dicha expresin tendr un valor de acuerdo al operador y el
valor actual de l los operandos. Las expresiones en VHDL son muy similares a las de otros
lenguajes de programacin, por lo que se expondrn brevemente. Como es de esperarse no todos los
operadores pueden aplicarse para todos los tipos de datos, por lo que se debe poner atencin de
cales son los tipos de datos de los operandos definidos para cada operador, ya que si no es as, se
marcar un error de sintaxis a la hora de simular o implementar el diseo.

OPERADORES LGICOS
Son NOT, AND, NAND, OR, NOR, XOR y XNOR. El funcionamiento es el habitual para
este tipo de operadores. Los operandos deben de ser de tipo BIT, BIT_VECTOR, STD_LOGIC,
STD_LOGIC_VECTOR BOOLEAN. En el caso de realizarse estas operaciones sobre un dato de
tipo STD_LOGIC_VECTOR BIT_VECTOR, la operacin se realiza bit a bit.
EJEMPLO
Por ejemplo si a='1', b='0', data1="0101", data2="0011", cond1=TRUE, cond2=FALSE,
entonces, las siguientes expresiones tendrn los valores indicados en la tabla:
Expresin
NOT a
a AND b
a NAND b
a OR b
a NOR b
a XOR b
a XNOR b

Valor de la
expresin
'0'
'0'
'1'
'1'
'0'
'1'
'0'

Expresin
NOT data1
dato1 AND dato2
dato1 NAND dato2
dato1 OR dato2
dato1 NOR dato2
dato1 XOR dato2
dato1 XNOR dato2

Valor de la
expresin
"1010"
"0001"
"1110"
"0111"
"1000"
"0110"
"1001"

Expresin
NOT cond1
cond1 AND cond2
cond1 NAND cond2
cond1 OR cond2
cond1 NOR cond2
cond1 XOR cond2
cond1 XNOR cond2

Valor de la
expresin
FALSE
FALSE
TRUE
TRUE
FALSE
TRUE
FALSE

Todos los operadores lgicos tienen la misma precedencia, con excepcin de NOT cuya
precedencia en mayor a la de los dems. Por lo tanto, cuando se usan dos o ms operadores con la
misma precedencia en la misma expresin, es necesario usar parntesis para especificar
correctamente las operaciones deseadas, sino se hace, se marcara error de sintaxis, ya que no se
sabe cul de las operaciones debe realizarse primero. Por ejemplo, si deseamos implementar la
ecuacin lgica: c=xz+xz, no podemos expresarla como:
c <= x AND z OR NOT x AND z;

La instruccin correcta sera:


c <= (x AND z) OR ((NOT x) AND z);

OPERADOR DE CONCATENACIN (&)


Concatena arreglos (array) de manera que el resultado ser igual a los elementos en el mismo
orden en que fueron incluidos en la expresin, por ejemplo si palabra1="Esta", palabra2=" casa es ",
la expresin:
palabra1 & palabra2 & 'r' & "oja."

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

16

Es igual a: "Esta casa es roja.". Este operador puede aplicarse a cualquier tipo de arreglo,
STD_LOGIC_VECTOR, STRING, etc.
PROBLEMA 3.2
a) Los datos de un diseo se declaran de la manera siguiente
CONSTANT dato1 STD_LOGIC_VECTOR (7 DOWNTO 0):= "01101100";
CONSTANT nibble1 STD_LOGIC_VECTOR (3 DOWNTO 0):= "1001";
CONSTANT nibble2 STD_LOGIC_VECTOR (3 DOWNTO 0):= "0101";
CONSTANT cad1 STRING (1 DOWNTO 5):= "vamos";
CONSTANT cad2 STRING (1 DOWNTO 5):= " a la";
CONSTANT cad3 STRING (1 DOWNTO 6):= " playa";
CONSTANT cad4 STRING (1 DOWNTO 11):= " el domingo";

Complete las celdas vacas en la siguiente tabla, en la columna de expresin utilice


slo los datos mencionados en este problema:
Expresin

nibble1 & nibble2


nibble2 & nibble1
cad1 & cad2 & cad3 & cad4

Valor de la expresin
"10010101"
"011011000101"
"vamos a la playa el domingo"
"vamos el domingo"

cad4 & cad1 & cad2 & cad3

b) Suponga que x='1', z='0', byte1="01010111", byte2="11000010", error=TRUE,


inicio=FALSE, complete la columna Valor de la expresin en la siguiente tabla:
Expresin
x XOR (NOT z)
byte1 AND byte2
byte2 NOR byte1
(NOT error) OR inicio
(x AND z) OR ( (NOT x) AND z)

Valor de la expresin

Llame al instructor para registrar el avance. (30 puntos).

OPERADORES ARITMETICOS
Estos aritmticos slo estn definidos para los tipos numricos (REAL, INTEGER). Los tipos
BIT o BIT_VECTOR no son considerados como numricos, aunque se les use para representar
nmeros binarios. En VHDL existen los siguientes operadores aritmticos:
** (exponencial): Sirve para elevar un nmero a una potencia dada: 4**2 es 4 2=16. El
operador de la izquierda puede ser entero o real, pero el de la derecha slo puede ser entero.
ABS() (valor absoluto): Devuelve el valor absoluto de su argumento que puede ser de
cualquier tipo numrico.
* (multiplicacin): Sirve para multiplicar dos nmeros de cualquier tipo.
/ (divisin): Divide un dato de tipo numrico entre otro de igual tipo.
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

17

REM (residuo): Calcula el residuo de la divisin entera y se define como el operador que
cumple: x=int(x/z)*z+(x REM z). Los operandos slo pueden ser enteros. El resultado toma el
signo de z.
+ (suma y signo positivo): Este operador sirve para indicar suma, si va entre dos operandos
(z + x), o signo, si va al principio de una expresin (+z). La precedencia es diferente en cada caso.
Opera sobre valores numricos de cualquier tipo.
(resta y signo negativo): Cuando va entre dos operandos se realiza la operacin de
sustraccin (z x), y si va delante de una expresin le cambia el signo (z). Los operandos pueden
ser numricos de cualquier tipo
EJEMPLO
Suponga que en1=10, en2=3, en3= 2, re1=4.5, re2=1.5, re3= 3.5, la siguiente tabla muestra
el funcionamiento de los operadores aritmticos.

Operador
**
ABS
*
/
REM
+ (suma)
(resta)

Expresin con
enteros
en1 ** en2
ABS(en1)
en1 * en3
en1 / en2
en1 REM en2
en1 + en2
en1 en2

Valor de la
expresin
1000
10
20
3
1
13
7

Expresin con
reales
re1 ** en2
ABS(re3)
re1 * re2
re1 / re3
No aplica
re1 + re3
re1 re2

Valor de la
expresin
91.125
3.5
6.75
1.28571
No aplica
1.0
3.0

OPERADORES RELACIONALES
Devuelven siempre un valor de tipo booleano (TRUE o FALSE). Los tipos con los que
pueden operar dependen de la operacin:
=, /= (igualdad, desigualdad): El primero devuelve TRUE si los operandos son iguales o
FALSE en caso contrario. El segundo indica desigualdad, as que funciona de manera inversa. Los
operandos pueden ser de cualquier tipo, siempre y cuando ambos sean del mismo tipo y dimensin.
<, <=, >, >= (menor que, menor o igual que, mayor que, mayor o igual que): Tienen el
significado normal que en los lenguajes de programacin convencionales. La diferencia con los
anteriores es que los operandos deben ser de tipo numrico (enteros y reales). Ntese que el smbolo
<= tambin se usa para denotar la asignacin concurrente, as que para diferenciar las operaciones
hay que tomar el contexto en que se usa este smbolo.

PRECEDENCIA DE OPERADORES
La precedencia de los operadores es el orden en que se ejecutarn, cuando existen varios en
una misma expresin, a pesar del orden en que estn escritos; si un operador tiene mayor
precedencia que otro, se ejecutar primero, aunque aparezca despus del operador de menor
precedencia. La precedencia de operadores en VHDL se presenta en la siguiente tabla:
Mxima precedencia

()
**
*

ABS
/

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

NOT
MOD

REM

18

Mnima precedencia

(signo)
(resta)
/=
OR

+(signo)
+(suma)
=
AND

&
<
NAND

<=
NOR

>
XOR

>=
XNOR

EJEMPLO
En la siguiente expresin hay varios operadores con diferente precedencia.

5 + 6 * 2 + ABS(3) + 2 ** 3 10 / 2 3*(1+2)
5 + 6 * 2 + ABS(3) + 2 ** 3 10 / 2 3 * 3
5+6*2 +

5 + 12

10 / 2 3 * 3
5

14
Aunque la suma (1+2) est hasta el final de la expresin, como est entre parntesis, toma la
mayor precedencia se ejecuta primero. Los operadores ABS() y ** siguen en precedencia entre los
dems operadores, stos se ejecutan, y despus los operadores que siguen en precedencia, la
multiplicacin y la divisin, y por ltimo los 3 operadores de de suma y los 2 de resta, que tienen la
misma precedencia, dando como resultado de la expresin el nmero entero 4.
PROBLEMA 3.2:
a) Suponga que cond1=TRUE, cond2=TRUE, cond3=TRUE, dato1=3, dato2=2 y
dato3=1, y tomando en cuenta la precedencia de los operadores, complete la columna
Valor de la expresin en la siguiente tabla:
Expresin
dato1 * dato2 + 2
dato3 + dato1 * dato2
(dato1 + 1) * 4
dato1 * 5 + 2
6 * ( dato3 1)
dato1 = dato2 OR dato1 = 3

Valor de la expresin

Llame al instructor para registrar el avance.

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

19

UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA

CURSO: MDULO III: VDHL BSICO

ACTIVIDAD 4: Operadores de asignacin Concurrente

Instructor: Dr. Ramn Antonio Flix Cuadras.


_______________________________________________________
Esta actividad est planeada con un enfoque de aprendizaje colaborativo, en el cual lo ms
importante es el trabajo en equipo para lograr el objetivo de aprender significativamente.
Para ello se formarn grupos de 3 personas, que tendrn que leer este documento. Uno de
los integrantes deber operar la PC siguiendo paso a paso las instrucciones que se indican
aqu. La calificacin de esta actividad va de 0 a 100 y se asignar proporcionalmente al
avance logrado al final de la sesin
Objetivo: Utilizar operadores de asignacin concurrente para disear circuitos
combinacionales.
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

20

_________________________________________________________________________

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

21

El objetivo de esta actividad es conocer el uso de las asignaciones condicionales y


concurrentes de VHDL
Asignacin condicional WHEN-ELSE
Le asigna a una seal o puerto de salida alguno de los varios valores, segn se cumpla
alguna de las condiciones propuestas. A continuacin se presenta la sintaxis con una
explicacin en lenguaje natural (coloquial) escrita como comentarios:
salida <= valor1 WHEN condicion1 ELSE
valor2 WHEN condicion2 ELSE

valorN WHEN condicionN ELSE


valorM;

-- Se asigna a salida el valor1 cuando condicion1 sea


-- verdadera, si no (ELSE)
-- se asigna a salida el valor2 cuando condicion2 sea
-- verdadera, si no (ELSE)
-- se asigna a salida el valorN cuando condicionN sea
-- verdadera, si no (ELSE)
-- se cumplen ninguna de las condiciones
-- anteriores, se le asigna a salida el valorM.

La asignacin WHEN-ELSE consiste de una salida (salida), que puede ser una seal
interna o puerto de salida, de cualquier tipo de dato, dimensin y rango, y de una serie de
sentencias WHEN, cada una ellas relacionadas con un valor (valor1, valor2, , valorN y
valorM), del mismo tipo que la salida, y con una condicin en forma de expresin de tipo
BOOLEAN (condicion1, condicion2, , y condicionN).
La salida ser asignada con alguno de los valores listados, dependiendo de los valores
de las expresiones booleanas (TRUE FALSE), por ejemplo si, condicion2=TRUE,
entonces a salida se le asignar valor2; si, condicionN=TRUE, entonces a salida se le
asignar valorN. Cuando ms de una condicin sea verdadera, la salida tomar el valor de
la condicin que se escribi antes, esto permite darle a la instruccin una prioridad. Por
ejemplo, si condicion1 y condicion2 son verdaderas, entonces a salida se le asignar
valor1, ya que fue definido primero en la sentencia.
En toda expresin condicional, que describa hardware de forma concurrente, es
importante incluir todas las opciones posibles y contemplar todos los casos posibles de una
variable. En este sentido es obligatorio siempre finalizar esta expresin condicional con un
ELSE antes de definir el ltimo valor (valorM).
El siguiente es un decodificador en VHDL de 2 a 4 lneas, usando la asignacin
concurrente WHEN-ELSE. Para los puertos de entrada, las lneas de seleccin es un puerto
(de 2 bits) de tipo STD_LOGIC_VECTOR (1 DOWNTO 0), con los elementos ordenados
de derecha a izquierda; las salidas tambin estn agrupadas, pero en un puerto (de 4 bits) de
tipo STD_LOGIC_VECTOR (3 DOWNTO 0).
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY dec2a4 IS
PORT(sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
salida: OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
END dec2a4;
ARCHITECTURE behavioral OF dec2a4 IS

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

22

BEGIN
salida <= "0001" WHEN sel="00" ELSE
"0010" WHEN sel="01" ELSE
"0100" WHEN sel="10" ELSE
"1000";
end Behavioral;

--salida es igual a "0001" cuando sel="00", si no


--salida es igual a "0010" cuando sel="01", si no
--salida es igual a "0100" cuando sel="10", si no
--salida es igual a "1000" para los otros casos (sel="11").

En la Figura 4.1 se muestra una simulacin del cdigo anterior.

Figura 4.1: Simulacin de un decodificador de 2 a 4.

PROBLEMA 4.1
a) Disee un multiplexor de 4 a 1 en VHDL usando la instruccin WHEN-ELSE.
dicho diseo deber tener una Entity con un puerto de entrada (SEL) de 2 bits, para las
lneas de seleccin, un puerto de entrada (X) de 4 bits para los datos de entrada del mux y
un puerto de salida (Z) de un bit. Como es de esperarse las entradas y la salida se
relacionarn como lo ndica la siguiente tabla.
Tabla 4.1. Tabla de verdad de un multiplexor de 4 a 1.
SEL(1) SEL(0)
Z
0
0
X(0)
0
1
X(1)
1
0
X(2)
1
1
X(3)

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

23

UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA

CURSO: MDULO III: VDHL BSICO

ACTIVIDAD 5: Operadores de asignacin en serie

Instructor: Dr. Ramn Antonio Flix Cuadras.


_______________________________________________________
Esta actividad est planeada con un enfoque de aprendizaje colaborativo, en el cual lo ms
importante es el trabajo en equipo para lograr el objetivo de aprender significativamente.
Para ello se formarn grupos de 3 personas, que tendrn que leer este documento.
Siguiendo paso a paso las instrucciones que se indican aqu. La calificacin de esta
actividad va de 0 a 100 y se asignar proporcionalmente al avance logrado al final de la
sesin
Objetivo: Aplicar operadores de asignacin concurrente para disear circuitos
secuenciales.
_________________________________________________________________________
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

24

El objetivo de esta actividad es conocer instrucciones en serie en los PROCESS, y las


asignaciones condicionales en serie de VHDL.

EL BLOQUE DE EJECUCIN SERIE: PROCESS


La forma de entrar en la ejecucin serie dentro de un programa en VHDL es mediante la
definicin de un bloque PROCESS. La declaracin es como sigue:
proc_id:
PROCESS(lista sensible)
--declaraciones de constantes y variables
BEGIN
--instrucciones en serie
END PROCESS proc_id;

El proc_id es una etiqueta opcional para asignarle nombre a los diferentes procesos de un
programa. La lista sensitiva o sensible es tambin opcional y contiene una lista de seales separadas
por comas. La ejecucin del PROCESS se activa cuando se produce un evento, o cambio, en alguna
de las seales de la lista sensible. En el caso de no existir lista sensible, la ejecucin se controla
mediante el uso de sentencias WAIT dentro del PROCESS. Esta sentencia WAIT se analizar ms
adelante.
Un PROCESS se ejecuta concurrentemente con respecto a otros PROCESS y es til
principalmente para describir circuitos secuenciales, pero tambin funciona para circuitos
combinacionales. Anlogamente a la programacin convencional, un PROCESS puede verse como
una funcin, que se ejecuta slo cuando alguna de las seales de la lista sensible cambia de valor.
Para efectos de simulacin, un PROCESS junto con las declaraciones e instrucciones en serie
que tiene dentro, se considera como una sola instruccin concurrente. El programa de simulacin
detendr el avance del tiempo de simulacin hasta que todos los PROCESS terminen de ejecutarse.
Si dentro de un PROCESS se asigna un valor a alguna seal, sta cambiar a ese valor cuando se
termine de ejecutarse el PROCESS y el simulador incremente el tiempo de simulacin. Para efectos
de sntesis el uso de PROCESS es ms delicado, ya que puede darse el caso de diseos que
funcionen correctamente para simulacin pero no sean realizables en el dispositivo especificado.

Ejemplo 5.1:
El siguiente cdigo es de un PROCESS con una lista sensitiva (A,B,C), dentro del PROCESS
se asigna valor a las seales X,Y y Z, dependiendo del valor de las seales A, B y C.
PROCESS(A,B,C)
BEGIN
X <= A AND B;
Y <= B OR C;
Z <= A XOR C;
END PROCESS;

Como se puede apreciar en la Figura 5.1, las seales X, Y y Z se comportan como si hubieran
sido asignadas concurrentemente (fuera del PROCESS), debido a que todas las seales de las que
dependen estn en la lista sensible, por lo tanto, cuando cambie A, B, C el PROCESS se ejecutar
y al final de la ejecucin se actualizar el valor de X, Y y Z.

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

25

Figura 5.1: Simulacin del PROCESS con la lista sensible (a,b,c).


Ahora suponga que en el mismo cdigo la lista sensible es solamente (B, C), entonces la
respuesta de las seales que dependen de A, sern diferentes a las de la Figura 5.1, ya que cuando
cambie la seal A no se ejecutar el PROCESS, slo cuando cambien las seales B C.
En la Figura 5.2 se muestra la simulacin del PROCESS con la lista sensible (B, C), debido a
las seales X y Z, dependen de la seal A, por lo tanto tienen un comportamiento distinto al de la
Figura 5.1.

Figura 5.1: Simulacin del PROCESS con la lista sensible (b,c).

PROBLEMA 5.1
a) Suponga el cdigo del Ejemplo 5.1, pero la lista sensible del PROCESS es (A, C). Dibuje
las formas de onda de X, Y y Z en la Figura 5.3.

Figura 5.3: Simulacin del PROCESS con la lista sensible (a,c).

Llame al instructor para registrar el avance. (40 puntos).

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

26

SENTENCIA IF-THEN
La construccin IF-THEN-ELSE es usada para seleccionar un conjunto de sentencias para ser
ejecutadas segn la evaluacin de una condicin o conjunto de condiciones, cuyo resultado debe ser
TRUE o FALSE. Si la condicin es verdadera, las sentencias seguidas a la palabra THEN son
ejecutadas. Si la condicin es falsa, la sentencia secuencial seguida a la palabra ELSE es ejecutada.
La construccin debe ser cerrada con END IF.
La sentencia IF-THEN-ELSE puede ser expandida para incluir la sentencia ELSIF, la cual nos
permite incluir una segunda condicin si no se ha cumplido la primera (la cual tiene prioridad). Su
estructura es la siguiente:
IF condicion1 THEN
--instrucciones1;
ELSIF condicion2 THEN

-- Si la condicion1=TRUE se ejecuta las intrucciones1


-- Aqu se definen las instrucciones1.
-- Si condicion1=FALSE, pero se cumple
-- condicion2=TRUE, se ejecutan las intrucciones2.
-- Aqu se definen las instrucciones2.

--instrucciones2;
ELSIF condicionM THEN
--instruccionesM;
ELSE
--instruccionesN;
END IF;

-- Si las condiciones anteriores son falsas, pero se cumple


-- condicionM=TRUE, se ejecutan las intruccionesM.
-- Aqu se definen las instruccionesM.
-- Si no se cumple ninguna de las condiciones definidas en
-- el IF y los ELSIF, se ejecutan las intruccionesN.
-- Aqu se definen las instruccionesN.
-- Se cierra el IF.

La estructura en serie IF-THEN gran parecido a la estructura concurrente WHEN-ELSE ya


que ambas definen cierta prioridad con el orden en la condiciones son escritas.

Ejemplo 5.2:
A continuacin se presenta un diseo de un decodificador de 2 a 4 lneas, usando la sentencia
IF-THEN-ELSIF-ELSE:
ENTITY dec2a4 IS
Port(sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
salidas: OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
END dec2a4;
ARCHITECTURE Behavioral OF dec2a4 IS
BEGIN
PROCESS(SEL)
BEGIN
IF SEL="00" Then
salidas <= "1110";
ELSIF SEL="01" then
salidas <= "1101";
ELSIF SEL="10" then
salidas <= "1011";
ELSE
salidas <= "0111";
END IF;
END PROCESS;
END Behavioral;

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

27

RECOMENDACIONES PARA EL USO DE LA SENTENCIA IF


Hay ciertas recomendaciones, en el uso de los IF, que se deben seguir para lograr un diseo
correcto.
1. Utilice una sola estructura IF dentro de un PROCESS.
2. Para verificar varias condiciones, preferentemente, utilice ELSIF dentro de la
estructura IF.
3. Nunca asigne valores a las mismas seales en diferentes PROCESS.
4. Evite, en la medida de lo posible, el uso de IF anidados; slo utilcelos para hacer ms
compacto el cdigo.

PROBLEMA 5.2
a) Suponga el cdigo del Ejemplo 5.2, pero la lista sensible del PROCESS es slo (A) en
lugar de (A, B). Complete la forma de onda de la seal X en la Figura 5.9.

Figura 5.9: Simulacin de IF-THEN con lista sensible (A).


b) Disee un multiplexor de 4 a 1, usando exclusivamente la sentencia IF-THEN-ELSIFELSE, con la siguiente entidad:
ENTITY mux4a1 IS
PORT( sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
entrada: IN STD_LOGIC_VECTOR (3 DOWNTO 0)
salida: OUT STD_LOGIC);
END mux4a1;

Llame al instructor para registrar el avance. (40 puntos).

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

28

UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA

CURSO: CIRCUITOS SECUENCIALES

ACTIVIDAD 6: Diseo de Circuitos Secuenciales en VHDL

Instructor: Dr. Ramn Antonio Flix Cuadras.


_______________________________________________________
Esta actividad est planeada con un enfoque de aprendizaje colaborativo, en el cual lo ms
importante es el trabajo en equipo para lograr el objetivo de aprender significativamente.
Para ello se formarn grupos de 3 personas, que tendrn que leer este documento, siguiendo
paso a paso las instrucciones que se indican aqu. La calificacin de esta actividad va de 0 a
100 y se asignar proporcionalmente al avance logrado al final de la sesin
El objetivo de esta actividad es disear circuitos secuenciales latches y flip-flops en VHDL

_________________________________________________________________________

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

29

Los circuitos secuenciales son aquellos que tienen componentes que almacenan datos y que
su estado siguiente es consecuencia de su estado actual. Entre estos circuitos se destacan los latches,
los registros, los flip-flops, los contadores, las memorias, las mquinas de estados, etc.

TIPOS DE CIRCUITOS SECUENCIALES


Los circuitos secuenciales se pueden clasificar en dos grandes categoras:
Los circuitos sncronos: todo cambio en su estado se sincroniza por una nica seal
de reloj, ya sea durante el flaco positivo (cambio de '0' a '1') negativo (cambio de '1'
a '0').
Los circuitos asncronos: los cambios del estado se dan por cambios en las entradas, y
no estn sincronizados con una nica seal de reloj, como el ejemplo anterior del
latch.
Las arquitecturas de los dispositivos lgicos programables (CPLD y FPGA) estn
optimizadas para la implementacin de circuitos secuenciales con una sola seal de reloj, y aunque
s tengan la capacidad de implementar cierto tipo de circuitos asncronos, stos deben evitarse en
la medida de lo posible.

DESCRIPCIN DE LATCHES
Un latch se caracteriza por tener una seal, que al estar inactiva guarda el estado anterior de la
salida y cuando se activa la salida toma el valor de la entrada. La forma ms adecuada de describir
el comportamiento de los circuitos secuenciales en VHDL, es a travs del uso de PROCESS, ya que
estos se ejecutan slo cuando alguna seal de la lista sensible cambia de valor, lo cual suele ser muy
ventajoso, como se aprecia en el siguiente ejemplo de un latch D:
entity latchD is
Port (enable : in std_logic;
D : in std_logic;
Q : out std_logic);
end latchD;
architecture Behavioral of latchD is
signal Q_aux: std_logic:='0';--Seal auxiliar para poder inicializar la salida Q
begin
Q <= Q_aux;
-- A la salida Q se le asigna concurrentemente la seal interna Q_aux
latch: PROCESS(enable, D)
begin
if enable = '1' then
Q_aux <= D;
-- El valor de D pasa a Q_aux y por lo tanto al puerto de salida Q.
end if;
end PROCESS;
end Behavioral;

Como este diseo es un circuito secuencial, es decir con memoria, el estado de la salida es
indefinido inicialmente, como cuando se energiza un latch flip-flop, Para inicializar el puerto de
salida Q se declara seal interna inicializada (Q_aux) y se asigna concurrentemente la seal Q_aux
al puerto de salida Q. As, en un tiempo inicial, Q tendr el valor con se inicializ a la seal Q_aux
Todo valor que deseemos asignarle a Q se lo asignaremos a Q_aux, para que el puerto Q tome
el valor de Q_aux, debido a la asignacin concurrentemente entre ellos. En la Figura 6.1 se pueden
apreciar las formas de onda de las seales del latch D.

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

30

Figura 6.1: Forma de onda de las seales un latch D.


El comportamiento de este diseo se resume en la siguiente tabla:
Tabla 6.1: Comportamiento de un latch
enable
D
Qi+1
'1'

D
'0'

Q (sin cambio)
Donde D es la entrada, Q es el estado actual, y Q i+1 es el estado de la seal Q_aux y del puerto
Q al final de la ejecucin del process. Note que la condicin (enable= '0'), donde no puede cambia la
salida Q, no es necesario de especificarse en el cdigo.

PROBLEMA 6.1
Usando un PROCESS, disee en un latch SR con la siguiente entidad:
entity LatchSR is
Port ( S : in STD_LOGIC;
R : in STD_LOGIC;
Q : out STD_LOGIC;
Qn : out STD_LOGIC); -- Q
end LatchSR;

Use seales internas para poder inicializar los puertos Q y Qn.

Tabla 6.2: Tabla caracterstica de un latch SR.


S R Q Q+1 Qn+1
0 0 Q
Qn
0 1 0
1
1 0 1
0
1 1 Q
Qn
Llame al instructor para registrar el avance. (10 puntos).

DESCRIPCIN DE FLIP-FLOP TIPO D


Para describir el comportamiento de un circuito sncrono es indispensable distinguir los flacos
(de subida y de bajada) de una seal de reloj, para ello existen varias opciones, la ms importante
requiere del atributo 'EVENT, que tiene el valor TRUE en el instante que una seal tiene un cambio,
su sintaxis es:
clk'EVENT

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

31

Donde clk es una seal o puerto, esto al atributo 'EVENT ideal para usarse dentro de los
PROCESS para detectar los flancos de subida o de bajada. Por ejemplo para detectar los flancos de
subida en la seal clk, es necesaria la expresin clk'EVENT AND clk='1', que tendr el valor TRUE
slo cuando haya habido un cambio en clk y el valor actual de clk sea '1'. Por otro lado, para
detectar los flancos de bajada de clk se usa la expresin clk'EVENT AND clk='0', que tendr el
valor TRUE cuando haya habido un cambio en clk y el valor actual de clk sea '0'. En la Figura 6.3
se muestran las formas de clk y de las expresiones mencionadas con el atributo 'EVENT.

Figura 6.3: Formas de onda usando el atributo 'EVENT.

EJEMPLO 6.1
El siguiente cdigo es de un flip-flop tipo D:
entity FFD is
Port ( CLK : in STD_LOGIC;
D : in STD_LOGIC;
Q : out STD_LOGIC);
end FFD;
architecture Behavioral of FFD is
Signal Qaux: std_logic:= '0'; -- Se declara una seal interna para leer el contenido de un puerto de
-- salida, al mismo tiempo se inicializa.
begin
Q<=Qaux;
--Al puerto de salida se le asigna concurrente el valor del puerto de salida
FFD: process (clk) --FFD: Flip-Flop D
begin
If clk'EVENT AND clk='1' then - Si hay un flanco de subida en CLK, entonces
Qaux<=D;
--a la seal Qaux se le asigna D (ecuacin caracterstica).
end if;
end process;
end Behavioral;

Siempre que se desee acceder (leer y escribir) el puerto de salida, se debe hacer a travs de la
seal Qaux, ya que la asignacin concurrente hace la funcin de un alambre; por lo tanto el
contenido de Q siempre ser igual al de Qaux.
A pesar que la seal Q se le asigna valor de la seal D, los cambios de esta ltima slo
tendrn efecto sobre Q, en los flancos de subida de clk (como se puede apreciar en la Figura 6.4), ya
que es la nica seal en la lista sensitiva del process.
El comportamiento de este diseo se resume en la siguiente tabla:
Tabla 6.3: Comportamiento de un Flip-flop D
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

32

clk

0
1

Qi+1
D (Ecuacin caracterstica)
Q (sin cambio)
Q (sin cambio)

Donde el smbolo significa un flanco de subida.

Figura 6.4: Formas de onda de las seales de un flip-flop tipo D.

PROBLEMA 6.2
a) Disee en VHDL un flip-flop tipo T activado en flanco de subida, con la siguiente entity:
Entity FFT is
Port( clk: in STD_LOGIC;
T: in STD_LOGIC;
Q: out STD_LOGIC);
end FFT;

El comportamiento de este diseo se resume en la siguiente tabla:


Tabla 6.4: Comportamiento de un Flip-flop T
clk
Qi+1

T Q (Ecuacin caracterstica)
0
Q (sin cambio)
1
Q (sin cambio)
Debido a que la ecuacin caracterstica depende del valor actual del puerto de salida Q, a la
hora de describir el comportamiento de este flip-flop se debe tomar conciencia que VHDL no
permite la lectura directa de un puerto de este tipo. Para poder leer el contenido de un puerto de
salida Q es necesario usar una seal auxiliar interna (Q_aux) que est conectada al puerto en
cuestin. Siempre que se desee leer el puerto de salida se debe hacer a travs de la seal Q_aux, ya
que la asignacin concurrente hace la funcin de un alambre; por lo tanto el contenido de Q siempre
ser igual al de Q_aux.
b) Disee en VHDL un flip-flop tipo JK activado en flanco de bajada, con la siguiente entity:
entity FFJK is
Port ( CLK : in STD_LOGIC;
J : in STD_LOGIC;
K : in STD_LOGIC;
Q : out STD_LOGIC);
end FFJK;

El comportamiento de este diseo se resume en la siguiente tabla:

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

33

Tabla 6.5: Comportamiento de un Flip-flop JK


clk
Qi+1

JQ + QK (Ecuacin caracterstica)
0
Q (sin cambio)
1
Q (sin cambio)
LLAME AL INSTRUCTOR PARA REGISTRAR EL AVANCE. (30 puntos)

DESCRIPCIN DE CIRCUITOS SNCRONOS-ASNCRONOS


Los circuitos sncronos-asncronos son aquellos que tienen ciertas funciones sicronizadas con
una seal de reloj y otras que no dependen de ninguna seal de reloj, por ejemplo un clear de un
Flip-Flop (FF).
Los FF tienen una funcin primaria: transferir a Q el contenido de D, para un FF tipo D;
negar la salida Q cuando la seal T este activa, para un FF tipo T; etc. Esta funcin primaria suele
ser sncrona, pero pueden tener otras funciones secundarias, como forzar la salida a '0' '1'. Xilinx,
al igual que varios autores de sistemas digitales, sigue la siguiente convencin para seales que
fuerzan la salida de un FF:
CLEAR (Asncrono): cuando esta seal est activa pone la salida a '0', sin depender
de ninguna otra seal.
PRESET (Asncrono): si esta seal se activa, la salida del FF se pone en '1', sin
depender de ninguna otra seal.
RESET (Sncrono): Si hay un flanco (positivo o negativo) en la seal de reloj y el
RESET est activo, la salida del FF es forzada a '0'.
SET (Sncrono): Si esta seal est activa y ocurre un flanco (positivo o negativo) en
la seal de reloj, la salida del FF se pone en '1'.
Las nicas 2 funciones asncronas que se recomiendan usar cuando se utilizan dispositivos
lgicos programables de Xilinx son el CLEAR y el PRESET.
Otra funcin secundaria muy comn es la de Clock Enable (CE), que al estar activa habilita el
efecto del reloj en un FF, y al estar desactivada lo deshabilita.
En la librera IEEE existen funciones ms eficientes para detectar los flancos de subida y
bajada. En el futuro usaremos estas funciones, sustituyendo la expresin clk'EVENT AND clk='1'
por rising_edge(clk) para detectar los flancos de subida y sustituiremos
clk'EVENT AND clk='0' por falling_edge(clk) para detectar los flancos de bajada.

EJEMPLO 6.2: Descripcin de un FF con clock enable y clear


A continuacin se presenta el siguiente cdigo en VHDL que describe el
comportamiento de un FF con Clock Enable y Clear asncrono:
entity FFDCE is
Port ( CLK : in STD_LOGIC;
CLR : in STD_LOGIC;
CE: in STD_LOGIC;
D : in STD_LOGIC;
Q : out STD_LOGIC);
end FFDCE;
architecture Behavioral of FFDCE is
signal Qaux: std_logic:='0'; --Seal auxiliar para asignarle un valor inicial a Q.
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

34

begin
Q<=Qaux;
--A Q se le asigna Qaux.
process (CLK, CLR)
--El Valor de Qaux slo se modificar cuando
begin
--haya un cambio en CLK y CLR.
if CLR='1' then
--CLR tiene preferencia por eso se verifica primero.
Qaux<='0'; --Q se pone en cero.
elsif rising_edge(CLK) then
--Se verifica el flanco de subida
if CE='1' then
--Se verifica el CE.
Qaux<= D;
--D se transfiere a Q.
end if;
end if;
--Si no se cumplen ninguna de las condiciones, Q mantiene
su valor
end process;
end Behavioral;

Cuando el Clock Enable est en alto y el clear asncrono (CLR) est en bajo, el contenido de
la entrada (D) se transfiere a la salida (Q) durante el flaco positivo del reloj (CLK). Cuando CLR
est en alto, se ignoran las dems seales y Q se pone en un valor bajo. Cuando CE est
desactivado, las transiciones de CLK son ignoradas, y Q conserva su valor.
El comportamiento de este diseo se resume en la siguiente tabla:
Tabla 6.6: Comportamiento de un un FF con Clock Enable y Clear asncrono.
CLR
CE
D
CLK
Qi+1
'1'

'0'
'0'
'1'

D
'0'
'0'

Q (sin cambio)
Donde Q es el estado actual, y Qi+1 es el estado en el instante siguiente, el smbolo indica
una condicin no-importa y smbolo significa un flanco de subida.
Note en la forma de onda de la Figura 2, como Q se pone en cero
inmediatamente cuando se activa el CLEAR.

Figura 6.5: Implementacin fsica de un FF con CE y CLR en un CPLD de Xilinx.

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

35

Figura 6.6: Forma de onda de un FF con Clock Enable y Clear asncrono.

EJEMPLO 6.4: DESCRIPCIN DE UN FF CON CLOCK ENABLE Y RESET

El siguiente cdigo en VHDL describe el comportamiento de un FF con


CLOCK ENABLE y RESET sncrono.
entity FFDRE is
Port ( CLK : in STD_LOGIC; --CLOCK
RST : in STD_LOGIC; --RESET
CE: in STD_LOGIC;
--CLOCK ENABLE
D : in STD_LOGIC;
--Entrada D
Q : out STD_LOGIC); --Salida Q
end FFDRE;
architecture Behavioral of FFDRE is
signal Qaux: std_logic:='0'; --Seal auxiliar para signarle un valor inicial a Q.
begin
Q<=Qaux;
--A Q se le asigna Qaux.
process (CLK)
--El valor de Qaux slo se modificar cuando haya un
cambio en CLK.
begin
if rising_edge(CLK) then
--Las asignaciones se sincronizan con el flanco de
subida de CLK.
if RST='1' then
--RST tiene preferencia por eso se verifica
primero.
Qaux<='0'; --Q se pone en cero.
elsif CE='1' then
--Se verifica CE.
Qaux<= D; --D se transfiere a Q.
end if;
end if;
end process;
end Behavioral;

Observe que el RESET (RST) no est en la lista sensitiva, a diferencia del


cdigo del Ejemplo 6.2 en que el CLEAR s est en la lista, lo cul se debe a que
la seal Q no debe ponerse en cero instantneamente con la activacin de RST,
sino que debe hacerlo en sincrona con el flanco de subida de reloj (CLK). Esto
se puede apreciar en la forma de onda de la Figura 6.8.
Tabla 6.7: Comportamiento de un un FF con Clock Enable y Reset asncrono.
RST
CE
D
CLK
Qi+1
'1'

0
'0'
'1'

D
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

36

'0'

'0'

'1'

Q (sin cambio)

Figura 6.7: Implementacin fsica de un FF con CE y RESET en un CPLD de Xilinx.

Figura 6.8: Forma de onda de un FF con Clock Enable y Reset sncrono.

PROBLEMA 6.3
a) Disee un flip-flop tipo T en VHDL con CLOCK ENABLE, flanco de subida, la funcin
sncrona RESET y la funcin asncrona CLEAR, que tiene la mayor preferencia, usando la siguiente
entity:
entity FFTRCE is
Port ( CLK : in STD_LOGIC;
CLR : in STD_LOGIC;
RST : in STD_LOGIC;
CE: in STD_LOGIC;
T : in STD_LOGIC;
Q : out STD_LOGIC);
end FFTRCE;

LLAME AL INSTRUCTOR PARA REGISTRAR EL AVANCE. (30 PUNTOS)

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

37

UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA

CURSO: CIRCUITOS SECUENCIALES

ACTIVIDAD 7: Descripcin Estructural de Circuitos Lgicos en


VHDL

Instructor: Dr. Ramn Antonio Flix Cuadras.


_______________________________________________________
Esta actividad est planeada con un enfoque de aprendizaje colaborativo, en el cual lo ms
importante es el trabajo en equipo para lograr el objetivo de aprender significativamente.
Para ello se formarn grupos de 3 personas, que tendrn que leer este documento. La
calificacin de esta actividad va de 0 a 100 y se asignar proporcionalmente al avance
logrado al final de la sesin
_________________________________________________________________________

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

38

El objetivo de esta actividad es comprender la descripcin estructural de circuitos lgicos en


VHDL.
Una de las principales ventajas del lenguaje VHDL es la posibilidad de reutilizar diseos
previamente hechos, para formar diseos ms complejos de una manera estructurada. Permitiendo,
por ejemplo, que varias personas trabajen en paralelo en diseando y verificando las partes de un
proyecto complejo; una vez probadas todas las partes del diseo, stas se pueden integrar de manera
simple para formar el diseo final.

DECLARACIN Y USO DE COMPONENTES

El modelo estructural permite tener dentro de un diseo, llamado


comnmente mdulo TOP, varios mdulos conectados a travs de seales
internas. Estos mdulos o componentes deben ser definidos por medio de una
entidad y una arquitectura, las cuales pueden ser declaradas en el mismo
archivo de que el mdulo TOP o en archivos separados, pero deben estar en el
mismo proyecto de software de desarrollo.
En el mdulo TOP, cada componente se declara con la palabra clave
COMPONENT, usualmente en la arquitectura, antes del BEGIN. La sintaxis de la
declaracin de un componente es:
COMPONENT nombre_componente IS
PORT (puerto_1 : IN/OUT tipo_1;
puerto_2 : IN/OUT tipo_2;

puerto_n : IN/OUT tipo_N);


END COMPONENT;

Despus del BEGIN se agregan instancias (copias, replicas o referencias)


de los componentes; se puede agregar un nmero ilimitado de instancias de
cada componente declarado. Cada instancia debe contener la sentencia
instruccin PORT MAP, en la cual se conectarn, los puertos de la entidad del
componente con las seales o puertos del mdulo TOP. La sintaxis para agregar una
instancia de un componente es:
nombre_instancia : nombre_componente
PORT MAP (puerto_1=>dato_1,
puerto_2=>dato_2,

puerto_n=>dato_N);

Donde dato_1, dato_2, , y dato_N pueden ser puertos o seales internas del mdulo TOP.
El operador => funciona de manera similar al de asignacin concurrente, conectando los puertos
de la copia (nombre_instancia) del componente (nombre_componente) con las seales o puertos del
diseo TOP.

EJEMPLO 7.1:
Suponga que existen 3 diseos en VHDL dentro en un proyecto del software ISE. Estos
diseos describen el comportamiento de compuertas lgicas: una AND de dos entradas (gate_and2),

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

39

una OR de dos entradas (gate_or2) y una AND de dos entradas con una entrada negada
(gate_and2b1). Los cdigos de los archivos de dichos diseos se presentan a continuacin.
--Cdigo del archivo gate_and2
ENTITY gate_and2 IS
PORT ( ent1 : IN STD_LOGIC;
ent2 : IN STD_LOGIC;
sal : OUT STD_LOGIC);
END gate_and2;
ARCHITECTURE Behavioral OF gate_and2 IS
BEGIN
sal <= ent1 AND ent2;
END Behavioral;
--Cdigo del archivo gate_or2
ENTITY gate_or2 IS
PORT ( ent1 : IN STD_LOGIC;
ent2 : IN STD_LOGIC;
sal : OUT STD_LOGIC);
END gate_or2;
ARCHITECTURE Behavioral OF gate_or2 IS
BEGIN
sal <= ent1 OR ent2;
END Behavioral;
--Cdigo del archivo gate_and2b1
ENTITY gate_and2b1 IS
PORT ( ent1 : IN STD_LOGIC;
ent2 : IN STD_LOGIC;
sal : OUT STD_LOGIC);
END gate_and2b1;
ARCHITECTURE Behavioral OF gate_and2b1 IS
BEGIN
sal <= ent1 AND (NOT ent2);
END Behavioral;

Ahora se desea disear un multiplexor de 2 a 1 a partir de los diseos ya dados, declarndolos


como componentes en la arquitectura (antes del BEGIN) y usando copias de los mismos (despus
del BEGIN) para hacer la descripcin del diseo TOP, cuyo cdigo es como sigue:
ENTITY mux2a1_top IS
PORT ( A : IN STD_LOGIC;
B : IN STD_LOGIC;
sel : IN STD_LOGIC;
Z : OUT STD_LOGIC);
END mux2a1_top;
ARCHITECTURE Behavioral OF mux2a1_top IS
COMPONENT gate_and2 is
PORT ( ent1 : in STD_LOGIC;
ent2 : in STD_LOGIC;
sal : OUT STD_LOGIC);
END COMPONENT;
COMPONENT gate_and2b1 IS
PORT ( ent1 : IN STD_LOGIC;

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

40

ent2 : IN STD_LOGIC;
sal : OUT STD_LOGIC);
END COMPONENT;
COMPONENT gate_or2 IS
PORT ( ent1 : IN STD_LOGIC;
ent2 : IN STD_LOGIC;
sal : OUT STD_LOGIC);
END COMPONENT;
SIGNAL x,y: STD_LOGIC;
BEGIN
inst1: gate_and2b1 PORT MAP (ent1=>A,
ent2=>sel,
sal=>x);
inst2: gate_and2 PORT MAP (ent1=>B,
ent2=>sel,
sal=>y);
inst3: gate_or2 PORT MAP (ent1=>x,
ent2=>y,
sal=>Z);
END Behavioral;

En este diseo se declaran los componentes gate_and2b1, gate_and2 y gate_or2 antes del
BEGIN, y se declara una instancia, llamada inst1, del componente gate_and2b1, conectando
concurrentemente: el puerto ent1 de inst1 al puerto de entrada A de este diseo TOP; el puerto ent2
del inst1 al puerto de entrada sel de mux2a1_top; el puerto sal a la seal interna x del diseo TOP.
Por su parte la instancia inst2 es una copia del componente gate_and2, sta posee las
siguientes conexiones: el puerto ent1 se conecta al puerto de entrada B de este diseo TOP; el
puerto ent2 se conecta al puerto de entrada sel de mux2a1_top; el puerto sal a la seal interna y del
diseo TOP.
Por ltimo, se declara una instancia, llamada inst3, del componente gate_or2, conectando
concurrentemente: el puerto ent1 de inst3 a la seal x de este diseo TOP; el puerto ent2 del inst1 a
la seal y de mux2a1_top; el puerto sal al puerto de salida Z del diseo TOP.
La filosofa del diseo modular en VHDL es muy similar al diseo con esquemticos, slo
que a nivel de programacin. Las conexiones que se hacen entre los puertos de las copias de
componentes y las seales y puertos del diseo TOP son anlogas a las conexiones hechas con
wires en los diagramas de esquemticos. En la Figura 7.1 se muestra un diagrama esquemtico
representativo del diseo mux2a1_top hecho con cdigo, donde cada instancia es representada con
un cuadro con el nombre de la instancia y del componente, los puertos de entrada estn alineados a
la izquierda y los de salida a la derecha, las conexiones entre los puertos de las instancias y las
seales y puertos de diseo TOP se representan con lneas (como wires).

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

41

inst1: gate_and2b1
ent1
sal

ent2

inst3: gate_or2
ent1
sal

sel

ent2

inst2: gate_and

ent1
sal
ent2

Figura 7.1. Diagrama esquemtico representativo del diseo mux2a1_top.


El diagrama esquemtico de la Figura 7.1 equivale, a su vez, al circuito lgico de la Figura
7.2.
A

SEL

Figura 7.2. Multiplexor de 2 a 1 lnea con las entradas A y B y el selector SEL como
puertos de entrada y Z como puerto de salida
En la Figura 7.3 se puede apreciar como se vera la ventana de fuentes de este diseo. En ella
se muestra la jerarqua de este proyecto, donde el diseo TOP (mux2a1_top) contiene 3 instancias
(inst1, inst2, inst3) de los 3 componentes (gate_and2b1, gate_and2, gate_or2).

Figura 7.3: Jerarqua del diseo modular de un multiplexor de 2 a 1.


Cabe mencionar que en un diseo TOP se puede declarar un nmero arbitrario de
componentes y agregar un nmero indefinido de copias de cada componente. Adems un diseo
TOP puede ser declarado como componente en otro diseo de mayor jerarqua, tal como se har en
el siguiente problema.

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

42

PROBLEMA 7.1
Como es bien sabido un multiplexor de 4 a 1 se puede implementar a partir de 3
multiplexores de 2 a 1, como lo muestra la Figura 7.4.
a) Disee en VHDL un multiplexor de 4 a 1 usando 3 instancias del multiplexor de 2 a 1
(mux2a1_top) del Ejemplo 7.1, de tal manera su jerarqua este dada como en la Figura 7.5 y su
funcionamiento sea como el circuito lgico de la Figura 7.4. La entidad del multiplexor de 4 a 1
deber ser la siguiente:
ENTITY mux4a1_top IS
PORT ( entrada : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
sel : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
Z : OUT STD_LOGIC);
END mux4a1_top;

Figura 7.4: Multiplexor de 4 a 1, implementado a partir de 3 multiplexores de 2 a 1

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

43

Figura 7.5: Jerarqua del diseo modular de un multiplexor de 4 a 1 implementado con 3 de


multiplexores de 2 a 1.

Llame al instructor para registrar el avance. (40 puntos).


LIBRERIAS
Los elementos de VHDL que se han analizado hasta ahora son las entidades y las
arquitecturas, la entidad sirve para definir la interfaz de un mdulo o sistema, mientras que la
arquitectura describe el comportamiento de un circuito lgico. A este tipo de estructuras se las
conoce como unidades de diseo.
Al realizar una descripcin en VHDL, estas unidades de diseo se suelen introducir en un
mismo archivo, o en varios; a cada uno de stos se le llama un archivo de diseo. Normalmente,
antes de simular o sintetizar un circuito descrito con VHDL, estos archivos de diseo se compilan
previamente. Despus de la compilacin, lo que inicialmente es uno o varios archivos de diseo con
la descripcin hardware, pasa a ser una nica librera de diseo; de manera que esta librera
contiene todas las descripciones de todos los elementos que componen el circuito. Posteriormente,
la simulacin o sntesis del circuito se realizar sobre esta librera de diseo, a sta se le llama
librera Work.
Ya se han visto dos unidades de diseo hasta ahora, la entidad y la arquitectura, pero existen
tres ms que son los paquetes, los cuerpos de los paquetes, y las configuraciones. A las unidades de
tipo declarativo, esto incluir a las entidades, los paquetes y las configuraciones, se las conoce como
unidades primarias. Al resto de unidades que son de tipo ejecutivo, que son las arquitecturas y
cuerpo de los paquetes, se las llama unidades secundarias.

Figura 7.6: Librera y unidades que la componen.


En la Figura 7.6 se muestra de forma esquemtica cmo se ordenan las unidades dentro de la
librera. Se ha visto que la librera es donde se guardan las unidades que describen un circuito a
partir de un archivo. No existe un mecanismo estndar en VHDL para la creacin de libreras,
siendo sta una tarea de la herramienta de diseo, en nuestro caso el sistema de desarrollo ISE de
Xilinx.
Este mecanismo utilizar los elemento dentro de una librera es la inclusin, al inicio del
archivo de diseo, de una clusula LIBRARY. A continuacin de esta sentencia se pone el
nombre de librera que se desea hacer visible; de manera que la herramienta traduce este nombre al
correspondiente sistema de almacenamiento que la herramienta tenga; puede ser que la librera sea
un archivo, o un directorio, o que todas las libreras estn en un nico archivo, etc.
Adems de LIBRARY, existen otras clausulas que permitan hacer visibles los elementos
internos de los paquetes. La sentencia que permite hacer esto se llama USE. Seguido del USE se
pone el paquete, y a continuacin la unidad o elemento que se quiere referenciar dentro del paquete

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

44

precedido por un punto. Si se quieren referenciar todos los elementos de un paquete se puede
utilizar la palabra ALL. Ejemplos:
LIBRARY componentes;
USE componentes.logico.and2;
USE componentes.arit.ALL;

-- Hace visible una librera componentes.


-- Hace visible la compuerta "and2" del paquete "logico".
-- Hace visibles todos los elementos del paquete "arit".

En cualquier sistema basado en VHDL siempre existen dos libreras que no necesitan ser
invocadas puesto que son cargadas por defecto. Una de estas libreras es work, es decir, la que
contiene las unidades del diseo que se est compilando. La otra librera es la std que contiene
dos paquetes; standard y textio. El paquete standard contiene todas las definiciones de tipos y
constantes vistos hasta ahora, como por ejemplo los tipos BIT y BIT_VECTOR. El paquete textio
contiene tipos y funciones para el acceso archivos de texto.

PAQUETES
Un paquete es una coleccin de declaraciones de tipo, constantes, subprogramas, etc.,
normalmente con la intencin de implementar algn servicio en particular o aislar un grupo de
elementos relacionados. De esta manera se pueden hacer visibles las interfaces de algunos
elementos como funciones o procedimientos.
Los paquetes estn separados en dos partes, una es la parte de declaraciones y la otra es la de
cuerpo. La parte de cuerpo, donde estarn por ejemplo algunas definiciones de funciones y
procedimientos, puede ser omitida si no hay ninguno de estos elementos. Naturalmente el nombre
del PACKAGE y del cuerpo deben de coincidir. A continuacin se muestra la sintaxis de la
declaracin de paquetes y de cuerpos de los paquetes:
-- Declaracion de paquete
PACKAGE nombre IS
-- Declaracin de tipos
-- Declaracin de subtipos
-- Declaracin de constantes
-- Declaracin de seales globales
-- Declaracin de variables globales
-- Declaracin de componentes
-- Declaracin de funciones
-- Declaracin de procedimientos
END nombre;
-- Declaracion del cuerpo del paquete
PACKAGE BODY nombre IS
-- Definicin de funciones
-- Definicin de procedimientos
END nombre;

EJEMPLO 7.2:
A continuacin se muestra un ejemplo de este tipo de declaraciones, donde al principio se
declaran los componentes de ejemplo 7.1. Debido a que este paquete no contiene funciones ni
procedimientos, no se declara el cuerpo de paquete.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
PACKAGE my_package is --Declaracin del paquete
-- Declaracin de componentes

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

45

COMPONENT gate_and2 is
PORT ( ent1 : in STD_LOGIC;
ent2 : in STD_LOGIC;
sal : OUT STD_LOGIC);
END COMPONENT;
COMPONENT gate_and2b1 IS
PORT ( ent1 : IN STD_LOGIC;
ent2 : IN STD_LOGIC;
sal : OUT STD_LOGIC);
END COMPONENT;
COMPONENT gate_or2 IS
PORT ( ent1 : IN STD_LOGIC;
ent2 : IN STD_LOGIC;
sal : OUT STD_LOGIC);
END COMPONENT;

PROBLEMA 7.2:
Retome el Ejemplo 7.1, pero en lugar de declarar los componentes dentro de las arquitecturas,
stos de debern declarar en un paquete llamado my_package. La forma ms apropiada para
llevar a cabo este ejercicio es:
1. Borre de la arquitectura del multiplexor de 2 a 1, las declaraciones de los componentes.
2. Inicie el proceso para crear una nueva fuente para el proyecto, puede hacerlo desde el
men Project>New Source .
3. En la ventana para seleccionar el tipo de la nueva fuente, seleccione la opcin VHDL
Package y en el nombre de la fuente introduzca my_package, termine de agregar el
archivo.
4. Una vez abierto el nuevo paquete, borre todo su contenido y sustityalo por el cdigo del
Ejemplo 7.1.
5. Note que hay dos libreras:, Verilog, y Work, expanda Work y ver que estn todas
las fuentes del proyecto, incluyendo el paquete my_package, que se acaba de crear.
6. Expanda la librera Work, seleccione, con el botn derecho del Mouse, el paquete
my_package.
7. En el archivo del multiplexor de 2 a 1, incluya la siguiente lnea de cdigo:
USE work.my_package.all;

Llame al instructor para registrar el avance.

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

46

UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA

CURSO: CIRCUITOS SECUENCIALES

ACTIVIDAD 8: Descripcin de Registros en VHDL

Instructor: Dr. Ramn Antonio Flix Cuadras.


_______________________________________________________
Esta actividad est planeada con un enfoque de aprendizaje colaborativo, en el cual lo ms
importante es el trabajo en equipo para lograr el objetivo de aprender significativamente.
Para ello se formarn grupos de 3 personas, que tendrn que leer este documento. La
calificacin de esta actividad va de 0 a 100 y se asignar proporcionalmente al avance
logrado al final de la sesin
_________________________________________________________________________

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

47

El objetivo de esta Actividad es conocer la descripcin en lenguaje VHDL de los registros


(paralelo, serie-paralelo y paralelo-serie) y los contadores.
Un registro es un conjunto de N flip-flops que se usa para almacenar N bits de informacin.
Para cada flip-flop de un registro se usa en comn un reloj (CLK) y una seal de habilitacin (CE),
dado el caso una seal comn de CLEAR RESET.

REGISTRO PARALELO
El diagrama esquemtico de la Figura 8.1 es un registro paralelo de 4 bits, con Clock Enable
(CE) y Clear asncrono (CLR). Cuando el CE est en alto el CLR est en bajo, el contenido de las
entradas (D) se transfieren a las salidas (Q) durante el flaco positivo del reloj (CLK). Cuando CLR
est en alto, se ignoran las dems seales y las salidas se ponen en un valor bajo. Cuando CE est
desactivado, las transiciones de CLK son ignoradas, y las salidas Q conservan sus valores.

Figura 8.1: Implementacin de un registro paralelo de 4 bits, a partir de FF tipo D.


La Tabla 8.1 resume el funcionamiento del un registro paralelo de la Figura 8.1.
Tabla 8.1: Tabla caracterstica de un registro paralelo de 4 bits.
CLR
'1'
'0
'0

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

CE

'0'
'1

CLK

Q+1
"0000"
Q
D

48

REGISTRO SERIE-PARALELO
Un registro serie-paralelo es un registro de corrimiento con una entrada serial de 1 bit y una
salida de N bits en paralelo, donde N es el nmero de flip-flop que contiene el registro. En la Figura
8.4 se muestra un registro serie-paralelo de 4 bits con entrada serie SLI (Shift-Left Input), salida
paralela (Q) Clock Enable (CE) y Clear asncrono (CLR).

Figura 8.4: Registro Serie- Paralelo de 4 bits con CLR y CE.


Cuando CE est activo y CLR este bajo, el dato en la entrada SLI se transfiere al bit menos
significativo Q(0) del registro, en el flanco de subida del reloj (CLK). Durante los subsecuentes
flancos de positivos en CLK, mientras CE este alto y CLR bajo, el dato se desplazar al siguiente
bit, mientras un nuevo dato se carga en Q(0), es decir, SLIQ(0), Q(0)Q(1), Q(1)Q(2),
Q(2)Q(3). El registro ignora las transiciones de reloj cuando CE es bajo.
La Tabla 8.2 resume el funcionamiento del un registro serie-paralelo de la Figura 8.4.
Tabla 8.2: Tabla caracterstica de un registro serie-paralelo de 4 bits.
CLR

CE

CLK

'1'
'0'
'0'

'0'
'1

Q(3)+1

Q(2)+1

Q(1)+1

Q(0)+1

'0'

'0'

'0'

'0'

Q(3)
Q(2)

Q(2)
Q(1)

Q(1)
Q(0)

Q(0)
SLI

Q+1
"0000"
Q
Q(2 downto 0) & SLI

REGISTRO PARALELO-SERIE
Un registro paralelo-serie tiene 2 modos de operacin: carga paralela, en el que un dato de
N bits se carga a las salidas de N flip-flop, como pasa en un registro paralelo, el otro modo es de
corrimiento, en el cual los bits se van recorriendo del bit menos al ms significativo en cada
flanco (positivo negativo) del reloj, al igual que sucede con un registro serie.
En la Figura 8.9 se puede apreciar un registro de 4 bits paralelo-serie, con Clear y CE y
corrimiento/carga (SHIFT_LOAD). Cuando CLR y SHIFT_LOAD estn en bajo y CE= '1',
entonces un '0' (GND) se pasa al bit menos significativo (Q(0)) del registro, en el flanco de subida
del reloj, al mismo tiempo el dato de la seal Q(0) se desplazar a Q(1), Q(1) se transferir a Q(2) y
por ltimo Q(2) se pasa al puerto de salida SLO (Shift-Left Output), es decir: Q(0)<= '0',
Q(1)<=Q(0), Q(2)<=Q(1), SLO<=Q(2)). El registro ignora las transiciones de reloj cuando CE es
bajo. Note dos cosas importantes: el dato que inicialmente estaba en SLO se pierde en el primer
pulso de CLK, adems despus de 4 desplazamientos todos los flip-flops tendrn sus salidas en
cero. Cuando CE y SHIFT_LOAD estn en '1', CLR este bajo, el dato en la entrada D se transfiere
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

49

a los flip-flops que forman el registro, en el siguiente flanco positivo de CLK; pero si CE est
activo.

Figura 8.9: Registro Paralelo-Serie de 4 bits con CLR y CE.


La Tabla 8.3 resume el funcionamiento del un registro paralelo-serie de la Figura 8.4.
Tabla 8.3: Tabla caracterstica de un registro paralelo-serie de 4 bits.
CLR
'1'
'0'

CE

'0'

CLK

SHIFT_LOAD

'0'

'1

'0'

'0'

'1

'1

Q(3)+1
'0'
Q(3)
Q(2)

Q(2)+1
'0'
Q(2)
Q(1)

Q(1)+1
'0'
Q(1)
Q(0)

Q(0)+1
'0'
Q(0)
'0'

D(3)

D(2)

D(1)

D(0)

Q+1
"0000"
Q
Q(2 downto 0) &
'0'
D

Un registro paralelo-serie funciona como un transmisor en un sistema de comunicacin serie


sncrona, el dato entra en paralelo al registro a travs del puerto D, ste es convertido a un tren de
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

50

pulsos en el puerto SLO, transmitindose en sincrona con el flanco de subida de CLK, en el otro
extremo de la comunicacin debe haber un registro serie-paralelo para decodificar el tren de pulsos
y reconstruir el dato que se introdujo por el puerto D del registro paralelo-serie.

PROBLEMA 8.1
a) Escriba una versin en VHDL del registro serie-paralelo de 4 bits que se ha analizado,
utilice 4 instancias del flip-flip tipo D con Clear y CE, como se hizo en el Ejemplo 8.1.
b) Escriba una versin en VHDL del registro paralelo-serie de 4 bits que se ha analizado,
utilice 4 instancias del flip-flip tipo D con Clear y CE, como se hizo en el Ejemplo 8.1.
Llame al instructor para registrar el avance. (30 puntos).

DESCRIPCIN ALGORTMICA DE REGISTROS EN VHDL


El siguiente cdigo en VHDL es la descripcin algortmica de un registro paralelo de 4 bits
con Clear y CE.
ENTITY registro_p IS
PORT (D :IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CLK : IN STD_LOGIC;
CLR : IN STD_LOGIC;
CE : IN STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END registro_p;
ARCHITECTURE Behavioral OF registro_p IS
BEGIN
PROCESS(CLK,CLR)
BEGIN
IF CLR='1' THEN
Q <= (OTHERS=>'0');
ELSIF RISING_EDGE(CLK) AND CE='1' THEN
Q <= D;
END IF;
END PROCESS;
END Behavioral;

El siguiente cdigo en VHDL es la descripcin algortmica de un registro serie-paralelo de 4


bits con Clear y CE.
ENTITY registro_sp IS
PORT (SLI:IN STD_LOGIC;
CLK: IN STD_LOGIC;
CLR: IN STD_LOGIC;
CE: IN STD_LOGIC;
Q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END registro_sp;
ARCHITECTURE behavioral OF registro_sp IS
SIGNAL QAUX: STD_LOGIC_VECTOR(3 DOWNTO 0):=(OTHERS=>'0');
BEGIN
Q<=QAUX;
PROCESS(CLK,CLR)
BEGIN
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

51

IF CLR='1' THEN
QAUX <= (OTHERS=>'0');
ELSIF RISING_EDGE(CLK) AND CE='1' THEN
--Corrimiento: por las piedritas
--QAUX(0)<=SLI; QAUX(1)<=QAUX(0); QAUX(2)<=QAUX(1); QAUX(3)<=QAUX(2);
--Corrimiento: como se debe de hacer
QAUX<=QAUX(2 DOWNTO 0) & SLI;
END IF;
END PROCESS;
END behavioral;

PROBLEMA 8.2
Disee en VHDL un registro paralelo-serie de 4 bits con descripcin algortmica, como si
hizo en los cdigos anteriores. Llame al instructor para registrar el avance. (40 puntos).

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

52

UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA

CURSO: CIRCUITOS SECUENCIALES

ACTIVIDAD 9: Contadores Sncronos.

Instructor: Dr. Ramn Antonio Flix Cuadras.


_______________________________________________________
Esta actividad est planeada con un enfoque de aprendizaje colaborativo, en el cual lo ms
importante es el trabajo en equipo para lograr el objetivo de aprender significativamente.
Para ello se formarn grupos de 3 personas, que tendrn que leer este documento. La
calificacin de esta actividad va de 0 a 100 y se asignar proporcionalmente al avance
logrado al final de la sesin
_________________________________________________________________________
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

53

El objetivo de esta Actividad es conocer la descripcin en VHDL de los contadores binarios,


contadores mdulo-N y divisores de frecuencia.

DESCRIPCIN ALGORTMICA DE CONTADORES EN VHDL


El siguiente cdigo en VHDL es la descripcin algortmica de un contador binario de 2 bits
como el de la Figura 9.3. El puerto conteo se define de tipo std_logic_vector (2 downto 0) para
almacenar la cuenta, como se trata de un circuito secuencial sncrono la estructura de este cdigo es
muy similar a la descripcin de un flip-flip, tenemos una seal de reloj (clk), una seal auxiliar
(count), que conectamos concurrentemente a la salida, para poder inicializar y leer el contenido del
conteo. En lugar de una ecuacin caracterstica tenemos que incrementar el valor de conteo con la
instruccin:countaux<=countaux+1, pero como countaux de de tipo std_logic_vector y 1 es de tipo
entero, es necesario llamar al paquete STD_LOGIC_UNSIGNED de la librera IEEE. Este paquete tiene
sobrecargado el operador + para que pueda ser usado con operandos de tipo std_logic_vector y enteros.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity cont3bits is
port (CLK: in std_logic;
conteo: out std_logic_vector (2 downto 0));
end cont3bits;

--Seal de reloj
--Conteo

architecture Behavioral of cont3bits is


signal countaux: std_logic_vector (2 downto 0):="000";
--Seal auxiliar
begin
conteo<=countaux;
--Al puerto conteo se conecta la cuenta auxiliar
process(CLK)
begin
if rising_edge(CLK) then
--Flanco de subida de clk
countaux <= countaux + 1;
--Se incrementa el conteo
end if;
end process;
end Behavioral;

El siguiente cdigo en VHDL es la descripcin algortmica de un contador binario mdulo-10


como el del Figura 9.3. Al igual que en el cdigo anterior, las expresiones: countaux+1 y
countaux=9 son validas gracias a que se llama al paquete STD_LOGIC_UNSIGNED.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity cont_mod10 is
port (CLK: in std_logic;
CE: in std_logic;
conteo: out std_logic_vector (3 downto 0);
CEO: out std_logic);
end cont_mod10;

--Seal de reloj
--Clock Enable
--Conteo

architecture Behavioral of cont_mod10 is


signal countaux: std_logic_vector (3 downto 0):=(others=>'0');
--Seal auxiliar
begin
conteo<=countaux;
--Al puerto conteo se conecta la cuenta auxiliar
process(CLK)
begin
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

54

if rising_edge(CLK) then
--Si hay un flanco de subida de clk
if CE = '1' then
--Si CE est activo
if countaux = 9 then
--Si el conteo lleg a "1001" entonces
countaux <= (others=>'0');
--el conteo se regresa a "0000"
else
--si no
countaux <= countaux + 1;
--Se incrementa el conteo
end if;
end if;
end if;
end process;
CEO <= '1' when countaux = 9 and CE ='1' else '0'; --CEO es '1' cuando se llega a la cuenta final y
--CE ='1 sino CEO es '0'
end Behavioral;

PROBLEMA 9.3
a) Disee en VHDL un contador mdulo-5 con entrada de Reset.
Llame al instructor para registrar el avance. (40 puntos).

CONTADORES GENRICOS EN CASCADA


Como ya se mencion anteriormente, para conectarse en cascada es necesario que los
contadores tengan una salida que indique cuando el contador de la siguiente etapa debe
incrementarse. Algunos autores llaman a esta salida overflow o carry, en el caso de la literatura
de Xilinx; esta salida es llamada Clock Enable Output (CEO) y debe conectarse al CE del contador
de la siguiente etapa.

Ejemplo 9.1
El siguiente cdigo es de un contador genrico con salida CEO para conteo en cascada.
Library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ContGenRE is
generic (Nbits:integer:=4;
--Nmero de bits para almacenar la cuenta
Cuenta_Fin:integer:=15);
--Mximo nmero que alcanza la cuenta
port (clk: in std_logic;
--Seal de reloj
CE: in std_logic;
--Clock Enable
RST: in std_logic;
--RESET Sncrono
conteo: out std_logic_vector (Nbits-1 downto 0); --Cuenta
CEO: out std_logic);
--Clock Enable Output
end ContGenRE;
architecture Behavioral of ContGenRE is
signal countaux: std_logic_vector (Nbits-1 downto 0):=(others=>'0'); --Cuenta auxiliar
signal TC: std_logic;
--TC: Bandera de la cuenta mxima
begin
conteo <= countaux;
--Al puerto cuenta se conecta la cuenta auxiliar
TC <= '1' when countaux=Cuenta_Fin else '0'; --Terminal Count:
process(clk)
begin
if rising_edge(clk) then
--Flanco positivo de clk
if RST='1' then
--Si est activo el RESET
countaux <= (others=>'0');
--Se Resetea cuenta
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

55

elsif CE='1' then


if TC='1' then
countaux <= (others=>'0');
else
countaux <= countaux + 1;
end if;
end if;
end if;
end process;
--La salida CEO
CEO <= '1' when TC='1' and CE='1' else '0';
end Behavioral;

--CE='1'
--Si se llega a la cuenta Final
--Se Resetea cuenta
--Si no
--Se sigue incrementando la cuenta

--Habilitador de la cuenta externa

En la Figura 9.5 se muestran las seales del contador genrico para conectarse en cascada, en
el recuadro se pueden ver a detalle la transicin de la cuenta de su valor final a cero.

DISEO DE CONTADORES BCD CON CONTADORES GENERICOS


Un contador BCD es aquel que cuenta de 0 a 9, este tipo de contadores son muy tiles cuando
se trabaja con displays de 7 segmentos, como el del mdulo BASYS2

Ejemplo 9.2:
El siguiente cdigo es de un contador BCD de 00 a 29, usando 2 instancias (una por cada
dgito) del componente genrico con salida para cuenta externa (Vea Ejemplo 9.1). Los diseos
genricos, al ser incluidos en otro diseo como instancias de componente genricos, pueden ser
configurados a travs de la sentencia GENERIC MAP, en la cual se definen los valores de los
parmetros genricos, en el caso de este diseo se utilizan 2 instancias del contador genrico
ContGenRE: la primera (cont_uni) es usada para llevar la cuenta de 0 a 9 y habilitar la cuenta de un
segundo contador (cont_dec), que contar cada vez que cont_uni tenga activado su puerto CEO, ya
que la seal CEO_uni lo conecta al puerto CE de la instancia cont_dec.
entity contBCD29 is
Port (clk: in std_logic;
Unidades: out std_logic_vector (3 downto 0);
Decenas: out std_logic_vector (1 downto 0);
CEO: out std_logic);
end contBCD29;
architecture Behavioral of contBCD29 is
signal CEO_uni:std_logic;
component ContGenRE is
generic(Nbits: integer:=4;
--Nmero de bits para almacenar la cuenta
Cuenta_Fin: integer:=15);
--Mximo nmero que alcanza la cuenta
port (clk: in std_logic;
--Seal de reloj
CE: in std_logic;
--Clock Enable
RST: in std_logic;
--RESET Sncrono
conteo: out std_logic_vector (Nbits-1 downto 0); --Cuenta
CEO: out std_logic);
--Clock Enable Output
end component;
begin
--Contador de unidades de 0 a 9
cont_uni: ContGenRE
generic map(Nbits=>4,Cuenta_Fin=>9)
Port map (clk=>clk, CE=>'1', RST=>'0', conteo=>Unidades, CEO=>CEO_uni);
--Contador de unidades de 0 a 2
cont_dec: ContGenRE
generic map(Nbits=>2,Cuenta_Fin=>2)
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

56

Port map(clk=>clk, CE=>CEO_uni, RST=>'0', conteo=>Decenas, CEO=>CEO);


end Behavioral;

En la Figura 9.3 se muestra un diagrama esquemtico representativo del diseo en VHDL


contBCD29. Cada cuadro representa una copia del componente ContGenRE, debajo del nombre de
la instancia y del componente se especifican los valores de los parmetros genricos (Nbits,
Cuenta_Fin). El GENERIC MAP se puede ver como una forma de configurar internamente a la
instancia de componente y el PORT MAP es la configuracin externa (conexiones) de la instancia .
cont_uni: ContGenRE
Nbits=4, cuenta_fin=9
CE

CE

CLK

CLK

conteo

RST

CEO

Unidades

'0'

cont_dec: ContGenRE
Nbits=2, cuenta_fin=2
CE
CLK

conteo

RST

CEO

Decenas

CEO

'0'

Figura 9.3. Diagrama esquemtico representativo del diseo contBCD29.

Ejemplo 9.3:
El siguiente cdigo es de un contador BCD de 0 a 23, usando 2 instancias del componente
genrico, debido a que el contador debe regresar a cero en un cuenta que no es la cuenta final de los
dos contadores, ya que el contador de unidades se reinicia en 9 y el contador de decenas se reinicia
en 2, es necesario hacer uso de las entradas de Reset sncrono (RST) de los componentes
ContGenRE, se emplear una seal que tenga un valor de '1' cuando el contador de unidades est en
3 y el de decenas en 2, esta seal se conecta a los puertos de RST de ambas instancias. Para que
cuando el conteo llegue a 23, ste se vaya a 00 en el siguiente flanco positivo del reloj.
entity contBCD23 is
Port (clk: std_logic;
Unidades: out std_logic_vector (3 downto 0);
Decenas: out std_logic_vector (1 downto 0);
CEO: out std_logic);
end conBCD23;
architecture Behavioral of contBCD23 is
signal CEO_uni,Reinicio: std_logic;
signal Uni: std_logic_vector (3 downto 0):=(others=>'0');-- Seal auxiliar para las unidades
signal Dec: std_logic_vector (1 downto 0):=(others=>'0'); -- Seal auxiliar para las decenas
component ContGenRE is

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

57

generic (Nbits: integer:=4;


--Nmero de bits para almacenar la cuenta
Cuenta_Fin: integer:=15);
--Mximo nmero que alcanza la cuenta
port (clk: in std_logic;
--Seal de reloj
CE: in std_logic;
--Clock Enable
RST: in std_logic;
--RESET Sncrono
conteo: out std_logic_vector (Nbits-1 downto 0); --Cuenta
CEO: out std_logic);
--Clock Enable Output
end component;
begin
Unidades<=Uni;
Decenas <=Dec;
Reinicio<= '1' when Dec=2 and Uni=3 and CE='1' else '0'; --se reinicia en 23
CEO<=Reinicio
--Contador de unidades de 0 a 9, se reinicia despus que el conteo llega a 23
cont_uni: ContGenRE
generic map(Nbits=>4,Cuenta_Fin=>9)
Port map(clk=>clk, CE=>'1', RST=>Reinicio, conteo=>Uni,CEO=>CEO_uni);
--Contador de decenas de 0 a 2, se reinicia despus que el conteo llega a 23
cont_dec: ContGenRE
generic map(Nbits=>2,Cuenta_Fin=>2)
Port map(clk=>clk, CE=>CEO_uni, RST=>Reinicio, conteo=>Dec,CEO=>open);
end Behavioral;

En la Figura 9.4 se muestra un diagrama esquemtico representativo del diseo en VHDL


contBCD29..
cont_uni: ContGenRE
Nbits=4, cuenta_fin=9
CE

CE

CLK

CLK

conteo

RST

CEO

Reinicio

Uni

CEO_uni

Unidades

cont_dec: ContGenRE
Nbits=2, cuenta_fin=2
CE
CLK

conteo

RST

CEO

Dec

Decenas

CEO
Reinicio
Reinicio<= '1' when Dec=2 and Uni=3 and CE='1' else '0';

Figura 9.4. Diagrama esquemtico representativo del diseo contBCD23.

Problema 9.1
a) Disee un contador BCD de 00 a 59, tome como base el cdigo del Ejemplo 9.2. Tambin
haga un diagrama esquemtico equivalente para ese cdigo.

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

58

b) Disee un contador BCD de 00 a 12, tome como base el cdigo del Ejemplo 9.3. Tambin
haga un diagrama esquemtico equivalente para ese cdigo.
Llame al instructor para registrar el avance (50 puntos).

Ejemplo 9.4:
El siguiente cdigo es de un contador BCD de 00 a 29, como el Ejemplo 9.2, pero el contador
BCD cambiar a una frecuencia 4 veces menor que el cdigo del Ejemplo 9.2. El divisor sncrono
de implementa con una instancia del componente ContGenRE ajustado para contar de 0 a 1.
entity Div_frec_contBCD29 is
Port (clk: in std_logic;
Unidades: out std_logic_vector (3 downto 0);
Decenas: out std_logic_vector (1 downto 0);
CEO: out std_logic);
end Div_frec_contBCD29;
architecture Behavioral of Div_frec_contBCD29 is
signal CEO_uni:std_logic;
signal CEO_div:std_logic;
component ContGenRE is
generic(Nbits: integer:=4;
--Nmero de bits para almacenar la cuenta
Cuenta_Fin: integer:=15);
--Mximo nmero que alcanza la cuenta
port (clk: in std_logic;
--Seal de reloj
CE: in std_logic;
--Clock Enable
RST: in std_logic;
--RESET Sncrono
conteo: out std_logic_vector (Nbits-1 downto 0); --Cuenta
CEO: out std_logic);
--Clock Enable Output
end component;
begin
--Divisor de frecuencia sncrono (entre 4)
div_frec: ContGenRE
generic map(Nbits=>2,Cuenta_Fin=>3)
Port map (clk=>clk, CE=>'1', RST=>'0', conteo=>open, CEO=>CEO_div);
--Contador de unidades de 0 a 9
cont_uni: ContGenRE
generic map(Nbits=>4,Cuenta_Fin=>9)
Port map (clk=>clk, CE=> CEO_div, RST=>'0', conteo=>Unidades, CEO=>CEO_uni);
--Contador de unidades de 0 a 2
cont_dec: ContGenRE
generic map(Nbits=>2,Cuenta_Fin=>2)
Port map(clk=>clk, CE=>CEO_uni, RST=>'0', conteo=>Decenas, CEO=>CEO);
end Behavioral;

En la Figura 9.12 se muestra el diagrama esquemtico representativo del diseo


Div_frec_contBCD29 y la Figura 9.13 es la simulacin de mismo diseo, en sta se puede ver como
la salida del divisor sncrono de frecuencia (CEO_div) es un pulso con la frecuencia deseada.

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

59

div_frec: ContGenRE
Nbits=2, cuenta_fin=3
CE

CE

CLK

CLK

conteo

RST

CEO

cont_uni: ContGenRE
Nbits=4, cuenta_fin=9

CEO_div

CE

'0'

CLK

conteo

RST

CEO

Unidades

CEO_uni
'0'

cont_dec: ContGenRE
Nbits=2, cuenta_fin=2
CE
CLK

conteo

RST

CEO

Decenas

CEO

'0'

Figura 9.12. Diagrama esquemtico representativo del diseo Div_frec_contBCD29

Problema 9.2
Suponga que se tiene disponible una seal de reloj de 50 MHz y se desea disear un contador
BCD de 0 a 9, pero que se incremente cada segundo. Tambin haga un diagrama esquemtico
equivalente para ese cdigo.
Llame a instructor para registrar el avance (50 puntos)

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

60

UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA

CURSO: CIRCUITOS SECUENCIALES

ACTIVIDAD 10: Diseo de Mquinas de Estados en VHDL

Instructor: Dr. Ramn Antonio Flix Cuadras.


_______________________________________________________
Esta actividad est planeada con un enfoque de aprendizaje colaborativo, en el cual lo ms
importante es el trabajo en equipo para lograr el objetivo de aprender significativamente.
Para ello se formarn grupos de 3 personas, que tendrn que leer este documento. La
calificacin de esta actividad va de 0 a 100 y se asignar proporcionalmente al avance
logrado al final de la sesin
_________________________________________________________________________

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

61

El objetivo de esta Actividad es disear mquinas de estados finitos en VHDL.

10.1 DESCRIPCIN DE MQUINAS DE ESTADO CON VHDL


En VHDL se pueden describir tanto mquinas de Mealy como de Moore. Existen
muchas alternativas para describir el comportamiento de una mquina de estados finitos, en
esta Actividad veremos la que presenta mayor simplicidad y mejor estructura. Es
importante mencionar que se debe tener con anterioridad un diagrama de estados, que
describa con precisin la mquina de estados que se va a disear.
Una mquina de estados deber estar definida por dos PROCESS: el primero a veces
llamado del estado siguiente, define el estado siguiente en que se encontrar la mquina
en el siguiente pulso de reloj, sta es una funcin anloga a la del circuito de excitacin. El
otro PROCESS denominado de salida, define los valores para las seales la salida, como
lo hace un circuito de salida.
El estado siguiente se define en funcin de las entradas y del estado actual. La salida
se calcula como una funcin del estado presente y las entradas, segn el tipo de mquina
que se est describiendo. Las mquinas de Mealy son ms generales y se caracterizan
porque la salida depende del estado y la entrada. Las mquinas de Moore son un caso
particular de las anteriores y se caracterizan porque la salida slo depende del estado en que
se encuentra el sistema.
La mayora de los sintetizadores para HDL ejecutan automticamente algoritmos para
la optimizacin de mquinas de estados, por ejemplo la codificacin de estados se hace
automticamente, cuando el programa detecta que se est describiendo una mquina de
estados. Se puede tomar ventaja de esto, definiendo a los estados de mquina no como
combinaciones de bits ("00", "01", "10", "11"), sino de forma ms mnemnica usando
palabras clave como inicio, espera, activado, final, etc. La forma de hacer esto en VHDL es
usar la sentencia TYPE, la cual define un tipo de dato y los valores que pueden tener los
objetos declarados como este tipo; por ejemplo est es la definicin del tipo BIT y de una
seal dato declarado como tipo BIT.
TYPE BIT IS ('0', '1');
SIGNAL dato : BIT;

Para el caso de una mquina de estados en VHDL, esta es la declaracin del tipo
ESTADO y de una seal de ese tipo inicializada con el valor inicio.
TYPE ESTADO IS (inicio, espera, activado, final);
SIGNAL estado_actual : ESTADO:= inicio;

En el PROCESS del estado siguiente, si existe alguna seal de CLEAR se verifica


antes que nada, con un IF; y como se trata de mquinas de estado sncronas,
inmediatamente se checa el flaco del reloj (CLK) con un ELSIF, dentro de ste se verifican
todos los posibles estados de la mquina con una estructura CASE-WHEN. Dentro de cada
caso se escriben la o las sentencias lgicas que definirn el estado siguiente.
Cuando verifique que la mquina est en estado en particular, se debern definir todas
las transiciones que salgan de l, y en cada una de ellas se deber especificar cual es el
estado siguiente, asignndole a la seal que guarda el estado actual, la palabra clave del
estado siguiente. Para las transiciones condicionales se recomienda usar, en la medida de lo
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

62

posible, la sentencia CASE-WHEN, pero tambin se permiten las estructuras IF-ELSIFELSE. En las transiciones incondicionales slo se especifica el estado siguiente. Si existe
un autolazo (el estado siguiente es el mismo que el actual), no es necesario especifcalo.
El PROCESS de salida debe tener en su lista sensible al estado actual y a las entradas,
en caso de ser una mquina de Mealy y cuando se trata de ser una mquina de Moore slo
deber estar el estado actual en la lista sensible, esto para que se pueda sintetizar como un
circuito combinacional.

Ejemplo 10.1: Descripcin de una mquina de Mealy en VHDL.


En la Figura 10.1 se aprecia el diagrama de estados de una mquina de Mealy.

Figura 10.1: Maquina de estados de Mealy.


El cdigo que describe la mquina de estado de la Figura 10.1 es como sigue:
entity MealyFSM is
Port(clk : in STD_LOGIC;
c : in STD_LOGIC;
clr: in STD_LOGIC;
y : out STD_LOGIC);
end MealyFSM;
architecture Behavioral of MealyFSM is
--Definicin del tipo ESTADO
type ESTADO IS (inicio,espera,fallo,fin);
signal estado_actual : ESTADO; --seal para el estado de la mquina
begin
--PROCESS del estado siguiente
process(clk, clr)
begin
if clr='1' then
--Se verifica el CLEAR
Universidad de Colima 2007. Copyright. Derechos Reservados.
Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

63

estado_actual<=inicio;
elsif rising_edge(clk) then
case estado_actual is
when inicio =>
--Si estado_inicial=inicio
estado_actual <= espera; --Transicin incondicional al siguiente estado
when espera =>
--Si estado_inicial=espera
if c='1' then
estado_actual <= fin; --Transicin condicional al siguiente estado
else
estado_actual <= fallo; --Transicin condicional al siguiente estado
end if;
when fin =>
--Si estado_actual=fin
estado_actual <= inicio; --Transicin incondicional al siguiente estado
when fallo =>
--Si estado_actual=fallo
estado_actual <= inicio; --Transicin incondicional al siguiente estado
end case;
end if;
end process;
--PROCESS de salida
process(estado_actual, c) --La salida depende de la entrada y el estado actual
begin
if estado_actual = espera and c='1' then
y <= '1';
else
y <= '0';
end if;
end process;
end Behavioral;

Problema 10.1:
Usando la metodologa de diseo descrita en esta actividad, realice una mquina de
estados en VHDL como la hecha en el ejemplo 10.1. Al finalizar llame al instructor para
registrar el avance (50 puntos).

Problema 10.2:
Disee una mquina de estados en VHDL, que tenga un diagrama de estados como la
hecha en el ejemplo 9.2. Al finalizar llame al instructor para registrar el avance (50
puntos).

Universidad de Colima 2007. Copyright. Derechos Reservados.


Dr. Ramn Antonio Flix Cuadras, rfelix@ucol.mx

64

Вам также может понравиться