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


von mr.chip (Gast)


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):
1
      if colcnt = 640 then -- blanking and stop image generation
2
        shblank <= '1';
3
        sfbufctrl_clken <= '1'; -- <=== ZEILE 61 ===
4
        colcnt <= colcnt + 1;
5
      elsif colcnt = (640 + 24) then -- hsync begin
6
        shsync <= '1';
7
        colcnt <= colcnt + 1;
8
      elsif colcnt = (640 + 120) then -- hsync end
9
         shsync <= '0';
10
        colcnt <= colcnt + 1;
11
      elsif colcnt <= (640 + 165) then -- start image generation
12
13
        sfbufctrl_clken <= '0'; -- <=== ZEILE 70 ===
14
        colcnt <= colcnt + 1;
15
      elsif colcnt = (640 + 168) then -- reset line
16
        shblank <= '0';
17
        colcnt <= (others => '0');
18
19
        if rowcnt = 480 then -- start vsync
20
          svblank <= '1';
21
          rowcnt <= rowcnt + 1;
22
        elsif rowcnt = (480 + 14) then
23
          svsync <= '1';
24
          rowcnt <= rowcnt + 1;
25
        elsif rowcnt = (480 + 16) then
26
          svsync <= '0';
27
          rowcnt <= rowcnt + 1;
28
        elsif rowcnt = (480 + 48) then
29
          svblank <= '0';
30
          rowcnt <= (others => '0');
31
        else -- image
32
          rowcnt <= rowcnt + 1;
33
        end if;
34
        
35
      else -- image, processed somewhere else
36
        colcnt <= colcnt + 1;          
37
      end if;
38
  hsync <= shsync;
39
  vsync <= svsync;
40
  blank <= (shblank or svblank);
41
  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

von mr.chip (Gast)


Angehängte Dateien:

Lesenswert?

Anhang

von Gast (Gast)


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

von mr.chip (Gast)


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!

von Harry Bo macht Kinder froh (Gast)


Lesenswert?

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

von Jannulis T. (tembridis)


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.

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.