www.mikrocontroller.net

Forum: FPGA, VHDL & Co. wie Chipselect bei SPI steuern?


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mehrere Teilnehmer am SPI-Bus und wollte mir deshalb einen 
Multiplexer schnitzen, über den auch gleich abgefragt werden kann, ob 
der SPI-Bus aktiv ist oder nicht.

Soweit so gut, aber wie verbinde ich die Adressleitungen mit den 
Modulen, sodass jedes beteiligte Modul die Adressleitungen schalten 
kann?

Soweit ich gelesen habe, gibt es intern kein Tristate. Wie würde ich die 
Verdrahtung dann vornehmen? Der CS-Blocker liefert busy wenn die 
Adressleitungen nicht alle 0 sind.

Nach meinem Verständnis ist der Adressbus unidirektional, aber ich weiß 
trotzdem nicht, wie ich die Leitungen in den Modulen ansteuere. Wenn ich 
den Bus freigebe, setze ich den dann auf 'L', oder 'H', oder '-', 
oder???

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> über den auch gleich abgefragt werden kann, ob
> der SPI-Bus aktiv ist oder nicht.
Wozu willst du das wissen?
Wenn du selber der Master bist, dann weißt du es.
Wenn du ein Slave bist, interessiert dich nur dein eigener Slave-Select.

> ob der SPI-Bus aktiv ist oder nicht.
Du meinst also, ob dein eigenes SPI-Modul aktiv ist?
Ganz einfach: gib ein Busy-Signal aus, solange die Übertragung läuft.

> Wenn ich den Bus freigebe, setze ich den dann auf 'L', oder 'H',
> oder '-', oder???
Da läuft mit der Logik gerade etwas ganz arg schief...

Mal angenommen, du hast drei Module (Input, Output und ADC), die mal was 
mit dem SPI-Modul haben möchten. Dein SPI-Modul sieht z.B. so aus:
entity SPI_Modul is
    Port ( clk : in  STD_LOGIC;
           dataTX : in STD_LOGIC_VECTOR( 7 downto 0);
           startTX : in STD_LOGIC;
           dataRX : out STD_LOGIC_VECTOR( 7 downto 0)
           busy : out STD_LOGIC);
end SPI_Modul;
Erst werden dataTX angelegt, dann das startTX aktiviert. Wenn die 
Übertragung läuft, wird busy aktiv. Wenn busy wieder inaktiv ist, können 
die Daten an dataRX abgeholt werden.

Du brauchst jetzt also einen Schiedsrichter (Arbiter), der bestimmt, wer 
von den drei Teilnehmern auf das SPI-Modul darf. Dazu eine 
State-Machine, die die Sendedaten entsprechend durchreicht, dann das 
Übertragungsende abwartet, und zum Schluss die Empfangsdaten an das 
anfordernde Modul abliefert. Und während der ganzen Übertragung einen 
Zugriff von den anderen Modulen blockiert.

Da ist also einiges mehr dran, als nur einen Bus hochohmig zu 
schalten...

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen Lothar,

>> Wenn ich den Bus freigebe, setze ich den dann auf 'L', oder 'H',
>> oder '-', oder???
> Da läuft mit der Logik gerade etwas ganz arg schief...

Dann bitte ich um Unterweisung, denn genau hier habe ich mein 
(Verständnis-)Problem. Egal ob jetzt mit SPI oder anderswo, es wird 
immer die Situation geben, dass mehrere Module ein anderes verwenden 
können/sollen. Bleibt also die Frage, wie steuere ich gemeinsame 
Leitungen an.
Das aktive Modul kann die Leitungen mit '0' und '1' treiben, aber was 
machen die wartenden Module?

Ich denke mal, das ist weniger eine logische Frage, als vielmehr eine 
technische (FPGA-interne) Frage ;)

>> über den auch gleich abgefragt werden kann, ob
>> der SPI-Bus aktiv ist oder nicht.
> Wozu willst du das wissen?
> Wenn du selber der Master bist, dann weißt du es.
> Wenn du ein Slave bist, interessiert dich nur dein eigener Slave-Select.

Da die Module sowohl unterschiedliche SPI-Modi benötigen, alsauch andere 
Taktfrequenzen, wollte ich das ganze als Multi-Master/Multi-Slave 
aufziehen und eventgesteuert die Übertragung starten.

