Hallo zusammen,
ich versuche mich gerade an einem Lauflicht. Das Licht soll so wandern,
wie es aus Knight Rider bekannt ist. Es soll also immer das aktuelle
Licht leuchten und die vorherigen Lichter langsam ausgeblendet werden.
Ich habe mir dazu eine Beschreibung überlegt. Leider meldet er mir bei
der Synthese folgende Warnungen:
WARNING:Xst:1293 - FF/Latch <ChThr_x_y> has a constant value of 0 in
block <Blinklicht>. This FF/Latch will be trimmed during the
optimization process.
(Mit x werden dabei alle Kanäle von 0 bis 7 durchnummeriert, für y
taucht jedesmal eine 0 und eine 1 auf.)
Wie kommt die Synthese darauf, meine Schwelle "ChThr" habe einen
konstanten Wert? Ich weise ihm doch eindeutig einen anderen Wert zu!
Hier der vermutlich relevante Abschnitt (im Anhang die komplette
Beschreibung):
1
Fading:process(FadingClk)
2
begin
3
ifrising_edge(FadingClk)then
4
foriin0to7loop-- Jedes Licht einzeln bearbeiten
5
ifi=LightLeaderthen-- Handelt es sich um das aktuelle Licht, ...
Hallo Lothar,
zumindest dachte ich zu wissen, was for-Schleifen in VHDL machen. Lassen
sich for-Schleifen nicht synthetisieren? Oder wird die Beschreibung
innerhalb der for-Schleife nach der Synthese nur so oft wiederholt, wie
die Zählvariable zählt? Oder kann man auf die Zählvariable einfach nicht
zugreifen?
Deine Seite kenne ich natürlich ;-) Aber ich programmiere das Lauflicht
ja nicht, um es hinterher einzusetzen, sondern um zu lernen. Ohne
Anleitung!
Grüße
Steffen
Steffen Hausinger schrieb:
> Hallo Lothar,>> zumindest dachte ich zu wissen, was for-Schleifen in VHDL machen. Lassen> sich for-Schleifen nicht synthetisieren? Oder wird die Beschreibung> innerhalb der for-Schleife nach der Synthese nur so oft wiederholt, wie> die Zählvariable zählt? Oder kann man auf die Zählvariable einfach nicht> zugreifen?
Eine for-Schleife in VHDL beschreibt keinen sequenziellen Ablauf wie bei
C, sondern sagt lediglich, wie oft die innerhalb der Schleife
beschriebene Hardware parallel synthetisiert werden soll.
Was habt ihr nur mit den for-Schleifen, die stimmen doch...
Ich würde sagen, dass xst recht hat. Dem ChThr wird entweder
C_PWM_Period zugewiesen (=10000) oder es wird C_Fading_StepSize
abgezogen (=-500) oder es wird auf 0 gesetzt.
Preisfrage: Was bedeutet das für die Bits 0 und 1 von ChThr? ;-)
Lothar Miller schrieb:
> Du weißt schon, was for-Schleifen in VHDL machen?
Ja, das zeigt er doch in seinem Code - die for-Schleife ist hier
vollkommen richtig eingesetzt.
Georg hat ja schon erklärt, woher die Warnungen kommen. Ich habe noch
eine andere Anmerkung: Gewöhne dir besser an, das ganze Design nur mit
einem einzigen Takt zu betreiben. Benutze besser das Konzept eines
Clock-Enable Signals für die nur langsam getakteten Prozesse.
> Ja, das zeigt er doch in seinem Code - die for-Schleife ist hier> vollkommen richtig eingesetzt.
Ich bin mir nur nicht sicher, ob Steffen weiß, dass aus seiner
Beschreibung ein Multiplexer werden wird, denn er fragt:
>> Oder wird die Beschreibung innerhalb der for-Schleife nach der Synthese>> nur so oft wiederholt, wie die Zählvariable zählt?
Und es ist anerkanntermaßen so, dass in VHDL eine for-Schleife überhaupt
nicht wiederholt sondern in Hardware dupliziert wird (wie Christian
schon angemerkt hat)... :-o
Ja, es lag am Wert der Zuweisung! Wenn ich meiner Konstante
C_Fading_Stepsize den Wert 511 zuweise, tauchen keine Warnungen mehr
auf. Sehr gut! Ich habe die Warnungen im Webpack jetzt deaktiviert. Das
klappt ja prima, man kann exakt die Warnung angeben und auch exakt die
entsprechende Instanz auswählen.
Den Tipp von Jan M. habe ich versucht umzusetzen. Siehe Anhang, die
Änderungen sind rot markiert. Ist das richtig so? Im Artikel
Taktung FPGA/CPLD wird für den Zähler ein Signal verwendet. Bietet
das irgendwelche Vorteile gegenüber meiner Variante mit der Variable?
Ich denke halt, meine Variable ist nur lokal gültig und damit habe ich
eine sauberere Trennung zu den anderen Prozessen.
Den Hinweis mit den for-Schleifen nehme ich ebenfalls gerne an, auch
wenn meine Beschreibung in diesem Fall doch gepasst hat. Ich komme aus
der C-Ecke und es ist schwierig, die Unterschiede zu erkennen, wenn man
die Befehle bereits meint zu kennen und eine Erwartungshaltung hat.
Vielen Dank für Eure Hilfe!
Steffen
> Wenn ich meiner Konstante C_Fading_Stepsize den Wert 511 zuweise,> tauchen keine Warnungen mehr auf. Sehr gut!
Naja, das ist wohl ein böser Work-Around.
Sei doch froh, dass mit 512 die Register wegoptimiert werden, dann
verbrauchen Sie schon keinen Platz auf dem FPGA.
> Bietet das irgendwelche Vorteile gegenüber meiner Variante mit der> Variable?
Ja. Du kannst das Signal im Simulator darstellen.
> Ich denke halt, meine Variable ist nur lokal gültig und damit habe> ich eine sauberere Trennung zu den anderen Prozessen.
Lass die C-Denkweise in der Hardwarebeschreibung einfach mal weg.
Die einfachsten Regeln für VHDL-Anfänger sind:
- keinen (asynchronen) Reset
- nur 1 Takt im ganzen Design
- nimm keine Variablen
- verwende keine Schleifen
Wenn du mit diesen Regeln in deinem Design an berechtigte Grenzen stößt,
dann darfst du auch mal Variable nehmen, oder einen zweiten Takt
einführen, aber du solltest dir über die Konsequenzen jeweils im Klaren
sein.
Such z.B. mal hier im Forum zum Thema Variable vs. Signal
Beitrag "Variable vs Signal"Beitrag "Beschreibung einer State Machine"
Und der Knight-Rider geht ganz ohne die Programmierelemente Variable
und Schleife. Den Link dazu habe ich dir schon gezeigt.
BTW: hänge deine Quelltexte bitte nicht als Grafik an, sondern als Datei
mit der Endung *.vhd, dann gibts gratis dazu das schöne
Syntax-Highlighting
Hallo Lothar,
die Wertuzweisung von 511 habe ich nicht als Workaround gemeint, sondern
als Test. Das ganze Lauflicht ist nur ein Test, um mit FPGAs und deren
Beschreibung vertrauter zu werden.
Lothar Miller schrieb:
>> Bietet das irgendwelche Vorteile gegenüber meiner Variante mit der>> Variable?> Ja. Du kannst das Signal im Simulator darstellen.
Wie geht das denn? Beziehst Du Dich hier auf Modelsim? In ISim habe ich
nichts entsprechendes gefunden. Dort zeigt er mir stur nur die Signale
des Ports an. Wo finde ich die im Prozess internen Signale?
Danke für Deine weiteren Tipps! Ich habe mir den Artikel VHDL auch
noch einmal durchgelesen, dort wird ebenfalls darauf hingewiesen.
Grüße
Steffen
>>> Ja. Du kannst das Signal im Simulator darstellen.> Beziehst Du Dich hier auf Modelsim?
Ja.
> In ISim habe ich nichts entsprechendes gefunden.
Da geht das sicher auch, denn das ist eine elementare Funktion eines
Simulators.
> Wo finde ich die im Prozess internen Signale?
Ich würde mal auf irgendwelche Projekt-Bäume (rechts-)klicken oder
versuchen, die Signale per Drag&Drop in die Waveform zu ziehen, da gibt
es sicher 1000undeine Möglichkeiten.