Lección 4_ Gramática Del Lenguaje I

9
4/10/2015 Lección 4: Gramática del lenguaje I http://www.ehu.eus/~jtpolagi/completo/04.htm#4 1/9 Gramática del lenguaje I Sentencias secuenciales 1 2 Asignación a una señal Asignación a variable 3 4 Sentencia if Sentencia case 5 6 Sentencia loop Sentencia exit 7 8 Sentencia next Sentencia null 9 10 Sentencia wait Sentencia wait until 11 Sentencias secuenciales  En la mayoría de los lenguajes de descripción de software, todas las sentencias de asignamiento son de naturaleza secuencial. Esto significa que la ejecución del programa se llevara a cabo de arriba a abajo, es decir siguiendo el orden en el que se hayan dispuesto dichas sentencias en el programa, por ello es de vital importancia la disposición de las mismas dentro del código fuente.     VHDL lleva a cabo las asignaciones a señales dentro del cuerpo de un proceso ﴾process﴿ de forma secuencial, con lo que el orden en el que aparezcan las distintas asignaciones será el tenido en cuenta a la hora de la compilación. Esto hace que cuando utilicemos modelos secuenciales en VHDL, estos se comporten de forma parecida a cualquier otro lenguaje de programación como Pascal, C, etc.   Asignación a una señal     Podremos asignar un cierto valor a una señal siempre que ésta haya sido declarada en la entidad en el apartado de declaración de puertos, o bien porque la hayamos creado específicamente dentro de un process .     La asignación a una señal dentro de un proceso es siempre secuencial , es decir, la señal no cambia su valor hasta que se ha evaluado el proceso en el cual se incluye. Si no está dentro de un proceso, como por ejemplo, usando el estilo dataflow , el cambio es concurrente, es decir, la

description

pdff

Transcript of Lección 4_ Gramática Del Lenguaje I

Page 1: Lección 4_ Gramática Del Lenguaje I

4/10/2015 Lección 4: Gramática del lenguaje I

http://www.ehu.eus/~jtpolagi/completo/04.htm#4 1/9

Gramática del lenguaje I

Sentencias secuenciales 1 2 Asignación a una señal

Asignación a variable 3 4 Sentencia if

Sentencia case 5 6 Sentencia loop

Sentencia exit 7 8 Sentencia next

Sentencia null 9 10 Sentencia wait

Sentencia wait until 11

Sentencias secuenciales

En la mayoría de los lenguajes de descripción de software, todas las sentencias deasignamiento son de naturaleza secuencial. Esto significa que la ejecución del programa sellevara a cabo de arriba a abajo, es decir siguiendo el orden en el que se hayan dispuestodichas sentencias en el programa, por ello es de vital importancia la disposición de las mismasdentro del código fuente.

VHDL lleva a cabo las asignaciones a señales dentro del cuerpo de un proceso ﴾process﴿ deforma secuencial, con lo que el orden en el que aparezcan las distintas asignaciones será eltenido en cuenta a la hora de la compilación. Esto hace que cuando utilicemos modelossecuenciales en VHDL, estos se comporten de forma parecida a cualquier otro lenguaje deprogramación como Pascal, C, etc.

Asignación a una señal

Podremos asignar un cierto valor a una señal siempre que ésta haya sido declarada en laentidad en el apartado de declaración de puertos, o bien porque la hayamos creadoespecíficamente dentro de un process.

La asignación a una señal dentro de un proceso es siempre secuencial, es decir, la señal nocambia su valor hasta que se ha evaluado el proceso en el cual se incluye. Si no está dentro deun proceso, como por ejemplo, usando el estilo dataflow, el cambio es concurrente, es decir, la

Page 2: Lección 4_ Gramática Del Lenguaje I

4/10/2015 Lección 4: Gramática del lenguaje I

http://www.ehu.eus/~jtpolagi/completo/04.htm#4 2/9

asignación está siempre activa, y se actualiza instanteneamente. Para hacer una asignación auna señal deberemos usar el operador <=, estando la señal a asignar a la izquierda y el valorque debe tomar a la derecha.

