Está en la página 1de 2

4.1.2.4 Sentencias secuenciales y concurrentes.

-El cuerpo de una architectura en VHDL est formado por sentencias concurrentes. - Las sentencias secuenciales slo pueden aparecer en los cuerpos de subprogramas y dentro de sentencias process. - Algunas sentencias concurrentes tienen un equivalente secuencial; el uso de una forma u otra depende de su ubicacin en el cdigo VHDL.

Sentencia case case expresin is


when valor => sentencias_secuenciales; {when valor => sentencias_secuenciales;} end case;
Hay que contemplar todos los posibles valores de la expresin de seleccin y no pueden solaparse las de distintas opciones de ejecucin. Como valor puede emplearse un rango (con to), others, y la unin de varios valores (con | ).

EJEMPLOS
Modalidades de retardo: transporte e inercial (valor por defecto). Sus diferencias importan en simulacin y en el modelado funcional de circuitos o componentes bsicos de bibliotecas de diseo. El modelo transporte propaga cualquier cambio que se produzca, mientras que el inercial hace que se filtren los cambios proyectados para tiempos anteriores a los impuestos en la asignacin. (no entramos en ms detalle, ya que para sntesis no afecta)
-- Puerta AND 2 entradas -- Descripcin funcional process begin c <= a and b; wait on a,b; end process; -- Biestable D sensible a flanco de reloj -- Descripcin funcional process begin q <= d; wait until clk =1; --equivale a wait until clkevent and clk=1; end process;

wait [on seal {,...} ] [until expresin_booleana] [for expresin_tiempo];

Sentencia loop
[etiqueta:] [while condicin_booleana | for control_repeticin] loop sentencias-secuenciales; end loop [etiqueta];

Sentencias concurrentes: block process assert asignacin a seal instancias de componentes generate llamadas a procedimientos
Sentencias secuenciales
if, case, loop, null, wait, next, exit, assert asignacin a seal, asignacin a variable, llamadas a procedimientos, 1

PROCESS (e) BEGIN S<= TRANSPORT NOT e AFTER 10 ns; END PROCESS;

Declaracin de variables Subprograma


(parte declarativa) Cuerpo del subprograma (procedure function)

control_repeticin ::== identificador in rango_discreto En su forma bsica (sin while ni for), la sentencia loop produce una ejecucin continua (bucle infinito) del bloque de sentencias secuenciales.

PROCESS (e) BEGIN S<= INERTIAL NOT e AFTER 10 ns;

-- Generacin de seal de reloj (para aplicacin de estmulos de simulacin): -process begin reloj<= not reloj; wait for 10 ns;-- seal cuadrada de periodo 20 ns end process; --interpretacin de wait con varias clusulas de reactivacin: wait on a, b until c = 1; --suspende hasta evento en a o en b, y que adems se cumpla c=1. --es sensible slo a a y b. Un evento en c no causa la activacin. wait on a, b for 10ns; --suspende hasta evento en a o en b, o hasta que el tiempo avance 10ns. 7

Hay dos sentencias asociadas con loop: Sentencia next: que finaliza la ejecucin de la iteracin actual para que inicie la siguiente: next [etiqueta_loop] [when condicin_ booleana]; Sentencia exit: que finaliza la iteracin actual y el bucle: exit [etiqueta_loop] [when condicin_ booleana];

END PROCESS;

Sentencias secuenciales
Permiten modelar la funcionalidad de los componentes, dentro de procesos y en los cuerpos de subprogramas
Clasificacin de sentencias secuenciales: Sentencias de asignacin, a variables o a seales. Sentencias condicionales (if, case) Sentencias iterativas (loop, exit, next) Otras (wait, assert, null) y llamadas a subprogramas.

