Introduccion Breve-VHDL-Parte 2 - sin Registrar PDF

Title Introduccion Breve-VHDL-Parte 2 - sin Registrar
Author Rafael Saldaña Ojeda
Course Sistemes digitals i llenguatges de descripció de hardware
Institution Universitat Autònoma de Barcelona
Pages 13
File Size 1.1 MB
File Type PDF
Total Downloads 111
Total Views 147

Summary

apuntes...


Description

Hola, En esta sesión abordaremos las sentencias secuenciales del lenguaje VHDL y detallaremos brevemente las sentencias secuenciales más esenciales para nuestro curso.

1

En el mundo Hw las puertas y dispositivos físicos funcionan de forma concurrente lo largo del tiempo, mientras que los lenguajes Sw tradicionales son descripciones funcionales secuenciales que se materializan ejecutando una sentencia después de otra. En el caso del VHDL conviven ambos mundos, el concurrente y el secuencial, donde las descripciones se realizan con sentencias diferenciadas: - Sentencias secuenciales y - Sentencias concurrentes Sentencias secuenciales: - Sentencias algorítmicas similares a los lenguajes software (if, case, loop, exit, return, …) - Se interpretan secuencialmente  el orden de ejecución es importante para los resultados - Solo se usan en functions, procedures y Processes Sentencias concurrentes: - Orientadas a describir o modelar hardware donde componentes, bloques y procesos trabajan simultáneamente a lo largo del tiempo - Sentencias seleccionadas: Procesos, Asignaciones a señal, Instanciación de componentes - Solo se utilizan en las Arquitecturas - Algunas sentencias secuenciales tiene sus equivalentes concurrentes Simulación basada únicamente en procesos (“process”) concurrentes: - Cada sentencia concurrente se convierte a su proceso equivalente basado en sentencias secuenciales - Para simular todas las sentencias concurrentes se convierten a sus procesos equivalentes - La simulación dirigida por eventos del VHDL solo gestiona un conjunto de procesos concurrentes 2

Veamos también cual es la estructura general de una modelo VHDL antes de ir al detalle de las sentencias. Como ya hemos dicho todo módulo VHDL esta definido por una “Entity” o entidad donde fundamentalmente se define la interface con su entorno: principalmente los puertos de entrada/salida. Toda entidad tendrá al menos una arquitectura asociada donde se definirá la funcionalidad del módulo. Dicha funcionalidad se describe entre el “begin” y el “end” y en esta parte solo pueden aparecer sentencias concurrentes. Así por ejemplo en el cuadro de la derecha podemos ver: - Asignaciones concurrentes a señal o - Diversos procesos concurrentes entre si y con las asignaciones anteriores. El orden de escritura de todas las sentencias de una arquitectura es irrelevante pues todas son concurrentes y como tales se simulan. En cambio dentro de los procesos, “process”, se aglutinan sentencias secuenciales y estas si se ejecutan o simulan según el orden en que se han escrito. Luego aquí el orden es importante. Por lo tanto diremos que en una arquitectura se describen de forma concurrente modelos de hardware concurrentes, mientras que en un proceso se describe, de una forma más algorítmica, una determinada funcionalidad mediante una série de instrucciones de ejecución secuencial. Así pues el proceso como tal es una sentencia concurrente que aglutina código secuencial que define la función de dicho proceso.

3

Después de estas aclaraciones previas veamos algunas sentencias secuenciales que pueden aparecer en Procesos, Funciones y Procedimientos. En este curso nos centraremos en los procesos aunque haremos uso de alguna función predefinida en los paquetes standard. Las principales sentencias secuenciales que detallaremos a continuación serán: - Asignaciones a variables y a señales - Wait - If..then..else.. Endif - Case - Loop - Funciones, procedimientos y Assert no las veremos en este curso.

4

La asignación a variable es exactamente igual a una asignación a variable en software, es decir el valor asignado se instala inmediatamente como contenido de la variable en cuestión. Aquí tenemos algunos ejemplos de variables que reciben valores literales, resultados de expresiones o de funciones. El reemplazo inmediato del valor de una variable tras una sentencia de asignación hace que, obviamente, las dos secuencias de la derecha produzcan resultados distintos. Así pues, si los valores iniciales eran A=11 y B=55 entonces: - El resultado final de la primera secuencia es A=B=55 - El resultado final de la segunda secuencia es A=B=11 En fin, el mismo comportamiento quelas variables en el contexto del software secuencial.

