Ich möchte einen Block kombinatorischer Logik mit VHDL entwerfen, aber gelegentlich enthält das synthetisierte Ergebnis einen unbeabsichtigten Latch.
Welche Codierungsrichtlinien muss ich befolgen, damit der Synthesizer keine Latches ableitet?
Beispiel: Soll ich in einem kleinen Codesegment if-else-Anweisungen verwenden?
Antworten:
Um Latches zu vermeiden, müssen Sie sicherstellen, dass alle Ihre Ausgaben in allen möglichen Zweigen des Codes zugewiesen sind.
zum Beispiel,
würde einen Latch erzeugen, da in der ersten Bedingung der Wert von b (1) nicht angegeben ist, sodass der Compiler entschieden hat, dass Sie den vorherigen Wert von b (1) dort behalten möchten. Eine Möglichkeit, dies zu schreiben, ohne dass ein Latch generiert wird, ist:
Hier geben Sie explizit an, dass b seinen alten Wert beibehalten und dann b (0) mit dem neuen Wert überschreiben soll.
Eine andere Möglichkeit besteht darin, einen Standardwert anzugeben, wie in der Antwort von @ TomiJ.
Wenn Sie den Code veröffentlichen, für den Sie einen Latch erhalten, können wir Ihnen helfen, den spezifischen Grund zu finden.
quelle
b <= b
einen Latch vermeiden wird, da der Zustand des Signals immer noch beibehalten werden muss.Wenn Sie Prozesse für die kombinatorische Logik verwenden (und ich rate aus diesem Grund davon ab), stellen Sie sicher, dass jeder Pfad durch den Prozess jedem Signal, das der Prozess steuert, etwas zuweist. Keine der Ausgaben kann von einer der Ausgaben vom "letzten Mal" abhängig sein, als der Prozess ausgeführt wurde.
Andernfalls schließen Sie auf einen Latch, da der Prozess beim nächsten Planen den Wert des Signals beibehalten muss, das beim letzten Mal keinen neuen Wert erhalten hat.
Ich bevorzuge es, rein kombinatorische Logik als kontinuierliche Zuweisungen beizubehalten und Prozesse für getaktete Logik zu verwenden, dann bekomme ich keine Latches.
quelle
Vier Regeln zur Vermeidung von Latches:
Wenn Sie mehrere kombinatorische Prozesse haben, stellen Sie außerdem sicher, dass Sie keine Schleife erstellen.
Verschiedene Codierungsstile können Ihnen dabei helfen, diese Regeln einzuhalten, z. B. der Stil in der Antwort von @ TomiJ. Wie @Martin Thompson betont, ist es möglicherweise besser, kombinatorische Logik insgesamt zu vermeiden. Setzen Sie stattdessen alles in einen getakteten Prozess.
quelle
Wie von @fbo und @Martin Thompson ausgeführt, müssen Sie sicherstellen, dass jedem vom Prozess gesteuerten Signal in jedem Zweig des Prozesses ein Wert zugewiesen wird, und dieser Wert darf nicht vom vorherigen Status eines der Ausgänge abhängig sein des Prozesses.
Der einfachste Weg, dies sicherzustellen, besteht darin, jedem Ausgang zu Beginn des Prozesses einen Standardwert zuzuweisen (z. B. das Beispiel von fbo):
quelle