> Du brauchst jetzt also einen Schiedsrichter (Arbiter), der bestimmt, wer
> von den drei Teilnehmern auf das SPI-Modul darf. Dazu eine
> State-Machine, die die Sendedaten entsprechend durchreicht, dann das
> Übertragungsende abwartet, und zum Schluss die Empfangsdaten an das
> anfordernde Modul abliefert. Und während der ganzen Übertragung einen
> Zugriff von den anderen Modulen blockiert.

Ob ich den Schiedsrichter jetzt Arbiter oder CS-Blocker nenne, 
dürfte doch Jacke wie Hose sein. Aus den unterschiedlichen Anforderungen 
wollte ich kein zentrales SPI-Modul machen, sondern den logischen 
Gegenstücken zu Speicher, ADC und Co die Übertragung gemäß ihren 
Anforderungen durchführen lassen.

> Da ist also einiges mehr dran, als nur einen Bus hochohmig zu
> schalten...

Das ist mir bewusst, aber ich frage da, wo ich gerade nicht weiter komme 
(ungeachtet der Probleme, die noch auf mich zukommen mögen). Ich habe 
mir jetzt ein Konzept für das Entwicklungboard gemacht und das will ich 
Stück für Stück umsetzen. Gelegentlich weiß ich nimmer weiter - soll 
doch vorkommen :)

Ich habe in einigen Tuts gelesen, dass man aufpassen muss, wenn mehrere 
Module an einem internen Bus hängen, aber ich fand noch keine Hinweise 
darauf, wie man es richtig machen kann/soll. Deshalb also meine Frage.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das aktive Modul kann die Leitungen mit '0' und '1' treiben, aber was
> machen die wartenden Module?
Jedes Modul treibt immer genau das, was es ausgeben will. Kein Modul 
kümmert sich um ein anderes. Ein Multiplexer wählt dann aus allen 
anliegenden Modulen eine Quelle für z.B. das SPI-Modul aus.

> Ich denke mal, das ist weniger eine logische Frage, als vielmehr eine
> technische (FPGA-interne) Frage ;)
Wie gesagt: das wird mit Multiplexern gemacht. Im einfachsten Fall (2 
Eingänge, 1 Ausgang) gibt es 1 Auswahlleitung, 1 Inverter, 1 ODER- und 1 
AND-Gatter:
                        _______
    Quelle 1 ----------|       |
                       |   &   |---
                    ---|_______|   |
                   O               |    _______
                  / \               ---|       |
                 /___\                 |  >=1  |-----
                   |                ---|_______|
                   |    _______    |
    Select   ------o---|       |   |
                       |   &   |---
    Quelle 2 ----------|_______|

> *Bleibt also die Frage, wie steuere ich gemeinsame Leitungen an?*
Antwort: Es gibt keine gemeinsame Leitungen.
Jede einzelne Leitung im FPGA hat genau 1 Treiber und mindestens 1 oder 
mehrere Empfänger. Es können nicht mehrere Ausgänge auf 1 Leitung 
geschaltet werden (auch nicht abwechselnd). Wenn sowas gewünscht ist, 
muß ein Multiplexer vorgesehen werden.

> wenn mehrere Module an einem internen Bus hängen,
Es gibt im FPGA keine richtigen (bidirektionalen) interne 
(Tristate-)Busse. Darum sollte jeder Port eines Moduls innerhalb des 
FPGAs mit in oder out definiert sein, nicht mit inout. Ein 
Tristate-Bus wird vom Synthesizer in einen Multiplexer aufgelöst.
Lediglich auf dem Top-Level, also an den FPGA-Pins, können die IO-Zellen 
einen Tristate-Bus ansteuern.

> Da die Module sowohl unterschiedliche SPI-Modi benötigen, alsauch andere
> Taktfrequenzen, wollte ich das ganze als Multi-Master/Multi-Slave
> aufziehen und eventgesteuert die Übertragung starten.
Dann mußt du nicht nur die Daten multiplexen, sondern auch die 
Konfiguration. Wenn du das Eine kannst, ist das Andere nicht schwer.

> das ganze als Multi-Master/Multi-Slave aufziehen
Was ist jetzt bei dir ein Master, und was ein Slave?
Hat das was mit deinem SPI-Modul zu tun? Oder hast du gleich mehrere 
SPI-Module, die auf die selben IO-Pins zugreifen sollen?

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Bleibt also die Frage, wie steuere ich gemeinsame Leitungen an?
> Antwort: Es gibt keine gemeinsame Leitungen.

Ja, wenn das so ist, dann stimmt natürlich die Logik auch nimmer.
Danke auch für's hinterfragen!

Muss nomml nachdenken gehen ;)

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.