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?
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 ioPin
Signal verbindet sich mit der Außenwelt und ist als inout
bidirektional deklariert.
Wenn der direction
Pin hoch ist, ioPin
wird ein Ausgang ausgegeben, der mit dem Wert von angesteuert wird toPin
. Wenn direction
Low ist, dann ioPin
wird es ein Eingang sein (angetrieben von High-Z). Das fromPin
Signal spiegelt immer den Wert von wider, ioPin
unabhä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.
fromPin = (direction == OUTPUT) ? 1'bz : ioPin
Eugen Sch.
inout
in Verilog den Typ Pin. Die Logik, wie es gesteuert wird, liegt bei Ihnen.Andi aka
crj11
Toni M
Rohr
crj11