Abend Ich verwende in meinem Design SDRAM Controller aus Qsys. Die SDRAM datein werden auf dem VGA Bildschirm angezeigt Der Avalon Memory Mapped Slave Interface ist direkt mit meinem FPGA design verbunden. Eigentlich soll die SAche gar nicht so kompliziert sein., aber ich bekomme mit regelmäßigen Abständen falsche Daten aus dem SDRAM, das sieht man auf dem Bildschirm sehr gut. Die daten werden nur dann geschrieben, wenn Waitrequest='0' ist, und gelesen wenn Rreadvalid and waitrequest='1' sind. Vermisse ich irgendwas? Soll ich selbst um irgendwelche CAS kümmern? Anbei das Testbild. DAs Textbild sollte aus den abwechselnde schwarze und weise Pixel bestehen, aber wie man sieht, es gibt regelmäßige Abstände, wo die Daten nicht übereinstimmen. Kann mir jemand hier bitte helfen?
Da Du keine Sources geposted hast, kann dir keiner konkrete Hinweise auf Fehler geben. Wie sieht dein Qsys-System aus, läuft da noch ein NiosII-CPU als BusMaster? Wie greift Dein VGA-Design auf das SDRAM zu? Ich vermute mal, dass Refresh-Zyklen mit ein Problem sind. Wenn Du für VGA Daten aus dem SDRAM ausliest, dann musst du evtl. mehrere Zeilen zwischenpuffern bzw. nach Bildende einen Refreshzyklus initiieren.
hallo, die Zeilen werden "zwischengepuffert". Es gibt kein NIOSII oder so.Der SDRAM Controler interface wird direkt in VHDL design angeschlossen Anbei mein Code (ein Teil davon): AV_CS<='1'; AV_BE_N<="00"; -----------Schreibe in SDRAM------------
1 | PROCESS (SDRAM_CLK) |
2 | BEGIN
|
3 | IF rising_edge(SDRAM_CLK) THEN |
4 | AV_RD_N<='1';---read enable_n |
5 | AV_WR_N<='0';----Write enalbe_n |
6 | SDRAM_ADDR<=STD_LOGIC_VECTOR(to_unsigned(SDRAM_ADDRIN,25)); |
7 | IF(AV_WRQ='0' )THEN----waitrequest |
8 | IF(NXT2='1')THEN |
9 | NXT2<='0'; |
10 | AV_WRDATA(7 downto 0)<=(others=>'0'); |
11 | ELSE
|
12 | NXT2<='1'; |
13 | AV_WRDATA(7 downto 0)<=(others=>'1'); |
14 | |
15 | END IF; |
16 | SDRAM_ADDRIN<=SDRAM_ADDRIN+1; |
17 | BUFF_ADDR2<=BUFF_ADDR2+1; |
18 | |
19 | END IF; |
20 | |
21 | END IF; |
------------Lese aus SDRAM
1 | AV_RD_N<='0';---read enable_n |
2 | AV_WR_N<='1';----Write enalbe_n |
3 | |
4 | IF(NXT='1')THEN |
5 | SDRAM_ADDR1<=SDRAM_ADDR1+1; |
6 | VRAMBUFFER_ADDR<=VRAMBUFFER_ADDR+1; |
7 | NXT<='0'; |
8 | END IF; |
9 | |
10 | |
11 | IF(AV_RDVALID='1' AND AV_WRQ='0' AND NXT='0')THEN |
12 | |
13 | |
14 | NXT<='1'; |
15 | VGABUFFER<=AV_RDDATA(7 downto 0); |
16 | |
17 | END IF; |
Sigi schrieb: > Ich vermute mal, dass Refresh-Zyklen mit ein Problem sind. Da sowieso zyklisch ausgelesen wird, kann man ggf. auf den Refresh verzichten. Duke
Da hast Du es ganz schön kompliziert "falsch" gemacht ;-) Bin nur bei einer Zeile stutzig geworden, die 100% falsch ist: Böser Kommunist schrieb: > IF(AV_RDVALID='1' AND AV_WRQ='0' AND NXT='0')THEN > > NXT<='1'; > VGABUFFER<=AV_RDDATA(7 downto 0); > > END IF; Die Daten aus dem SDRAM sind nur dann gültig, wenn AV_RDVALID = '1' ist. Alles andere interessiert Dich nicht. Mit Refreshes und Co hat das überhaupt nichts zu tun (da kümmert sich QSYS darum) Ich mache das hier ungefähr so (stark zusammengeschnitten): -- aus dem Speicher lesen if (fifo_out_almost_full = '0') then read_temp <= '1'; elsif avm_r_waitrequest = '0' and (fifo_out_almost_full = '1') then read_temp <= '0'; end if; -- aus dem Speicher lesen if avm_r_waitrequest = '0' and (read_temp = '1') then read_addr <= read_addr + unsigned(addr_incr); end if; und dann: fifo_out_data <= avm_r_readdata; fifo_out_wrreq <= avm_r_readdatavalid Grüße Kest
Hallo, ich habe jetzt alles so gemacht, wie du es gesagt hast, nun sind die vertikale "Balken" weg. Es gibt jetzt diese nur auf den beiden Diagonalen Wenn ich die Testdaten direkt in den Videobuffer schreibe, dann gibt es das nicht. Nur wenn ich die Daten durch SDRAM lasse, erscheint das Problem.Das is bestimmt ein Problem mit dem Timing. Aber ich habe alles so gemacht, wie im Demo für DE1-SoC. Der CLK für SDRAM wird nach hinten verschoben, der nicht verschobener CLK wird für SDRAM controller und FPGA design verwendet. Scheiben in SDRAM
1 | AV_RD_N<='1'; |
2 | AV_WR_N<='0'; |
3 | IF(AV_WRQ='1')THEN |
4 | RST1<='1'; |
5 | END IF; |
6 | SDRAM_ADDR<=STD_LOGIC_VECTOR(to_unsigned(SDRAM_ADDRIN,25)); |
7 | |
8 | |
9 | IF(AV_WRQ='0' )THEN |
10 | RST1<='0'; |
11 | |
12 | |
13 | IF(RST1='0')THEN |
14 | AV_WRDATA(7 downto 0)<=TESTDATA; |
15 | |
16 | IF(NXT2='1')THEN |
17 | NXT2<='0'; |
18 | TESTDATA(7 downto 0)<=(others=>'0'); |
19 | ELSE
|
20 | NXT2<='1'; |
21 | TESTDATA(7 downto 0)<=(others=>'1'); |
22 | END IF; |
23 | SDRAM_ADDRIN<=SDRAM_ADDRIN+1; |
24 | |
25 | END IF; |
26 | end if; |
Lesen aus SDRAM
1 | VRAM_WE<=AV_RDVALID; |
2 | AV_RD_N<='0'; |
3 | AV_WR_N<='1'; |
4 | IF(AV_WRQ='1')THEN |
5 | RST1<='1'; |
6 | END IF; |
7 | IF(AV_RDVALID='1')THEN |
8 | RST1<='0'; |
9 | END IF; |
10 | IF(AV_WRQ='0' )THEN |
11 | IF(RST1='0')THEN |
12 | VRAM_buffer<=AV_RDDATA(7 downto 0); |
13 | |
14 | |
15 | IF(VRAM_READ<LINELENGHT)THEN----- fill buffer2 |
16 | SDRAM_ADDR2<=SDRAM_ADDR2+1; |
17 | VRAM_addr<=VRAM_addr+1; |
18 | |
19 | END IF; |
20 | END IF; |
21 | END IF; |
:
Bearbeitet durch User
Nur kurz: IF(VRAM_READ<LINELENGHT)THEN----- fill buffer2 SDRAM_ADDR2<=SDRAM_ADDR2+1; VRAM_addr<=VRAM_addr+1; END IF; Ob Framebuffer oder sonstiges: eine Abhängigkeit von der Zeilenlänge ist eine ganz schlechte Idee! Wenn Du die Daten aus dem SDRAM ließt, dann schiebe diese in ein FIFO... mit jedem neuen Bild machst Du FIFO_CLR. Auf der anderen Seite des FIFOs ziehst Du die Daten mit der VGA-Frequenz raus (if not empty). Ansonsten denke ich nicht, dass das ein Timingproblem ist. Grüße Kest
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.