signal <= signal1 + signal2;

Las señales son el objeto más usado dentro de la síntesis de diseños, teniendo laparticularidad de que los cambios en una señal son programados, no son inmediatos. Estoresulta extraño, sobre todo si comparamos su comportamiento con el de las variables, y paradejar claro este concepto veamos el siguiente ejemplo:

processbegina <= b;b <= a;wait on a,b;end process;

La señal a tendrá el valor bLa señal b tendrá el valor a Se acualizan los cambios AQUÍ

En este ejemplo, las dos señales intercambian sus valores, ya que cuando se ejecuta lasegunda ﴾b<=a﴿, el valor de la señal a no ha cambiado todavía aunque esté la sentencia a<=b, ya que ninguna señal cambia de valor hasta que se hayan evaluado todas las órdenesde un proceso, y es en ese momento cuando a y b toman el valor que se les ha indicado tomar.

Asignación a variable

La asignación a una variable viene totalmente influenciada por su propia naturaleza, la cualhace que sólo tengan su campo de acción en un proceso o un subprograma ﴾areassecuenciales﴿. Una variable no retiene sus valores dentro de un subprograma después de cadallamada, soliendo usarse como índices para ciclos loop y para asignaciones inmediatas. Siqueremos usar una variable fuera de un proceso, deberemos asignar su valor a una señal, yoperar con la señal fuera. Para hacer el asignamiento a una variable deberemos usar eloperador := , como se muestra en los ejemplos siguientes.

A diferencia de las señales, el asignamiento de un valor a un variable, no tiene un retardoasociado, de manera que la variable toma el nuevo valor justo en el momento de la asigación,de forma que las sentencias que vengan a continuación, la variable recien asignada, tendrá elnuevo valor. De esta forma, el ejemplo expuesto para señales, al ser usado para variables, noconseguimos el mismo resultado:

a := b;b := a;

a toma el valor bb toma el NUEVO valor de a (el de b)

En esta ocasión, no se intercambiarán los valores de ambas señales, sino que acabarán conel valor inicial de la variable b. Para conseguir que se intercambien las variables, deberemosusar una variable temporal de la siguiente forma:

Page 3: Lección 4_ Gramática Del Lenguaje I

4/10/2015 Lección 4: Gramática del lenguaje I

http://www.ehu.eus/~jtpolagi/completo/04.htm#4 3/9

temp := a;a := b;b := temp;

temp toma el valor de aa toma el valor de bb toma el valor de temp (que era a)

Deberemos tener en cuenta que una variable se reinicializa siempre al hacer una nuevallamda a un subprograma.

Sentencia if

La construcción if­then­else es usada para seleccionar un conjunto de sentencias paraser ejecutadas según la evaluación de una condición o conjunto de condiciones, cuyo resultadodebe ser o true o false. Su estructura es la siguiente:

if (condición) then haz una cosa;else haz otra cosa diferente;end if;

Si la condición entre paréntesis es verdadera, la﴾s﴿ sentencia﴾s﴿ secuencial﴾es﴿ seguidas a lapalabra then son ejecutadas. Si la condición entre paréntesis es falsa, la﴾s﴿ sentencia﴾s﴿secuencial﴾es﴿ seguidas a la palabra else son ejecutadas. La construcción debe ser cerradacon las palabras end if.

La sentencia if­then­else puede ser expandida para incluir la sentencia elsif, la cual nospermite incluir una segunda condición si no se ha cumplido la primera ﴾la cual tiene prioridad﴿.Su estructura es la siguiente:

if (condición) then haz una cosa;elsif (otra condición) then haz otra cosa diferente;else haz otra totalmente diferente;end if;

Si se da la situación en la cual la primera condición es verdad ejecuta las sentencias que vandespués del primer then. Si no es verdadera la primera condición, se pasa a evaluar lasegunda, y de ser esta verdad, ejecuta las sentencias que están a continuación del segundothen. Si ninguna de las dos es verdadera, se ejecuta lo que está detrás de la palabra else.Nótese que para que se ejecute las sentencias con el nombre "otra cosas diferente", no solodebe ser la segunda condición verdadera, sino que además la primera condición debe serfalsa. Un ejemplo de esta sentencia se puede ver a continuación:

