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
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.
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.
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.
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
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
> du glaubst ja nicht im Ernst dass das Funktioniert?
Nein, wie ich ja auch schon geschrieben hab.
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
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
> 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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.