Rodolfo E. Escobar Uribe, página 1 of 2 <e t i q u e t a >: FOR < i d e n t i f i c a d o r > IN <rango> GENERATE Tipos de dato <d e c l a r a c i o n concurrente > NOTA: Los tipos integer, signed y unsigned se encuentran 1. Fundamentos del lenguaje END GENERATE ; en el paquete ieee.numeric_std.all. Nociones básicas IF/GENERATE Tipo Valores sintetizables El siguiente diagrama muestra la estructura básica de un Una forma no secuancial de IF esta permitida con el incon- programa en VHDL: veniente de no poder utilizar el modo ELSE: bit,bit_vector ’0’,’1’ std_logic,std_logic_vector ’0’,’1’,’Z’,’X’ boolean True,False Librerías <e t i q u e t a >: IF <condicion > GENERATE integer de −231 a 231 − 1 <d e c l a r a c i o n concurrente > END GENERATE ; signed de −231 a 231 − 1 Entidad Diseño secuencial unsigned de 0 a 232 − 1 Arquitectura VHDL es inerentemente concurrente. Sin embargo los únicos segmentos de cádigo que se ejecutan de forma ’0’ Cero lógico sintetizable secuencial son: PROCESS, FUNCTION y PROCEDURE. El El siguiente ejemplo es un código que describe la función código secuecial es llamado código behavioral. ’1’ Uno lógico sintetizable booleana Y = AB + C: ’X’ Desconocido sintetizable PROCESS −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− library ieee ; [ e t i q u e t a : ] PROCESS (< l i s t a de s e n s i b i l i d a d >) ’Z’ Alta impedancia (buffer tri-estado) use i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; [ VARIABLE nombre t i p o [ rango ] [ : = v a l o r _ i n i c a l ; ] ] use i e e e . numeric_std . a l l ; BEGIN ’-’ Don’t Care −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− <codigo s e c u e n c i a l > entity circuito is END PROCESS [ e t i q u e t a ] ; Señales p o r t (A : i n s t d _ l o g i c ; Las señales deben declaradas en la arquitectura antes del B : in s t d _ l o g i c ; Lista de sensibilidad: señales que al cambiar hacen que se begin [sección declarativa]. No es necesario establecer si C : in s t d _ l o g i c ; ejecute el proceso. son entradas o salidas. Y : out s t d _ l o g i c ) ; IF/ELSE end e n t i t y ; IF <condicion > THEN STD_LOGIC,STD_LOGIC_VECTOR −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− <a s i g a n c i o n e s > a r c h i t e c t u r e arq o f c i r c u i t o i s ELSIF <condicion > THNE s i g n a l <nombre >: STD_LOGIC [ : = <v a l o r i n i c i a l > ] ; begin <s i g n a c i o n e s > s i g n a l <nombre >: STD_LOGIC_VECTOR <tamano> ; Y <= (A and not ( B ) ) or C ; ELSE end a r c h i t e c t u r e ; <a s i g n a c i o n e s > INTEGER,SIGNED, UNSIGNED −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− END i f ; s i g n a l <nombre >: INTEGER RANGE <min> t o <max>; La entidad hace una descripción del circuito entero como CASE Arrays una caja negra dónde sólo se consideran las entradas y CASE <puerto > I S salidas. La arquitectura describe el funcionamiento del WHEN <v a l o r > => <a s i g n a c i o n e s >; TYPE <nom_array> I S ARRAY ( tamano / rango ) OF <t i p o >; sistema. WHEN OTHERS => <a s i g n a c i o n e s >; s i g n a l <nombre >: <nom_array> [ : = <v a l o r e s > ] ; END CASE ; Diseño concurrente Atributos FOR/LOOP Atributos de señal VHDL no es un lengiaje de programación sino un lenguaje [< e t i q u e t a > : ] FOR < i d e n t i f i c a d o r > IN <rango> LOOP que describe circuitos electronicos digitales, por lo que su <d e c l a r a c i o n s e c u a n c i a l > s’EVENT Verdadero si un evento ocurre ejecución es inherentemente concurrente. END LOOP [< e t i q u e t a > ] ; s’STABLE Verdadero si ningún evento ocurre WHEN/ELSE WHILE/LOOP <puerto > <= <val_0 > WHEN <cond_0> ELSE [< e t i q u e t a > : ] WHILE <condicion > LOOP Atributos de dato <= <val_1 > WHEN <cond_1> ELSE <d e c l a r a c i o n s e c u a n c i a l > END LOOP [< e t i q u e t a > ] ; d’LOW Retorna índice menor del vector <= <v a l _ ( n−1)> WHEN <cond_n> ELSE <= <val_n >; EXIT : usado para salir de un loop d’HIGH Retorna índice mayor del vector WITH/SELECT/WHEN [< e t i q u e t a >: ] EXIT [< e t i q u e t a >] WHEN <condicion > d’LENGTH Retorna tamaño del vector WITH <puerto_1 > SELECT <puerto_2 > <= <val_0 > WHEN <val2_0 > SKIP: usado para omitir declaración en un loop d’RANGE Retorna rango del vector <= <val_1 > WHEN <val2_1 > [< e t i q u e t a >: ] SKIP [< e t i q u e t a >] WHEN <condicion > <= <v a l _ d e f > WHEN OTHERS ; d’REVERSE_RANGE Rango en orden inverso Apuntes de VHDL 4. Conversión entre tipos 6. Simulación con archivo test bench Rodolfo E. Escobar Uribe, página 2 of 2 NOTA: Las siguientes funciones de conversión se encuen- La entidad del testbench siempre queda vacía. tran en el paquete ieee.numeric_std. 3. Operadores Todos los diseños que va an probarse deben ser decla- Lógicos INTEGER a STD_LOGIC_VECTOR rados como componentes. •A and B •A nand B •A xnor B signal A : integer ; El proceso de generación del reloj es parte del código •A or B •A nor B s i g n a l B : s t d _ l o g i c _ v e c t o r ( 3 downto 0 ) ; del testbench. •not A •A xor B s i g n a l C : s t d _ l o g i c _ v e c t o r ( 3 downto 0 ) ; Todas las señales asociadas a las entradas deben estar Aritméticos −− E n t e r o s p o s i t i v o s inicializadas a 0; NOTA: Los operadores aritméticos sólo pueden usarse B <= s t d _ l o g i c _ v e c t o r ( to_unsigned (A, B ’ l e n g t h ) ) ; entre elementos de tipos INTEGER,UNSIGNED y SIGNED. −− E n t e r o s p o s i t i v o s o n e g a t i v o s Plantilla de Test Bench C <= s t d _ l o g i c _ v e c t o r ( t o _ s i g n e d (A, C’ l e n g t h ) ) ; library ieee ; Operación Descripción Restricción STD_LOGIC_VECTOR a INTEGER use i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ; use i e e e . numeric_std . a l l ; + Suma s i g n a l A : s t d _ l o g i c _ v e c t o r ( 3 downto 0 ) ; - Resta signal B : integer ; e n t i t y tb i s * Multiplicación signal C : integer ; end e n t i t y ; ** Potenciación base y potencia estáticos −− UNSIGNED / División sólo potencias de 2 a r c h i t e c t u r e t e s t o f tb i s B <= t o _ i n t e g e r ( unsigned (A) ) ; −− D e c l a r a c i o n de componente a sim ular MOD Módulo −− SIGNED component entidad_elemento i s REM Residuo p o r t ( x0 : i n s t d _ l o g i c ; ABS Valor absoluto C <= t o _ i n t e g e r ( si gned (A) ) ; y0 : out s t d _ l o g i c ) ; 5. Funciones end component ; NOTA: Las funciones se escriben en la sección declarativa −− D e c l a r a c i o n de s e n a l e s Desplazamiento de bits de la arquitectura (al igual que las señales) o en el paquete. s i g n a l c l k : out s t d _ l o g i c := 0 ; −− o p c i o n a l s i g n a l x0 : i n s t d _ l o g i c := 0 ; Operación Descripción s i g n a l y0 : out s t d _ l o g i c := 0 ; FUNCTION <nombre> (< argumentos >) RETURN <t i p o > I S −− <array> sll <n> izquierda lógico <d e c l a r a c i o n e s > −− Constantes <array> srl <n> derecha lógico BEGIN c o n s t a n t CLK_PERIOD : time := 100 ns ; <array> sla <n> izquierda aritmético <codigo s e c u e n c i a l > −− <array> sra <n> derecha aritmético END FUNCTION ; begin −− I n i c i a d e s c r i p c i o n d e l t e s t bench −− I n s t a n c i a d e l componente <array> rol <n> rotativo izquierda Los argumentos se declaran de la siguiente manera: dut : entidad_elemento p o r t map( <array> ror <n> rotativo derecha x0 => x0 , ( s i g n a l <arg0 >: <t i p o >; s i g n a l <arg1 >: <t i p o > , . . . ) y0 => y0 ) ; Dentro de una función no es posible declarar señales pero −− "1100" sll 1 resulta: "1000" si variables que se comportan de la misma manera y son −− Proc eso de r e l o j ( o p c i o n a l ) "1100" srl 2 resulta: "0011" declaradas de la siguiente manera: clk_proc : process "1100" sla 1 resulta: "1000" begin Ejemplos: "1100" sra 2 VARIABLE <nombre> : <t i p o > [ : = <v a l o r i n i c i a l >] c l k <= ’ 0 ’ ; resulta: "1111" Ejemplo: función de suma de arreglos lógicos. wait f o r CLK_PERIOD/ 2 ; "1100" rol 1 resulta: "1001" c l k <= ’ 1 ’ ; "1100" ror 2 resulta: "0011" −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− wait f o r CLK_PERIOD/ 2 ; f u n c t i o n suma ( s i g n a l a , b : s t d _ l o g i c _ v e c t o r ) end p r o c e s s ; Concatenación return integer i s −− Operador de concatenación: &. v a r i a b l e a i , b i : i n t e g e r range 0 t o 7 := 0 ; −− Proc eso de e s t i m u l o s begin stim_proc : p r o c e s s Ejemplo: a i := t o _ i n t e g e r ( unsigned ( a ) ) ; begin b i := t o _ i n t e g e r ( unsigned ( b ) ) ; wait f o r 100 ns ; return a i+bi ; x0 <= ’ 0 ’ ; s i g n a l A : s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) ; end f u n c t i o n ; wait f o r 300 ns ; s i g n a l B , C : s t d _ l o g i c _ v e c t o r ( 2 downto 0 ) ; −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− −−− x0 <= ’ 1 ’ ; −− Ejemplo de llamado : wait ; B <= ’ 1 ’ & ’ 0 ’ & ’ 1 ’ ; y i <= suma ( x0 , x1 ) ; end p r o c e s s ; C <= ’ 0 ’ & ’ 0 ’ & ’ 0 ’ ; −− A <= B&C ; −− A = "101000" y <= s t d _ l o g i c _ v e c t o r ( to_unsigned ( yi , y ’ l e n g t h ) ) ; −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− end a r c h i t e c t u r e ;