DE0nano VHDL VGA Controller

Gast #4286363
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.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #4286437
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"
Gast #4286484
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.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #4286600
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...
#4286921
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.

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