Sentencia de asignacin a seal (<=) : nombre_seal <= [transport | inertial] {expresin_valor after expresin_tiempo, ...}; -Planifica los valores que ir tomando una seal a lo largo del tiempo.
- Cada seal tiene asociado un valor actual (el que leen los distintos procesos) y un driver o cola de eventos. La ejecucin de la asignacin modifica dicho driver, aadiendo a l uno o varios pares <valor, tiempo>.

Sentencia wait wait [on seal {,...} ] [until expresin_booleana] [for expresin_tiempo]; - Suspende la ejecucin del proceso y fija las condiciones para su reactivacin.
Se contemplan tres posibles clusulas de reactivacin: condicin (con until) y temporizacin (con for)

Sentencia assert : assert expresin_booleana [report cadena_caracteres] [expresin_severidad];


- Se emplea en simulacin para generar mensajes segn se cumpla o no una determinada condicin. - La cadena de caracteres se enva al dispositivo estndar de salida cuando no se cumple la condicin. - La expresin_severidad debe ser del tipo enumerado severity_level, definido en el paquete standard, y puede tomar los valores: note, warning, error, y failure.

sensibilizacin (on signal,..),

s <= 0 after 5 ns, 1 after 10 ns, 0 after 20 ns, 1 after 25ns;

Sentencia de asignacin de variable (:=)


Sintaxis: nombre_variable := expresin;

- La lista de sensibilizacin especifica el conjunto de seales a las que es sensible el proceso mientras est suspendido. Cuando ocurra un evento en alguna de ellas, se evala la condicin. Si el resultado es true (o si se ha omitido la condicin), se activa la ejecucin del proceso a partir de la siguiente sentencia. - Si se ha omitido la clusula de sensibilizacin, el proceso es sensible a todas las seales que aparecen en la expresin de condicin. - La expresin de temporizacin indica el tiempo mximo que permanecer suspendido el proceso. - Si se omiten todas las clusulas, la suspensin del proceso es indefinida.

Sentencia null: [etiqueta :] null; - Indica que no se realice accin alguna. Muy utilizada en sentencias case

Sentencia if

if condicin then sentencias_secuenciales {elsif condicin then sentencias_secuenciales;} [else sentencias_secuenciales;] end if; - En simulacin, el valor actual no se modifica hasta un tiempo de retardo indicado mediante after expresin_tiempo, o tras un tiempo mnimo (retardo-delta) - Normalmente, los sintetizadores RT-lgicos ignoran (o prohben) la clusula after.

Los sintetizadores interpretan las sentencias wait slo con ciertas clausulas y formas concretas de uso.

Llamadas secuenciales a subprogramas (procedure y function) dentro de un proceso : [etiqueta :] nombre_procedimiento [(parmetros)]; A diferencia de la llamada a procedimientos, las llamadas a funciones forman parte de expresiones en las asignaciones. Sintaxis: nombre_funcin [(parmetros)]
Ms adelante se ver la forma de definicin de procedimientos y funciones

Relaci n!de!sentencias!concurrentes: process, asignacin concurrente a seal, sentencias estructurales


(component, generate, configuration, generic), bloques y llamadas concurrentes a subprogramas.

Asignacin concurrente condicional:


[etiqueta:] nombre_seal <= [transport] {forma_de_onda when expresin_booleana else} forma_de_onda;

Sentencias estructurales:
En este grupo incluimos las sentencias component, generate, as como las

Sentencia process :
[etiqueta:] process [(nombre_seal {,...})] [is] declaraciones begin sentencias secuenciales; end process [etiqueta]; Sentencia concurrente que hace que se ejecute continuamente un grupo de sentencias secuenciales. La parte de declaraciones se emplea para declarar datos locales y subprogramas locales al proceso. Las seales entre parntesis constituyen la lista (opcional) de sensibilidad del proceso, de manera que las dos descripciones siguientes son equivalentes:

construcciones configuration y generic.

La asignacin se realiza cada vez que se produzca un evento en alguna de las seales de la expresin de asignacin (forma_onda) o de la parte de condicin (expresin_booleana).

