Um ein Display anzusteuern benötige ich mehrere Signale die alle ausgehend vom Zeilenbeginn um bestimmte Pixelanzahlen verschoben sind und eine entsprechende Dauer habe. Daher habe ich einen Zähler verwendet, der mit dem Pixeltakt getaktet wird, und synchron mit HSync zurückgesetzt wird. Jetzt meine Frage: Wie macht man es richtig in VHDL, wenn man ausgehend von diesem Zähler Signale generieren möchte. Als Beispiel möchte ich jetzt ein Signal haben, das während dem Wertebereich des Zählers von 25-625 auf high ist. Eine Möglichkeit wäre reine kombinatorische Logik, die eben während diesen Zählerzuständen ein High liefert. Allerdings befürchte ich, dass es dabei Glitches geben könnte. Man müsste also an den Ausgang nochmal ein vom Pixeltakt getaktetes Latch dranhängen, damit es wirklich sauber ist. Die nächste Möglichkeit wären zwei Teile mit kombinatorischer Logik, die jeweils beim Einschaltzeitpunkt und beim Ausschaltzeitpunkt ein High erzeugen, und damit ein RS-FF setzen bzw. zurücksetzen. Aber auch hier könnten wieder Glitches auftreten die das FF falsch setzen. Wie macht man es also richtig in VHDL ? Oder ist meine Angst um die Glitches übertrieben, und die Lösungen sind wirklich praxistauglich ? Ich habe momentan eine Lösung die meiner Meinung nach nicht ganz praxistauglich ist, da gemischt synchron/asynchron, so dass es halt irgendwie funktioniert.
Ich sehe mehrere Möglichkeiten: - Zustandsautomat nach Moore - geeignete Codierung des Zählers verwenden z.B. Gray, dann kann auch glitchfrei verknüpft werden - überlegen, inwieweit die Glitche stören in der realen Anwendung. Gehen die Signal auf flankensensitive Schaltungsteile (= Takteingäne), dann dürfen keine Glitche drin sein. Werden die verknüpten Signale jedoch von der nachfolgenden Schaltung auch wieder synchron übernommen, dann ist das kein Problem. - nochmals abtasten (mit FF nicht Latch) ist auch gut, liefert das Signal aber um einen Takt verzögert an. Könnte in deinem Fall durch die anderen Anfangswerte berücksichtigt werden (24 bis 624).
Ich würde das, wie HildeK am Schluß vorschlägt machen. Dadurch, dass die Abfrage im Prozess stattfindet, entsteht am Ausgang ein FF. Also so etwa: vhdl process(pixel_clk) begin if rising_edge(pixel_clk) then pixel_counter <= pixel_counter+1; if (pixel_counter > 23 and pixel_counter < 623) then --mein_signal wird mit der 25.Taktflanke 1 und mit der 625. Flanke wieder 0 mein_signal <= '1'; else mein_signal <= '0'; end if; end if; end process; /vhdl Tom
ok, war noch ein Fehler drin, hoffentlich passt nun auch die Formatierung
1 | process(pixel_clk) |
2 | |
3 | begin
|
4 | if rising_edge(pixel_clk) then |
5 | |
6 | pixel_counter <= pixel_counter+1; |
7 | |
8 | if (pixel_counter > 23 and pixel_counter < 624) then |
9 | |
10 | --mein_signal wird mit der 25.Taktflanke 1 und mit der 625. Flanke wieder 0
|
11 | mein_signal <= '1'; |
12 | else
|
13 | mein_signal <= '0'; |
14 | end if; |
15 | end if; |
16 | |
17 | end process; |
Ich würde das so lösen:
1 | if rising_edge(clock) then |
2 | if counter=x"018" then -- 24 |
3 | flag <= '1'; |
4 | elseif counter=x"270" then -- 624 |
5 | flag <= '0'; |
6 | end if; |
7 | end if; |
Den Zähler hochzählen und die Resetlogik (falls benötigt) müsste noch ergänzt werden. Aus "flag" wird dabei ein Latch. Das wird immer um einen Takt verzögert gesetzt und wieder zurückgesetzt. Die Kombinatiorik hat in diesem Takt Zeit sich zu beruhigen.
Meine Lösung ist etwas kleiner (9 vs. 10 Slices - bei gleicher Anzahl FF und LUTs...) und läuft mit höherem Takt (265 vs. 218 MHz). Hier noch eine Version ohne Tipfehler (man muss die Werte auch nicht unbedingt nach HEX umrechnen):
1 | if rising_edge(clock) then |
2 | if counter=24 then |
3 | flag <= '1'; |
4 | elsif counter=624 then |
5 | flag <= '0'; |
6 | end if; |
7 | end if; |
Danke ! Das ist wirklich eine einfache und kompakte Lösung. Darauf muss man erstmal kommen. Ich hatte schon alles mögliche ausprobiert, was zwar prinzipiell auch ging, aber dann doch die Gefahr von Glitches o.ä. hatte.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.