Creé un multiplexor simple que alimenta diferentes entradas a salidas dependiendo de la máquina de estado. Ahora hay estados en los que no necesito la salida, por lo que generalmente la configuro en 0.
INST <= "01" WHEN fsm_state = read_first_half
OR fsm_state = read_second_half
OR fsm_state = next_r ELSE
"10" WHEN fsm_state = write_first_half
OR fsm_state = write_second_half
OR fsm_state = next_w
ELSE "00";
Por lo que recuerdo, había un tercer valor sintetizable 'Z'. Por lo que recuerdo, es un valor flotante con alta impedancia. ¿Cuándo lo uso y es seguro de usar? ¿Será sintetizable en todos los FPGA?
Cuando no le importe un valor de salida dado un conjunto de entradas, use '-' que significa "no me importa". El sintetizador simplemente asignará valores que optimicen recursos/rendimiento. Sin embargo, tenga en cuenta que un simulador tiene la opción de mantener '-' como un valor real, y esto realmente lo ayudará a asegurarse de que tener un "no me importa" allí no afectará las partes relevantes de su diseño.
'Z' o "alta impedancia" en FPGA solo se usa para salidas de tres estados, que hoy en día solo están disponibles en los pines reales del chip, no para lógica interna. Los fabricantes de FPGA modernos simplemente no asignan recursos de enrutamiento interno para ellos, y solo están destinados a interactuar con chips/componentes externos. Para la lógica interna, la misma funcionalidad (como el arbitraje de bus) se puede lograr con puertas lógicas regulares.
Estas definiciones se pueden encontrar en la biblioteca IEEE std_logic_1164.vhdl: http://standards.ieee.org/downloads/1076/1076.2-1996/std_logic_1164.vhdl
Realmente no hay una razón para poner una salida en tres estados ('Z') si el IO es solo una salida y no una 'entrada'. Además, tener un '1' o un '0' en la salida facilita la depuración (medición).
o <= '0' when sig = '0' else 'Z'
Puedo pensar en muchos casos en los que usarías la Z en señales, tanto internas como en los pines. Por ejemplo, si tiene un bus que se controla desde varias fuentes, puede controlarlo colocando todas las demás señales de control en Z. Algunas FPGA admiten esto internamente, pero no todas.
En cuanto a las señales de salida, muchas veces no querrás sacar señales, como datos, de tu FPGA, porque esas señales pueden compartirse entre varios dispositivos. Algunos optan por cambiar la dirección de las señales en lugar de poner la salida en Z, lo que facilita la depuración.
INST <= "01" WHEN fsm_state = read_first_half
OR fsm_state = read_second_half
OR fsm_state = next_r ELSE
"10" WHEN fsm_state = write_first_half
OR fsm_state = write_second_half
OR fsm_state = next_w
ELSE "--"; -- don't cares
El sintetizador debería presentar algo óptimo (pero no necesariamente predecible)
mate joven
apalopohapa
martin thompson
-
es un valor por derecho propio, por lo que para que realmente se comporte como si no importara en una comparación, debe usar lastd_match()
función...