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


von Nik N. (neusser)



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

von Morin (Gast)


Lesenswert?

Nein, die beiden Befehle sind nicht identisch. Die Datenleitungen sind 
bidirektional, oder? Dann wäre das hier richtig:
1
case select is
2
  when '1' =>
3
    data_fpga<=data_sd;
4
    data_sd<=data_fpga;
5
    data_ext<= (others=>'Z');  -- hochohmig
6
  when '0' =>
7
    data_fpga<=(others=>'Z');  -- hochohmig
8
    data_ext<= data_sd;
9
    data_sd<=data_ext;
10
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.

von Morin (Gast)


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.

von Morin (Gast)


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.

von Nik N. (neusser)


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

von Roger S. (edge)


Lesenswert?

Morin wrote:
> Die Datenleitungen sind bidirektional, oder? Dann wäre das hier richtig:
1
data_fpga<=data_sd;
2
data_sd<=data_fpga;

du glaubst ja nicht im Ernst dass das Funktioniert?

@ Nik Nn
1
data_sd :  InOut std_logic_vector (8 downto 0);
2
data_fpga: InOut std_logic_vector (8 downto 0);
3
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

von Morin (Gast)


Lesenswert?

> du glaubst ja nicht im Ernst dass das Funktioniert?

Nein, wie ich ja auch schon geschrieben hab.

von Nik N. (neusser)


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

von Roger S. (edge)


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

von Morin (Gast)


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.

von Nik N. (neusser)


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

von Morin (Gast)


Lesenswert?

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

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.