Está en la página 1de 40

SENTENCIAS SECUENCIALES Y

CONCURRENTES DE VHDL
SENTENCIA IF

sentencia_if::=
[etiqueta:]
if condicion(boolean) then
{sentencias_secuenciales}
{elsif condicion then
{sentencias_secuenciales}}
[else
{sentencias_secuenciales}]
end if [etiqueta];
SENTENCIA IF

El orden en el que se sitúan las ‘condiciones’ dentro del if-


elsif es importante, pues si hay dos ciertas, se ejecutará
únicamente la primera.
SENTENCIA CASE

sentencia_case::=
[etiqueta:]
case expresion is
when valor=>{sentencias_secuenciales}
{...}
end case [etiqueta];

valor ::=(expresion_simple|rango_discreto|others){|...}

•Los valores de elección no pueden solapar sus rangos .


•Los valores de elección deben cubrir todos los valores posibles de
‘expresion’
SENTENCIA CASE
SENTENCIA CASE
SENTENCIA CASE
BUCLES

sentencia_loop::=
[etiqueta:]
[while condicion|for id in rango_discreto] loop
{sentencias_secuenciales}
end loop [etiqueta];
BUCLES
BUCLES
BUCLES
BUCLES

La sentencia next se utiliza en un bucle para detener una ejecución y


pasar a la siguiente iteración:

sentencia_next::=
[etiqueta:]next [etiqueta_loop][when condicion];
BUCLES
La sentencia exit se utiliza para salir de un bucle de forma incondicional.

sentencia_exit::=
[etiqueta:]exit [etiqueta_loop][when condicion];

Sentencia NULL
sentencia_null::= •Una sentencia null no efectúa ninguna
[etiqueta:] null : acción.
•En algunas ocasiones la sintaxis del
lenguaje exige la poner una sentencia
Sentencia ASSERT
•Proporciona mensajes si no se cumple una condición en tiempo de ejecución.
•Se utiliza en la depuración de modelos.
•Puede llegar a detener la ejecución de una simulación

sentecia_assert::=
[etiqueta:] assert condicion
[report expresion] [severity expresion];

type severity_level is (note,warning,error,failure);


Asignación secuencial de señales
declaracion_señal::=
signal identificador{,...}:subtipo[tipo_señal][:=expresion ];

tipo_señal::= register|bus

asignacion_señal ::=
[label]identificador<=[mecanismo_retardo]forma_de_onda;

forma_de_onda::=(expresion [after exp_tmp]){,...}

mecanismo_retardo::= transport|[reject exp_tmp]inertial

signal net1,net2: bit;


signal enable:integer:=0;
reloj<= ‘1’ after t_pw,’0’ after 2*t_pw;
-- t_pw y 2*t_pw tienen la misma referencia temporal:
-- el tiempo de simulación actual.
y<= not or_a_b after 5ns;
salida<= b“0010”; -- retardo delta
Asignación secuencial de señales
• Las señales pueden cambiar de valor en cualquier momento, pero a
diferencia de las variables guardan una analogía con el Hw.
• Se pueden considerar una abstracción de conexiones físicas o buses.
• Cosideraremos:
Transacción: par nuevo valor-tiempo en que se aplica
Evento: transacción que provoca un cambio de valor en una señal
• Los procesos se ejecutan como respuesta a eventos en las señales.
• Cada señal tiene asociado un driver en el que se almacenan pares valor-
tiempo como una secuencia de transacciones.
• Cuando se hace una asignación a una señal no se modifica el contenido
de la misma, si no el de su cola de eventos. Se indica el futuro valor de la
señal para un tiempo determinado, aunque esa asignación puede llegar a
no producirse.
Asignación secuencial de señales
• Retardo Delta: en algunas ocasiones la asignación de señales se produce
con un retardo de 0 fs (delta delay), por ejemplo salida<= b“0010”;
• El ciclo de simulación tiene dos fases:
• Actualización de señales: se produce cuando el tiempo de
simulación avanza hasta una transacción programada.
• Ejecución de procesos: si en la fase anterior se producen eventos los
procesos implicados en ellos se ejecutan.
• Cuando todos los procesos se suspenden, el simulador procesa las
señales que tienen retardo delta, produciéndose una actualización
como la descrita anteriormente pero sin que cambie el paso de
simulación.
• Y así sucesivamente hasta que no hayan más eventos.
• Los modelos con retardos delta implican alto nivel de abstracción
Asignación secuencial de señales

