¿En qué casos debo usar Z como salida en HDL?

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?

Respuestas (4)

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

I2C es un buen ejemplo. El bit ACK requiere un estado de salida de alta Z ya que el esclavo enviará una respuesta lógica alta. Consulte prodigytechno.com/blog/wp-content/uploads/2011/12/… como referencia.
@Martin Thompson Fijo. Gracias por el comentario. También edité la respuesta para incluir un enlace a la biblioteca ieee que define std_logic.
@apalopohapa: Gracias. También valdría la pena mencionar que -es un valor por derecho propio, por lo que para que realmente se comporte como si no importara en una comparación, debe usar la std_match()función...

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).

¿EN REALIDAD? ¿Qué harías cuando te conectas al bus I2C?
@FarhadA Entonces creo que eso caería en el caso 'inout' que mencionó vermaete.
Por supuesto, mi punto solo es válido si es una salida normal en el FPGA conectado a alguna entrada normal.
Incluso para un búfer de tres estados, preferiría tener un conjunto de habilitación de entrada, salida y salida en la entidad del componente e insertar el búfer bidireccional en el nivel superior.
Entonces, ¿haces la señal ACK del I2C como entrada? Bueno, creo que te llevarás una gran sorpresa al depurar tu diseño.
No estaba hablando de I2C. Solo un pad básico de entrada/salida. Pero volvamos a la pregunta original. Hay una salida que siempre está activada ('1' o '0'). Entonces, no es un tristate, IO, o lo que sea. Solo una salida. La pregunta era si había una razón para poner la salida en 'Z'. Yo decía: no, no hay ninguna razón en absoluto. BESO. No utilice una 'Z' si no es necesario.
Acerca de mantener las señales IO como (I/O/O_en) y convertirlas en un nivel superior en un IO-pad. Es lo que está haciendo Xilinx con (¿la mayoría?) de sus IP. Por ejemplo , xilinx.com/support/documentation/ip_documentation/xps_iic.pdf , página 2, figura 1.
@vermaete: usar 'Z' en una salida pura es una buena manera de inferir una salida de drenaje abiertoo <= '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)