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.
Schade. Gibt es denn in EDK die möglichkeit ein einfaches Oder einzufügen? Wenn ja wo ;)
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.
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:
1 | miso_intern <= spi_miso_2 when spi_csn(0)='0' else spi_miso_1; |
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 ?
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.
Ich versteh immer noch nicht, warum Du um das MB-Design nicht einfach eine Schale baust, in der Du den MUX implementierst...
Oder Du schaust mal im IP-Catalog unter Utilities. Da gibts einen fertigen IO-Mux.
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.
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.