Componentes: definen mdulos estructurales interconectables. Para utilizar un componente primero se declara y despus se hacen copias del mismo (instancias). - Sintaxis de declaracin de un componente:
Ms adelante veremos el significado de generic

Sentencia return: [etiqueta :] return [expresin] ; Termina la ejecucin de un subprograma, pasando a ejecutar la instruccin siguiente a la que efectu la llamada: Se utiliza en la definicin del cuerpo de los subprogramas.

La asignacin condicional es una forma compacta de expresar asignaciones secuenciales con la sentencia if dentro de un proceso: -- La sentencia: Z <= X0 when S = 0 else X1;

component nombre_de_componente [ generic (lista_de_genricos);] [port (lista_de_puertos)]; end component ; - Sintaxis de la instanciacin o referencia a un componente: etiqueta_instancia : nombre_de_componente

La expresin de retorno se emplea cuando se trata de funciones

PROCESS BEGIN sentencias secuenciales; WAIT ON lista_de_sensibilidad; END PROCESS;

PROCESS (lista_de_sensibilidad) BEGIN sentencias secuenciales; END PROCESS;

-- es equivalente a la construccin: process (S, X0, X1) begin if S = 0 then Z <= X0; else Z <= X1; end if; end process;

[generic map (lista_asociacin_de_genricos)]


La etiqueta es obligatoria

[port map (lista_asociacin_de_puertos);]

Sentencias concurrentes
La descripcin de una arquitectura en VHDL est formada por sentencias concurrentes
Asignacin concurrente con seleccin: Asignacin concurrente a seal :
Su sintaxis ms sencilla coincide con la de una asignacin secuencial: [etiqueta:] with expresin select nombre_seal <= [transport] {forma_de_onda when valor,} forma_de_onda when valor ;

Ejemplo de declaracin e instaciacin de componentes:


Descripcin estructural de un sumador completo en trminos de semisumadores:
Obsrvese que slo se estn declarando los componentes utilizados, cuya definicin detallada deber tambin estar visible.

[etiqueta:] nombre_seal <= [transport] forma_onda;


La diferencia est en que la asignacin concurrente se ubica fuera de cualquier sentencia process, siendo en s misma equivalente a un proceso con una asignacin secuencial. La asignacin concurrente es sensible a todas las seales que se encuentren en la parte derecha de la misma:
a <= b; es equivalente al proceso: process (b) begin a <=b; end process;

Es equivalente a un proceso que contenga asignaciones secuenciales en una sentencia case. El proceso equivalente se ejecuta cada vez que se produce un evento en alguna de las seales de la expresin de seleccin o de las formas de onda. Estas dos construcciones son equivalentes:
process (op1, op2, alu_op) begin case alu_op is when alu_suma => result <= op1 + op2; when alu_resta => result <= op1 op2; when alu_nand => result <= op1 nand op2; when alu_xor => result <= op1 xor op2; end case; end process;

entity SumadorCompleto is port (X,Y,CIn : in bit; COut,Sum: out bit); end SumadorCompleto; --------------architecture Estructura of SumadorCompleto is signal A,B,C: bit; component Semisumador is port (I1,I2: in bit; COut, Sum: out bit); end component; component or_2 is component port (e1,e2: in bit; y: out bit); end component; begin U1: Semisumador port map (X,Y,A,B); U2: Semisumador port map (B,CIn,C,Sum); U3: or_2 port map (A,C,COut); end Estructura;

Las asignaciones concurrentes admiten adems dos formas compuestas alternativas: asignacin condicional y asignacin con seleccin.

with alu_op select result <= op1 + op2 when alu_suma, op1 op2 when alu_resta, op1 nand op2 when alu_nand, op1 xor op2 when alu_xor;

10

La lista de asociacin que definimos (con port map) al instanciar, puede ser posicional o por nombres: U2 : Semisumador port map (I1=>B, Sum=> Sum, I2=>Cin, Cout=>C); es equivalente a la asignacin posicional anterior de la instancia U2.