INICIO SIMULACIÓN

Lista de
Todas las señales
eventos
actualizadas

Actualizar
señales δ Ejecutar
procesos

Procesos suspendidos:
No más eventos
Avance del tiempo de
Fin tiempo simulación
simulación hasta próximo
evento programado

FINAL SIMULACIÓN
Asignación secuencial de señales
(modelos de retardos)
mecanismo_retardo::=
transport|[reject exp_tmp]inertial

•El modelo transport describe el comportamiento de un dispositivo


ideal, en el que cualquier pulso de entrada independientemente de
su duración provoca una salida: respuesta en frecuencia infinita.
•El modelo inertial describe circuitos reales en los que una señal de
corta duración puede no provocar una salida en el dispositivo. La
anchura de pulso mínima se especifica mediante reject y en su
ausencia por after.
•Si no se indica nada en la asignación de un señal el modelo de
retardo utilizado es inertial
•Cuando en una misma asignación se especifican varias transaccio-
nes a una señal, el mecanismo de retardo solo se aplica a la prime-
ra, siendo el del resto del tipo transport.
Asignación secuencial de señales
(modelos de retardos)

18ns 5ns

10ns 10ns

A 1ns

B
10ns
Asignación secuencial de señales
(modelos de retardos)
Modelo de transporte:
• Las nuevas asignaciones eliminan las asignaciones posteriores del
driver:
• Se añaden al final del driver

Valor Actual 1 Valor Actual 1 X


Tiempo T T+10 Tiempo T T+10 T+25

Valor Actual 1 0 X Valor Actual 1 0


Tiempo T T+10 T+20 T+25 Tiempo T T+10 T+20
Asignación secuencial de señales
(modelos de retardos)
Modelo inercial:
• Las nuevas asignaciones eliminan las asignaciones posteriores del
driver:
• Se comprueban en las nuevas transacciones si se cumple la anchura de
pulso mínima exigida (parámetro reject o after), eliminando las
asignaciones que no lo hagan.

Valor Actual 000 Valor Actual 000 101


Tiempo T T+10 Tiempo T T+9 T+10 T+15

-6

Valor Actual 010 101 Valor Actual 010


Tiempo T T+12 T+15 Tiempo T T+12
Asignación secuencial de señales
(modelos de retardos)
Otro ejemplo:

Valor actual 1 X 1 0 1 1 1 0
Tiempo T T+11 T+12 T+14 T+15 T+16 T+17 T+20 T+25

Valor actual 1 X 1 0 1 1 1 1 0
Tiempo T T+11 T+12 T+13 T+14 T+15 T+16 T+17 T+18 T+20 T+25

-5

Valor actual 1 X 1 1 1
Tiempo T T+11 T+12 T+16 T+17 T+18
Asignación secuencial de señales
(Atributos)
Para una señal S y un tiempo T se definen los siguientes atributos:

S’delayed[(T)] Señal S retrasada T unidades de tiempo


S’stable[(T)] Señal booleana verdadera si no se han producido eventos
en las T últimas unidades de tiempo.
S’quiet[(T)] Señal booleana verdadera si no se ha producido ninguna
asignación en las T ultimas unidades de tiempo.
S’transaction Señal tipo bit que cambia de ‘0’ a ‘1’ y viceversa cada vez
que se produce una transacción en S.
S’event Verdadero si hay un evento en S en el actual ciclo de
simulación, falso en cualquier otro caso.
S’active Verdadero si hay una transacción en S en el actual ciclo de
simulación, falso en cualquier otro caso.
S’last_event Intervalo de tiempo desde el último evento en S.
S’last_active Intervalo de tiempo desde la última transacción en S.
S’last_value Valor de S antes del último evento.
SENTENCIA PROCESS

• Un proceso es una sentencia concurrente que define su comportamiento a


través de sentencias secuenciales:
• Cualquier sentencia, secuencial o concurrente tiene su proceso equivalente:
VHDL solo trabaja con procesos.

sentencia_process::=
[label:] process [(id_señal {,…})] [is]
{declaraciones}
begin
{sentencias secuenciales}
end process [label];

• Un proceso es un bucle infinito entre las sentencias begin y end process.


