Implementieren eines Zählers in VHLD mit flankengetriggertem Löschen

Ich mache immer noch meine ersten Schritte beim Erlernen von VHDL und konnte nach ein paar Tagen noch keine Lösung für dieses Problem finden.

Ich versuche, einen LCD-Controller auf einem Altera MAX II CPLD zu implementieren, der Signale von einem vorhandenen Gerät empfängt.

Eines der Signale ist das Rahmensignal, das hoch ist, während ein Rahmen empfangen wird, und ansonsten niedrig. Ich habe auch ein Taktsignal, das den Zustand für alle verfügbaren Pixeldaten von niedrig nach hoch ändert.

Auf meinem CPLD habe ich einen Zeilen- und einen Spaltenzähler, die bei der ersten steigenden Flanke der Uhr zurückgesetzt werden müssen , nach dem Beginn jedes Frames und der Spaltenzähler muss bei jeder steigenden Flanke der Uhr inkrementiert werden.

Was ich versuche zu erreichen, ist im folgenden Diagramm dargestellt.

Zeitdiagramm

Das Problem, mit dem ich konfrontiert bin, ist, dass, wenn ich versuche, die Zähler bei der steigenden Flanke des Frame- Signals zurückzusetzen und sie bei der steigenden Flanke des clk- Signals zu inkrementieren, der folgende Fehler angezeigt wird:

Error (10821): HDL error at AddressController.vhd(116): can't infer register for "line[0]" because its behavior does not match any supported register model

Ich denke, das sollte ein einfacher Weg sein, dies zu tun, aber ich habe Probleme, es herauszufinden.

Machen Sie alles an Taktkanten. Setzen Sie die Zähler bei der ersten Taktflanke zurück, nachdem der Frame hoch geht. (Tipp: Speichern Sie eine Kopie von Frame am selben Taktrand, damit Sie erkennen können, dass nachfolgende Takte nicht die ersten sind ...)
@BrianDrummond: Es ist vielleicht nicht so einfach. Basierend auf dem Diagramm gibt es möglicherweise keine Taktflanken, die auftreten, während framees niedrig ist.
Danke Brian für deinen Vorschlag, aber wie @DaveTweed bemerkt hat, besteht das Problem darin, dass ich nur Uhren habe, wenn der Frame hoch ist, also kann ich die Uhr dafür nicht verwenden.
Frame müsste also als Active-Low-Reset auf das "save Frame"-Register verwendet werden.
@BrianDrummond Danke für deinen Vorschlag. Ich hatte bereits darüber nachgedacht, eine Variable zu verwenden, um die erste Taktflanke zu identifizieren, aber ich war mir nicht sicher, wann ich sie löschen oder setzen sollte.

Antworten (1)

Sie können ein einzelnes Flip-Flop (wie Sie es möglicherweise zur Implementierung einer synchronen Zustandsmaschine verwenden) nicht mit zwei verschiedenen Taktsignalen ansteuern. Wenn Sie auf diese Weise auf Flanken an mehreren Signalen reagieren müssen, müssen Sie im Allgemeinen eine asynchrone Zustandsmaschine verwenden. Leider scheinen Designtechniken für ASMs nicht mehr weit verbreitet zu sein.

In diesem speziellen Fall könnten Sie ein einfaches RS-Latch verwenden. Dieser Latch würde durch ein niedriges Signal gesetzt frameund durch ein hohes clkSignal gelöscht. Rufen Sie die Ausgabe dieses Latches auf first. clkIn Ihrem Zähler, der nur durch das Signal gesteuert wird , firstlöschen Sie den Zähler, wenn gesetzt ist; Andernfalls erhöhen Sie den Zähler.

Wenn Sie versuchen, diesen Code (insbesondere für einen FPGA) zu synthetisieren, werden Sie zweifellos eine oder mehrere Warnungen zu dieser kombinatorischen Rückkopplungsschleife erhalten – Sie müssen sie einfach ignorieren. Oder fügen Sie eine spezielle Ausnahme für diesen Fall hinzu, wenn Ihre Tools dies zulassen.

Vielen Dank, ich denke das löst mein Problem. Ich habe ein paar Sonderfälle, die ich in meiner Frage weggelassen habe, um Verwirrung zu vermeiden, aber ich denke, ich kann damit umgehen.