16

Sentencia generate: permite definir estructuras repetitivas (equivalentes a instanciaciones mltiples de componentes) o mltiples copias de sentencias concurrentes (incluida la propia generate). etiqueta_generate : { [for especificiacin_for | if condicin] } generate
La etiqueta es obligatoria

Ejemplo de generate con if: Descripcin de sumador para palabras de N bits.


Se utilizan tres sentencias generate con if dentro de una generate con for.

Sintaxis de la declaracin de subprogramas:


(Las declaraciones de parmetros tienen una sintaxis similar a las declaraciones de puertos de entidades)

{ sentencias concurrentes; } end generate;

Sentencia assert concurrente : equivale a un proceso con un assert secuencial (el mismo formato), cuya lista de sensibilidad comprende todas las seales que aparecen en su expresin booleana.

Funciones (function): Slo un valor de retorno, cero o ms parmetros de entrada. Declaracin: function nombre_funcion [(declaraciones_de_parmetros)] return nombre_de_tipo;

Ejemplo de generate con for: Descripcin de un registro de N bits como instancia mltiple de un biestable o flip-flop tipo D:
Tamao genrico, que debe particularizarse al instanciarlo

Declaracin del componente FF_D

entity Registro is generic (N : positive:=4); port ( Reloj : in bit: X : in bit_vector(N-1 downto 0); Z : out bit_vector(N-1 downto 0)); end Registro; ------------------architecture Estructura of Registro is component FF_D is port(reloj, D: in bit; Q: out bit); end component; begin

La conectividad del primer (I0) y ltimo (IN_1) sumadores de un bit se definen de manera distinta al resto.

Sentencia block : permite agrupar (e identificar con un nombre) a un conjunto de sentencias concurrentes. Sintaxis bsica:
Etiqueta: block {declaraciones} begin {sentencias concurrentes} end block [etiqueta];
La etiqueta es obligatoria. Las declaraciones estn visibles slo para las sentencias del bloque (incluidos sub-bloques)

Procedimientos (procedure): Cero o ms parmetros de entrada (in), salida (out) o entrada/salida (inout). Declaracin: procedure nombre_proc [(declaraciones_de_parmetros)];

La instanciacin de FF_D es en este ejemplo la sentencia concurrente de la que se generan mltiples copias

GeneraRegistro: for I in 0 to N-1 generate R: FF_D port map (reloj,X(I),Z(I)); end generate; end Estructura;

Configuracin de un diseo (configuration): Los simuladores genuinos de VHDL, as como algunos sintetizadores, requieren dos etapas (analyze y elaborate) para componer la representacin interna de un diseo completo formado por una o varias entidades.

Llamadas a subprogramas (procedure y function) y su definicin :


Las llamadas son concurrentes cuando se emplean dentro de una arquitectura pero fuera de una sentencia process. El subprograma se ejecuta cada vez que se produzca un evento en alguno de sus parmetros de entrada. La sintaxis de llamada es la misma que en las construcciones secuenciales. Al sintetizar, los subprogramas producen bloques de hardware combinacional (similar a la instanciacin de componentes combinacionales).

Definicin del cuerpo de subprogramas:

La construccin generic permite definir valores genricos de parmetros en la entidad y en la declaracin de componentes. Estos valores deben concretarse cuando se instancia (con generic map).
El registro de tamao genrico N que hemos definido en el ejemplo anterior, al instanciarlo debemos concretar su tamao. Por ejemplo, para un tamao de 16 bits, una instancia del registro podra tener la forma:
Registro_16 : Registro generic map (16) port map (Reloj, Entrada, Salida);

Cuerpo de una funcin: function nombre_funcion [(declaraciones_de_parmetros)] return nombre_de_tipo is {declaraciones} begin

