Академический Документы
Профессиональный Документы
Культура Документы
UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA
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.
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;
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;
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
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.
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.
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).
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
UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA
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
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;
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:
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;
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.
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"
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
=
<
>
>=
<=
=>
)
ACRNIMO
EQ
LT
GT
GE
LE
ROW
CLOSEPAR
13
'
:
;
,
+
*
/
.
:=
OPENPAR
TICK
COLON
SEMICOLON
COMMA
PLUS
MULT
DIV
POINT
AFFECT
14
UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA
15
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;
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";
Valor de la expresin
"10010101"
"011011000101"
"vamos a la playa el domingo"
"vamos el domingo"
Valor de la expresin
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
/
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
19
UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA
20
_________________________________________________________________________
21
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
22
BEGIN
salida <= "0001" WHEN sel="00" ELSE
"0010" WHEN sel="01" ELSE
"0100" WHEN sel="10" ELSE
"1000";
end Behavioral;
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)
23
UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA
24
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.
25
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.
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
--instrucciones2;
ELSIF condicionM THEN
--instruccionesM;
ELSE
--instruccionesN;
END IF;
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;
27
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.
28
UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA
_________________________________________________________________________
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.
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.
30
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;
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.
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)
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;
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;
33
JQ + QK (Ecuacin caracterstica)
0
Q (sin cambio)
1
Q (sin cambio)
LLAME AL INSTRUCTOR PARA REGISTRAR EL AVANCE. (30 puntos)
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.
35
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)
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;
37
UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA
38
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),
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;
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).
41
inst1: gate_and2b1
ent1
sal
ent2
inst3: gate_or2
ent1
sal
sel
ent2
inst2: gate_and
ent1
sal
ent2
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).
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;
43
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;
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
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;
46
UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA
47
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.
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).
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.
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
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).
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).
52
UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA
53
--Seal de reloj
--Conteo
--Seal de reloj
--Clock Enable
--Conteo
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).
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
--CE='1'
--Si se llega a la cuenta Final
--Se Resetea cuenta
--Si no
--Se sigue incrementando la cuenta
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.
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
CE
CLK
CLK
conteo
RST
CEO
Unidades
'0'
cont_dec: ContGenRE
Nbits=2, cuenta_fin=2
CE
CLK
conteo
RST
CEO
Decenas
CEO
'0'
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
57
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';
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.
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;
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'
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)
60
UNIVERSIDAD DE COLIMA
FACULTAD DE INGENIERA MECNICA Y ELCTRICA
61
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;
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.
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).
64