Forum: FPGA, VHDL & Co. Auslesen von inout Pins bei Konflikt?


von hmann (Gast)


Lesenswert?

Hi!

Ich habe einen Bus dessen Pins ich in VHDL als "inout" realisiert
habe.
Es kann nun aber ein anderer Master meinen Bus auf "LOW" ziehen
wärend ich ein "HIGH" darauf gebe.
Kann ich wenn ich in VHDL den PIN auf "HIGH" setzte ihn dann einlesen
und bekomme ein "LOW" wenn der Bus von einem anderen Master "LOW"
gesetzt wird oder muss ich meinen PIN auf high impedance setzen um ihn
einzulesen?

Danke
  hmann

von Max Müller (Gast)


Lesenswert?

Es soll immer nur ein Treiber pro Signal aktiv sein, da du sonst einen
Kurzschluß zwischen den zwei Treiber produzierst.

Einzige Ausnahme sind Treiber einer Open-Kollektor oder Open-Drain
Schaltung, die nur in die gleiche Richtung ziehen können.

Deshalb immer bei INOUT auf 'Z' setzen, da sonst der Ausgang nicht
abgeschalten und der Eingang nicht einlesbar wird.

Gruß

Max

von F01Qx (Gast)


Lesenswert?

Hallo

wenn ich das richtig verstehe, ist das ein OpenCollector-Bus.
Dazu der Busmaster 'H' auf dem Pin/Bus ausgeben. Wenn ein anderes
Gerät den Pin/Bus auf low ziehen will, musst es '0' ausgeben.

VHDL-Referenz (in IEEE.STD_LOGIC_1164.ALL definiert):
type std_logic is (
'U', --uninitialized
'X', --forcing unknown
'0', --forcing zero
'1', --forcing one
'Z', --high impendance
'W', --weak unknown
'L', --weak zero
'H', --weak one
'-'); --don't care

von Max Müller (Gast)


Lesenswert?

Das 'H' wird durch einen externen Pull-up definiert.
Nur das 'L' musst du durch deinen Treiber definieren.

Der Treiber darf nicht den 'H' Pegel treiben!!


Gruß


Max

von hmann (Gast)


Lesenswert?

hi!

Ich muss das Thema nochmal aufgreifen. Ich hatte ne längere Pause.

Es handelt sich um einen I2C Bus den ich implementieren will (nur einen
Master) und ich will das ACKNOWLEDGE BIT vom Slave einlesen. Am Oszi
sieht es auch schön aus. Das 9. Bit zieht der Slave auf '0'
Intern ist SDA auf 'H' gesetzt und ich bekomme eine '1' wenn ich
SDA abfrage... :(
Es ist egal ob ich 'Z' oder 'H' setze es geht mit keinem von
beiden...

Kann mir vieleicht jemand nen Tip geben?

Danke!!

von Hagen (Gast)


Lesenswert?

es hängt nun vom jeweiligen Tool ab, arbeitest du mit Quartus oder
WebPack. Desweiteren hängt es vom CPLD ab, ist es ein Altera oder
Xilinx Stein.

Wenn ich nicht weiterweis in VHDL so arbeite ich mit den integrierten
Schematic Editoren beider Tools. Dort musst du "Buffer" finden wie
"OpenDrain" etc. pp. Im Schematic solche Buffer einbauen und das
Schematic als VHDL exportieren. In diesem VHDL findest du exakt die
Instanzierungen der nötigen Componenten für dich. Das musst du dann nur
in dein VHDL kopieren. Fazit: du musst im VHDL die speziellen
Komponenten für deinen Chip instanzieren damit der VHDL Compiler weis
was du erzeugen willst.

Oder aber du benutzt den Pin-Assignment-Editor. Dort legst du fest auf
welchen Pins welches Signal kommen soll. Nebenbei kannst du dort
verschiedene Optionen definieren, wie Slew-Rate, PowerUp State, etc.
pp. und eben auch ob OpenDrain, TriState usw.

Gruß Hagen

von hmann (Gast)


Lesenswert?

hi Hagen!

Ich arbeite mit einem Xilinx CPLD XC9572XL und dem Webpack.

Ne Schlatung mit dem Schematics Editor aufzubauen krieg ich nicht hin.
Bin noch Anfänger...

Aber es muss doch auch irgendwie in VHDL gehen. Sonst bringt doch der
inout typ nix...

Ciao
  hmann

von Hagen (Gast)


Lesenswert?

architecture Behavioral of XYZ is

  component OBUFE
  port
    (O: out STD_ULOGIC;
     E: in STD_ULOGIC;
     I: in STD_ULOGIC);
  end component;

begin

  B1: OBUFE port map
        (O => user_O,
         E => user_E,
         I => user_I);

end....

Du benutzt einen OBUFE, bei User_O setzt du dein inout Pin rein das als
Ausgabe/Eingabe dient, bei User_I das zum Lesen als Eingang und mit
User_E schaltest du zwischen beiden um. E ist Active High, wenn E =
'0' dann ist der Output High "Z".

Schau mal in den Ordner C:\Xilinx\doc\usenglish\de\libs\ dir die
PDF's genauer an.

Echte PullUps gibt bei den XC Typen nicht.

Gruß Hagen

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.