www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Multiplexer - SD Card - Richtung


Autor: Nik N. (neusser)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hätte mal eine generelle Frage wie ein Multiplexer in vhdl 
sauber/richtig implementiert werden sollte.

Ich möchte eine SD Karte sowohl mit meinem fpga als auch mit einem 
externen Controller Baustein verbinden.
Entweder soll die Karte also über den fpga angesteuert werden (SPI) oder 
von einem ext. Controller. Die Verschaltung mittels Multiplexer habe ich 
mir analog zum angehängten Bildchen vorgestellt.

Wie lässt sich das jetzt sauber implementieren? Zweifel habe ich vor 
allem aufgrund der Datenrichtungen (in beide Richtungen). Ist A<=B und 
B<=A identisch?


Ich hätte mir folgendes vorgestellt:

data_sd :  InOut std_logic_vector (8 downto 0);
data_fpga: InOut std_logic_vector (8 downto 0);
data_ext:  InOut std_logic_vector (8 downto 0);

case select is
   when '1' =>
        data_fpga<=data_sd;
        data_ext<= (others=>'Z');  -- hochohmig
   when '0' =>
        data_fpga<=(others=>'Z');  -- hochohmig
        data_ext<= data_sd;
end case;

Danke für eure Hilfe!
Nik

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, die beiden Befehle sind nicht identisch. Die Datenleitungen sind 
bidirektional, oder? Dann wäre das hier richtig:
case select is
  when '1' =>
    data_fpga<=data_sd;
    data_sd<=data_fpga;
    data_ext<= (others=>'Z');  -- hochohmig
  when '0' =>
    data_fpga<=(others=>'Z');  -- hochohmig
    data_ext<= data_sd;
    data_sd<=data_ext;
end case;

ansonsten leitet dein Mux nur in einer Richtung Daten weiter.

Außerdem muss der Mikro natürlich damit klarkommen, wenn du ihm Z auf 
der Datenleitung gibst.

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja und nochwas, der Mux leitet auf keinen Fall Z weiter, wenn einer 
der Teilnehmer das dem Mux liefert. Soll heißen, wenn z.B. der 
Mikrocontroller Z ausgibt, damit er die Karte "hört", wird das vom Mux 
verschluckt.

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry für den Dreifachpost, aber wie du den beiden Beiträgen vorher 
vielleicht schon entnommen hast funktioniert ein bidirektionaler Mux in 
VHDL nicht so wie du dir das vorstellst. Der Grund ist, dass ein Bi-Mux 
Z weiterleiten können müsste, was aber ein FPGA prinzipiell nicht kann. 
Der Ausdruck "A <= B" wird also in diesem Sinne nicht korrekt 
synthetisiert.

Um sowas bauen zu können brauchst du Output-Enable-Leitungen, soll 
heißen der FPGA muss nicht nur wissen, ob er oder der Mikro "dran" ist, 
sondern auch, ob diese Seite oder die Karte gerade die Leitung treibt.

Alles natürlich unter der Voraussetzung, dass du wirklich Bi-Leitungen 
brauchst. Das weiß ich deshalb nicht, weil ich noch nie mit einer 
SD-Karte gearbeitet habe.

Autor: Nik N. (neusser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm,

ich seh schon, dass muss ich mir noch einmal durch den Kopf gehen 
lassen. Danke für deine Anregungen erstmal. Wenns mir doch nicht ganz 
klar ist, melde ich mich hier noch einmal.

Frohe Ostern!
Nik

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morin wrote:
> Die Datenleitungen sind bidirektional, oder? Dann wäre das hier richtig:
data_fpga<=data_sd;
data_sd<=data_fpga;

du glaubst ja nicht im Ernst dass das Funktioniert?

@ Nik Nn
data_sd :  InOut std_logic_vector (8 downto 0);
data_fpga: InOut std_logic_vector (8 downto 0);
data_ext:  InOut std_logic_vector (8 downto 0);

InOut nur fuer pins verwenden, einer davon wird ja an dein SPI core 
gehen, dort die Datenrichtung aufsplitten -> data_fpag_out, 
data_fpga_in.
Dann sollte auch Dein Mux ein klacks sein.

Cheers, Roger

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> du glaubst ja nicht im Ernst dass das Funktioniert?

Nein, wie ich ja auch schon geschrieben hab.

Autor: Nik N. (neusser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Roger:
4 der 9 Leitungen an die SD Karte sind In/Out, d.h. entweder sendet der 
Controller Daten oder die Karte antwortet und sendet Daten zurück.

Muss ich, um den MUX zu realisieren, jeweils wissen ob gerade Daten in 
die eine oder in die andere Richtung fließen?
Ich hab nicht so genau verstanden was du mit "[...] dort die 
Datenrichtung aufsplitten -> data_fpag_out, data_fpga_in." meinst!

Danke,

Nik

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nik Nn wrote:
> Muss ich, um den MUX zu realisieren, jeweils wissen ob gerade Daten in
> die eine oder in die andere Richtung fließen?

Ja.

> Ich hab nicht so genau verstanden was du mit "[...] dort die
> Datenrichtung aufsplitten -> data_fpag_out, data_fpga_in." meinst!

z.B data_fpga_in fuer die daten in den MUX rein, data_fpga_out fuer die 
Daten aus dem MUX raus.

Wobei ich seh grad dass deine Zeichnung nicht dem entspricht was du 
willst.
Die SD-Card zwischen deinem SPI core und dem externen controller im FPGA 
zu muxen kannst du vermutlich vergessen.

Cheers, Roger

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Muss ich, um den MUX zu realisieren, jeweils wissen ob gerade Daten in
> die eine oder in die andere Richtung fließen?

Ja, und das gibt dir auch den Hinweis, den du brauchst. Der FPGA kann 
prinzipiell keine bidirektionalen Leitungen Muxen (da hab ich anfangs 
Mist geschrieben). Wenn du ihn aber das Protokoll analysieren lässt, 
kannst du erkennen, wann es in welche Richtung gehen muss. Dann ist aber 
auch das Umschalten der Select-Leitung nicht ganz einfach, da das dann 
synchron zum Protokoll passieren muss.

Ansonsten kannst du, soweit es dir möglich ist, den µC umprogrammieren, 
so dass er über den Mux bescheid weiß und z.B. die von Roger 
angesprochen zwei Leitungen statt einer benutzt (jeweils pro 
bidirektionaler Leitung). Bidirektionale Leitungen wären dann nur noch 
zwischen FPGA und Karte, nicht mehr zwischen FPGA und µC.

Autor: Nik N. (neusser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,
danke für eure Antworten!

Das löst mir zwar nicht mein Problem, aber immerhin hab ich da etwas 
neues gelernt.

Den uC kann ich leider nicht umprogrammieren. Das ist ein gekaufter IC. 
Dann werde ich wohl doch auf einen externen Bus-Mux Baustein ausweichen 
müssen.

Nik

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist sicher die einfachere Variante. Ansonsten geht's wie gesagt auch 
dadurch, dass der FPGA das Busprotokoll analysiert.

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.