Gast
#687869
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