Qsys SDRAM controller

OP #4017257
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?
Angehängte Dateien:
Gast #4017408
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.
OP #4017449
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;
Gast #4017915
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
OP #4019976
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;
Angehängte Dateien:
Gast #4020867
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.