Forum: FPGA, VHDL & Co. Qsys SDRAM controller


von GS (chromosoma)


Angehängte Dateien:

Lesenswert?

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?

von Sigi (Gast)


Lesenswert?

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.

von GS (chromosoma)


Lesenswert?

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;

von Duke Scarring (Gast)


Lesenswert?

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

von Kest (Gast)


Lesenswert?

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

von GS (chromosoma)


Angehängte Dateien:

Lesenswert?

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
von Kest (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.