BRAM lesen -> Addition -> BRAM schreiben

OP #3778117
Hallo, ich habe eine Frage zum BRAM. Es heißt ja, dass wenn ich da eine 
Adresse anlege, die Daten einen Takt später zur Verfügung stehen, das 
verstehe ich auch, aber ich verstehe nicht wieso folgendes funktioniert:

RAM(adr) <= RAM(adr) +1;

Wie geht das in Hardware, also das läuft in einem Takt wo es doch 
logischerweise 2 Takte bräuchte?

Ich bin verwirrt und danke für Erklärung :-)
Gast
Gustl Buheitel schrieb:

> Ich bin verwirrt und danke für Erklärung :-)

Die Daten sind ja schon einige Zeit vor dem nächsten Takt gültig, es 
macht also nichts aus, dass du da noch etwas combinatorischen Delay 
draufpackts. Reduziert halt die maximal erreichbare Geschwindigkeit.
OP
Du meinst die Addition? Klar die kostet nur etwas Zeit, aber ich 
verstehe nicht wie das dann im nächsten Takt schon geschrieben ist.

Also einen Takt nach der obigen Anweisung sind die neuen Daten schon im 
BRAM obwohl die zu der Zeit, also im 2. Takt erst valide gelesen worden 
sein sollten.

RAM(adr) <= RAM(adr) +1; -- 1. Takt
Neue Daten im BRAM -- 2. Takt

Für mich wäre es verständlich wenn das hier ginge:

Buffer <= RAM(adr); -- 1. Takt
RAM(adr) <= Buffer +1; -- 2. Takt
Neue Daten im BRAM -- 3. Takt

Das sind 2 Takte, und einen Takt danach, also im 3. stehen die neuen 
Daten dann im BRAM, aber anscheinend geht das auch einen Takt schneller.
Moderator (Firma: Titel) Persönliche Seite
Gustl Buheitel schrieb:
> Klar die kostet nur etwas Zeit, aber ich verstehe nicht wie das dann im
> nächsten Takt schon geschrieben ist.
Du denkst um 1 Takt versetzt (das ist übrigens das, was vielen auch in 
echt passiert): da werden natürlich die im vorigen Takt gelesenen 
Daten um 1 inkrementiert. Deshalb ist der jetzige Takt schon dein 
nächster Takt. Der Trick: gleichzeitig mit dem "Schreibetakt" (oder 
kurz danach) kommt das geschriebene Wort ja am Ausgang schon wieder 
heraus, wenn das RAM auf WRITE_FIRST eingestellt ist. sieh dir einfach 
mal die Timing-Diagramme des RAMs an. Da wird das eigentlich schnell 
klar...
OP
Ah! Das erklärt einiges. Danke!

Dann werden bei

RAM(adr) <= RAM(adr) +1;

wenn ich in jedem Takt die Adresse hochzähle die neuen Daten versetzt 
geschrieben. Habe das jetzt entzerrt, aber kostet eben auch Zeit und 
schmälert den Durchsatz.
Gast
Gustl Buheitel schrieb:
> Ah! Das erklärt einiges. Danke!
>
> Dann werden bei
>
> RAM(adr) <= RAM(adr) +1;
>
> wenn ich in jedem Takt die Adresse hochzähle die neuen Daten versetzt
> geschrieben. Habe das jetzt entzerrt, aber kostet eben auch Zeit und
> schmälert den Durchsatz.

Als DP RAM konfigurieren und die write addresse verschleppen

RAM(wadr) <= RAM(radr) +1;
wadr <= radr;
radr <= next_radr;
Persönliche Seite
Man sollte eventuell noch erwähnen, dass die BRAMs typischerweise mit 
einer input / output registrierung gefahren werden wobei am output sogar 
2 register liegen können / müssen, um auf Tempo zu kommen. Damit kommen 
bis zu 3 Takte Delay hinein. Man vergleiche die Einstellungen in z.B. 
CoreGen.

Und da wir gerade bei Xilinx sind: Ein einschlägig bekannter Chip hat 
hier auch noch einige issues beim write first. Da geht (ging) sogar 
teilweise die DP-Funktion an sich nicht, wenn man bestimmte 
Adressbereiche genutzt hat.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 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.