Es posible conducir una señal desde dos módulos.
Sin embargo, no es sencillo; los dos módulos tienen que cooperar: si uno acciona '1' y el otro '0' al mismo tiempo, ha creado un cortocircuito en la fuente de alimentación y puede dañar el dispositivo. En la simulación, afortunadamente, ¡los resultados son menos dramáticos!
Dos formas de hacerlo; y la razón para no usar ninguno de ellos dentro de un FPGA.
La primera forma es el "Y cableado" tradicional, donde hay un '1' débil conectado permanentemente a la señal. Tradicionalmente esta era una resistencia conectada a + 5V; en VHDL puede decir Load_Divider <='H';
en el diseño de nivel superior. H y L son versiones débiles de '1' y '0'.
Ahora todos los controladores pueden bajarlo o apagarlo
if condition then
Load_Divider <='0';
else
Load_Divider <='Z';
end if;
('Z' significa el estado de alta impedancia Z o alta, es decir, apagar el controlador).
Si TODOS los módulos manejan Z, la salida es 'H' (igual a '1').
La segunda forma se llama un bus tri-estatal. Aquí cualquiera de los módulos puede conducir 0, 1 o Z en el bus. Sin embargo, usted, el diseñador, DEBE asegurarse de que cuando un módulo esté manejando '0' o '1', TODOS los otros módulos estén manejando 'Z', para evitar el cortocircuito y los daños mencionados anteriormente. Eso requiere la cooperación de todos los módulos de alguna manera:
if my_turn then
Load_Divider <= my_signal; -- 0 or 1
else
Load_Divider <='Z';
end if;
Cualquiera de estas técnicas son formas válidas de comunicarse entre FPGA separados y otros chips (memorias, CPU) en su tablero. Pero dentro de un FPGA no hay señales de tri-estado (solo en sus pines de E / S), por lo que si utiliza cualquiera de las técnicas anteriores, las herramientas de síntesis lo convierten en una señal equivalente sin los tri-estados.
Por ejemplo, la primera técnica (cableada-AND) podría traducirse a
Load_Divider_1 <= '0'; -- module 1
Load_Divider_2 <= '1'; -- module 2
Load_Divider <= Load_Divider_1 and Load_Divider_2;
donde puede ver que cada señal tiene un solo controlador. Entonces, ¿por qué no escribir eso en primer lugar?