Warum gibt es scheinbar keine Verzögerung beim Block-RAM-Lesen?

Ich versuche, Verilog zu lernen, und war neugierig, warum der Block-RAM meines FPGA die von mir angeforderten Daten sofort zu liefern scheint. Ich hatte erwartet, dass es eine gewisse Anzahl von Uhren geben würde, auf die ich warten müsste, bevor meine Ergebnisse verfügbar wären.

Auf der CPU eines herkömmlichen Computers sind die einzigen Daten, die sofort verfügbar sind, das, was in einem Register gespeichert ist, richtig? Daten, die in Caches oder im RAM gespeichert sind, müssten in ein Register geholt werden, bevor sie richtig verarbeitet werden können? Sind diese Block-RAM-Objekte nur über Register auf dem Chip implementiert?

Danke

Öffnen Sie die Spezifikationen Ihres FPGA-Block-RAM und sehen Sie sich die Zeitdiagramme an.
"Auf der CPU eines herkömmlichen Computers sind die einzigen Daten, die sofort verfügbar sind, die, die in einem Register gespeichert sind, korrekt?" Falsch. Beispielsweise kann ein L1-Cache-Speicher Daten am Ende eines einzelnen Taktzyklus bereitstellen.

Antworten (1)

Haben Sie eine primitive, generierte IP instanziiert oder mit einem Array abgeleitet?

IP hat normalerweise die Wahl zwischen registrierter Ausgabe oder nicht.

Wenn es sich um ein Primitiv oder ein abgeleitetes handelt, entscheiden Sie, ob Sie es in Ihrer RTL registrieren (getakteter Prozess) oder nicht. Das Grundelement ist typischerweise eine asynchrone Ausgabe, abgesehen von allen herstellerspezifischen Attributen, die ihm möglicherweise zugeordnet sind.

Als @EugeneSh. sagte: Das Datenblatt sagt Ihnen alles, was Sie wissen müssen.

Daten, die in Caches oder im RAM gespeichert sind, müssten in ein Register geholt werden, bevor sie richtig verarbeitet werden können?

Sie müssen kein Signal registrieren, um damit zu arbeiten ... Hängt von der Situation ab. Zum Lesen des Gedächtnisses würde ich das wahrscheinlich tun.

Sind diese Block-RAM-Objekte nur über Register auf dem Chip implementiert?

Sie können den Speicher während der Synthese in Register "pushen", aber wenn Sie RAM zur Verfügung haben, würden Sie normalerweise den RAM verwenden (und das Tool würde dies standardmäßig auch implementieren ... insbesondere wenn Sie ein Primitiv verwenden). Das Datenblatt sagt Ihnen, wie viel RAM Sie haben und wie es angeordnet ist. Wie es umgesetzt wurde, erfahren Sie im Synthesebericht.

Um das Leben einfacher zu machen, würde ich einfach auf RAM mit einem Array schließen.

Ich verwende generierte IP. Können Sie erklären, was Sie mit "registriert" meinen? Bedeutet die Bereitstellung eines Takteingangs, dass er bei dieser Uhr "registriert" ist?
In Bezug auf generierte IP gibt es normalerweise eine Option zum "Austragen" über die GUI, die im Wesentlichen den RAM umschließt und ein Register auf die Ausgabe legt ... oder es könnte eine manuelle Zuweisung zu einem Attribut sein. Wenn ich "registrieren" sage, meine ich ein nicht transparentes Flip-Flop (D-FF), das einen Takt verwendet, um den Wert zu verschieben (registrieren). dh von Ihrem RAM-Ausgang zu einem "Taktzyklus-späteren Signal", scheinbar Ihrem Ausgang oder dem Signal, mit dem Sie arbeiten möchten