Forum: FPGA, VHDL & Co. SPI in Multi-Master Configuration


von User (Gast)


Lesenswert?

Hi. Ich möchte einen AXI SPI Core wie auf Seite 20 beschrieben verwenden 
(http://www.xilinx.com/support/documentation/ip_documentation/axi_spi_ds742.pdf). 
Im ucf-File habe ich dazu angelegt:

NET spi_csn[0] LOC = AM25  | IOSTANDARD = LVCMOS25;
NET spi_csn[1] LOC = L33   | IOSTANDARD = LVCMOS25;

NET spi_clk_1  LOC = AL25  |  IOSTANDARD = LVCMOS25;
NET spi_mosi_1 LOC = AP30  |  IOSTANDARD = LVCMOS25;
NET spi_miso_1 LOC = AP31  |  IOSTANDARD = LVCMOS25;

NET spi_clk_2  LOC = M32   |  IOSTANDARD = LVCMOS25;
NET spi_mosi_2 LOC = R31   |  IOSTANDARD = LVCMOS25;
NET spi_miso_2 LOC = R32   |  IOSTANDARD = LVCMOS25;

In den Core-Einstellungen habe ich zwei Slaves eingestellt. In EDK habe 
ich an den SPI-Core beide spi_csn, beide spi_mosi, beide spi_clk 
angeschlossen. Nur bei spi_miso kann ich keine neue Verbindung 
hinzufügen. Lediglich eine darf ich auswählen. Ich vermute einmal, weil 
es sich im einen Eingang handelt. Hat einer einen Vorschlag wie ich das 
Problem behebe und auch hier n miso Leitungen anschließen kann?

von User (Gast)


Angehängte Dateien:

Lesenswert?

Anbei nocheinmal die Einstellungen. In ISE würde ich nun einfach eine 
"IF-Abfrage" einführen. D.h. wenn spi_en = 01 dann nehme für miso pin 1 
ansonsten nehme Pin 2, aber hier?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

User schrieb:
> Hat einer einen Vorschlag wie ich das Problem behebe
Was ist denn das eigentliche Problem?
Was willst du machen?
Und seit wann sollte SPI Multi-Master fähig sein?

von User (Gast)


Lesenswert?

Also:
Ich habe eine Baugruppe am FPGA. Diese spreche ich über den SPI-Bus an. 
Das funktioniert soweit. Ich möchte nun eine zweite Baugruppe an den 
FPGA anschließen. Diese möchte ich auch per SPI ansprechen können. Der 
Enable-Vektor wählt mir ja ein Device aus, mit dem ich kommunizieren 
möchte, korrekt? (D.h. 01 -> Enable an Device A, 10 Enable an Device B).

Die Taktleitung "clk" und die Datenleitungen "miso", "mosi" sind für 
beide Devices identisch.

Also habe ich gedacht, dass ichs wie erwähnt parallel schalte um mir ein 
weiteres SPI-Interface zu sparen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

User schrieb:
> Also: Ich habe eine Baugruppe am FPGA. Diese spreche ich über den
> SPI-Bus an.
Das FPGA enthält also den Master.
> Ich möchte nun eine zweite Baugruppe an den FPGA anschließen. Diese
> möchte ich auch per SPI ansprechen können.
Du hast also 1 Master im FPGA und mehrere Slaves?

Das ist eine ganz ganz übliche Verdrahtung des SPI, die im Kupfer 
ausserhalb des FPGAs gemacht wird. Der Master selektiert dann nur noch 
mit mehreren SS Leitungen, welcher der Slaves mit der aktuellen 
Übertragung gemeint ist.

von User (Gast)


Lesenswert?

Ja okay. Ich müsste die Verdrahtung jedoch im FPGA machen. Bedingt durch 
die gesamte Architektur meines Systems. Deswegen habe ich ja clk1 und 
clk2 an clk angeschlossen etc. Nur mit dem Miso funktioniert das nicht 
so einfach.

von Stefan (Gast)


Lesenswert?

Das funktioniert evtl. nicht, weil es ein Eingang ist (wie du auch schon 
vermutet hast) und die Ausgänge der Slaves dann gegeneinander treiben 
könnten. Praktisch passiert das nicht, weil die Ausgänge der Slaves 
HighZ sind, wenn der Slave nicht selektiert ist (zumindest sollte es so 
sein).
Umgehen kannst du das, wenn du die Ausgänge logisch veroderst. Dann hast 
du nur noch den einen Ausgang aus dem Oder Gatter.

von User (Gast)


Lesenswert?

Schade. Gibt es denn in EDK die möglichkeit ein einfaches Oder 
einzufügen? Wenn ja wo ;)

von Philip K. (philip_k)


Lesenswert?

User schrieb:
> Schade. Gibt es denn in EDK die möglichkeit ein einfaches Oder
> einzufügen?
Eher nicht. Das macht man dann üblicherweise in HDL.

von User (Gast)


Lesenswert?

Hab ich mir gedacht. Hab jedoch das HDL-Projekt in EDK vorliegen. Wenn 
ich den xmp-Block in ISE (hier kann ich ja "VHDL" benutzen) einfüge, 
komm ich nicht mehr an die interne Struktur aus dem EDK-Projekt. Das 
einzige was ich machen kann ist mir einen IPCore als Oder zu definieren. 
Ein wenig unschön finde ich das ganze. Man sollte von Xilinx echt die 
Finger lassen.

von Stefan (Gast)


Lesenswert?

Nun ja, ein bisschen Glue-Logic braust du hier und da eigentlich immer 
mal. Wenn alles andere IP Blöcke sind, in die du nicht rein kommst, 
musst du notgedrungen einen eigenen bauen. Finde ich eigentlich sauber.
Die andere Möglichkeit wäre, die Ports extern zu verdrahten. Habe ich 
auch schon des öfteren gesehen, aber da zweifele ich immer ganz ehrlich 
an der Kompetenz des Entwicklers

