Signal vergisst sofort seinen Wert

Gast #938501
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
Gast #938594
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.
#940004
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren