Forum: FPGA, VHDL & Co. inout für richtige Register verwenden


von Patrick B. (p51d)


Lesenswert?

Hallo

Ich habe schon öfters gelesen, dass man sich in VHDL nicht mit inout 
beschäftigen "sollte". In den meisten Fällen ist dies auch kein Problem, 
weil ein Design konkrete Ein- und Ausgänge hat.

In einem Schulprojekt möchte ich nun auf einem Zynq-Baustein den 
Prozessor mit einer eigenen Logik ergänzen. Dazu kann bequem ein AXI-Bus 
implementiert werden. Diese Register haben dann standartmässig inouts. 
Wenn jetzt bei meinem Design nur Aus- oder Eingang so verknüpft werden, 
muss ich halt die AXI-Zugriffe anpassen. Auch kein Problem.

Nun zu meiner Frage: Bei den uCs ist es ja oft der Fall, dass man ein 
Flag löschen kann, wenn man dieses mit 1 oder 0 beschreibt. Das würde 
aber einem inout in VHDL entsprechen, oder sehe ich das falsch?
Wie kann man solche Co-Designs am besten beschreiben? Weil ein einzelner 
Eingang für das zurücksetzen und dann wieder ein Ausgang für den 
Flagzustand scheint doch etwas verwirrend.

Besten Dank,
MFG
Patrick

von Lattice User (Gast)


Lesenswert?

Im FPGA gibt es kein inout.
An den FPGA Pins sehr wohl.
Ein inout Pin hat dann typischerweise 3 Signale:

InData (direkt) vom Pin
OutData
OutputEnable

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Patrick B. schrieb:
> Weil ein einzelner Eingang für das zurücksetzen und dann wieder ein
> Ausgang für den Flagzustand scheint doch etwas verwirrend.
Genau das wird in einem uC aber gemacht, ohne dass du es direkt siehst. 
Bei den Reigstern gibt es einen getrennten Schreib- und Lese-Pfad. Denn 
ein Register ist eben nur ein Flipflop. Und das hat eine Eingang, ein 
Übernahmesignal (Takt) und einen Ausgang.

> Nun zu meiner Frage: Bei den uCs ist es ja oft der Fall, dass man ein
> Flag löschen kann, wenn man dieses mit 1 oder 0 beschreibt.
Diese getrennten Pfade sieht man z.B. beim AVR Controller bei den 
Interrupt-Flags ganz gut: um ein gesetztes Interruptflag zu löschen 
muss eine '1' auf dieses Register geschrieben werden.
Denn wenn du direkt auf ein Register eine '1' schreiben würdest, dann 
hätte dieses Register hinterher eben auch am Ausgang eine  '1'.
Oder beim Timer: Ein Lesen und Schreiben auf das Timer-High-Register 
geht nicht direkt auf den Zähler selbst, sondern in ein 
Schattenregister.

> Weil ein einzelner Eingang für das zurücksetzen und dann wieder ein
> Ausgang für den Flagzustand scheint doch etwas verwirrend.
Durchaus nicht.
Du hast eine Adresse für dieses Register. Und einen Befehl 
(Lesen/Schreiben). Und dann gibt es Eingangsdaten, die beim über einen 
Eingangsdemultiplexer beim Schreiben in das Register geschrieben werden.
Und es gibt Ausgangsdaten, die das Register über den Ausgangsmultiplexer 
zur Verfügung stellt.

Du könntest einen FPGA-internen Bus zwar auch auch bidirektional mitsamt 
(others=>'Z) beschreiben, aber die Toolchain muss diese 
Bidirektionalität auf jeden Fall in unidirektionale Leitungen auflösen. 
Wenn sie es nicht kann, hagelt es einfach ein paar Fehlermeldungen (z.B. 
"multiple sources" o.ä.)

BTW:
> standartmässig
Es gibt einen Standard und eine Standarte. Das Erstere ist geläufiger. 
Das zweite eine besondere Form einer Flagge...

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
Noch kein Account? Hier anmelden.