VHDL CONCURRENTE 1 VHDL CONCURRENTE • Entidad • Arquitectura • Sentencias concurrentes • Procesos • Wait • Asignación concurrente a señales • Componentes • Generate VHDL CONCURRENTE 2 Declaración entidad Nombre entidad entity_decl <= entity id is [ port ( port_interface_list ) ; ] { entity_declarative_item } end [ entity ] [ id ] ; port_interface_list <= Nombre puerto ( id { , … } : [ mode ] subtype [ := expr ] ) { ; … } mode <= in | out | inout VHDL CONCURRENTE 3 Entidad: Ejemplo entity program_rom is port ( address : in bit_vector (14 downto 0) ; data : out bit_vector (7 downto 0) ; enable : in bit ); subtype instruction_byte is bit_vector (7 downto 0); type program is array (0 to 2**14-1) of instruction_byte; end entity program_rom; Declaración de tipos, señales o constantes (no variables) VHDL CONCURRENTE 4 Declaración arquitectura Nombre arquitectura Nombre entidad arch_body <= architecture id of entity_name is { block_decl_item } begin { concurrent_stmt } end [ architecture ] [ id ] ; Declaración de tipos, señales o constantes Procesos e instanciación de componentes VHDL CONCURRENTE 5 Arquitectura: Ejemplo architecture primitive of and_or_inv is signal and_a, and_b, or_a_b : bit; begin and_a: process is begin and_a <= a1 and a2; wait on a1, a2; end process; …… end architecture; VHDL CONCURRENTE 6 Sentencias concurrentes Sentencias que se ejecutan simultáneamente en la simulación: •Procesos •Asignación concurrente a señales •Instanciación de componentes •Sentencias generate •When-else VHDL CONCURRENTE 7 Procesos Lista sensitiva (opcional) process_stmt <= [ process_label : ] process [ ( signal_name { , … } ) ] [ is ] { process_decl_item } begin { sequential_stmt } end process [ process_label] ; VHDL CONCURRENTE 8 Procesos • Lista sensitiva: variables que disparan el proceso. 9 VHDL CONCURRENTE Lista sensitiva: Ejemplo 10 VHDL CONCURRENTE Lista sensitiva: Ejemplo VHDL CONCURRENTE 11 Lista sensitiva/Sentencia wait • Lista sensitiva es equivalente a una sentencia “wait” antes del “end process”. • VHDL requiere que el proceso tenga uno de los dos: • lista sensitiva • una o más sentencias wait. VHDL CONCURRENTE 12 Procesos: Ejemplo Procesos equivalentes VHDL CONCURRENTE 13 Sentencia wait. • Suspende la ejecución de un proceso. • Tres tipos de sentencia wait: • Combinaciones también posibles: VHDL CONCURRENTE 14 Wait on • Proceso suspendido hasta que se produce un evento en A, B o C. VHDL CONCURRENTE 15 Wait until • Proceso suspendido hasta que la condición se verifica. VHDL CONCURRENTE 16 Wait for • Suspensión del proceso durante 10ns. VHDL CONCURRENTE 17 Wait for: Ejemplo aplicación • Generación de un reloj para simulaciones. Proceso sin lista sensitiva VHDL CONCURRENTE 18 Asignación concurrente a señales • La asignación concurrente se hace en el cuerpo de la arquitectura (fuera de procesos). • Existe la versión equivalente mediante utilización de procesos. 19 VHDL CONCURRENTE Asignación concurrente a señales concurrent_signal <= [ label : ] conditional_signal_assignment | [ label : ] selected_signal_assignment conditional_signal <= name <= [ delay_mechanism ] { waveform when boolean_expr else } waveform [ when boolean_expr ]; VHDL CONCURRENTE 20 Asignación concurrente a señales: Ejemplos zmux: z <= d0 when sel1 = ‘0’ and sel0 = ‘0’ else d1 when sel1 = ‘0’ and sel0 = ‘1’ else d2 when sel1 = ‘1’ and sel0 = ‘0’ else d3; zmux: process (d0,d1,d2,d3,sel0,sel1) is begin if sel1 = ‘0’ and sel0 = ‘0’ then z <= d0; elsif sel1 = ‘0’ and sel0 = ‘1’ then z <= d1; elsif sel1 = ‘1’ and sel0 = ‘0’ then z <= d2; else z <= d3; end; 21 VHDL CONCURRENTE Declaración de componentes • Declaración dentro de la arquitectura o del paquete. • Declaración casi idéntica a declaración de entidad. VHDL CONCURRENTE 22 Instanciación de componentes • Instanciación dentro de la arquitectura: Sentencia concurrente. • Se incluye una etiqueta para identificar el elemento instanciado. 23 VHDL CONCURRENTE Instanciación de componentes VHDL CONCURRENTE 24 Componentes: Ejemplo diseño • Sumador acarreo enlazado de 4 bits. 25 VHDL CONCURRENTE Componentes: Ejemplo diseño half adder 26 VHDL CONCURRENTE Componentes: Ejemplo diseño full adder VHDL CONCURRENTE 27 Componentes. Ejemplo diseño. (behav); (behav); full adder 28 VHDL CONCURRENTE Componentes: Ejemplo diseño Sumador acarreo enlazado VHDL CONCURRENTE 29 Componentes • Especificación de la componente a utilizar VHDL CONCURRENTE 30 Sentencias generate • Para instanciar componentes idénticos bajo el control de un índice o de una condición. library IEEE; use IEEE.std_logic_1164.all; entity PARIDAD is generic(no_bits: integer:=32); port(IN_DAT: in std_logic_vector (no_bits-1 downto 0); PARITY: out std_logic); end PARIDAD; architecture ARBOL_XOR of PARIDAD is signal TMP: std_logic_vector (no_bits-1 downto 0); begin TMP (no_bits-1) <= IN_DATA (no_bits-1); PARITY <= tmp(0); GEN_ARBOL: for I in no_bits-2 downto 0 generate TMP (I) <= IN_DATA(I) xor TMP(I+1); end generate; end ARBOL_XOR; 31 VHDL CONCURRENTE Sentencias generate: Ejemplo 32 VHDL CONCURRENTE Sentencias generate: Ejemplo 33 VHDL CONCURRENTE Sentencias generate: Ejemplo 34 VHDL CONCURRENTE Sentencias generate: Ejemplo