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