Wo werden Register in VHDL-Modulen platziert?

Ich bin von Beruf Software-Typ und habe mich mit digitalem Design auf FPGA unter Verwendung der Open-Source-Toolchain beschäftigt. Ich habe ein paar Entwürfe gemacht und verstehe im Allgemeinen, wie die mit Verilog und VHDL umgehen.

Eines der Dinge, die ich mich frage, ist nicht wirklich eine Schwarz-Weiß-Frage, sondern ich frage mich, ob es eine "Best Practice" gibt.

Ich teile die von mir erstellten Designs im Allgemeinen in Module auf. Zum Beispiel habe ich ein Uart, das ich in ein Design einbeziehen kann. Jetzt hat der Sendeteil des uart einen Rückkopplungsmechanismus, der anzeigt, ob er bereit ist, ein weiteres 8-Bit-Wort zum Senden zu empfangen.

Jetzt könnte ich wählen, ob ich entweder die Eingabe oder die Ausgabe registrieren lassen möchte, um im Wesentlichen eine Pipeline zu erzwingen. Dies hätte jedoch einige Auswirkungen auf die Benutzer des Designs. Wenn ich den Eingang oder den Ausgang registriere, wird die Rückmeldung immer um 1 Takt verzögert. Das ist nicht so schlimm und könnte sogar das sein, was Sie wollen. Wenn jedoch sowohl Eingang als auch Ausgang registriert werden, wird die Rückmeldung um 2 Taktzyklen verzögert, was für Benutzer verwirrend sein kann.

Gibt es hier eine Art Best-Practice zu befolgen? Wie in den meisten Fällen registrieren Sie Ihren Input oder Ihren Output?

Jede Hilfe ist willkommen!

Ich verstehe nicht, wie es "verwirrend" sein könnte. Wofür Sie sich auch entscheiden, es spiegelt sich in der Schnittstellenspezifikation (Dokumentation) für Ihr Modul wider. Benutzer müssen sich an diese Spezifikation halten, was auch immer sie ist.
Du entscheidest. Dokumentieren Sie einfach die Pipeline-Tiefe jedes Moduls; mathematische Module können viel größere Pipeline-Tiefen haben, um einen hohen Durchsatz zu erreichen.

Antworten (1)

UART ist möglicherweise nicht das beste Beispiel, um diese Frage zu beantworten, da die mit einem UART verbundenen externen Aktivitäten im Allgemeinen im Vergleich zu den anderen internen Aktivitäten des FPGA so langsam sind, dass ein oder zwei zusätzliche Takte in einem Handshake kaum einen Unterschied machen.

In den Hochgeschwindigkeits-Pipelines für die Videosignalverarbeitung, die ich baue (wie es scheint, der Großteil meiner Arbeit heutzutage), registriere ich jedoch im Allgemeinen die Ausgänge jedes Moduls. Dann können alle Module, die diese Signale empfangen, kombinatorische Logik darauf anwenden, ohne sich Gedanken über übermäßige Eingangsverzögerungen, Störungen usw. machen zu müssen.

Eingänge werden nur registriert, wenn bekannt ist, dass sie aus einer anderen Taktdomäne oder einer vollständig asynchronen Quelle stammen. In diesem Fall habe ich eine Bibliothek von CDC-Modulen (Clock Domain Crossing), die ich verwende.

Warum aber den Ausgang wählen? Würde nicht die gleiche Verzögerung auftreten, aber am Eingang?
Weil es einfacher ist, die Quelle eines Signals zu registrieren, als es an allen möglichen Orten zu tun. Aber es ist nur die Konvention, die ich gewählt habe – Sie könnten eine andere wählen. So oder so, am Ende muss das Design sowieso alle zeitlichen Einschränkungen erfüllen.