entity multi is port( entidad del multiplexor

Page 4: Lección 4_ Gramática Del Lenguaje I

4/10/2015 Lección 4: Gramática del lenguaje I

http://www.ehu.eus/~jtpolagi/completo/04.htm#4 4/9

a, b, c :in bit_vector(3 downto 0);enable :in bit;control :in bit_vector(1 downto 0);d :out bit_vector(3 downto 0));end multi;

puertos del multiplexor finaliza la entidad

architecture archmul of multi isbeginprocess (a, b, c, control, enable)beginif enable='1' then d<="1111";elsif enable='0' then case control is when "00" => d <= a; when "01" => d <= b; when "10" => d <= c; when "11" => d <= "1111"; end case;end if;end process;end archmul;

arquitectura del multiplexor si enable es 1 entonces d="1111"si enable no es 1 y es 0 entoncessentencia case dentro del if se cierra la sentencia casese cierra la sentencia if con end finaliza la arquitectura

Deberemos tener cuidado al usar una sentencia if­then­else ya que podemos caer en el errorde la memoria implícita. Si no incluimos la palabra else, y si no se cumple la primera condición,las señales de salida no cambian, reteniendo el valor previo a la sentencia if. Esto puedeayudarnos ﴾flip­flops﴿ o bien hacer que un diseño sea totalmente erróneo. Analicémoslo conun ejemplo:

