mikrocontroller.net

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


Autor: hmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: F01Qx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.