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?
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
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).
o <= '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)
Matt Jung
Apalopohapa
Martin Thomson
-
ein eigenständiger Wert ist. Um ihn also dazu zu bringen, sich in einem Vergleich tatsächlich als egal zu verhalten, müssen Sie diestd_match()
Funktion verwenden ...