Departamento de Sistemas e Informática Síntesis de sistemas digitales en FPGA Very High speed integrated circuit Hardware Description Language (VHDL) 2016 Contenido Conceptos básicos del lenguaje Objetos VHDL Unidades de diseño Descripción en flujo de datos Operadores VHDL Circuitos combinacionales Ejemplos Descripción algorítmica Descripción del flanco de reloj Circuitos secuenciales sincrónicos Ejemplos Consideraciones de diseño 2 Conceptos básicos del lenguaje Objetos VHDL Unidades de diseño Diseño digital Lenguajes de Descripción de Hardware (HDL) Permiten descripciones de alto nivel La edición es rápida y sencilla Soportados por herramientas EDA Las herramientas EDA permiten integrar distintos estilos de diseño 4 VHDL: Antecedentes históricos Necesidad de estandarizar los diseños DoD +IEEE Patrocinan el desarrollo en los 80´s Es estándar de IEEE en 1987 VHDL-87 El estándar se amplía en 1993 VHDL-93 Se realizaron revisiones posteriores (2001, 2008) Existen otros HDL populares como ABEL y VERILOG 5 VHDL: Evolución Se inicia como un leguaje de modelado y especificación. Documentación Ligado a actividades de Simulación Luego se incorporan herramientas de síntesis capaces de manejar este tipo de descripciones Ambientes integrados de diseño 6 Descripción de un dispositivo VHDL Descripción de componentes Entidad Declaración de I/O Caja negra 7 Dispositivo VHDL Arquitectura Descripción comportamental Caja blanca Descripción de un dispositivo VHDL Diseño VHDL Entidad Archivo de texto Arquitectura library IEEE; use IEEE.std_logic_1164.all; entity Puerta is generic (WIDTH: integer range 1 to 32 := 1); port (A, B:in std_logic_vector (WIDTH-1 downto 0); C: out std_logic_vector (WIDTH-1 downto 0) ); end Puerta; architecture Behavioral of Puerta is begin C <= A and B; end Behavioral; 1 2 3 8 AND Unidades de diseño en VHDL 9 Modelo VHDL Bibliotecas VHDL Compuesto por unidades de diseño Colecciones de unidades de diseño Secciones mínimas de código compilables en forma independiente. Organizan el código Promueven el reuso Unidades de diseño. Clasificación Se clasifican de acuerdo a las relaciones de dependencia jerárquica que mantienen entre sí Unidades Primarias Unidades Secundarias 1. Declaración de Entidad 1. Cuerpo de Arquitectura 2. Declaración de Paquete 2. Cuerpo de Paquete 3. Declaración de Configuración 10 Paquetes. Definición Son unidades VHDL que contienen declaraciones y subprogramas de uso habitual. Constantes Tipos y subtipos Componentes Subprogramas Funciones Procedimientos El diseñador los hace visibles y utiliza sus elementos, que guardan cierta relación lógica entre sí. 11 Bibliotecas Realiza comprobación sintáctica COMPILACIÓN Construye bibliotecas de diseño En ISE es parte del proceso de síntesis Las unidades creadas en un proyecto se compilan automáticamente en la biblioteca work. Pueden crearse otras bibliotecas y reacomodar las unidades en la vista libraries de ISE. 12 Paquetes y bibliotecas importantes Fuente: Pardo Carpio 13 Objetos VHDL Un objeto VHDL es un elemento que guarda un valor de un tipo de datos específico. Sobre él pueden invocarse operaciones coherentes con su tipo. Compilador Los objetos VHDL deben declararse en forma previa a su utilización en cualquier unidad de diseño. 14 Objetos VHDL: Constantes variables y señales Constantes Contribuyen a la legibilidad, mantenimiento y portabilidad del programa. No cambian su valor una vez inicializadas. constant nombre_constante: tipo := expresión ; Variables Cambian su valor con sentencias de asignación. Son locales a los procesos. No tienen significado físico. variable nombre_variable: tipo ; nombre_variable := expresión ; 15 Objetos VHDL: Constantes variables y señales Las señales son abstracciones de conexiones físicas Señales Cambian su valor con sentencias de asignación. Tienen una analogía física directa. Interconectan componentes de un circuito. Sincronizan la ejecución y suspención de procesos. Son visibles para todos elementos de una arquitectura. Los puertos de una entidad son señales. signal nombre_señal: tipo ; nombre_señal <= expresión ; 16 VHDL: Tipos de datos Tipos de datos predefinidos Biblioteca Standard (STD) BIT Escalares BOOLEAN INTEGER REAL Compuestos Orientados a síntesis Bit_vector (n-1 downto 0) Es un arreglo de n bits Modela buses 17 VHDL: Tipos de datos Para representar situaciones reales en los circuitos, la IEEE definió dos tipos de datos multivaluados orientados a síntesis Std_logic Modela líneas (escalar) Std_logic_vector (n-1 downto 0) Modela buses (enumerado) Los valores posibles en síntesis para un objeto de estos tipos son: ‘0’ ‘1’ ‘Z’ 18 valor bajo valor alto alta impedancia Biblioteca: IEEE Paquete: std_logic_1164 Estructura de un diseño VHDL: Entidad library IEEE; use IEEE.std_logic_1164.all; Declaración de bibliotecas Visibilidad de paquetes Parámetro de tamaño entity Puerta is generic (WIDTH: integer range 1 to 32 := 1); port ( A, B:in std_logic_vector (WIDTH-1 downto 0); C: out std_logic_vector (WIDTH-1 downto 0) ); Puertos end Puerta; INTERFAZ Da nombre al módulo y define su conexión con el exterior 19 Puertos de la entidad port (nombre_señal : modo tipo_señal) ; Modo Define cómo se lo utiliza in: Entrada, se lee. No se le puede asignar valor. out: Salida, se le asigna valor. No se puede leer. inout: Entrada / Salida. CUIDADO !! buffer: Salida / Puede ser usado en el sistema (leído). Tipo 20 Define los valores y operaciones legales Reutilización del código: Parámetros VHDL Parámetros de tamaño Establecen el número de bits de las señales de datos Adaptan el diseño a distintos tamaños de datos Tipo de datos para síntesis Escalabilidad Integer Natural generic (nombre_parámetro : tipo_parámetro := valor_defecto) ; 21 Estructura de un diseño VHDL: Arquitectura Se relaciona architecture Behavorial of Puerta is con la entidad begin C <= A and B; Descripción del comportamiento end Behavorial; del dispositivo Descripción algorítmica Descripción de flujo de datos Distintos Estilos Descripción estructural Una arquitectura está siempre ligada con una entidad 22 Flujo de diseño VHDL orientado a FPGA Ingreso del diseño con esquemas Ambiente ISE Análisis Mapeo, rutas y ubicación 23 Ingreso del diseño con HDL Código Síntesis Simulación post PAR Simulación funcional Bitstream Esquemático RTL 24 Descripción en flujo de datos Operadores VHDL Circuitos combinacionales Ejemplos Descripción en flujo de datos de un multiplexor a b MUX library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Multiplexor is port ( a , b : in std_logic_vector(1 downto 0); sel : in std_logic; s : out std_logic_vector(1 downto 0)); end Multiplexor; architecture Behavioral of Multiplexor is begin s <= a when sel ='1' else b; end Behavioral; Sel 26 s Descripción en flujo de datos. Sintaxis Sentencias concurrentes que en simulación se “disparan” al cambiar el valor de algún argumento de las asignaciones. Asignación concurrente de señal: salida <= a xor b; Asignación condicional: WHEN ... ELSE architecture mux_flu of mux is begin salida <= a when sel = ‘1’ else b; end mux_flu; 27 Descripción en flujo de datos. Sintaxis Asignación condicional: WHEN ... ELSE < senial > <= < exp > when <condición_bool > else < exp > when <condición_bool > else ……………. < exp > when <condición_bool > else < exp >; Prioridad explícita entre las opciones Se pueden usar varias expresiones booleanas distintas La última opción de la sentencia es sin condición Descripción de circuitos combinacionales !! 28 Descripción en flujo de datos. Sintaxis Asignación con selección:WITH...SELECT...WHEN with estado select semaforo <= rojo when “01”, verde when “10”, amarillo when “11”, nofunciona when others; Expresiones con valores indefinidos Sintaxis incorrecta Las asignaciones con selección deben cubrir todos los posibles valores de la expresión 29 Descripción en flujo de datos. Sintaxis Asignación con selección:WITH...SELECT...WHEN with < exp_sel> select < senial > <= < exp > when <valor1> , < exp > when <valor2>, …….. < exp > when <valorn>, < exp > when others; Las opciones no tienen una prioridad explícita entre ellas La expresión de selección es única y todos sus valores deben estar listados en las cláusulas mutuamente excluyentes 30 Descripción en flujo de datos Describe interconexiones entre objetos del lenguaje Permite estructuras de tipo condicional típicas de una descripción abstracta Todas las sentencias de la descripción son “concurrentes”. SIMULACIÓN 31 Descripción de Codificadores architecture Behavioral of Cod_7seg is Lógica negativa begin with HEX select LED <= "1111001" when "0001", --1 "0100100" when "0010", --2 "0110000" when "0011", --3 "0011001 " when"0100", --4 "0010010" when "0101", --5 "0000010" when "0110", --6 "1111000 " when "0111", --7 "0000000" when "1000", --8 library IEEE; "0010000" when "1001", --9 "0001000" when "1010", --A use IEEE.STD_LOGIC_1164.ALL; "0000011" when "1011", --b "1000110" when "1100", --C entity Cod_7seg is "0100001" when "1101", --d port ( HEX : in std_logic_vector( 3 downto 0); "0000110" when "1110", --E LED:out in std_logic_vector( 6 downto 0)); "0001110" when "1111", --F end; "1000000" when others; --0 end; 32 Descripción de una memoria ROM architecture behavioral of MROM is Tipo de datos type mem is array ( 0 to 15) of std_logic_vector(7 downto 0); del usuario signal mi_Rom : mem; library ieee; begin use ieee.std_logic_1164.all; mi_Rom <= ( use ieee.std_logic_unsigned.all; 0 => "00000000", entity MROM is 1 => "00000001", port ( dir : in std_logic_vector(3 downto 0); 2 => "00000010", datos : out std_logic_vector(7 downto 0) ); 3 => "00000011", end MROM; 4 => "00000100", 5 => "11110000", 6 => "11110011", 7 => "11110111", others => "11111111"); datos <= mi_Rom (CONV_INTEGER(dir)); end behavioral; 33 Esquemático RTL VHDL: Operadores Lógicos Existe una gran cantidad de operadores definidos para distintos tipos de datos Relacionales Aritméticos Sólo un subconjunto está orientado a síntesis Concatenación 34 VHDL: Operadores Lógicos and, or, nor, xor, not Definidos para: bit, bit_vector, std_logic, std_logic_vector, boolean Los operandos deben ser del mismo tipo y tener la misma cantidad de bits Ejemplos 35 signal A, B, C, D: std_logic_vector (7 downto 0); A <= “11001010”; B <=“10011010”; C <= A or B; D <= A and B; VHDL: Operadores Relacionales = (igual) < (menor) > (mayor) /= (distinto) <= (menor o igual) >= (mayor o igual) Definidos para: bit, bit_vector, std_logic, std_logic_vector, boolean, integer Los operandos deben ser del mismo tipo y pueden tener distinta cantidad de bits Las comparación de dos vectores, se realiza bit a bit alineando ambas tiras de dígitos a partir del MSB de cada una. Cuidado !!! 36 VHDL: Operadores relacionales Comparación de vectores de distinta cantidad de bits signal A : std_logic_vector (7 downto 0); signal B : std_logic_vector (3 downto 0); A <= “00100100”; B <= “0110” A>B? 37 NO !! VHDL: Operadores relacionales Comparación de vectores ¿ Cómo se interpreta la tira de dígitos de std_logic_vector? signal A : std_logic_vector (3 downto 0); A <= “1010”; ¿A es igual a 10 o a -6? 38 Interpretación del tipo std_logic_vector La interpretación que se da a los datos std_logic_vector depende de los paquetes que se incluyan en el diseño Desarrollados por Synopsis. Se distribuyen como parte de la biblioteca IEEE. STD_LOGIC_ARITH STD_LOGIC_UNSIGNED STD_LOGIC_SIGNED STD_LOGIC_ARITH: Define los tipos signed y unsigned y operaciones aritméticas. Define funciones de conversión entre signed, unsigned, std_logic_vector e integer 39 Interpretación del tipo std_logic_vector library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_SIGNED.all; STD_LOGIC_VECTOR se interpreta como entero en C2 use IEEE.STD_LOGIC_UNSIGNED.all; STD_LOGIC_VECTOR se interpreta como entero sin signo 40 Interpretación del tipo std_logic_vector Paquete NUMERIC_STD: Define los tipos signed y unsigned y operaciones aritméticas. Define funciones de conversión entre signed, unsigned, std_logic_vector e integer Se opera con datos signed o unsigned y luego se usa un cast para convertirlos a std_logic_vector. Para darle visibilidad: library IEEE; use IEEE.NUMERIC_STD.all; Se recomienda incorporarlo para desarrollos futuros 41 Paquete numeric_std: Conversión tipos 42 Nota: Representación de enteros Magnitud y signo Utilizada en la vida diaria Complemento a la base Complementos Complemento a la base menos 1 43 Nota: Complemento a la base Dado un número N en base r con n dígitos, el complemento a r de N se define como rn – N. Ejemplo en binario: Ejemplo en decimal: N = (01101)2 -N = (10011)2 N = (31.479)10 -N = (68.521)10 Es el complemento más utilizado en sistemas digitales En binario se le llama complemento a 2 (C2) 44 Nota: Representación del signo El signo se representa utilizando el bit más significativo de la tira Positivo con 0 Negativo con 1 Ejemplo en binario: N = (14)10 = (0 00001110)2 -N = (- 14)10 = (1 11110010)2 Utilizando complemento a 2 45 VHDL: Operadores de comparación Ejemplo de comparación de vectores signal A :std_logic_vector (3 downto 0); signal B :std_logic_vector (3 downto 0); signal COMP: boolean; A <= “0110”; B <= “1000”; COMP verdadero si se COMP <= A > B; incluyó el paquete SIGNED COMP será falso si se incluyó el paquete UNSIGNED 46 VHDL: Comparador sin signo library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity compara is port ( a : in std_logic_vector(3 downto 0); b : in std_logic_vector(3 downto 0); mayor: out std_logic); end compara; architecture Behavioral of compara is begin mayor <= '1' when a > b else '0'; end Behavioral; 47 VHDL: Comparador sin signo Circuito RTL inferido por el ambiente Simulación del modelo 48 VHDL: Comparador en C2 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_SIGNED.ALL; entity comparaSig is port ( a : in std_logic_vector(3 downto 0); b : in std_logic_vector(3 downto 0); mayor: out std_logic); end comparaSig; architecture Behavioral of comparaSig is begin mayor <= '1' when a > b else '0'; end Behavioral; 49 VHDL: Comparador en C2 Simulación del modelo Circuito RTL inferido por el ambiente 50 VHDL: Operadores Aritméticos + (suma) - (resta) Definidos para datos enteros (integer) Se pueden utilizar con vectores std_logic_vector Se debe incluir el paquete correspondiente (SIGNED o UNSIGNED) 51 VHDL: Operadores Concatenación (&) Permite definir vectores a partir de líneas u otros vectores signal A :std_logic_vector (3 downto 0); signal B :std_logic_vector (3 downto 0); signal C: std_logic_vector (5 downto 0); A <= “0110”; B <=“1000”; C <= A(3 downto 1) & B(2 downto 0); 52 C será “011000” VHDL: Sumador en C2 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_SIGNED.ALL; entity SuRes is port ( a : in std_logic_vector(3 downto 0); b : in std_logic_vector(3 downto 0); suma : out std_logic_vector(4 downto 0)); end; architecture Behavioral of SuRes is begin suma <= (a(3) & a) + b ; end; 53 Se incluye el paquete SIGNED Se previene OF definiendo la salida con un bit más Se completa formato con bit de signo VHDL: Sumador en C2 Se completa formato con bit de signo 54 VHDL: Sumadores/Restadores De acuerdo con la representación de datos adoptada Incluir el paquete que corresponde Completar formato en forma adecuada Si el tamaño de bus está acotado y se requiere detectar OF Se debe agregar en la descripción del sumador 55 Descripción algorítmica Elementos sintácticos Circuitos secuenciales sincrónicos Ejemplos El bloque process Es una construcción de un mayor nivel de abstracción Su uso está ligado a un tipo de descripción “ALGORITMICA” Describe comportamiento como una secuencia de eventos Permite otros elementos sintácticos Condicionales Selección Bucles 57 El bloque process SINTAXIS: process (lista_sensible) [declaraciones;] begin sentencias_secuenciales; end process ; Tiene dos estados posibles: En ejecución Suspendido Es un ambiente secuencial donde las sentencias se procesan en orden Los procesos actúan (“se ejecutan”) en paralelo 58 El bloque process: Elementos sintácticos Sentencia condicional IF...THEN...ELSE if condición then sentencias elsif condición then sentencias Esta estructura puede anidarse. Modela una selección jerárquica. else sentencias end if ; 59 elsif y else son optativas. Si no se contemplan todas las posibilidades, se infiere almacenamiento. El bloque process: Elementos sintácticos Sentencia condicional IF...THEN...ELSE - Ejemplo p < = b when a > b else process ( a, b, c ) c when a > c else begin a when (a = c and c = b) else if a > b then ‘0’ ; p <= b; elsif a > c then Con asignación “concurrente” p <= c; elsif (a = c and c = b) then p <= a; else p <= ‘0’; end if ; La lista sensible debe incluir todas las end process ; señales cuyo cambio es importante. 60 El bloque process: Elementos sintácticos Sentencia condicional IF...THEN...ELSE - Ejemplo Se sintetiza un circuito combinacional 61 El bloque process: Elementos sintácticos case expresión is when caso1 = > instrucciones when caso2 = > instrucciones when others = > instrucciones end case ; 62 a b c d MUX Sentencia de selección CASE Sel (1:0) case sel is when “10” = > s <= a; when “00” = > s <= b; when “01” => s <= c; when others = > s <= d; end case ; No hay prioridad entre las opciones La expresión de selección debe ser discreta. No puede haber casos duplicados. Se deben cubrir todas las opciones de selección. s El bloque process: Elementos sintácticos BUCLES Mecanismos para repetir secciones de código VHDL La interpretación HW de un bucle consiste en replicar el módulo descripto en sus sentencias internas La única sentencia VHDL sintetizable para describir un bucle es el FOR - LOOP 63 El bloque process: Elementos sintácticos BUCLES: FOR - LOOP [etiqueta]: for identificador in rango_discreto loop <sentencias> end loop [etiqueta]; El identificador toma en cada iteración valores sucesivos en el rango, comenzando por el elemento de la izquierda No necesita ser declarado Por defecto es entero Existe mientras se ejecuta el loop 64 Bucles: Ejemplo entity bucle is Port ( a,b,c : in STD_LOGIC_VECTOR (3 downto 0); All_bit_1 : out STD_LOGIC_VECTOR (3 downto 0)); end bucle; architecture Behavioral of bucle is begin process (a,b,c) begin for i in 0 to 3 loop All_bit_1(i) <= not (a(i) and b(i) and c (i)); end loop; end process; end Behavioral; 65 Bucles: Ejemplo El bloque HW descripto en el bucle se replica al sintetizar el diseño El bloque process: Elementos sintácticos BUCLES: Sentencia NEXT [etiqueta]: for identificador in rango_discreto loop <sentencias> Si se cumple condicion, se ignoran las next when <condicion>; sentencias posteriores a next y se salta a <sentencias> la siguiente iteración del bucle end loop [etiqueta]; BUCLES: Sentencia EXIT [etiqueta]: for identificador in rango_discreto loop <sentencias> exit when <condicion>; Si se cumple condicion, se sale del bucle. <sentencias> end loop [etiqueta]; 67 Descripción de un elemento de memoria library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity FF is port ( entrada: in std_logic; clk: in std_logic; salida: out std_logic); end; architecture Behavioral of FF is begin process (clk) Lista de sensibilidad begin if clk'event and clk = '1' then salida <= entrada ; end if; Descripción del end process ; flanco activo de reloj end; 68 (rising_edge(clk)) Circuitos secuenciales sincrónicos Se describen circuitos temporizados Es necesario reconocer un flanco activo de reloj. clk’event and clk = ‘1’ (rising_edge(clk)) Atributo event de la señal de reloj Función que recibe el reloj como argumento Expresiones reconocidas por XST para describir un flanco ascendente de reloj 69 Procesos y bloques secuenciales sincrónicos Lista de sensibilidad Activación del bloque PROCESS process (clk) begin if clk'event and clk = '1‘ then … ; end if; end process ; En simulación, cada vez que cambia alguna de las señales se ejecuta el bloque SIMULADOR: El bloque es una sentencia “concurrente” Descripción del flanco activo de reloj 70 Las sentencias internas se ejecutan secuencialmente Procesos y simulación: Lista de sensibilidad ¿Qué se debe incluir en la lista de sensibilidad? Todas las señales cuyo cambio es importante !! Circuito combinacional process (a,b,sel) Circuito secuencial sincrónico Todas las señales que definen valores El reloj si todas las señales de control son sincrónicas El reset asincrónico si existe process (clk, reset) 71 Descripción de un registro de desplazamiento library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; --Registro con reset sincrónico, carga paralela y --desplazamiento a la izquierda, prioridades en ese orden. entity regis is port ( din: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; r, l, shl: in STD_LOGIC; sli: in STD_LOGIC; dout: out std_logic_vector (3 downto 0) ); end regis; 72 Registro de desplazamiento: Continuación architecture register_arch of regis is begin Todas las señales de control son sincrónicas process (clk) variable bout : std_logic_vector (3 downto 0); Local al proceso begin if ( clk'event and clk = '1') then Flanco ascendente del reloj. if r = ‘1’ then bout := (others => ‘0’); elsif l = ‘1’ then bout := din; elsif shl ='1' then bout := bout (2 downto 0) & sli; end if; end if; dout <= bout; Operador de end process; concatenación end register_arch; 73 Registro de desplazamiento: Continuación 74 Procesos: variables versus señales Tener en cuenta: Las señales se actualizan cuando se suspende el proceso Las variables se actualizan en forma inmediata durante la ejecución del proceso Los procesos son ambientes secuenciales Hay implicancias sobre el HW que se describe 75 Procesos: variables versus señales Usando una señal (a) Usando una variable (a) process (clk) variable a: std_logic; begin if rising_edge(clk) then a := b or c; salida <= a; end if; end process ; 76 process (clk) begin if rising_edge (clk) then a <= b or c; salida <= a; end if; end process ; Variables vs. Señales Señales Variables Sintaxis destino<= fuente destino:= fuente Utilidad Modelan nodos físicos del circuito Representan almacenamiento local Visibilidad Comportamiento Global (comunicación entre Local (dentro del procesos) proceso) Se actualizan al avanzar el Se actualizan tiempo (suspensión proceso) inmediatamente Descripción de un contador binario library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; -- Contador de 8 bits con reset asincrónico carga paralela y -- habilitación de cuenta, con prioridades en ese orden. -- La salida tc indica cuenta máxima. entity contador is port ( din: in STD_LOGIC_VECTOR (7 downto 0); clk: in STD_LOGIC; r, l, en: in STD_LOGIC; tc: out STD_LOGIC; cuenta: out std_logic_vector (7 downto 0) ); end contador; 78 Contador binario: Continuación architecture contador_arch of contador is signal bout : std_logic_vector (7 downto 0); begin El reset es asincrónico process (clk, r) begin if r = ‘1' then bout <= (others => '0'); elsif ( clk'event and clk = '1') then if l = '1' then bout <= din; elsif en = '1' then bout <= bout +1; end if; En la misma arquitectura coexisten end if; distintos estilos de descripción end process; cuenta <= bout; tc <= '1' when bout = “11111111” else '0'; end contador_arch; 79 Contador binario: Continuación Contador con carga paralela, reset asincrónico y habilitación de cuenta Esquemático inferido por el ambiente 80 Ejemplo: Definición de la interfaz El subproceso “View schematic RTL” muestra la interfaz del módulo y los componentes que el sintetizador infiere a partir de la descripción VHDL library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_SIGNED.ALL; entity modulo1 is Port ( a : in STD_LOGIC_VECTOR (3 downto 0); clk : in STD_LOGIC; r : in STD_LOGIC; v: out STD_LOGIC; s : out STD_LOGIC_VECTOR (4 downto 0)); end modulo1; 81 Módulo1 Ejemplo: Definición del funcionamiento Señales internas Registro con reset asincrónico Contador con reset asincrónico Descripción de las salidas 82 architecture Behavioral of modulo1 is signal cuenta:STD_LOGIC_VECTOR (1 downto 0); signal registro: STD_LOGIC; begin process (clk,r) begin if r = '1' then registro <= (others => '0'); elsif clk'event and clk = '1' then registro <= a; end if; end process; process (clk,r) begin if r = '1' then cuenta <= (others => '0'); elsif clk'event and clk = '1' then cuenta <= cuenta + 1; end if; end process; s <= a(3) & a + registro when cuenta = "11“ else (others => '0'); v <= '0' when cuenta = "11" else '1'; end Behavioral; Ejemplo: Circuito RTL inferido en ISE 83 Ejemplo: Simulación comportamental Los estímulos cambian en el flanco descendente del reloj Los estímulos cambian en el flanco ascendente del reloj 84 Consideraciones de diseño Consideraciones generales Documentar el desarrollo Comentar el código Utilizar nombres significativos, coherentes con la función del objeto Respetar la estructura de la descripción VHDL Se está describiendo Hardware Evitar construcciones típicas de otros lenguajes de alto nivel El sintetizador trabaja en base a patrones de descripción Seguir las recomendaciones de la herramienta que se utilice 86 Consideraciones sobre memoria implícita Causa: Las señales tienen valor actual y futuro Consecuencia: Si en la descripción VHDL no se define el valor futuro, se mantiene el actual Se sintetiza un elemento de memoria !! 87 VENTAJAS Simplifica la creación de memoria. CONTRAS Puede crearse memoria no deseada Circuitos combinacionales y memoria implícita Las salidas sólo dependen de las entradas, no se permite que: La señal que se está asignando intervenga en la asignación: s <= a when sel = ‘1’ else b; s <= a when sel = ‘1’ else s; s <= a when s = ‘1’ else b; COMBINACIONAL SECUENCIAL Existan lazos combinacionales 88 COMBINACIONAL SECUENCIAL a <= b or c; e <= d and a; a <= b or c; b <= d and a; Circuitos combinacionales y memoria implícita Descripción algorítmica Las instrucciones IF.. THEN.. ELSE, deben incluir ELSE Se deben especificar todas las alternativas de un CASE. Descripción en flujo de datos Las asignaciones con selección deben cubrir todas las posibilidades 89 Consideraciones para diseños sincrónicos Es aconsejable registrar las señales asincrónicas cuando ingresan al sistema. No colocar puertas en el reloj, utilizar señal de enable. Utilizar un único reloj por proceso. Si todas las señales de control son sincrónicas, basta el clk en la lista de sensibilidad. Agregar el reset asincrónico. 90 ¿Preguntas?