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
@ 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
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
@ 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
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.
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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.