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
ARCHITECTUREsyncerOFDE0nano_VGA800x600IS
2
BEGIN
3
vga:PROCESS(clk,hs)
4
VARIABLEhcount:integerrange0to2047;
5
VARIABLEvcount:integerrange0to2047;
6
VARIABLEhbuf:std_logic;
7
VARIABLEvbuf:std_logic;
8
VARIABLEvgaout:std_logic;
9
BEGIN
10
-- Pixeltakt
11
IFrising_edge(clk)THEN-- mal getaktet
12
hcount:=hcount+1;
13
ENDIF;
14
-- Spaltenzähler
15
IFhcount=hsumTHEN-- mal kombinatorisch
16
hcount:=0;
17
ENDIF;
18
-- Zeilentakt
19
IFfalling_edge(hs)THEN-- wieder ein Takt, aber ein Anderer
20
vcount:=vcount+1;
21
ENDIF;
22
-- Zeilenzähler
23
IFvcount=vsumTHEN-- un ddann wieder Kombinatorik
24
vcount:=0;
25
ENDIF;
26
-- HSYNC
27
IF(hcount>=0ANDhcount<=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"
>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.