Forum: FPGA, VHDL & Co. Block RAM Lesezugriff wie beschleunigen?


von FPGA-Fragender (Gast)


Lesenswert?

Hallo zusammen,

folgendes Problem hat mich am Wochenende einige Stunden Fehlersuche 
gekostet. :-((

Ein relativ großes Block-RAM in einem Spartan 3 1000er mit 2048 Adressen 
und 64 Bit Datenbreite soll per State Machine gelesen werden.

Takt beträgt 50 Mhz ( 20 ns )

Das Block Ram wurde mit dem kostenlosen WEB ISE 8.1  ( Core Generator ) 
entworfen.

- Die Eingänge bzw. Ausgänge wurden OHNE Registerstufen konfiguriert.

- Synchrone Arbeitsweise ohne Handschake Signale

Meine State Machine legt also lediglich

- das Write Enable ( High Aktiv) dauerhaft auf LOW

- Mit einer positiven Taktflanke wird die neue Adresse angelegt

- mit der nächsten positiven Taktflanke wird der Block-RaM Data-Out in 
eine Register übernommen.

Die Adresse des Blockram ist über einen synchronen Zähler realisiert.

Nun hat sich nach langer Fehlersuche herausgestellt, dass die Daten 
nicht rechtzeitig am Ausgang des BRAMs anliegen und deshalb die Daten, 
die noch von der alten Adresse stammen ins Register übernommen werden.

Nachdem ich die Adresse für 2 Takte anlege und dann die Daten in das 
Register übernehme funktioniert alles nach Wunsch.

Zusatzinfo: Es werden immer z.B. 255 Zugriffe direkt nacheinander 
durchgeführt. Die Übertragung erfolgt also Blockweise.

Allerdings jetzt zu langsam.

Nun zu meiner Frage:

- wie kann ich die Zugriffszeit auf das Block Ram im Lesemodus erhöhen. 
?

- hab ich einen grundsätzlichen Denkfehler ?

- wie oder wo kann ich aus den Timing Reports die Zugriffszeiten für 
Block Rams herauslesen ?

Für die selbst erstellten Komponenten gibts ja die timing Reports aber 
für das Block RaM konnte ich beim besten Willen nichts finden.

Gruß vom FPGA-Fragenden

von Falk B. (falk)


Lesenswert?

@ FPGA-Fragender (Gast)

>Nun hat sich nach langer Fehlersuche herausgestellt, dass die Daten
>nicht rechtzeitig am Ausgang des BRAMs anliegen und deshalb die Daten,
>die noch von der alten Adresse stammen ins Register übernommen werden.

>Nachdem ich die Adresse für 2 Takte anlege und dann die Daten in das
>Register übernehme funktioniert alles nach Wunsch.

Das ist unnötig. Der BRAM ist synchron, d.h. du legst alle 
Eingangssignale an, gibst einen Takt drauf, die Daten kommen raus bzw. 
werden geschrieben.

>- wie kann ich die Zugriffszeit auf das Block Ram im Lesemodus erhöhen.
>?

Indem du richtg verstehst, wie er funktioniert. Es reicht ein 
Taktzyklus, um ihn zu lesen. Und das sogar bei 200 MHz++.

>- hab ich einen grundsätzlichen Denkfehler ?

Ja.

>- wie oder wo kann ich aus den Timing Reports die Zugriffszeiten für
>Block Rams herauslesen ?

Schau ins Datenblatt, dort stehen die Timings drin. Allerdings ist das 
hier nicht dein Problem, du hast ein Problem mit der Logik.

MfG
Falk

von FPGA-Fragender (Gast)


Lesenswert?

Hallo Falk Brunner,

ich denke Du hast mich mißverstanden.

Die Timings hab ich gelesen und verstanden. Mein Problem besteht ja 
gerade darin, dass ich genau das was Du schreibst erwartet habe.

Zitat:

Indem du richtg verstehst, wie er funktioniert. Es reicht ein
Taktzyklus, um ihn zu lesen. Und das sogar bei 200 MHz++.

Zitat ende:

Die FSM hab ich nur gemacht, weil verschiedene Master auf das Block-Ram 
zugreifen sollen.

Ich hab ja oben geschrieben, dass mit einer Flanke die Adresse anlege 
und bei der nächsten Flanke das Data Out übernehme. Also ein Taktzyklus

Meine Test haben ja ergeben, dass der Inhalt richtig ins Block Ram 
geschrieben wird, aber beim lesen die Daten eben nicht rechtzeitig 
anliegen.

Gruß vom FPGA-Fragenden

von Falk B. (falk)


Lesenswert?

@ FPGA-Fragender (Gast)

>ich denke Du hast mich mißverstanden.

Nööö, ich hab dich schon verstanden. Aber du hast meine Antwort 
vielleicht nicht ganz verstanden ;-)
>Die FSM hab ich nur gemacht, weil verschiedene Master auf das Block-Ram
>zugreifen sollen.

Das ist ja OK.

>Ich hab ja oben geschrieben, dass mit einer Flanke die Adresse anlege
>und bei der nächsten Flanke das Data Out übernehme. Also ein Taktzyklus

Jaja, dort liegt dein Denkfehler. Deine Adresse wird ja erst mit der 
Taktflanke angelegt, und NACH der NÄCHSTEN Taktflanke sind die 
zugehörigen Daten erst am Ausgang des BRAMs, d.h. du kannst erst nach 
der übernächsten Taktflanke in deiner FSM die Lesedaten erfassen. Das 
kannst du nur "beschleunigen", wenn du das Adressmuxing kominatorisch 
machst.

Poste mal Code.

>Meine Test haben ja ergeben, dass der Inhalt richtig ins Block Ram
>geschrieben wird, aber beim lesen die Daten eben nicht rechtzeitig
>anliegen.

Doch, doch, aber du bist immer noch auf dem Holzweg. Schau mal in deine 
Simulation wann die Adresse DIREKT am BRAM anliegt und wann das 
dazugehörige Datum DIREKT am BRAM rauskommt.

MFG
Falk

von Hermann (Gast)


Lesenswert?

Ich glaube, er wird dennoch das Problem haben, wenn er Multimaster 
arbeitet, da er die Latenz einmal hat. Für sowas empfiehlt sich ein 
Blockleseverfahren, in dem gleich mehrere Adressen übertragen werden.

Oder man multiplexet das RAM in dem man es übertaktet: Die FSM und das 
RAM müssen dann auf sagen wir 200MHz laufen (das ist beim SPARTAN noch 
gut machbar) und bringen dann die Daten nach z.B. 4 Zyklen. Dann schafft 
man nach aussen die 50 - ist aber Verschwendung.

Besser ist es, die zugreifenden Prozesse auf der logistischen Ebene zu 
trennen und Zugriffsslot zu definieren.

von FPGA-Fragender (Gast)


Lesenswert?

Hallo zusammen,

Zitat:

Deine Adresse wird ja erst mit der Taktflanke angelegt, und NACH der 
NÄCHSTEN Taktflanke sind die zugehörigen Daten erst am Ausgang des 
BRAMs, d.h. du kannst erst nach der übernächsten Taktflanke in deiner 
FSM die Lesedaten erfassen. Das kannst du nur "beschleunigen", wenn du 
das Adressmuxing kominatorisch machst.

Zitat ende.

Ich denke jetzt ist mir klar wo mein Problem liegt.


Wenn ich die Sache richtig sehe, muss ich meine Block Übertragung quasi 
als "Pipeline" aufbauen.

D.h. die Adresse wird mit jeder positiven Taktflanke hochgezählt aber 
die Daten werden eben mit 1 Takt ( Verzögerung ausgelesen )

Beispiel:

1. steigende Flanke

    Adr 0 anlegen an BRAM

2. steigende Flanke ( Adr 0 wird intern ins BRAM übernommen )

    Adr 1 anlegen

    Data Out Bram =  ungültig

3. steigende Flanke ( Adr 1 wird intern ins BRAM übernommen )

    Adr 2 anlegen

    Data Out Bram = Data von Adr 0 =>  wird in Register übernommen

4. steigende Flanke ( Adr 2 wird intern ins BRAM übernommen )

    Adr 3 anlegen

    Data Out Bram = Data von Adr 1 =>  wird in Register übernommen


usw.

Ist das so richtig ?


Gruß FPGA-Fragender

von Falk B. (falk)


Lesenswert?

@ FPGA-Fragender (Gast)

>Wenn ich die Sache richtig sehe, muss ich meine Block Übertragung quasi
>als "Pipeline" aufbauen.

Ja.

>D.h. die Adresse wird mit jeder positiven Taktflanke hochgezählt aber
>die Daten werden eben mit 1 Takt ( Verzögerung ausgelesen )

Ja.

>Ist das so richtig ?

Ja.

MFG
Falk

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.