5

Veamos ahora la asignación a señal: en este caso, en lugar de producir un cambio inmediato en el valor de la señal lo que se hace es proyectar a futuro un nuevo evento en el “driver” asociado a cada señal. Pero, ¿Qué es un evento? Un evento es una pareja de datos (tiempo, valor) cuyo significado es que en el tiempo “ti” indicado la señal toma el valor “vi” asociado. Y ¿Qué es el “driver” de una señal? A diferencia de las variables que solo son posiciones de memoria con un nombre concreto que cambian de valor de forma inmediata cuando hay una asignación y lo conservan hasta que les afecta otra asignación, una señal requiere de una estructura de memoria más compleja pues debe ser capaz de almacenar distintos valores de futuro, por lo tanto valores que ira asumiendo en distintos instantes de tiempo en el futuro. Visto así el “driver” de una señal es la cola de eventos, pares tiempo-valor, de dicha señal. Así pues las asignaciones a señal llevan asociada una clausula temporal que indica en que instante de tiempo o con que retardo ese nuevo valor debe aparecer en la señal, luego con que retardo dicho valor debe figurar en el “driver“ de la señal. Si no se indica retardo alguno se supone que es con retardo “cero” y en ese caso el nuevo valor se instalaría al principio de la cola de eventos del “driver”, pero seguiría siendo un valor proyectado a futuro, aunque este sea “inmediato”. Este tipo de respuesta ideal con retardo-cero en VHDL se conoce como delta-delay o retardo delta. El VHDL tiene dos modelos de retardo, “transporte” e “inercial”, que no vamos a analizar en detalle pero que definiremos como: - “Inertial”: El retardo asociado a una asignación se considera como el retardo tal que si sobre la señal asignada se producen pulsos inferiores o iguales a dicho retardo estos se filtran y no se proyectan sobre la señal asignada. - “Tranport”: en cambio en este modelo cualquier pulso que se envié a una señal se transfiere a la misma con el retardo indicado sin filtrar los pulsos inferiores al mismo. En este ejemplo de aquí observamos que: -

En primer lugar cargamos el driver de la señal “A” con esta secuencia de eventos. A continuación realizamos asignaciones de esa señal “A” sobre las señales “B1, B2, B3” con distintos tipos de retardo y en el diagrama temporal de la derecha podemos observar los resultados. En general utilizaremos el retardo “inercial” o bien el “inercial con pulso mínimo” que corresponden a estos dos casos de B2 y B3: -

En B2 vemos que con el retardo “inercial” se considera que el tiempo mínimo que tiene que estar estable el valor que se asigna es el correspondiente al retardo de la clausula “after” y por ello en B2 se eliminan los pulsos de entrada inferiores a 10ns. - En cambio en B3 tenemos un retardo “inercial con pulso mínimo de 5ns” y es por ello que en B3 solo se eliminan aquellos pulsos iguales o inferiores a 5ns. Por último, abajo a la izquierda vemos dos asignaciones a señal consecutivas que, a diferencia de lo que ocurría con las variables, ahora ambas secuencias dan el mismo resultado que es un intercambio de valores entre las señales A y B. Si A y B son salidas de flip-flops entonces responde al comportamiento hw correcto; pero si son simples señales de interconexión, entonces este comportamiento de intercambio de valores es inadecuado. En todo caso en esta introducción no profundizaremos en estos temas de los distintos modelos temporales del VHDL.

6

