mikrocontroller.net

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


Autor: Steffen Hausinger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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):
Fading : process(FadingClk)
  begin
    if rising_edge(FadingClk) then
      for i in 0 to 7 loop                      -- Jedes Licht einzeln bearbeiten
        if i = LightLeader then                  -- Handelt es sich um das aktuelle Licht, ...
          ChThr(i) <= C_PWM_Period;              -- ...maximale Leuchtstärke auswählen
        else
          if ChThr(i) > C_Fading_StepSize then      -- Kann die Leuchtstärke mit der vorgegebenen Schrittweite verringert werden, ...
            ChThr(i) <= ChThr(i) - C_Fading_StepSize;  -- ...dies jetzt tun
          else                            -- Andernfalls...
            ChThr(i) <= 0;                    -- ...minimale Leuchtstärke auswählen
          end if;
        end if;
      end loop;
    end if;
  end process;


Weiß jemand von Euch, warum er hier meckert?

Grüße
Jasper

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
      for i in 0 to 7 loop                      -- Jedes Licht einzeln bearbeiten
         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  ;-)

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? ;-)

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen Hausinger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.