VII. Múltiples Procesos en una Arquitectura 1 Introducción Aunque es conveniente describir sistemas en forma secuencial, esto no ocurre en la realidad. El Mundo No es Secuencial. Todos los vehículos se mueven al mismo tiempo, es decir, concurrentemente. Si cada vehículo lo consideramos como un sistema, tenemos sistemas operando concurrentemente. Sin embargo, a un nivel de detalle apropiado, se puede especificar el funcionamiento de cada sistema como una secuencia de acciones o procesos. Como conclusión, la jerárquía de VHDL permite especificar a los sistemas como “Un conjunto de sub-sistemas secuenciales trabajando concurrentemente”. 2 Un sistema : Múltiples Procesos Cada uno de estos posibles sub-sistemas inter-relacionados será especificado como un proceso separado. MICROCOMPUTADORA CPU MEMORIA FD SISTEMA I/O HD CPU : Process Begin . . . . End Process CPU; I_O : Process Begin . . . . End Process I_O; Memoria : Process Begin . . . . End Process Memoria; FD : Process Begin . . . . End Process FD; HD : Process Begin . . . . End Process HD; 3 El nivel de detalle en cada proceso depende de lo que esté especificando. Por ejemplo, el proceso que especifica el comportamiento del procesador es mas complejo que el de la memoria. Una Arquitectura puede tener más de un proceso y ellos serán ejecutados en forma concurrente. Architecture Ejemplo of Microcomputador is Signal DataBus : Bit_Vector (31 downto 0); begin CPU : Process Begin . . . . End Process CPU; Memoria : Process Begin . . . . End Process Memoria; . . . Aunque los procesos se listan en forma secuencial, su ejecución es concurrente. HD : Process Begin . . . . End Process HD; End Architecure Ejemplo; 4 La ejecución concurrente de procesos es uno de los conceptos mas confusos en VHDL. La idea sería mas clara si los procesos fueran escritos en columnas : Architecture SomeArch of SomeEntity is Begin P1 : Process( A, B) Begin Proposición 1; Proposición 2; Proposición 3; End Process P1; P2 : Process ( B, C ) Begin Proposición 1; Proposición 2; Proposición 3; Proposición 4; End Process P2; P3 : Process ( B ) Begin Proposición 1; Proposición 2; End Process P3; End Architecture SomeArch; Recordemos que un proceso permanece suspendido mientras no ocurran cambios en las señales que estan en la lista de sensitividad. Cuando se tienen múltiples procesos es lo mismo; si una señal cambia, todos aquellos procesos que la incluyan en su lista de sensitividad serán restaurados y se ejecutarán. Puesto que los procesos no distinguen entre señales generadas externamente (viniendo de su ambiente) y señales generadas internamente (dentro de la arquitectura), un proceso pueder ser activado con un cambio generado en otro proceso. 5 Architecture SomeArch of SomeEntity is Begin Si una señal cambia, el proceso se ejecuta, no importa de donde se generó el cambio. De hecho las señales son el único medio para intercambiar información entre procesos, puesto que las variables son locales a cada proceso y el valor de una variable no puede ser conocido por todos los procesos. P1 : Process( A, B, E) Begin Proposición 1; Proposición 2; D <= expresion1; End Process P1; P2 : Process ( A, C ) Begin Proposición 1; Proposición 2; Proposición 3; E <= expresion2; End Process P2; P3 : Process ( B, D ) Begin Proposición 1; Proposición 2; End Process P3; End Architecture SomeArch; 6 Procesos muy simples . . . Architecture Combinacional1 of Combinacional1 is Sigal Inter1, Inter2 : bit; Begin P1 : Process( A, B) Begin Inter1 <= A OR B; End Process P1; Por ejemplo un circuito combinacional simple: A B X P2 : Process ( C, D ) Begin Inter2 <= C OR D; End Process P2; C D P3 : Process ( Inter1, Inter2 ) Begin x <= Inter1 AND Inter2; End Process P3; End Architecture Combinacional1; Debido a que las compuertas trabajan en forma concurrente, no es conveniente usar un solo proceso; sin embargo, cada proceso básicamente consiste de una proposción. 7 Asignamientos de señales concurrentes VHDL permite simplificar tales procesos que consistan de un asignamiento único, sustituyéndolos por una línea con una proposición única, llamada asignamiento de señal concurrente. Architecture Combinacional1 of Combinacional1 is Sigal Inter1, Inter2 : bit; Begin Inter1 <= A OR B; Inter2 <= C OR D; X <= Inter1 AND Inter2; A B X C D End Architecture Combinacional1; Los asignamientos de señal concurrente pueden combinarse con procesos, dentro de una arquitectura, o bien con otros asignamientos concurrentes. Entonces, si dentro de un proceso aparecen dos o mas asignamientos de señal, estos se ejecutaran secuencialmente. Sin embargo, si las asignaciones no están dentro de un proceso, su ejecución será concurrente. 8 Activación de los asignamientos concurrentes La lista de sensitividad de un proceso se coloca a la derecha de su especificación, algo similar debería ocurrir en los asignamientos concurrentes; y en efecto así sucede, las señales que se encuentren en la expresión derecha de la asignación, conforman la lista de sensitividad del asignamiento. Un cambio en cualquier señal de la derecha, activa la asignación concurrente de la señal. Además, estas asignaciones pueden ser retrazadas usando retrazos inerciales o de transporte. Architecture Gates of Gates is Sigal Inter1, Inter2, SN : bit; Begin S A X B Inter1 <= A and S after 1ns; SN <= not S after 1ns; Inter2 <= B and SN after 1ns; X <= Inter1 or Inter2 after 1 ns; End Architecture Gates; 9 Asignamiento condicional de señal Algunas veces es necesario que una condicion sea verdadera para hacer el asignamiento de una señal, esto puede hacerse por medio de la proposición If . . . Then . . . Else, sin embargo esta proposición es secuencial y está restringida a procesos. VHDL cuenta con una sentencia de asignación condicional que puede hacerse dentro de la arquitectura. Su funcionamiento es similar a una proposición condicional, pero se escribe en forma diferente. S Architecture CondProc of MUX2_TO1 is Begin Process ( A, B , S ) begin if S = ‘1’ then Y <= A; else Y <= B; end if; End process MUX2TO1; End CondProc; A Y B Architecture AsCond of MUX2_TO1 is Begin Y <= A when S = ‘1’ else B; End AsCond; 10 La principal diferencia entre un asignamiento condicional y una proposición condicional en la que se realicen asignaciones, es que la primera es exclusica para señales mientras que en la segunda se puede hacer la asignación de cualquier tipo de objeto: señal o variable. Asignamiento seleccionado de señal El acondicionamiento se hace de acuerdo al valor de una señal que puede tomar diferentes valores. Es una construcción concurrente que no puede aparecer dentro de los procesos. Dentro de un proceso puede sustituirse por la estructura: Case . . . Is . . . When Similar al asignamiento condicional, es una estructura restringida a las señales. 11 COMPUERTA PROGRAMABLE Dato1 Salida Dato2 Modo -- Estructura Case .. Is .. When .. Architecture Gate_Prog of Gate_Prog is Begin process ( Modo, Dato1, Dato2 ) begin case Modo is when “000” => Salida <= Dato1 and Dato2; when “001” => Salida <= Dato1 or Dato2; when “010” => Salida <= Dato1 nand Dato2; when “011” => Salida <= Dato1 nor Dato2; when “100” => Salida <= not Dato1; when “101” => Salida <= not Dato2; when others => Salida <= „0‟; end case; end process; End Gate_Prog; -- Asignamiento Seleccionado de una señal Architecture AsSel of Gate_Prog is Begin With Modo select Salida <= Dato1 and Dato2 when “000”, Dato1 or Dato2 when “001”, Dato1 nand Dato2 when “010”, Dato1 nor Dato2 when “011”, not Dato1 when “100”, not Dato2 when “101”, „0‟ when others; End AsSel; 12 Manejador de señal (Driver) Recordemos que los asignamientos de señales realizados dentro de procesos solo toman efecto cuando el proceso es suspendido, por lo que sólo el último asignamiento tomará efecto. Entonces, ¿Cómo es que se conservan los eventos que ocurren en las señales? Esta es la función de un driver. El compilador de VHDL le asigna un driver para cada señal a la que se le asigna un valor dentro de un proceso. El funcionamiento es muy simple, no importa cuantas asignaciones se hagan a una señal dentro de un proceso, sólo existe un driver por señal por proceso. Las asignaciones serán efectuadas en el driver y se copiarán a la señal cuando el proceso se suspenda. ProcEj : Process( SigA, SigB) Begin SigC <= SigA; . . . . SigC <= SigB + 1; End Process ProcEj; SigA : 0 SigB : 3 SigC : 1 Driver_SigC : 13 Otros atributos asociados con las señales El driver lleva información de los cambios de una señal y su uso es necesario para propósitos de simulacion. Sin embargo las señales en VHDL tienen otros atributos que si pueden reflejarse en la sintesis del circuito. Detección de Flancos: Para verificar si ocurrió un flanco de subida o bajada en alguna señal (usualmente CLK), es necesario conocer si su valor es „1‟ o „0‟ y si acaba de ocurrir un cambio en ella, el atributo event permite conocer la última condición, para la primera se requiere evaluar otras condiciones. If CLK‟event AND CLK = „1‟ AND CLK‟last_value = „0‟ then . . . . -- Detecta un flanco de subida If CLK‟event AND CLK = „0‟ AND CLK‟last_value = „1‟ then . . . . -- Detecta un flanco de bajada 14 Lazos Universales : Existen algunos lazos for que por lo general trabajan en un arreglo unidimensional, sin importar cual sea el rango de ese arreglo, para simplificar este tipo de operaciones VHDL introduce los atributos: range y reverse_range su uso simplifica los lazos, ya que el número de iteraciones es el mismo que el rango del arreglo. For i in ArrDatos‟range loop . . . . For i in ArrDatos‟reverse_range loop . . . . Indice del Bit más significativo : En la definición de un arreglo a la izquierda se coloca el índice del bit más significativo, en ocasiones se hacen evaluaciones de este bit, y si el arreglo se modifica, tales evaluaciones deben corregirse. Para evitar estas correcciones puede usarse el atributo left por medio del cual se obtiene el índice del bit más significativo. AlgunArreglo‟left 15 Tiempo de Ajuste (Setup Time) : Cuando un sistema es manejado por un reloj maestro, todas las asignaciones deben hacerse justo después del flanco de activación (tiempo de ajuste). Pueden existir errores si se hacen asignaciones fuera de este tiempo de ajuste, para ello VHDL cuenta con un atributo last_event por medio del cual se puede determinar si una asignación fue hecha antes de tiempo. En el siguiente ejemplo la variable booleana SetupViolated tendrá verdadero cuando el tiempo de ajuste de SomeSignal sea violado. If CLK‟event AND CLK = „1‟ AND CLK‟last_value = „0‟ then SetupVilated := SomeSignal‟last_event < SetupTime; end if; Nota: En el Estandar de VHDL existen mas atributos para las señales u otros objetos (son 36 en total), solo se han comentado los mas populares. 16 Múltiples manejadores (Drivers) Existen señales que pueden ser manipuladas por múltiples procesos, para lectura o escritura. Por ejemplo, en una microcomputadora, el bus de datos va a ser accesado por diferentes elementos: Memoria, DMA, Procesador, etc. Memoria: Process Begin DMA: Process Begin DataBus <= . . .; DataBus <= . . .; . . . <= DataBus; . . . <= DataBus; end Process Memoria; end Process DMA; DataBus CPU: Process Begin DataBus <= . . .; . . . <= DataBus; end Process CPU; Cada uno de estos dispositivos maneja al bus, por lo que cada línea de señal del bus debe tener múltiples drivers. VHDL puede manipular múltiples drivers puesto que fue creado para trabajar con sistemas digitales. Se debe tener cuidado cuando existan múltiples fuentes para una señal, o bien, establecer un mecanismo que las maneje y coordine. 17 Múltiples manejadores . . . debe resolverse Un simulador de VHDL no puede saber de antemano si en una señal con múltiples manejadores ocurrirá una asignación simultánea de diferentes fuentes. Por lo que el simulador debe estar preparado para hacer una mezcla, cuando ello ocurra. A esta mezcla de señales se le conoce como “resolución” y debe especificarse como una tabla que es conocida como función de resolución Una posible comparación puede hacerse con colores: R R G B R R R/G R/B G G/R G G/B B B/R B/G A Z R Z <= A; . . . Z <= B; R B G A B Z G/B B B 18 Dos valores no son suficientes . . . La función de resolución requiere mas valores que los existentes en el conjunto básico (en el ejemplo anterior se generaron 3 colores adicionales). Algo similar debe ocurrir cuando tengamos múltiples fuentes para un asignamiento de señal, el problema con las señales de tipo bit es que solo cuenta con 2 valores por lo que no hay forma de mezclar un „1‟ con „0‟ o viceversa. 0 1 0 0 ? 1 ? 1 Z <= A; . . . Z <= B; No es posible con los tipos bit y bit_vector Como consecuencia, si solo usamos los tipos bit o bit_vector, no será posible definir buses compartidos como ocurre en un procesador o algún sistema similar. Lo que significa que requerimos de otro tipo de datos que maneje más de 2 valores y cuente con una función de resolución definida para poder mezclar valores distintos. 19 Otros valores “lógicos” Existen otros valores representados o manejados por los sistemas digitales reales, los describiremos a continuación. •En el diseño de un sistema hay situaciones en las cuales en realidad no importa el valor de una señal, puede ser „1‟ o „0‟, no importa. •Los buffers de tres estados se desconectan del sistema con un estado de alta impedancia, el cual no es „1‟ ni „0‟. • Ocasionalmente, un sistema puede tener un valor no asignado o desconocido, el cual es diferente del no importa. Estos tres valores son manejados por el tipo std_ulogic, el cual está definido en el paquete Std_logic_1164. Este paquete tambien cuenta con la definición del vector std_ulogic_vector, basado en el tipo std_ulogic. Ambos tipos cuentan con un conjunto de operaciones lógicas definidas para ellos. La u dentro del nombre std_ulogic indica “unresolved types” (tipos no resueltos). 20 Definición del tipo std_ulogic : Esta declarado en el paquete Std_logic_1164 y consiste de una enumeración con 9 valores: TYPE std_ulogic is ( „U‟, -- Desconocido o no asignado „X‟, -- Forzado a 0 o a 1 „0‟, -- Forzado a 0 „1‟, -- Forzado a 1 „Z‟, -- Alta impedancia „W‟, -- 0 o 1 débil „L‟, -- 0 débil „H‟, -- 1 débil „–‟ ); -- No importa TYPE std_ulogic_vector is ARRAY ( NATURAL RANGE <> ) of std_ulogic; Para usar el tipo std_ulogic : Se debe incluir el paquete correspondiente, para ello antes de la descripción de la entidad habrá que incluir las siguientes sentencias: Library IEEE; Use IEEE.Std_Logic.1164.all; 21 Operadores lógicos aplicables al tipo std_ulogic : Se pueden aplicar todos los definidos para los tipos bit y bit_vector, es decir: and, nand, or, nor, xor y not. Y debido a que son 9 posibles valores, se tiene una tabal de definición para cada operación, por ejemplo para la and: CONSTANT and_table : stdlogic_table := ( -- ------------------------------------------------------------ U X 0 1 Z W L H -- ------------------------------------------------------------( „U‟, „U‟ , „0‟ , „U‟ , „U‟, „U‟, „0‟, „U‟, „U‟ ), -( „U‟, „X‟ , „0‟ , „X‟ , „X‟, „X‟, „0‟, „X‟, „X‟ ), -( „0‟, „0‟ , „0‟ , „0‟ , „0‟, „0‟, „0‟, „0‟, „0‟ ), -( „U‟, „X‟ , „0‟ , „1‟ , „X‟, „X‟, „0‟, „1‟, „X‟ ), -( „U‟, „X‟ , „0‟ , „X‟ , „X‟, „X‟, „0‟, „X‟, „X‟ ), -( „U‟, „X‟ , „0‟ , „X‟ , „X‟, „X‟, „0‟, „X‟, „X‟ ), -( „0‟, „0‟ , „0‟ , „0‟ , „0‟, „0‟, „0‟, „0‟, „0‟ ), -( „U‟, „X‟ , „0‟ , „1‟ , „X‟, „X‟, „0‟, „1‟, „X‟ ), -( „U‟, „X‟ , „0‟ , „X‟ , „X‟, „X‟, „0‟, „X‟, „X‟ ) -); U X 0 1 Z W L H - Detección de Flancos de subida o bajada: Por conveniencia, para este tipo especial de datos se han incluido dos funciones: falling_edge para detectar los flancos de bajada y rising_edge para los de subida. 22 Lógica multivaluada resuelta El tipo std_ulogic soporta todos los valores que pueden aparecer en un sistema dígital típico. Sin embargo este tipo no cuenta con una función de resolución para cuando existen multiples fuentes de asignación. Debido a esto, el paquete std_logic_1114 incluye al tipo de datos std_logic, el cual maneja los 9 estados manejados por el std_ulogic pero además si cuenta con una función de resolución. De hecho la única diferencia entre los tipos std_logic y std_ulogic es que el primero si cuenta con una función de resolución mientras que el segundo no, incluso las funciones de detección de flancos están en el std_logic. Como consecuencia de ello, el tipo std_logic es actualmente un de facto de los paquetes de síntesis. El paquete std_logic_1114 incluye también el tipo de datos std_logic_vector el cual es un arreglo unidimensional de std_logic. La tabla de resolución se muestra a continuación. 23 U X 0 1 Z W L H - U U U U U U U U U U X U X X X X X X X X 0 U X 0 X 0 0 0 0 X 1 U X X 1 1 1 1 1 X Z U X 0 1 Z W L H X W U X 0 1 W W W W X L U X 0 1 L W L W X H U X 0 1 H W W H X - U X X X X X X X X Tabla de resolución para el tipo de datos: STD_LOGIC 24