Forum: FPGA, VHDL & Co. DE0nano VHDL VGA Controller


von dasrotemopped (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich mache gerade mit Quartus und VHDL meine ersten Gehversuche.
Auf dem DE0nano habe ich einen einfachen 9-bit VGA Adapter
angeschlossen und den VHDL Code für einen VGA Controller geschrieben.
Die Synchronisierungssignale werden einwandfrei erzeugt, der Monitor
zeigt ein Bild (Farbe bordeauxrot). Der Logikanalyser bestätigt die 
perfekten Timings (72Hz/48kHz). Wenn ich allerdings die Zeilen
dclk <= ' usw. einfüge, geht das Timing für die Vertikalfrequenz von 72 
Hz auf 144 Hz hoch. Im RTL Viewer kann ich keinen Grund für dieses 
Verhalten sehen.
Auch bei anderen Versuchen, den Bildinhalt zu ändern (z.B. Farbbalken 
horizontal) passiert das selbe.
Hat jemand eine Idee, was ich falsch mache ?

Gruß,

dasrotemopped.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

CONSTANT hsync : integer range 0 to 2047 :=  120-1;
Welche Konstante hat denn einen Bereich?
Das müsste korrekterweise doch so lauten:
CONSTANT hsync : integer :=  120-1;

Und die hier:
VARIABLE hcount : integer range 0 to 2047;
Welchen Bereich hat die wirklich?
Denn genau diesen Bereich solltest du eigentlich angeben. Irgendwelche 
Bits, die über den nötigen Wertebereich rausgehen schmeitßt der 
Synthesizer eh' weg...

dasrotemopped schrieb:
> Hat jemand eine Idee, was ich falsch mache ?
Du schreibst Alles und jedes in ein und den selben Prozess. Wo lernt man 
denn sowas?
Und dazu noch der hier:
1
ARCHITECTURE syncer OF DE0nano_VGA800x600 IS
2
BEGIN
3
  vga : PROCESS (clk, hs)
4
    VARIABLE hcount : integer range 0 to 2047;
5
    VARIABLE vcount : integer range 0 to 2047;
6
    VARIABLE hbuf : std_logic;
7
    VARIABLE vbuf : std_logic;
8
    VARIABLE vgaout : std_logic;
9
  BEGIN
10
    -- Pixeltakt
11
    IF rising_edge(clk) THEN                 -- mal getaktet
12
      hcount := hcount +1;
13
    END IF;
14
    -- Spaltenzähler
15
    IF hcount = hsum THEN                    -- mal kombinatorisch
16
      hcount := 0;
17
    END IF;
18
    -- Zeilentakt
19
    IF falling_edge(hs) THEN                 -- wieder ein Takt, aber ein Anderer
20
      vcount := vcount +1;
21
    END IF;
22
    -- Zeilenzähler
23
    IF vcount = vsum THEN                    -- un ddann wieder Kombinatorik
24
      vcount := 0;
25
    END IF;  
26
    -- HSYNC
27
    IF (hcount >= 0 AND hcount <= hsync) THEN
28
    : 
29
    :
Welche Warnungen und Infos hat dein Synthesizer für diesen Prozess 
ausgegeben? Irgendwas mit "Simulation ist falsch, weil Sensitivliste 
unvollständig"?

Und eines muss dir klar werden: der hs ist KEIN Takt, der mit 
rising_edge() oder falling_edge() oder 'event verwendet werden darf!!!

Und noch eins: du brauchst hier garantiert keine Variablen!!!

> Hat jemand eine Idee, was ich falsch mache ?
Wie wäre es, wenn du das mal simulierst?
Das geht blitzschnell (du brauchst ja nur den Takt) und sieht man ganz 
schnell, was schief geht...

Sieh dir mal den Beitrag "Kein Bild bei eigenem VGA" an.
Und den Beitrag "VGA - Fortsetzung"

: Bearbeitet durch Moderator
von Werktätiger (Gast)


Lesenswert?

Da ist nur der counter synchron da das if rising_edge nur diesen 
umschliesst.

MfG,

von dasrotemopped (Gast)


Angehängte Dateien:

Lesenswert?

>CONSTANT hsync : integer :=  120-1;
die entsprechende Logik für 32 bit wird erzeugt
>CONSTANT hsync : integer range 0 to 2047 :=  120-1;
die entsprechende Logik für 11 bit wird erzeugt ( 2^11=2048 )
spart Logik Ressourcen, wenn man mal das Design nicht in einen Cyclone 
4E mit 22k Elementen verwenden will.
Jetzt belegt der Controller 40 LE, mit 32bit Integer war es etwa das 
3-fache.
Im RTL-Viewer wird die Bit-Breite angezeigt.

>Du schreibst Alles und jedes in ein und den selben Prozess.
D.h., alle Schritte einzeln in Prozesse kapseln und alles wird gut ?

>Wo lernt man denn sowas?
Selbststudium durch Tutorials aus dem Netz.

>Wie wäre es, wenn du das mal simulierst?
Wenn ich wüsste, wie das geht ...

Der LogicAnalyser ist übrigens ein Saleae an den Pins des Boards,
keine Software von Quartus.

von dasrotemopped (Gast)


Lesenswert?

benutze übrigens Quartus 15 Web Edition 64bit / Win7

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

dasrotemopped schrieb:
>>Wie wäre es, wenn du das mal simulierst?
> Wenn ich wüsste, wie das geht ...
Mit einer Testbench.
Ich habe Dir mal eine passende angehängt.

Duke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

dasrotemopped schrieb:
>> CONSTANT hsync : integer :=  120-1;
> die entsprechende Logik für 32 bit wird erzeugt
Du lügst dir da selber was in die Tasche (oder du lässt dich anlügen). 
Für eine Konstante wird nichts erzeugt. Die wird umgehend optimiert.
> Jetzt belegt der Controller 40 LE, mit 32bit Integer war es etwa das
> 3-fache.
Ist das der Wert, der letztlich tatsächlich auf dem FPGA benötigt 
wird? Da darfst du keinen Unterschied sehen. Falls doch, dann hat die 
Toochain einen Fehler oder ist noch nicht ganz fertig...

Denn sonst müsstest du konsequenterweise deine Konstanten so angeben:
CONSTANT hsync : integer range 120-1 to 120-1 :=  120-1;

> Im RTL-Viewer wird die Bit-Breite angezeigt.
Der RTL-Viewer zeigt nur das an, was im VHDL Text hingeschrieben wird.

> D.h., alle Schritte einzeln in Prozesse kapseln und alles wird gut ?
Nein. Die Strategie grundlegend anpassen...

Duke Scarring schrieb:
> Mit einer Testbench.
> Ich habe Dir mal eine passende angehängt.
Allerdings wird die Simulation immer noch falsch (und damit nutzlos) 
sein, weil die Sensitivliste unvollständig ist. Das wieht man wegen 
der kuriosen Schreibweise 
"getaktetA-kombinatorisch-getaktetB-kombinatorisch" aber sehr 
schlecht...

von Markus H. (dasrotemopped)


Lesenswert?

>dann hat die Toolchain einen Fehler oder ist noch nicht ganz fertig...

Ich habe den Code mal auf ein anderes Board (Altium EB2) übertragen und
dort kann ich die Zeilen "dclk <= '  " einfügen, ohne das die Timings 
vom VGA Signal verloren gehen.
Bei dem Board muss ich allerdings Quartus 11 SP1 installieren, da dort
der Cyclone 1 EP1C12F324C8 verbaut ist statt dem Cyclone 4E und Quartus 
15 den Cyclone 1 nicht mehr unterstützt.

Bringt mich einer Lösung auch nicht weiter.

Gruß,

dasrotemopped.

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.