I2C verwendet Open-Collector-Ausgänge. FPGAs haben solche Ausgänge nicht. Sie haben jedoch Tri-State-Puffer.
- Wie sollte der Open-Collector-Ausgang in einer VHDL für ein FPGA definiert werden?
- Wie soll der Open-Collector-Ausgang in der Testbench hochgezogen werden? dh wie modelliert man den Pull-up-Widerstand zB auf einer SDA-Leitung, die Master mit Slave verbindet, in einer Testbench?
Antworten:
FPGAs haben Drei-Zustands-Ausgänge:
Manchmal gibt es auch optionale interne Pull-Ups, die jedoch keine externen Schaltkreise ansteuern sollen. Daher benötigt ein I2C-Bus einen tatsächlichen Pull-Up-Widerstand.
Der VHDL-Standardlogiktyp hat die Werte 'H' und 'L', um Pull-up und Pulldowns zu simulieren. Du kannst schreiben
im Prüfstand, um einen Klimmzug zu simulieren.
std_logic ist ein "aufgelöster" Typ, ein Signal kann mehrere Treiber haben und eine Auflösungsfunktion wird verwendet, um den Endzustand zu bestimmen: 'Z' + 'H' = 'H', '0' + 'H' = '0'
quelle
1) Laut Xilinx können Sie durch Erstellen eines Tristate-Geräts in VHDL einen Open-Collector / Drain-Ausgang anhand des folgenden Logikdiagramms modellieren:
Der VHDL-Code:
Der Verilog-Code (obwohl Sie speziell nach VHDL gefragt haben):
Code, Bild und Informationen finden Sie hier
2) Um Klimmzüge validieren zu können, würden Sie stattdessen logische HIGH- und LOW-Werte verwenden, d
dout <= '1'
. H. Sie sollten auch die Spezifikationen Ihrer Master- und Slave-Geräte überprüfen, welche Pull-Ups empfohlen werden.quelle
assign DOUT = ENABLE ? 1'b0 : 1'bz;
? (Außerdem fungiert IhrENABLE
alsDISABLE
, was den Code etwas verwirrend macht).Beachten Sie, dass FPGA-Designtools manchmal ein bestimmtes Open-Drain-Grundelement in ihrer Bibliothek bereitstellen. ZB in Quartus II können Sie schreiben
Dies sollte für einen Bidir-E / A-Pin keinen Unterschied machen, kann jedoch einen Unterschied machen, wenn Sie einen Nur-Ausgabe-Pin verwenden oder Ihr Design auf ASIC migrieren müssen. Es macht Ihren Code jedoch herstellerspezifisch.
quelle