La sentencia “wait” es muy importante para sincronizar el funcionamiento de los procesos concurrentes en VHDL y ya sabemos que todas las sentencias concurrentes se convierten a sus procesos equivalentes para proceder a su simulación; luego cuando se simula solo se simulan procesos concurrentes entre si y secuenciales en su ejecución interior. Esta sentencia indica un punto donde el proceso en cuestión debe suspenderse o detenerse, así como las condiciones para su reactivación. En un proceso pueden haber mas de una sentencia “wait”. Aquí tenemos la sintaxis de esta sentencia pero veamos directamente algunos ejemplos ilustrativos de su posibilidades: - “Wait;” sin condición de reactivación: en este caso el proceso se suspende definitivamente. - “Wait on a, b;”: el proceso se detiene al llegar a este “wait” y se reactivara si y solo si hay algun evento en las señales “a” o “b”. Es equivalente a haber escrito “Process (a, b)” y no poner la sentencia “wait on a, b;” - “Wait for 10ns;”: una vez detenido el proceso en este “wait” se dejan transcurrir 10 ns y entonces el proceso se reactiva y sigue en secuencia. - “Wait until Clock = 1;”: este “wait” detiene el proceso y se queda sensible a “evento en señal” (evento en “Clock”) y que se cumpla una condición (“Clock = 1”). De hecho esta es una de las formas de detección de un flanco de subida en la citada señal “Clock”.

7

Ahora que hemos visto la sentencia “Wait” hagamos un pequeño inciso sobre la simulación dirigida por eventos del VHDL que nos ayudara a entender la importancia de esta sentencia para facilitar la comunicación de procesos a través de las señales y a partir de ello el funcionamiento del ciclo de simulación del VHDL. Una simulación dirigida por eventos significa que la simulación de procesos solo se realiza en aquellos instantes en los que se ha producido algún evento en alguna señal y en ese caso solo se reactivan y evalúan solo aquellos procesos que se ven afectados por los eventos de cada instante. El tiempo transcurrido entre dos eventos consecutivos no genera ninguna tarea de simulación pues los ciclos de simulación saltan al siguiente evento mas cercano en el tiempo. Si vemos el ciclo de simulación del VHDL observamos que: - En primer lugar se inicializan todas las señales de nuestro modelo bajo simulación. - Luego, la primera vez, se evalúan o ejecutan todos los procesos concurrentes del modelo bajo simulación. Esos procesos proyectarán eventos a futuro sobre distintas señales. - Cuando todos los procesos en ejecución se han detenido (wait o lista de sensibilidad) pasamos a la fase de actualizar los drivers de todas las señales y ver cual es el instante de tiempo más cercano en el que hay algún evento y avanzamos el tiempo hasta ese instante. - Entonces se vuelve a la ejecución de procesos pero ahora reactivando solo aquellos que en ese instante de tiempo hay algún evento que los despierta, los reactiva; es decir, algún evento en las señales de su lista de sensibilidad o del “wait” correspondiente, o bien algún evento temporal especifico del proceso (p.e. “wait for 10 ns”). - Y vamos repitiendo este bucle “ejecución – actualización” hasta que no queden eventos en ninguna cola de ningún driver de señal o bien haya finalizado el tiempo de simulación. En el diagrama de la derecha podemos ver un ejemplo de evolución de estas simulaciones dirigidas por eventos: - Hay eventos en los tiempos: 0, 1, 3, 4 y 5, y por lo tanto en esos instantes es cuando se ejecutan los procesos que se hayan activado debido a los correspondientes eventos. Entre los tiempos 1 y 3 no hay eventos y por lo tanto no se evalúan procesos. - Cuando en una fase de actualización de drivers y de tiempos se detecta que ha habido uno o más eventos nuevos con retardo “0” o “delta” se volverán a evaluar los procesos afectados por tal/tales eventos pero sin avanzar el tiempo de simulación. Esto es lo que se llama un ciclo-delta de simulación y serian esta marcas que hay en vertical sobre un mismo instante de simulación. Los retardos-delta consumen ciclos de simulación pero no hacen avanzar el tiempo de simulación.

8

