Forum: FPGA, VHDL & Co. Warum klappt diese Synthese nicht?!


von Steffen Hausinger (Gast)


Angehängte Dateien:

Lesenswert?

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
    if rising_edge(FadingClk) then
4
      for i in 0 to 7 loop                      -- Jedes Licht einzeln bearbeiten
5
        if i = LightLeader then                  -- Handelt es sich um das aktuelle Licht, ...
6
          ChThr(i) <= C_PWM_Period;              -- ...maximale Leuchtstärke auswählen
7
        else
8
          if ChThr(i) > C_Fading_StepSize then      -- Kann die Leuchtstärke mit der vorgegebenen Schrittweite verringert werden, ...
9
            ChThr(i) <= ChThr(i) - C_Fading_StepSize;  -- ...dies jetzt tun
10
          else                            -- Andernfalls...
11
            ChThr(i) <= 0;                    -- ...minimale Leuchtstärke auswählen
12
          end if;
13
        end if;
14
      end loop;
15
    end if;
16
  end process;


Weiß jemand von Euch, warum er hier meckert?

Grüße
Jasper

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
      for i in 0 to 7 loop                      -- Jedes Licht einzeln bearbeiten
2
         if i = LightLeader then                -- Handelt es sich um das aktuelle Licht, ...
Du weißt schon, was for-Schleifen in VHDL machen?

> Das Licht soll so wandern, wie es aus Knight Rider bekannt ist.
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
Nimm meinen, der funktioniert  ;-)

von Steffen Hausinger (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Georg A. (Gast)


Lesenswert?

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? ;-)

von Jan M. (mueschel)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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

von Steffen Hausinger (Gast)


Angehängte Dateien:

Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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

von Steffen Hausinger (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>>> 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.

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
Noch kein Account? Hier anmelden.