• La ejecución de un proceso se detiene (suspende) al ejecutar una sentencia
wait.
• Un proceso despierta cuando se produce un evento en la relación de señales
especificadas en su declaración o por las especificadas en a sentencia wait.
• Un proceso que no asigna valores a ninguna y señal y por tanto no puede
despertar a otros procesos, se llama proceso pasivo.
SENTENCIA WAIT

• La sentencia wait indica en que punto se suspende la


ejecución de un proceso.
• Al mismo tiempo indica las condiciones para su
reactivación.

sentencia_wait::=
[etiqueta:] wait [on id_señal {,..}]
[until exp_booleana]
[for exp_temp];

•wait on establece las señales a las que será sensible el


proceso.
SENTENCIA WAIT
SENTENCIA WAIT
SENTENCIA WAIT
Asignación concurrente de señales
• Se utiliza para casos sencillos, en modelos funcionales comportamentales en
los que la operación se describe como una simple asignación combinacional
que transforma las entradas en salidas.
• Se declara en las arquitecturas en vez de en los procesos o subprogramas.
• Es sensible a las señales que se encuentran a la derecha del símbolo de
asignación.

asignacion_concurrente_señal::=
[label:]identificador<=[mecanismo_retardo]forma_de_onda;

Dato_0<= sel and dato_in after 20ns;


Asignación concurrente de señales
Asignación concurrente condicional

Asignacion_concurrente_condicional::=
[etiqueta:]señal_id<=[mecanismo_retardo]
{forma_de_onda when expr_booleana else}
forma_de_onda [when expr_booleana];

•Podemos sustituir forma_de_onda por la palabra clave unaffected si para alguna


condición no deseamos cambiar el valor de la señal.
•Es sensible a las señales relacionadas en forma_de_onda y en expr_boolena.
Asignación concurrente de señales
Asignación concurrente condicional
Asignación concurrente de señales
Asignación concurrente con selección

Asignacion_concurrente_seleccion::=
[etiqueta:]with expr select
señal_id<= [mecanismo_retardo]
{forma_onda when valor,}
forma_onda when valor;

• Podemos sustituir forma_de_onda por la palabra clave unaffected si para alguna


condición no deseamos cambiar el valor de la señal.
• Es sensible a las señales relacionadas en forma_de_onda y en expr.
Asignación concurrente de señales
Asignación concurrente con selección
Assert concurrente

sentecia_assert::=
[etiqueta:] assert condicion
[report expresion] [severity expresion];
Entidades y procesos pasivos
Declaracion_entidad::=
entity <identificador> is
[generic (lista_de_genéricos);]
[port (lista_de_puertos);]
{declaraciones}
[begin
{sentencias_assert_concurrentes
|llamadas_a_procesos_concurrentes_pasivos
|sentencias_de_procesos_pasivos}]
end [entity] [identificador];

•Cualquier sentencia concurrente incluida en la declaración de


entidad debe ser pasiva, no puede afectar a ninguna señal.
Descripciones estructurales
•Una descripción estructural representa un sistema en términos de subsistemas
interconectados mediante señales.
•Cada subsistema a su vez se puede representar mediante otros subsistemas
más básicos interconectados por señales.
•Y así sucesivamente hasta llegar a los componentes básicos consistentes en
primitivas descritas en términos de comportamiento.

sentencia_instanciacion_componente::=
etiqueta: entity id_entidad [(id_arquitectura)]
[port map (lista_asocioacion_puertos)];

•Se puede considerar que esta sentencia concurrente crea una copia de la
entidad referenciada, a la que le asocia una de las posibles arquitecturas
que puede tener definidas

lista_asociacion_puertos::=
([nombre_puerto=>](señal_id|expr|open)){,…}

•Permite asociar cada puerto de la entidad referenciada con una señal de


la arquitectura donde se instancia.
•La cláusula open indica que un puerto no esta asociado a ninguna señal.
Descripciones estructurales

Asociación posicional: cada señal listada en el mapa de puertos se conecta con el


puerto de la misma posición en la declaración de entidad.

Asociación por nombre: se indica explícitamente mediante el operador => la


asociación entre los puertos.
SENTENCIA GENERATE

sentencia_generate::=
etiqueta:
[for identificador in rango_discreto |if expr_booleana] generate
{[bloque_declaraciones}
begin]
{sentencias_concurrentes} --atencion
end generate [etiqueta];
SENTENCIA GENERATE

También podría gustarte