Forum: FPGA, VHDL & Co. Problem mit SRAM Controller Spartan 3 Starter Board Digilent


von FPGA-Fragender (Gast)


Lesenswert?

Hallo zusammen,

ich hab mal wieder ein Problem, das mich graue Haare kostet und bitte um 
Euren Rat.

Ich habe das Spartan 3 1000 Starter Board von Digilent mit schnellem 
SRAM ( 10 ns )

Takt beträgt 50 Mhz ( 20 ns )

Nun hab ich einen Master SRAM Controller mit der kostenlosen WEB ISE 8.1
entworfen.

Zwei verschiedene Master sollen auf das SRAM lesend oder schreibend 
zugreifen können.

Das ganze ist so aufgebaut, dass der Takt 50 Mhz = CLK  durch 2 geteilt 
wird ( = CLK2 ). Ist der CLK2 positiv darf der eine wenn negativ der 
andere Client auf das SRAM zugreifen.

Den Orginal Code hab ich leider grad nicht zur Verfügung deshab den u.g. 
code aus dem Gedächtnis. ( dürfte aber so passen )


Der controller hat unter anderem die Eingänge

- USB_SRAM_Adr(17 downto 0)
- USB_SRAM_RD
- USB_SRAM_WR
- USB_Data_in( 31 downto 0)

sowie

- FPGA_SRAM_Adr(17 downto 0)
- FPGA_SRAM_RD
- FPGA_SRAM_WR
- FPGA_Data_in( 31 downto 0)

und eben den Ausgang

- SRAM_Data_Out ( 31 downto 0)

-----------------------------------------------------------------------

( pseudo Code )

Signal SRAM_Data_in ( 31 downto 0 )
Signal SRAM_WE
Signal SRAM_Adr( 17 downto 9 )


Process ( clk, clk2 )
..

if ( clk = '1') and (clock' event)
  -- USB darf zugreifen
  if clk2 = '1' then

      if USB_SRAM_RD = '1' then

          SRAM_Adr       <= USB_SRAM_Adr ;       -- USBB Adr übernehmen
          SRAM_Data_in   <= SRAM_Data_in ;
          SRAM_WE        <= '0' ;                -- WE inaktiv

      elsif USB_SRAM_WR = '1' then               -- USBB Adr übernehmen

          SRAM_Adr       <= USB_SRAM_Adr ;
          SRAM_Data_in   <= USB_SRAM_Data_in ;   -- Daten USB einlesen
          SRAM_WE        <= '1' ;                -- WE aktiv !

      else

          SRAM_Adr       <= SRAM_Adr;
          SRAM_Data_in   <= SRAM_Data_in ;       -- Daten USB einlesen
          SRAM_WE        <= '0' ;                -- WE inaktiv
     end if ;

  else

      if FPGA_SRAM_RD = '1' then

          SRAM_Adr       <= FPGA_SRAM_Adr ;      -- FPGA Adr übernehmen
          SRAM_Data_in   <= SRAM_Data_in ;
          SRAM_WE        <= '0' ;                -- WE inaktiv

      elsif FPGA_SRAM_WR = '1' then              -- FPGA Adr übernehmen

          SRAM_Adr       <= FPGA_SRAM_Adr ;
          SRAM_Data_in   <= FPGA_SRAM_Data_in ;  -- Daten FPGA einlesen
          SRAM_WE        <= '1' ;                -- WE aktiv !

      else

          SRAM_Adr       <= SRAM_Adr;
          SRAM_Data_in   <= SRAM_Data_in ;       -- Daten USB einlesen
          SRAM_WE        <= '0' ;                -- WE inaktiv
      end if ;

end if

------------------------------------------------------------------------ 
--

Nun zu meinem verflixten Problem

Alternatives lesen / schreiben ist OK
======================================

Ich kann per USB die Daten im SRAM mit Zufallszahlen schreiben und 
Rücklesen ohne Probleme.

Das gleiche funktioniert auch per FPGA client ohne Probleme.

Soll heißen der jeweils andere Client ist inaktiv während der andere 
Client liest oder schreibt.

Konflikt beim gemischten Zugriff
================================

Zum Testen des gemischten Zugriff mache ich folgendes.

Wie oben wird von der PC USB Seite her das SRAM komplett mit 
Zufallszahlen gefüllt und diese wieder ausgelesen.

Gleichzeitig lege ich an der FPGA Client Seite des controllers die 
Eingangssignale für FPGA fest auf schreiben.

FPGA_SRAM_RD     <= '0'    ;                -- dauerhaft auf inaktiv
FPGA_SRAM_WR     <= '1'    ;                -- dauerhaft auf aktiv.
FPGA_SRAM_Adr    <= "111100000000000000" ;  -- irgend eine feste Adresse
SRAM_Data_in     <= My_Test_Data_Fix_32_Bit ;


Nun erwarte ich, dass mein PC Testprogramm bis auf die fest 
FPGA_SRAM_Adr Adresse alles wieder korrekt zurückliest.

Genaue Fehlerbeschreibung:
==========================

Die Zufallszahlen werden bis zu der o.g. Adresse korrekt zurückgelesen.

Also ich kann beliebig oft Zufallszahlen erzeugen, diese in einem Array 
abspeichern, dann auf das SRAM per USB schreiben und wieder aus dem SRAM 
auslesen alles fehlerfrei.

Aber nur bis der o.g. Adresse. Ab der o.g. Adresse enthalten alle 
Dateninhalte nur noch den o.g. Werte die ich zurücklesen nur noch das 
o.g. My_Test_Data_Fix_32_Bit Bitmuster.

Ich weiß beim besten Willen nicht mehr wie ich den Fehler finden soll.

Gruß vom FPGA-Fragenden

von Falk B. (falk)


Lesenswert?

@ FPGA-Fragender (Gast)

>Zwei verschiedene Master sollen auf das SRAM lesend oder schreibend
>zugreifen können.

>Den Orginal Code hab ich leider grad nicht zur Verfügung deshab den u.g.
>code aus dem Gedächtnis. ( dürfte aber so passen )

Sowas kannst du dir sparen. Es kommt da auf Details drauf an. Original 
oder gar nichts.

>Ich weiß beim besten Willen nicht mehr wie ich den Fehler finden soll.

Und ich nicht, wie wir dir ohne den echten Quelltext helfen sollen

MFG
Falk

von Manuel (Gast)


Lesenswert?

Ich kann Dir leider auch nicht weiterhelfen, würde aber gerne wissen wie 
du den USB an das Starterkit gebastelt hast?

von FPGA-Fragender (Gast)


Lesenswert?

Hallo manuel,

http://www.braintechnology.de

Selbst auf eine Lochraster Platine gelötet und per Adapter an das Board 
angesteckt usw.

Gruß vom FPGA-Fragenden

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.