www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Signal vergisst sofort seinen Wert


Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Der angehängte VHDL-Code ist mir ein Rätsel:

Wie man sieht, handelt es sich um eine Komponente, welche ein VGA-Signal 
generiert. Das funktioniert soweit völlig problemlos. Probleme gibts 
hingegen auf Zeile 61, möglicherweise in Zusammenhang mit Zeile 70. Das 
Signal sfbufctrl_clken (und der dazugehörige Output) wird ganz kurz auf 
1 gesetzt, fällt dann aber sofort wieder auf 0 zurück. (Auf meinem 25 
MHz Oszi ist nur ein senkrechter Strich zu sehen, das Signal dürfte also 
genau 1 Taktperiode (auch 25 MHz) auf 1 sein.) Richtigerweise sollte das 
Signal aber einige Taktzyklen oben bleiben...

Auszug aus dem Code (vollständige Datei im Anhang):
      if colcnt = 640 then -- blanking and stop image generation
        shblank <= '1';
        sfbufctrl_clken <= '1'; -- <=== ZEILE 61 ===
        colcnt <= colcnt + 1;
      elsif colcnt = (640 + 24) then -- hsync begin
        shsync <= '1';
        colcnt <= colcnt + 1;
      elsif colcnt = (640 + 120) then -- hsync end
         shsync <= '0';
        colcnt <= colcnt + 1;
      elsif colcnt <= (640 + 165) then -- start image generation

        sfbufctrl_clken <= '0'; -- <=== ZEILE 70 ===
        colcnt <= colcnt + 1;
      elsif colcnt = (640 + 168) then -- reset line
        shblank <= '0';
        colcnt <= (others => '0');

        if rowcnt = 480 then -- start vsync
          svblank <= '1';
          rowcnt <= rowcnt + 1;
        elsif rowcnt = (480 + 14) then
          svsync <= '1';
          rowcnt <= rowcnt + 1;
        elsif rowcnt = (480 + 16) then
          svsync <= '0';
          rowcnt <= rowcnt + 1;
        elsif rowcnt = (480 + 48) then
          svblank <= '0';
          rowcnt <= (others => '0');
        else -- image
          rowcnt <= rowcnt + 1;
        end if;
        
      else -- image, processed somewhere else
        colcnt <= colcnt + 1;          
      end if;
  hsync <= shsync;
  vsync <= svsync;
  blank <= (shblank or svblank);
  fbufctrl_clken <= sfbufctrl_clken;

Dann noch eine andere Frage, hängt evtl. damit zusammen: Ist es 
notwendig, alle Outputs als Signal 'zwischenzuspeichern', so wie es im 
vorliegenden Code gemacht wird? Oder könnte ich den jeweiligen Wert auch 
direkt auf den Output schreiben?

Gruss
Michael

Autor: mr.chip (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anhang

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Jo, If wird sequentiell durchlaufen. Bei colcnt = 640 wird der Ausgang 
auf 1 gesetzt. Die anderen elsif Abfragen werden nicht berücksichtigt. 
Im nächsten Takt (colcnt = 641) greift dann die
elsif colcnt <= (640 + 165)
 Anweisung und das Signal geht wieder in den 0 Zustand gesetzt. Somit 
bleibt dein Signal nur 1 Takt lang auf HIGH.

(Ab hier wirds spekulativ)
Das Signal wird in der synthese immer mit einem Speicher versehen. 
Würdest du sonst in einem process durchlauf das Signal nicht neu 
deklarieren, würde das Signal ja für diesen Takt undefiniert sein.

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm...jetzt seh' ichs auch :-) Ich dachte schon, irgend einem 
VHDL-spezifischen Stolperstein aufgesessen zu sein, dabei ist dieses 
'<=' schon rein inhaltlich falsch.

Danke für den Tipp!

Autor: Harry Bo macht Kinder froh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schade, und ich dachte schon es habe jemand Alzheimer beim FPGA 
entdeckt. :D

Autor: Jannulis Tembridis (tembridis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise, aber nicht notwendigerweise, werden für Ports, die in 
einem synchronen Prozess getrieben Register generiert. Man braucht also 
eigentlich keine zusätzlichen Signale zu deklarieren, ausser man möchte 
im Prozess lesend auf das Signal zugreifen. In einem solchen Fall würde 
man aber die Zuweisung auf den Port asynchron ausserhalb des Prozess 
vornehmen können (man will ja für den Port dann nicht unbedingt ein 
zusätzliches Register).

Vermutlich hat der Urheber diese extra Zuweisungen zur Verzögerung der 
Sync-Signale in Bezug auf einen Datenpfad eingefügt.

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.