Diseño de Sistemas Computacionales para
Aplicación Específica
Sesión 05: Código concurrente
en VHDL
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
Temario:
- Concurrente vs secuencial
- Características del código concurrente
- La sentencia WHEN
- La sentencia GENERATE
- Ejericios aplicativos
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.1.- Concurrente vs. Secuencial
¿Qué quieren decir los términos
concurrente y secuencial?
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.1.- Concurrente vs. Secuencial
Lógica combinacional vs. Lógica secuencial
● Por definición, lógica combinacional es aquella en donde la salida del cicuito depende,
solamente, de las entradas actuales. Por lo tanto, el sistema no requiere memoria y puede
ser implementado utilzando compuertas lógicas convencionales.
●
En contraste, la lógica secuencial se define como aquella en donde la salida depende de
las entradas actuales y también de las salidas anteriores. Por lo tanto, se requieren
elementos de almacenamiento, los cuales son conectados al bloque de lógica
combinacional mediante un lazo de retroalimentación, de modo que los estados
almacenados también afectarán la salida del circuito.
Circuito lógico combinacional. Circuito lógico secuencial.
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.2.- Características del código concurrente
●
En esta clase discutiremos el código concurrente, es decir, estudiaremos las sentencias que
solamente pueden ser usadas fuera de los procesos (PROCESS), funciones (FUNCTION)
y procedimientos (PROCEDURE).
●
De forma resumida, en el código concurrente pueden utilizarse: Operadores (vistos en la
clase anterior), la sentencia WHEN y la sentencia GENERATE.
● El código en VHDL es inherentemente concurrente. Solamente las sentencias colocadas
dentro de un PROCESS, FUNCTION o PROCEDURE son secuenciales. Sin embargo,
aunque dentro de estos bloques la ejecución es secuencial, el bloque, como un todo, es
concurrente con cualquier otra sentencia externa.
● En general, solamente podemos construir circuitos lógicos combinacionales con código
concurrente. Para obtener circuitos lógicos secuenciales, debe emplearse código
secuencial.
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.3.- Código concurrente con operadores
●
Es posible construir diversos circuitos lógicos combinacionales empleando solamente
operadores.
●
Imagine que se desea implementar el multiplexor que se muestra en la imagen inferior ¿Es
posible describir su comportamiento empleando solamente operadores lógicos?
●
Definitivamente, es posible construir este circuito en base a operadores. Sin embargo, la
implementación del código no es tan directa, ya que se debe hacer un análisis previo del
comportamiento del sistema para determinar los operadores que serán necesarios (mapa
de Karnaugh).
●
En estos casos es mejor emplear sentencias condicionales concurrentes, las cuales se
describirán a continuación.
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.3.- Código concurrente con operadores
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.4.- La sentencia WHEN simple
● La sentencia WHEN es utilizada para llevar a cabo una acción determinada, en base al
cumplimiento de una condición específica. En este sentido, la sentencia WHEN (cuando) se
comporta de manera equivalente a la sentencia IF(si). La diferencia principal es que, en
VHDL, la sentencia WHEN se emplea solamente para código concurrente; mientras
que la sentencia IF se emplea solamente para código secuencial.
●
La sentencia WHEN presenta 02 formas: WHEN simple y WHEN con selector. Primero
analizaremos la sintaxis de la sentencia WHEN simple.
●
La sentencia WHEN simple en VHDL se comporta de forma análoga a una estructura de if
anidados en el lenguaje C. Su sintaxis es la siguiente:
asignación WHEN condición ELSE
asignación WHEN condición ELSE
asignación WHEN condición ELSE
.
.
.
asignación;
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.4.- La sentencia WHEN simple
Por ejemplo, el multiplexor visto anteriormente puede ser descrito mediante la sentencia
WHEN simple, de la siguiente manera:
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.5.- La sentencia WHEN con selector
●
La sentencia WHEN con selector es una versión modificada del WHEN simple. A diferencia
de este último, el WHEN con selector nos permite reducir las expresiones condicionales.
● Sin embargo, la sentencia WHEN con selector solamente es útil cuando TODAS las
expresiones condicionales preguntan por el valor de un mismo elemento (entrada, variable
o señal) en particular. Además, cuando se utiliza el WHEN con selector se deben
considerar TODOS los casos posibles.
●
En este sentido, la sentencia WHEN en VHDL se comporta de forma análoga a la
sentencia switch en el lenguaje C. Su sintaxis es la siguiente:
WITH identificador SELECT
asignación WHEN valor,
asignación WHEN valor,
.
.
.
asignación WHEN valor;
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.5.- La sentencia WHEN con selector
Por ejemplo, el multiplexor visto anteriormente puede ser descrito mediante la sentencia
WHEN con selector, de la siguiente manera:
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.6.- WHEN simple vs. WHEN con selector
● Cuado deseamos evaluar múltiples condiciones que hacen referencia a más de un
elemento (entrada, variable o señal) debemos emplear la sentencia WHEN simple. En
estos casos no es posible utilizar el WHEN con selector, ya que éste solamente puede
evaluar el valor de un elemento (el selector).
●
Cuando deseamos evaluar múltiples condiciones que hacen referencia a un slo elemento,
podemos emplear tanto WHEN simple como WHEN con selector. Sin embargo, el código
empleando WHEN con selector será más reducido, debido a que sus expresiones
condicionales se encuentran abreviadas.
● Cuando empleamos la sentencia WHEN con selector debemos asegurarnos de especificar
una asignación para CADA VALOR POSIBLE del selector. En caso de que se tenga una
asignación “por defecto” que se repite con múltiples valores, puede emplearse la palabra
OTHERS.
●
Cuando empleamos la sentencia WHEN con selector, y se desea que un valor permanezca
sin cambio ante una condición determinada, puede emplearse la palabra UNAFFECTED.
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.6.- WHEN simple vs. WHEN con selector
A continuación, se muestran ejemplos de código VHDL empleando las setencias WHEN
simple y WHEN con selector:
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.6.- WHEN simple vs. WHEN con selector
Al emplear la sentencia WHEN simple se infiere que lo que se desea es emplear una red de
multiplexores con prioridades, como el que se muestra en la imagen inferior.
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.6.- WHEN simple vs. WHEN con selector
Al emplear la sentencia WHEN son selector se infiere que lo que se desea es emplear un
multiplexor, como se muestra en la imagen inferior.
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.7.- La sentencia GENERATE
Considere que tiene una señal x, de 8 bits, una señal y, de 16 bits, y una señal z a la que se
desea asignar el resultado de una AND entre los 08 MSB (bits más a la izquierda) de x e y.
Esto puede lograrse empleando la sentencia GENERATE y el atributo ‘RANGE (o
‘REVERSE_RANGE), tal como se muestra a continuación:
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.7.- La sentencia GENERATE
Al emplear la sentencia FOR/GENERATE, se genera hardware y conexiones que siguen un
patron, como el ejemplo que se muestra en la imagen inferior.
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
1.- CÓDIGO CONCURRENTE
1.8.- Restricciones de la sentencia GENERATE
●
Es importante recalcar que, al utilizar la sentencia GENERATE, ambos límites del rango
(superior e inferior) deben ser estáticos. En este sentido, no está permitido utilizar
elementos (señales, variables o entradas) como límites en GENERATE.
● Por ejemplo, en el siguiente segmento de código “valor” es una entrada:
No_Valido: FOR I IN 0 TO valor GENERATE
(sentencias concurrentes)
END GENERATE;
●
Por otro lado, debemos tener cuidado de no asignar más de una vez un valor a un bit. Por
ejemplo, los siguientes segmentos de código son inválidos:
No_Valido: FOR i IN 0 TO 7 GENERATE
salida <= “11111111” WHEN (a(i) AND b(i)) = ‘1’ ELSE “00000000”; END GENERATE;
No_Valido: FOR i IN 0 TO 7 GENERATE
acumulador <= acumulador + 1 WHEN x(i) = ‘1’; END
GENERATE;
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
2.- EJERCICIOS
2.1.- La sentencia WHEN
Escribir un código en VHDL, empleando la sentencia WHEN, que implemente un buffer tri-
estado como el que se muestra a continuación.
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
2.- EJERCICIOS
2.1.- La sentencia WHEN
Escribir un código en VHDL, empleando la sentencia WHEN, para implementar un
decodificador para display de 7 segmentos. Este circuito debe recibir una entrada de 04 bits y
debe entregar a la salida una secuencia que permita visualizar el valor de la entrada como un
dígito hexadecimal (de 0 a F).
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
2.- EJERCICIOS
2.1.- La sentencia WHEN
Escribir un código en VHDL, empleando la sentencia WHEN, para implementar una unidad
aritmética lógica (ALU). Este circuito debe contar con: 02 entradas, a y b, de 02 bits cada una;
una entrada c_in, que representa un carry de entrada; una entrada sel, de 04 bits, que indica
la operación que se llevará a cabo (ver tabla inferior); y una salida y, de 02 bits, que muestra el
resultado de la operación.
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
2.- EJERCICIOS
2.2.- La sentencia GENERATE
Escribir un código en VHDL, empleando la sentencia GENERATE, para implementar una un
codificador de binario a Gray. Considere que cuenta con una entrada a, de 08 bits, y una
salida b, de 08 bits.
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
3.- RESUMEN
Estilos de código
●
Código concurrente → Solo sirve para circuitos combinacionales.
●
Código secuencial → Sirve para circuitos combinacionales y secuenciales
Código concurrente
●
Operadores (aritméticos, lógicos, etc.)
●
Sentencia WHEN
●
Sentencia GENERATE
Sentencia WHEN
●
WHEN simple →Multiplexores con prioridad
●
WHEN con selector → Multiplexor
Sentencia GENERATE
●
Se emplea con FOR (generalmente)
●
Genera hardware y conexiones que siguen un patrón
●
Se debe tener cuidado de no generar “corto circuitos”
Sesión 05 – Código concurrente MSc. Ántero C.
Diseño de Sistemas Computacionales para
Aplicación Específica
4.- PREGUNTAS
Sesión 05 – Código concurrente MSc. Ántero C.