von Philip K. (philip_k)


Lesenswert?

User schrieb:
> Wenn
> ich den xmp-Block in ISE (hier kann ich ja "VHDL" benutzen) einfüge,
> komm ich nicht mehr an die interne Struktur aus dem EDK-Projekt.
Was heißt "komme nicht mehr an die innere Struktur"? Du kannst doch das 
Projekt nach wie vor öffnen und bearbeiten.

von User (Gast)


Lesenswert?

Ok. Wenn ich so ein "einfaches" ODER bauen möchte, dann schreibe ich ja 
eigentlich:

entity OR_ent is
port(  X1: in std_logic;
  X2: in std_logic;
  Y: out std_logic);
end OR_ent;

architecture OR_arch of OR_ent is
begin

    process(X1, X2)
    begin
       if ((X1='0') and (X2='0')) then
      Y <= '0';
  else
      Y <= '0';
  end if;
    end process;

end OR_arch;

architecture OR_beh of OR_ent is
begin

    Y <= X1 or X2;

end OR_beh;

Die benutzerdefinierten Cores in EDK sind ja immer an den AXI Bus etc 
angebunden. Ist das nicht alles ein wenig sehr überdimensioniert?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

User schrieb:
> Ja okay. Ich müsste die Verdrahtung jedoch im FPGA machen.
Warum? Wenn es tatsächlich externe Komponenten sind, dann verdrahtet 
man die besser so, wie es beim SPI spezifiziert ist.
Oder sind die Komponenten schon fest angeschlossen?

User schrieb:
> Ok. Wenn ich so ein "einfaches" ODER bauen möchte, dann schreibe ich ja
> eigentlich: ...ganz viel Code...
Die vorletzte Zeile reicht.

> if ((X1='0') and (X2='0')) then
>       Y <= '0';
>   else
>       Y <= '0';
>   end if;
Ähm... wie nochmal?

> Wenn ich so ein "einfaches" ODER bauen möchte
Du willst eigentlich kein ODER bauen, sondern zwei Eingänge auf einen 
schalten. Das tut man üblicherweise mit einem Multiplexer. Also etwa so:
1
  miso_intern <= spi_miso_2 when spi_csn(0)='0' else spi_miso_1;

von user (Gast)


Lesenswert?

Ja ok. Aber wie setzt man es in edk um? Man müsste einen eigenen core 
dafür erstellen, oder wo tippe Ich die Zeilen von dir ein ?

von User (Gast)


Lesenswert?

Wie erstelle ich denn für EDK einen core, ohne dass er die Anbindung an 
einen AXI Bus hat. Also einen Block in dem ich wirklich nur x Eingänge 
und y Ausgänge habe. Kann ich dafür in ISE einen Core irgendwie erzeugen 
und in EDK einfügen? Wenn ja kennt jemand ein Beispiel?

Ich habe schon Cores mit dem "Create or Import Peripheral.." erzeugt. 
Allerdings muss man hier immer eine "Bus-Anbindung" etc. auswählen.

von Philip K. (philip_k)


Lesenswert?

Ich versteh immer noch nicht, warum Du um das MB-Design nicht einfach 
eine Schale baust, in der Du den MUX implementierst...

von Philip K. (philip_k)


Lesenswert?

Oder Du schaust mal im IP-Catalog unter Utilities. Da gibts einen 
fertigen IO-Mux.

von User (Gast)


Lesenswert?

Danke. Dann sieht es wie folgt aus: Ich füge 3 Multiplexer ein -> 
Verschalte diese so, dass ich vier Eingänge, einen Steuervektor S[0:1] 
habe. Ich belege nun Eingang 2 mit spi_miso_1 und Eingang 3 mit 
spi_miso_2. Eingang 1 und 4 verbinde ich nicht (NC). Richtig?

von User (Gast)


Lesenswert?

Unschön an der Lösung: Das Signal SS des SPI Masters ist ein Vektor 
[1:0]. Ich muss dieses nun an den Steuervektor des MUX anschließen. Der 
MUX besteht jedoch auch drei verschalteten einfachen MUXs. Also sind s1 
und s0 zwei Signale die nicht als Vektor zusammengefasst sind.

von Philip K. (philip_k)


Lesenswert?

User schrieb:
> Ich füge 3 Multiplexer ein
Warum 3? Du brauchst doch nur einen 2:1 MUX.

Ich würd einfach den vorhandenen 2:1 MUX einmal instanziieren und an das 
Steuersignal eines der beiden SS-bits anschließen.

Und was ist unschön daran, einzelne Signale mit einem Vektor zu 
verbinden?

von User (Gast)


Lesenswert?

Wie verbinde ich denn "einzelne" Signale eines Vektors in EDK? In ISE 
klar mit a[0] oder a[1] etc. Wie schreib ich das jedoch in EDK hin?  Hab 
mir jetzt mal wie du gesagt hast versucht eine Box ums EDK Projekt zu 
legen, d.h. das projekt in ISE einzubinden. (-> 
http://www.youtube.com/watch?v=R5wZ89BcBPo). Im Video wird nachher 
"update with processor data" ausgeführt. In meiner ISE Version (14.6) 
fehlt der Menüpunkt?!

von Philip K. (philip_k)


Lesenswert?

Da kann ich Dir leider nicht weiter helfen. Ich mach das mit dem 
Integrieren ins ISE so nie, weil dann im XPS aus für mich unerfindlichen 
Gründen kein Erzeugen von Simulations-Netzlisten mehr möglich ist.
Ich mache das laden der Software ins Bitfile mit einem separaten 
Skriptaufruf von data2mem.

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.