In welchen Fällen sollte ich Z als Ausgabe in HDL verwenden?

Ich habe einen einfachen Multiplexer erstellt, der je nach Zustandsmaschine unterschiedliche Eingaben in die Ausgabe einspeist. Jetzt gibt es Zustände, in denen ich den Ausgang nicht benötige, also setze ich ihn normalerweise auf 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";

Soweit ich mich erinnere, gab es einen dritten syntetisierbaren Wert 'Z'. Soweit ich mich erinnere, ist es ein schwebender Wert mit hoher Impedanz. Wann verwende ich es und ist es sicher zu verwenden? Wird es auf allen FPGAs synthetisierbar sein?

Antworten (4)

Wenn Ihnen ein Ausgabewert bei einer Reihe von Eingaben egal ist, verwenden Sie '-', was "egal" bedeutet. Der Synthesizer weist einfach Werte zu, die Ressourcen/Leistung optimieren. Beachten Sie, dass ein Simulator jedoch die Option hat, „-“ als tatsächlichen Wert beizubehalten, und dies hilft Ihnen tatsächlich dabei, sicherzustellen, dass ein „egal“ darin keine Auswirkungen auf die relevanten Teile Ihres Designs hat.

'Z' oder "High Impedance" in FPGAs wird nur für Tri-State-Ausgänge verwendet, die heutzutage nur an den eigentlichen Pins des Chips verfügbar sind, nicht für interne Logik. Moderne FPGA-Hersteller weisen ihnen einfach keine internen Routing-Ressourcen zu und sind nur für die Verbindung mit externen Chips/Komponenten vorgesehen. Für die interne Logik kann die gleiche Funktionalität (wie etwa Busarbitrierung) stattdessen mit regulären Logikgattern erreicht werden.

Diese Definitionen finden Sie in der Bibliothek IEEE std_logic_1164.vhdl: http://standards.ieee.org/downloads/1076/1076.2-1996/std_logic_1164.vhdl

I2C ist ein gutes Beispiel. Das ACK-Bit erfordert einen High-Z-Ausgangszustand, da der Slave ein logisches High zurücksendet. Siehe prodigytechno.com/blog/wp-content/uploads/2011/12/… als Referenz.
@Martin Thompson Behoben. Danke für den Kommentar. Ich habe die Antwort auch so bearbeitet, dass sie einen Link zur IEEE-Bibliothek enthält, die std_logic definiert.
@apalopohapa: Danke - es wäre auch erwähnenswert, dass dies -ein eigenständiger Wert ist. Um ihn also dazu zu bringen, sich in einem Vergleich tatsächlich als egal zu verhalten, müssen Sie die std_match()Funktion verwenden ...

Es gibt nicht wirklich einen Grund, einen Ausgang in Tristate ('Z') zu setzen, wenn das IO nur ein Ausgang und kein 'inout' ist. Außerdem erleichtert eine „1“ oder „0“ am Ausgang das Debuggen (Messen).

WIRKLICH? Was würden Sie tun, wenn Sie sich mit dem I2C-Bus verbinden?
@FarhadA Dann denke ich, dass das unter den Fall "inout" fallen würde, den vermaete erwähnt hat.
Natürlich ist mein Punkt nur gültig, wenn es sich um einen normalen Ausgang am FPGA handelt, der irgendwo mit einem normalen Eingang verbunden ist.
Selbst für einen Tristate-Puffer würde ich es vorziehen, eine Reihe von Eingabe-, Ausgabe- und Ausgabeaktivierungen an der Entität der Komponente zu haben und den bidirektionalen Puffer auf oberster Ebene einzufügen.
Sie machen also das ACK-Signal des I2C als Eingang? Nun, ich glaube, Sie werden eine große Überraschung erleben, wenn Sie Ihr Design debuggen.
Ich habe nicht von I2C gesprochen. Nur ein einfaches Input/Output-Pad. Aber kommen wir zurück zur Ausgangsfrage. Es gibt einen Ausgang, der immer angesteuert ist ('1' oder '0'). Es ist also kein Tristate, IO oder was auch immer. Nur eine Ausgabe. Die Frage war, ob es einen Grund gab, die Ausgabe auf 'Z' zu setzen. Ich sagte: Nein, es gibt überhaupt keinen Grund. KUSS. Verwenden Sie kein 'Z', wenn es nicht benötigt wird.
Über das Halten der IO-Signale als (I/O/O_en) und Konvertieren auf oberster Ebene in ein IO-Pad. Es ist so, wie es Xilinx mit (den meisten?) IPs macht. ZB xilinx.com/support/documentation/ip_documentation/xps_iic.pdf , Seite 2, Abbildung 1.
@vermaete: Die Verwendung von 'Z' für eine reine Ausgabe ist eine gute Möglichkeit, auf eine Open-Drain-Ausgabe zu schließeno <= '0' when sig = '0' else 'Z'

Ich kann mir viele Fälle vorstellen, in denen Sie das Z für Signale verwenden würden, sowohl intern als auch an den Pins. Wenn Sie beispielsweise einen Bus haben, der von mehreren Quellen angesteuert wird, können Sie ihn steuern, indem Sie alle anderen Ansteuersignale auf Z legen. Einige FPGAs unterstützen dies intern, aber nicht alle.

Was Ausgangssignale betrifft, möchten Sie häufig keine Signale wie Daten aus Ihrem FPGA treiben, da diese Signale möglicherweise von mehreren Geräten gemeinsam genutzt werden. Einige entscheiden sich dafür, die Richtung der Signale zu ändern, anstatt den Ausgang auf Z zu setzen, was das Debuggen erleichtert.

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

Der Synthesizer sollte sich etwas Optimales einfallen lassen (aber nicht unbedingt vorhersehbar)