programacion de sistemas digitales

Page 90

82

Conceptos avanzados en VHDL

o un '0', este ser a el valor que se tome ya que el '1' o el '0' son valores m as fuertes que el 'Z'. La precauci on, a la hora de realizar el circuito, es cuidar de que s olo haya un dispositivo a un tiempo que escribe el valor fuerte, mientras que el resto est an en alta impedancia. Otros buses, normalmente los dedicados al arbitraje, suelen utilizar salidas en colector abierto de manera que varios dispositivos pueden escribir a la vez, y no pasa nada porque uno escriba un '0' y otro un '1' al mismo tiempo ya que el cero siempre gana. Es una forma, adem as, de realizar lo que se llama una AND cableada, ya que simplemente conectando juntas varias se~nales en colector abierto el resultado en el bus ser a una AND l ogica sobre todas las se~nales que escriben en el bus. Hasta ahora, en todos los ejemplos que se han visto, s olo se asignaba un valor a una se~nal. De hecho, es imposible en VHDL asignar dos veces una misma se~nal (de tipo no resuelto) en dos instrucciones concurrentes. Dicho de otra manera, s olo un driver puede escribir sobre una se~nal (en el caso de poner retrasos, en una multiasignaci on, son varios driver consecutivos, pero s olo hay uno que escribe sobre la se~nal). Como corolario de este principio que acabamos de dar, se puede decir que no se puede asignar dos veces un valor a una se~nal en procesos diferentes, y conviene recalcarlo tanto ya que es un error muy com un a la hora de describir circuitos usando VHDL. Para solucionar el problema de los buses en VHDL se han creado los tipos resueltos que van a ser un tipo de se~nales que tienen asociada una funci on de resoluci on que es precisamente la que resuelve el con icto que se da cuando varios drivers escriben sobre una misma se~nal y decide qu e valor asignarle. Un tipo resuelto se de ne con la declaraci on de subtipo a~nadiendo el nombre de la funci on. Para ver esto m as claro veamos una aplicaci on evidente. Supongamos que tenemos una l ogica con tres niveles que son el uno '1', el cero '0', y el de alta impedancia 'Z'. Supongamos que se tienen se~nales sobre las que se pueden dar accesos m ultiples a un tiempo (ej. un bus de datos). Con estas consideraciones vamos a ver c omo se describir a un bus de este tipo para que soportara m ultiples drivers en una misma se~nal. Para empezar habr a que de nir estos tipos: TYPE logico IS ('0','1','Z'); TYPE vector_logico IS ARRAY (integer range <>) OF logico;

Para continuar hay que de nirse una funci on de resoluci on que calcule el valor del driver en funci on de todas las asignaciones que se est an haciendo. En nuestro ejemplo cualquier se~nal que contenga 'Z' no interviene, y para el resto, ser a cero si al menos hay uno que es cero (wire AND logic). Con estas consideraciones, la funci on de resoluci on ser a: FUNCTION resolver(senales: IN vector_logico) RETURN logico IS VARIABLE index: integer; VARIABLE escribe: boolean:=FALSE; BEGIN FOR index IN senales'range LOOP IF senales(index)='0' THEN RETURN '0'; END IF; IF senales(index)='1' THEN escribe:=TRUE; END IF; END LOOP; IF escribe RETURN '1'; END IF; RETURN 'Z'; END resolver;

Ingenier a Inform atica

Universidad de Valencia


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.