FPGA - Ist es möglich, die Pin-Richtung/Typ während der Laufzeit zu ändern?

Ist es auf einem FPGA möglich, das Verhalten von so etwas wie einem Arduino nachzuahmen, wobei der auf dem Chip laufende Code einen Pin als Ein- oder Ausgang bestimmen kann?

Nehmen wir an, das FPGA ist als Prozessor konfiguriert. Nehmen wir weiter an, dass wir drei Register haben, die für die Steuerung von IO-Pins bestimmt sind, ähnlich wie die Arduino-Äquivalente :

Jeder Port wird von drei Registern gesteuert ... Das DDR-Register bestimmt, ob der Pin ein INPUT oder OUTPUT ist. Das PORT-Register steuert, ob der Pin HIGH oder LOW ist, und das PIN-Register liest den Zustand der INPUT-Pins, die mit pinMode() auf Eingang gesetzt wurden.

Wie können Sie das FPGA dazu bringen, ein Register (wie DDR) zu verwenden, um die Richtung des Pins zu ändern, basierend darauf, worauf das laufende Programm das Register aktualisiert? (Mit laufendem Programm meine ich das Programm, das auf dem Prozessor läuft, als das der FPGA konfiguriert wurde).

Ich bin mir nicht sicher, ob dies möglich ist, da Sie während der Pin-Zuweisung für die Synthese die Pin-Richtung angeben müssen. Aber hoffentlich irre ich mich? Könnte dies irgendwie durch Verwendung des "bidirektionalen" Pin-Modus erreicht werden?

Natürlich ist es möglich. Zu diesem Zweck gibt es inoutin Verilog den Typ Pin. Die Logik, wie es gesteuert wird, liegt bei Ihnen.
Und ich habe beim Entwerfen eines Teils einer PLL einen Ausgang im Handumdrehen tristateiert.
Wenn Sie den Pin als bidirektional definieren, erhält er immer den Zustand des Pins. Ihr FPGA-Code entscheidet, ob der Pin angesteuert wird. Wenn dies nicht der Fall ist, wird der Zustand extern bestimmt und Sie können den Pin und den Eingang berücksichtigen. Wenn das FPGA den Ausgangstreiber aktiviert, handelt es sich um einen Ausgang, und der Zustand wird dadurch bestimmt, womit das FPGA ihn ansteuert. Stellen Sie einfach sicher, dass der Stift jeweils nur von einer Quelle angesteuert wird.
Ja. FPGAs und CPLDs haben fast alle Tri-State-Pin-Treiber und Pin-Eingangspuffer. Alle sind mit dem internen Logikschaltungsarray verbunden und können von dieser Schaltung nach Belieben angesteuert oder verwendet werden. Sehen Sie sich die I/O-Pin-Schaltungen in einem typischen FPGA-Datenblatt an. Probieren Sie das Datenblatt für einen Xilinx Spartan-3E aus.
@crj11 Du hast deine Antwort an der falschen Stelle geschrieben. Jetzt kann es von der Community nicht überprüft oder als richtig akzeptiert werden.
Ich merke, dass ich es an der falschen Stelle platziert habe. Ich wollte nur schnell antworten, verdammt noch mal.

Antworten (1)

Die Antwort lautet in den meisten Fällen ja. Die GPIO-Pins auf den meisten FPGAs sind bidirektional, genau wie die auf einem ATMega (Arduino-Board-MCU).

Bei einem FPGA müssen Sie lediglich die Logik für einen Tri-State-Puffer beschreiben, um die Richtung steuern zu können. Das ist in den meisten Fällen ganz einfach.

Um ein Beispiel zu geben, nehmen wir Verilog an:

module tristate (
    inout ioPin, //inout means bidirectional

    input toPin,     //Data to io pin (i.e. PORT)
    input direction, //Direction control (i.e. DDR)
    output fromPin   //Data from io pin (i.e. PIN)
);

localparam INPUT = 1'b0;
assign ioPin = (direction == INPUT) ? 1'bz : toPin;
assign fromPin = ioPin;

endmodule

Aus dem obigen Code würden die Synthesewerkzeuge einen Tristate-Puffer mit einem Steuerpin ableiten. Ich habe die Ports mit den Namen der entsprechenden ATMega-Register gekennzeichnet. Das ioPinSignal verbindet sich mit der Außenwelt und ist als inoutbidirektional deklariert.

Wenn der directionPin hoch ist, ioPinwird ein Ausgang ausgegeben, der mit dem Wert von angesteuert wird toPin. Wenn directionLow ist, dann ioPinwird es ein Eingang sein (angetrieben von High-Z). Das fromPinSignal spiegelt immer den Wert von wider, ioPinunabhängig davon, ob es sich um einen Eingang oder Ausgang handelt.

Sie können ähnliche Konstrukte in VHDL- und Schaltplan-/Netzlisten-Eingabemethoden erstellen.

Darüber hinaus bieten viele FPGA-Hersteller primitive Elemente für bidirektionale Puffer, wenn Sie sich nicht auf Syntheseraten verlassen möchten.

Gibt es irgendwelche Nachteile, wenn man auch einen Tristate auf der Eingangsseite platziert? DhfromPin = (direction == OUTPUT) ? 1'bz : ioPin
Wenn Sie auf der Eingangsseite keinen Puffer haben, würden Sie nicht auch mit einer Art Kurzschluss enden? Angenommen, Sie schreiben 1/high an den io-Pin. Sie würden gleichzeitig auch dasselbe 1/hoch lesen, das Sie schreiben. Also sinken Sie gleichzeitig mit dem Sourcing?
Nun, fromPin treibt die interne Logik an, sodass Sie es auf den meisten Geräten nicht auf Tristate setzen können, selbst wenn Sie wollten (die meisten FPGAs unterstützen kein internes Tristate). Und ja, Sie würden erwarten, dass Sie denselben Pegel zurücklesen, auf dem Sie schreiben, es sei denn, es liegt ein externer Masseschluss oder so etwas vor.