7. Múltiples procesos en una arquitectura

Anuncio
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
Descargar