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?
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?
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?
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.
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.
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.
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.
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.
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
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.
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?
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:
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.
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?
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.
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?
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?!
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.