Con analyze se obtienen representaciones intermedias de todas las arquitecturas asociadas a las distintas entidades; representaciones que se guardan en la biblioteca work.

Elaborate compone el diseo total a partir de los mdulos analizados disponibles en work y de otras bibliotecas de diseo visibles, llegando a una expresin del diseo como una red global de procesos interconectados.
La construccin configuration se utiliza para identificar qu arquitectura se debe emplear para cada entidad en el proceso de elaboracin del diseo. No suele ser necesario su uso cuando slo tenemos definida una arquitectura para la entidad (Prescindimos aqu de detallar la forma de declarar y usar configuraciones).

La definicin de los subprogramas (al igual que ocurre con los componentes y las entidades) consta de dos partes: declaracin y cuerpo de subprograma. La declaracin define su interfaz (nombre, parmetros y sus tipos, y valor de retorno en el caso de funciones). El cuerpo del subprograma especifica una implementacin del algoritmo que lo define. Usualmente, cuando se definen subprogramas en paquetes de bibliotecas, sus declaraciones aparecen en la declaracin del paquete, y sus cuerpos en el cuerpo del paquete.

{sentencias secuenciales} end [nombre_funcin]; Cuerpo de un procedimiento: procedure nombre_proc [(declaraciones_de_parmetros)] is {declaraciones} begin {sentencias secuenciales} end [nombre_proc];

Si no se concreta ningn tamao, tomara el valor por defecto en la declaracin (4 en este ejemplo)

En donde Entrada y Salida quedaran como puertos de 16 bits.

NOTA: a partir del VHDL-93 se permite instanciar componentes sin haberlos declarado previamente, especificando en la misma instancia la entidad y la arquitectura a utilizar:
etiqueta_referencia: entity nombre_entidad[(nombre_arquitectura)] [generic map (lista _genricos);] [port map (lista_puertos);]

Funciones de resolucin:
En un diseo VHDL cada seal debe tener un nico driver. Cuando haya varios procesos fuente que pueden actuar como drivers de una seal, debe emplearse algn mecanismo que decida qu valores se van a proyectar para la seal. Para simulacin se emplean funciones de resolucin, que devuelven un valor resuelto (resolved) en caso de conflicto. (Ejem.: vase la definicin std_logic como subtipo de datos resuelto de std_ulogic, en el paquete std_logic_1164 de la biblioteca IEEE).

EXTRACTO de ...\libraries\ieee\std_ 1164.vhd

-- EJEMPLO2: DOS CONSTRUCCIONES QUE SINTETIZAN COMO MULTIPLEXORES -LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY multiplexor IS PORT( X0, X1, S : IN STD_LOGIC; Mux_Out1, Mux_Out2 : OUT STD_LOGIC ); END multiplexer; ARCHITECTURE behavior OF multiplexer IS BEGIN Mux_Out1 <= X1 WHEN S = '1' ELSE X0; PROCESS ( X0, X1, S) BEGIN IF S = '0' THEN Mux_Out2 <= X0; ELSE Mux_Out2 <= X1; END IF; END PROCESS; END behavior;

27

En cambio, para sntesis deben emplearse construcciones que eviten el posible conflicto en lneas o buses, forzando a que la herramienta de sntesis infiera o elementos triestado o bien multiplexores.

Ejemplos:
----EJEMPLO1: DISEO VHDL QUE PRODUCE UN TRI-ESTADO AL SINTETIZAR SI LA SEAL DE DESTINO ES UN PORT, DEBE DECLARARSE COMO INOUT (en FPLDs ser aplicable en aquellas celdas/bloques que admitan configuracin de salida triestado; normalmente slo las E/S del chip)

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY tristate IS PORT( Entrada, Control : IN STD_LOGIC; Salida : INOUT STD_LOGIC); END tristate; ARCHITECTURE behavior OF tristate IS BEGIN Salida <= Entrada WHEN Control = '0' ELSE 'Z'; END behavior;

26