Recuperemos las sentencias secuenciales en las que estábamos. La siguiente es la sentencia “if__the__else__endif;” Esta es la sintaxis que puede tener “ifs” anidados y que puede estar incompletamente especificada, es decir puede tener “then” sin tener “else”. Veamos algunos ejemplos: - Mux: este esquema de abajo a la izquierda ya lo conocíamos y modela la funcionalidad de un multiplexor. - Buffer Triestate: este caso se parece al multiplexor, pero cuando no se cumple la condición conectamos la salida a ‘Z’ alta impedancia. Luego este es un buffer cuya salida puede tener tres estados distintos: el valor de la “Entrada”, que podría ser ‘0’ o ‘1’, y el de ‘Z’ o alta impedancia. - Latch: en este caso vemos un “if” incompletamente especificado pues tiene “then” pero no tiene “else”. ¿Cómo se interpreta este código? Pues si se cumple la condición la entrada “D” se envía a la salida “Q”; pero si no se cumple la condición no se especifica lo que hay que hacer y por lo tanto se interpreta que debemos guardar el último valor que había en Q. Así mismo y dado que el “wait” se reactiva por cambios en “load” o en “D”, mientras “load=1” cualquier cambio en D se guardará en este biestable o elemento de memoria; y este comportamiento describe el funcionamiento de un «LATCH». - Flip-flop: en este caso vemos un “if” anidado: - Si se cumple el primer “if rst = 1” entonces ponemos “Q …” - Un rango de valores: “when 5 to 12 =>…” - El resto de posibles valores: “when others =>…” Cuando un “case” no esta completamente especificado y no tiene la clausula “when others =>…” significa que para los casos no especificados se deben conservar los valores anteriores de las variables o señales afectadas; luego, en estos casos, también se infieren elementos de memoria tipo latch. Y aquí tenemos algunos ejemplos muy sencillos de esta sentencia “case” en base a una serie de tipos de datos y señales previamente definidos como se indica aquí. Y en este último cuadro un último ejemplo basado en señales y variables de tipo entero.

10

Veamos ahora un ejemplo un poco más elaborado y combinado de estas sentencias “if” y “case”. Queremos modelar en VHDL el esquema “LatMux” de la figura y para ello: - Declaramos primero una “entity LatMux” con sus entradas y salidas primarias. - A continuación definimos una “architecture TwoProc of LatMux” donde declaramos la señal “X” que nos servirá en esta arquitectura para conectar la salida del multiplexor con la entrada del latch. - Ya dentro de la arquitectura vemos que hay dos procesos concurrentes para modelar los dos subbloques: - El multiplexor con una sentencia “case”; y - El latch con una sentencia “if” incompletamente especificada (solo tiene clausula “then” pero no tiene “else”) que, como ya vimos, es una de las formas de modelar un latch. Estos dos procesos encapsulan código secuencial pero son concurrentes entre si.

11

Una nueva sentencia secuencial: el “Loop” o bucle. Esta sentencia encierra entre el “loop” y el “end loop” un conjunto de sentencias secuenciales que se repiten según el tipo y condiciones de control del “Loop”. Hay tres tipos de bucles o loops: - “While loop … end loop”: el bucle se repite mientras se cumpla la condición, es decir mientras la condición sea “true”. - “For loop… end loop”: el bucle se repite para todos los valores del rango de repetición indicados en . - “Loop… end loop”: este es un bucle infinito. Como ejemplo veamos un sumador de “n-bits” que se recorren desde el bit “0” hasta el bit “n-1” mediante una sentencia “For loop… end loop”. Existen sentencias para romper la secuencia normal de iteraciones de un bucle: - Exit: Finaliza la ejecución del bucle cuando la “boolean_condition” es “true” y continua por la sentencia siguiente después del bucle. - Next: Finaliza la iteración en curso del bucle cuando “boolean_condition” es “true” y salta a la iteración siguiente (después de esta sentencia se abandona la iteración en curso y salta a la siguiente iteración)

12

Como resumen de esta sesión diremos que : - Hemos identificado las principales características y diferencias entre el mundo secuencial y el concurrente en VHDL. - Hemos detallado un subconjunto de las sentencias secuenciales disponibles en este lenguaje. - Hemos presentado como se gestiona el “tiempo” en VHDL introduciendo a su vez los elementos fundamentales de la simulación temporal dirigida por eventos en la que se basa este lenguaje. - Y todo ello aderezado con ejemplos sencillos para facilitar su comprensión. Y esto es todo. Saludos y hasta la próxima.

13...


Similar Free PDFs