if (clk'event and clk='1') then q <= d;end if;

Si hay un flanco de subida en la señal clk,entonces q toma el valor de d.

En este caso se dice que debe ejecutarse si hay un flanco de subida en la señal clk, pero nose dice nada si no hay cambios o si el flanco es de bajada. Es en este caso se ha definido unamemoria implícita, y VHDL hace que la señal q siga con el valor que tenía antes de ejecutarsela sentencia if. Esto hace que este código y el que se lista a continuación sean equivalentes:

if (clk'event and clk='1') then q <= d;else q <= q;end if;

Si hay un flanco de subisda en la señal clk,entonces q toma el valor de d, si no es así,q sigue manteniendo su valor.

Esto hace que se recomiende siempre el especificar con else que debe pasar con lasseñales si no se cumpla la condición indicada con el if. En la parte práctica hay varios ejemplsocon la sentencia if, pulsa aquí para ir a la parte práctica.

Para evitar la inclusión de memoria implícitas se recomienda especificar siempre elcomportamiento del circuito en aquellos casos en los que no se cumple la condicion de una

Page 5: Lección 4_ Gramática Del Lenguaje I

4/10/2015 Lección 4: Gramática del lenguaje I

http://www.ehu.eus/~jtpolagi/completo/04.htm#4 5/9

sentencia if, o de una sentencia case.

Sentencia case

La sentencia case es usada para especificar una serie de aciones según el valor dado deuna señal de selección. Esta sentencia es equivalente a la sentencia with­select­when, con lasalvedad que la sentencia que nos ocupa es secuencial, no combinacional. La estructura es lasiguiente:

case (señal a evaluar) is when (valor 1) => haz una cosa; when (valor 2) => haz otra cosa; ... when (último valor) => haz tal cosa;end case;

En el caso que la señal a evaluar ﴾situada después del case﴿ tenga el "valor 1", entonces seejecuta "una cosa", si tiene el "valor 2", se ejecuta "otra cosa", ... y si tiene el "último valor", seejecuta "tal cosa". Esta sentencia parece hecha a la medida para crear multiplexores, como seve en el siguiente ejemplo, del cual sólo estudiamos la parte correspondiente a la sentenciacase:

entity multi is port(a, b, c :in bit_vector(3 downto 0);enable :in bit;control :in bit_vector(1 downto 0);d :out bit_vector(3 downto 0));end multi; architecture archmul of multi isbeginprocess (a, b, c, control, enable)beginif enable='1' then d<="1111";elsif enable='0' then case control is when "00" => d <= a; when "01" => d <= b; when "10" => d <= c; when "11" => d <= "1111"; end case;end if;end process;

entidad del multiplexorpuertos del multiplexor finaliza la entidad arquitectura del multiplexor sentencia if que contiene al case se evalúa la señal control si control vale "00" entonces d<=asi control vale "01" entonces d<=bsi control vale "10" entonces d<=csi control vale "11" d valdrá "1111"se cierra la sentencia case con endse cierra la sentencia if

Page 6: Lección 4_ Gramática Del Lenguaje I

4/10/2015 Lección 4: Gramática del lenguaje I

http://www.ehu.eus/~jtpolagi/completo/04.htm#4 6/9

end archmul; finaliza la arquitectura

Esta sentencia es muy típica de los lenguajes de programación y cuenta además con unavariante, muy importante en VHDL, como es dar un valor especificado a la cierta señal si no secontemplan todos los casos posibles de la señal a evaluar. Para ello se usa la palabrareservada others, que aparece en el siguiente fragmento de código:

case control is when "00" => d <= a; when "01" => d <= b; when "10" => d <= c; when others => d <= "1111";

end case;

se evalúa la señal control si control vale "00" entonces d<=asi control vale "01" entonces d<=bsi control vale "10" entonces d<=csi control no toma ningún valor de los especificados antes,toma el valor "1111"finaliza la arquitectura

Al igual que era recomendable especificar un else dentro de cada if, se recomienda, conmás razón el uso de others dentro de un case aunque en un rpincipio paresca que estanespecificados todos los valores posibles, ya que algunos tipos soportan más valores aparte delnivel uno y cero lógico, como el estado Z o de alta impedancia. Pulsa aquí para ir a la prácticadel multiplexor.

La sentencia case también nos permite especificar un rango de valores posibles de la señalde selección, para los cuales hacer una asignación, mediante la palabra reservada to. Comoejemplo veamos dos fragmentos de código que son equivalentes:

case control iswhen "000" => d <= a;when "001" => d <= a;when "010" => d <= a;when "011" => d <= b;when "100" => d <= b;when "101" => d <= b;when "110" => d <= b;when "111" => d <= c;when others => d <= null;end case;

case control iswhen "000" to "010" => d <= a;when "011" to "110" => d <= b;when "111" => d <= c;when others => d <= null;end case;

Sentencia loop

La sentencia loop ﴾ciclo en castellano﴿ se usa para ejecutar un grupo de sentencias unnúmero determinado de veces, y consiste tanto en un ciclo for como en un ciclo while. Lasentencia for se ejecuta un número específico de iteraciones basado en el valor de unavariable. La sentencia while continuará ejcutándo una operación mientra una condición decontrol local sea cierta. Estas sentencias son muy típicas de los lenguajes más usuales deprogramación, usándose habitualmente para ello la variable i. A continuación se listan sendos

Page 7: Lección 4_ Gramática Del Lenguaje I

4/10/2015 Lección 4: Gramática del lenguaje I

http://www.ehu.eus/~jtpolagi/completo/04.htm#4 7/9

ejemplos para cada caso:

process (a)beginciclo1: for i in 7 downto 0 loop entrada(i) <= ( others => '0' )end loop;end process;

Cabecera del ciclo Instrucciones a ejecutar 8 vecesFinalización del ciclo

Este fragmento de código hace que uno por uno los 8 últimos bits de la señal entrada tenganel valor lógico cero. Que se indique que deben hacerse cero 8 bits, no quiere decir que la señalentrada esté formada por más de ocho. El encabezamiento de la sentencia nos dice que se vaa repetir ocho veces seguidas las instrucciones entre loop y end loop. Debemos destacar queen un ciclo for, la variable del mismo se declara atomáticamente, y no tenemos queincrementarla o inicializarla, ya que el programa lo hace por nosotros. La etiqueta ciclo1 se usa﴾aunque es opcional﴿ para dar más posibilidades de organización al programador.

process (a)variable i: integer := 0;beginciclo2: while i < 7 loop entrada(i) <= (others => '0'); i := i + 1;end loop;end process;

Mientras i sea menor que 7 => ciclo Finaliza el ciclo

En esta ocasión se usa la sentencia while, para lograr el mismo resultado que en el ejemploanterior, es decir, inicializar los 8 últimos bits del vector entrada a cero. Esta vez, se ejecutanlas líneas entre loop y end loop mientras la variable i sea menor que siete. Es lógico que estavariable cambie dentro del ciclo, ya que de no ser así, se ejecutaría para siempre. De formadistinta al ejemplo anterior, la variable del ciclo while debe ser declarada ﴾como integer﴿,inicializada e incrementada por nosotros, por lo que requiere más trabajo.

Sentencia exit

Usada siempre dentro de un loop, la sentencia exit nos permite salir del mismo si se alcanzauna condición fijada por nosotros. Su verdadera utilidad la encontramos si diseñamoscontroladores de memoria. A continuación analizamos un ejemplo:

process (a)beginciclo1: for i in 7 downto 0 loop if a'length < i then exit ciclo1; entrada(i) <= ( others => '0' );end loop;

Page 8: Lección 4_ Gramática Del Lenguaje I

4/10/2015 Lección 4: Gramática del lenguaje I

http://www.ehu.eus/~jtpolagi/completo/04.htm#4 8/9

end process;

Ahora se ejecuta el mismo ejemplo que expusimos en el caso de un ciclo for con la salvedadque si la variable i supera la longitud del vector a el ciclo deja de ejecutarse aunque no sehayan cumplido las veces pedidas en el encabezamiento.

Sentencia next

La sentencia next también debe estar dentro de un ciclo loop, y nos sirve para saltarnos unao más de las ejecuciones programadas.

process (a)beginciclo1: for i in 7 downto 0 loop if i=4 then next; else entrada(i) <= ( others => '0' ); end if;end loop;end process;

Cabecera del cicloSi i vale 4, se salta el cicloSi no vale 4,...... se inicializa entrada Finaliza el ciclo

Ahora se ejecuta el programa todas las veces programadas, excepto la cuarta, ya que hayuna sentencia if que hace que se pase a la siguiente iteración si la varaibale i vale cuatro.

Sentencia null

La sentencia null se utiliza, al igual que en otros lenguajes de programación, para que dadauna condición especial no pase nada , es decir, que ninguna señal o variable cambie, y que elprograma siga su curso habitual. Su comportamiento dentro de un loop es similar al de lasentencia next.

Sentencia wait

La sentencia wait se usa para suspender un proceso si éste no tiene lista sensitiva. Lo únicoque exige esta sentencia es estar situada la final del proceso. Para entender mejor ésto, basta

Page 9: Lección 4_ Gramática Del Lenguaje I

4/10/2015 Lección 4: Gramática del lenguaje I

http://www.ehu.eus/~jtpolagi/completo/04.htm#4 9/9

con decir que los dos códigos siguientes son equivalentes.

process (a,b,c)begin x <= a and b and c;end process;

processbegin x <= a and b and c; wait on a,b,c;end process;

Ambos procesos se ejecutarán cuando haya un cambio en la señal a, b o c se muestra eneste caso la equivalencia de una lista sensitiva y una sentencia wait explícita.

Sentencia wait until

No debemos confundir la sentencia wait until con la sentencia wait vista en el apartadoanterior. En esta ocasión, tampoco se puede usar una lsita sensitiva con el proceso, ya queésta queda definida con la misma sentencia. Para las descripciones la fórmula wait until debeestar al prncipio del proceso, por lo que la lógica descrita de esta menera no puede serreseteada asíncronamente. Veamos su uso en el caso de la arquitectura de un flip­flop d:

architecture ejemplo of ffd is begin process begin wait until (clk='1'); q <= d;end process;end ejemplo;

Este proceso se suspende hasta que la condición siguiente a wait until es verdadera. Unavez que es verdad, y las asignaciones de señal se han realizado, el proceso vuelve a esperarhasta que la señal clk vuelve a valer de nuevo 1, es decir, un flanco de subida. Pulsa aquí parair a la práctica del Flip Flop D.