Sunteți pe pagina 1din 15

VHDL

Diferencias entre Variable-Seal


ARCHITECTURE comport OF ejemplo SIGNAL q : INTEGER RANGE 0 TO 3; BEGIN ej: PROCESS(A,B,..) BEGIN q<=0; IF(A=1) THEN q<=q+1; END IF; IF(B=1) THEN q<=q+2; END IF; CASE q => WHEN 0 => .... END CASE; END PROCESS ej; END comport; El valor de q no se actualiza hasta que el proceso ha concluido. Esto significa que en la evaluacin realizada en la estructura CASE el valor de q es el que tuviese antes de la 26 evaluacin del proceso.
26/02/2006

VHDL
Diferencias entre Variable-Seal
ARCHITECTURE behav OF ejemplo BEGIN ej: PROCESS(A,B,..) VARIABLE q : INTEGER RANGE 0 TO 3; BEGIN q:=0; IF(A=1) THEN q:=q+1; END IF; IF(B=1) THEN q:=q+2; END IF; CASE q => WHEN 0 => .... END CASE; END PROCESS ej; END behav; Para realizar una evaluacin secuencial tal y como se realiza en un programa desarrollado para una CPU es preciso utilizar variables en vez de seales

26/02/2006

VHDL
Declaraciones Secunciales n Asignacin secuencial de seales IF CASE LOOP NEXT EXIT WAIT ASSERT Subprogramas (funciones y procedimientos) * Functions * Procedures
26/02/2006

VHDL
IF IF condicin 1THEN Consecuencia 1; ELSIF condicin 2 THEN Consecuencia 2; ELSIF ... THEN ... ELSE Consecuencia por defecto; END IF;

26/02/2006

VHDL
IF IF condicin 1THEN IF condicin 2 THEN Consecuencia 2.1; ELSE Consecuencia 2.2; END IF; ELSE Consecuencia por defecto; END IF; La condicin 1 es previa a la condicin 2, que nunca ser evaluada en caso de cumplimiento de la primera.
26/02/2006

Las condiciones en una sentencia IF se evalan a travs de expresiones booleanas que devuelven los valores verdadero o falso. En la siguiente tabla se resumen los tipos de expresiones:

26/02/2006

VHDL
Case
CASE objeto IS WHEN caso1 => Cdigo1; WHEN caso2 => Cdigo2; WHEN caso3 => Cdigo3; WHEN OTHERS => Cdigo para el resto de los casos; END CASE; WHEN OTHERS representa la condicin por defecto. No puede haber dos valores de seleccin iguales y la clusula others debe aparecer si no se cubren todos los posibles valores de seleccin.
26/02/2006

VHDL Ejemplo de uso de Case


library IEEE; use IEEE.STD_LOGIC_1164.all; entity designx is port( a,b,c,d,e,f,g,h,I,j: out bit:='0'; Oper : in STD_LOGIC_VECTOR(3 downto 0) ); end designx; architecture designejemplo of designx is begin process(Oper) begin Case Oper is when "0000" => a <= '1'; when "0001" => b <= '1'; when "0010" => c <= '1'; when "0011" => d <= '1'; when "0100" => e <= '1'; when "0101" => f <= '1'; when "0110" => g <= '1'; when "0111" => h <= '1'; when "1000" => i <= '1'; when "1001" => j <= '1'; When others => null; end case; end process; end designejemplo;

26/02/2006

If Vs Case
En los casos en que las dos formas son posibles, es recomendable el uso de CASE antes que IF/ELSIF dado que el IF introduce un elemento que puede resultar menos eficiente (ms rea).

26/02/2006

VHDL
LOOP
Etiqueta: FOR parmetro IN lista_de_valores LOOP Cdigo; END LOOP Etiqueta; Etiqueta: WHILE condicin LOOP Cdigo; END LOOP Etiqueta; En ambos casos es posible interrumpir la evaluacin normal con las instrucciones NEXT y EXIT, cuando la condicin se satisface. NEXT salta el resto del cdigo secuencial dentro del bucle y obliga a la evaluacin de un nuevo ndice. EXIT salta el resto del cdigo secuencial y obliga a la terminacin del mismo, continuando con la secuencia del proceso.
26/02/2006

VHDL
LOOP
NEXT etiqueta WHEN condicin; --saltar el resto del bucle EXIT etiqueta WHEN condicin; --salir del bucle por ejemplo: FOR i IN 0 TO 7 LOOP NEXT WHEN i=6; -- Dejamos el bit 6 como estaba Bus(i) <= 0; END LOOP; Otra alternativa es: i:=0; WHILE i < 8 LOOP
Bus(i) <= 0; i:=i+1;

END LOOP;

26/02/2006

VHDL Ejemplo del uso de FOR


library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_unsigned.all; entity ejemplo4 is port( A : in STD_LOGIC_VECTOR(15 downto 0); B : in STD_LOGIC_VECTOR(3 downto 0); Z : out STD_LOGIC; R : out STD_LOGIC_VECTOR(19 downto 0):=(others=>'0') ); end ejemplo4; architecture arq_ejemplo4 of ejemplo4 is begin process(A,B) variable ValorB: integer := 0; variable SalTemporal: STD_LOGIC_VECTOR(19 downto 0):=(others=>'0'); begin SalTemporal :=(others=>'0'); ValorB := conv_integer(B);

for i in ValorB downto 1 loop


SalTemporal:= SalTemporal + A; end loop; if (A="00000000000000000000" or B ="0000") then Z<='1'; else Z<='0'; end if; R <= SalTemporal; end process; end arq_ejemplo4;

26/02/2006

VHDL
WAIT WAIT ON pulso; WAIT UNTIL counter>7; WAIT FOR 1 ns; WAIT ON interrupcion FOR 25 ns; WAIT ON clk,sensor UNTIL counter=3 FOR 100 ns; Un proceso debe tener una lista sensible o al menos una sentencia WAIT, de lo contrario, el proceso se ejecuta indefinidamente una y otra vez. Si el proceso ya tiene una lista sensible entonces no se puede utilizar la sentencia WAIT en el interior de ese proceso.
26/02/2006

VHDL
ASSERT Durante la simulacin de un circuito descrito en VHDL es muchas veces interesante la notificacin de ciertos sucesos. Por ejemplo puede ser til sacar un mensaje por pantalla indicando que cierta seal se ha activado. La forma en que se pueden notificar estos sucesos es mediante el uso de la palabra ASSERT que tendr como elemento de activacin una condicin: ASSERT condicin REPORT mensaje SEVERITY nivel gravedad;

26/02/2006

VHDL
Deteccin de flancos

XEVENT and X=1 Detecta un flanco positivo XEVENT and X=0 Detecta un flanco negativo En X.

26/02/2006

S-ar putea să vă placă și