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.
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
Da ist nur der counter synchron da das if rising_edge nur diesen umschliesst. MfG,
>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.
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
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...
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.