Methoden für die Einrichtung von RAM-Daten vor der Uhr

Ich bin ganz neu im digitalen Design (mein Hintergrund ist Software). Ich versuche, etwas Block-RAM auf einem Xilinx-FPGA zu verwenden, und ich möchte wissen, wie die üblichen Methoden zum Einrichten der RAM-Steuersignale für die Uhr sind.

Ich habe derzeit eine einzige Uhr, die von allen meinen Designs verwendet wird. Der RAM kann bei jeder steigenden Flanke einen Lese-/Schreibvorgang ausführen, und ich möchte ihn mit dieser Rate verwenden. Natürlich müssen die Steuersignale einige Zeit vor der ansteigenden Taktflanke gesetzt werden. Ich kann mir vorstellen, dass es dafür mehrere Möglichkeiten gibt:

  1. Setzen Sie die Signale auf die fallende Flanke der Uhr.
  2. Setzen Sie die Signale auf die steigende Flanke. Das Synthesetool ist schlau genug, um zu wissen, was ich will, kennt die erforderliche Einrichtungszeit und kümmert sich um alles.
  3. Setzen Sie die Signale auf die steigende Flanke. Das Synthese-Tool ist nicht schlau genug, aber ich kann mit Timing-Einschränkungen lustige Dinge anstellen, um die Signale früh genug einzurichten.
  4. Verwenden Sie zwei Takte, die leicht phasenverschoben sind, und stellen Sie die Signale auf die steigende Flanke des führenden Takts ein.
  5. Einige andere Ansätze?

Welche davon sind möglich, welche sind eigentlich gut oder werden häufig verwendet und gibt es Vor- oder Nachteile, die bei der Auswahl helfen?

Bearbeiten: Ich verwende aus Gründen der Portabilität reines VHDL und keine Xilinx-spezifischen CoreGen oder Primitive. Ich folge jedoch der Xilinx-Dokumentation und schreibe die VHDL so, dass die Tools auf den richtigen RAM-Typ schließen können ("RAM HDL-Codierungsrichtlinien in UG687, falls jemand interessiert ist). Die Tools scheinen dies korrekt zu tun.

Antworten (3)

Sie müssen nicht die andere Flanke verwenden oder den Takt phasenverschieben.

Richten Sie die Daten einfach auf der steigenden Flanke ein, und die nächste steigende Flanke taktet sie in den Speicher ein (gemäß Option 2).

Das Ausführen einer statischen Timing-Analyse informiert Sie über Hold/Setup-Verletzungen. Aber wenn Sie Ihrer Uhr geeignete Wellenformbeschränkungen hinzufügen (dh Frequenz, Tastverhältnis), wird der Fitter sein Bestes tun, um die Timing-Anforderungen zu erfüllen.


Dies ist die grundlegende Grundlage des synchronen Designs. Jedes Register taktet zur gleichen Zeit auf derselben Flanke, sodass theoretisch die Daten vom letzten Zyklus an jedem Registereingang immer im aktuellen Zyklus geladen werden. Dies wird hauptsächlich durch H-Tree-Taktarchitekturen mit geringem Skew erreicht, bei denen die Entfernung von der Taktquelle zu jedem Register bei denselben Verzögerungen ziemlich gleich lang ist. Theoretisch sollte also jedes Register zur gleichen Zeit takten.

Es dauert etwas länger, bis die Daten ankommen (da sie eine DFF-Fortpflanzungsverzögerung und Routing-Verzögerung haben), bevor sie zum nächsten Register gelangen, was bedeutet, dass sich der Eingang eines Registers irgendwann nach der Taktflanke ändert, die ihn eingerichtet hat (und hoffentlich vor der Kante, die es laden soll).

Ich werde wahrscheinlich nicht die 5 Unterfragen beantworten, aber ich werde Ihre Hauptfrage beantworten

Ich möchte wissen, was die üblichen Methoden zum Einrichten der RAM-Steuersignale bezüglich der Uhr sind

Die übliche Methode ist, dass der Hersteller einen ziemlich detaillierten App-Hinweis zum Timing seiner RAM-Schnittstelle hat. Beispielsweise fand eine schnelle Google-Suche diesen App-Hinweis für ein QDR II SRAM mit einem Virtex-5.

Typischerweise werden diese Schnittstellen mit einem Kerneditor instanziiert. Dieser Editor sagt Ihnen, welche Schnittstellen und Optionen erlaubt sind. Dies können optionale Parameter wie Blockgröße, Anzahl der Datenbits usw. sein. Ebenso wichtig ist eine gute App-Notiz, die Sie über die Einschränkungen des Kerns informiert.

Es hört sich so an, als ob Sie dies von Hand tun möchten, aber es gibt einige Vorteile, wenn Sie einen Block instanziieren.

  1. Sie nutzen das Wissen der Chipdesigner und Anwendungsingenieure des Unternehmens

  2. Der Block kümmert sich bereits um Timing, Setup, Holds, mehrere Clocks usw., solange Sie innerhalb seiner Grenzen bleiben und ihn nicht mit Müll füttern

  3. Der Block kennt bereits jeden verfügbaren Blocktyp im Zielsilizium und versucht sein Bestes, um einen kleinen Fußabdruck oder eine hohe Geschwindigkeit zu halten (das ist manchmal eine andere Einstellung).

Ich kann lustige Dinge mit Zeitbeschränkungen machen, um die Signale früh genug einzurichten

Wenn Sie ein neuer Digitaldesigner sind, gibt es viele Probleme, wenn Sie mit dem Timing herumspielen. Denken Sie daran, dass die Timing-/Slack-/Setup-/Hold-Tools usw. dazu da sind, Ihnen zu helfen. Dies kann Sie jetzt vielleicht nicht stören, könnte aber ein Problem sein, wenn sich das Design ein wenig ändert und Ihre LUT plötzlich in einem anderen Slice platziert wird, weil Sie die Timing-Einstellungen geändert haben, aber nicht die Platzierungsbeschränkungen.

Wie bei den meisten Regeln sind dies Regeln, es sei denn, Sie wissen wirklich, was Sie tun, dann sind es Richtlinien.

Sie arbeiten immer synchron und nur mit steigender Flanke. Denken Sie daran, dass Sie zum Schreiben eine einzige Uhr verwenden können, zum Lesen jedoch mindestens zwei, eine zum Bereitstellen der Adresse und die zweite zum Lesen der Daten