Hallo zusammen, hier mal ein kleines Beispiel für einen Bare Metal Cortex-A8 mit einer FPGA Anbindung. Als Cortex-A8 wurde hier das BeagleBone Board verwendet. Für das FPGA ein Altera DE0-nano. Die CPU ist hier ein AM335x und das FPGA ein Cyclone IV. Bei der CPU wurde der GPMC Bus, im FPGA ein Wishbone Bus verwendet. Das Beispiel dient mehr als Test für die Umsetzung des GPMC / Wishbone Masters. Wenn alles läuft können von der CPU aus die LEDs (0 bis 6) auf dem DE0-nano gesteuert werden. Genug der Worte hier gibt es die Sourcen: http://www.emb4fun.de/arm/bbbmfpga/index.html Einen extra "Schaltplan" für die Verbindung zwischen CPU und FPGA gibt es nicht. Also mal in die Sourcen schauen... Viele Grüße, Michael
Michael Fischer schrieb: > Wenn alles läuft können von der CPU aus die LEDs (0 bis 6) > auf dem DE0-nano gesteuert werden. Das ist ja nun noch nicht die Killerapplikation ;-) Wie breit ist das Dateninterface? Wie schnell kann der Prozessor an seiner Schnittstelle die Daten bereitstellen bzw. abholen? Was bleibt von der Datenrate effektiv noch übrig, wenn man auf dem Wishbonebus misst? Duke
Hallo Duke, >Das ist ja nun noch nicht die Killerapplikation ;-) Das habe ich mir gedacht das so etwas kommen wird. Aber egal, mein Schwerpunkt lag darin einen Wishbone Master zum laufen zu bekommen. Und erst mal eine Lösung für weitere Diskussionen. Zurück zu den Fragen. Der GPMC Bus vom AM335x läuft mit 100MHz, und die Read/Write Zugriffe sind auf 50ns eingestellt. Zwischen den Zugriffen brauche ich aber noch 30ns Cycle2Cycle Delay. D.h. die max. Geschwindigkeit beträgt hier 80ns. Die Busbreite beträgt 16-Bit. Mit diesen 80ns würde ich in die Rechnung gehen wollen. Mit 80ns und 16Bit Breite komme ich auf einen Wert von 25MByte/s. Warum jetzt nur 50ns und 30ns Cycle2Cycle Delay? Der CPU Bus läuft asynchrone zum FPGA. D.h. die Steuersignale wie CS, WE und OE werden erst mal einsynchronisiert. Da hierdurch jetzt die FPGA Signale verzögert sind gegenüber der CPU, werden die FPGA Signale auch später wieder deaktiviert gegenüber der CPU. Darum benötige ich das Cycle2Cycle Delay. Vielleicht ist das auch der falsche Ansatz, und es gibt bessere Möglichkeiten für das Bus Interface. Immer her damit, ich mache jetzt VHDL erst seit einem Jahr und mir fehlt die entsprechende Erfahrung um vielleicht den letzten Takt aus dem Design zu holen. Alternativ zum ersten Ansatz könnte man das CPU Interface auch synchron betreiben. Hier wird der 100MHz Clock aber nur so lange erzeugt wie auch ein Zugriff auf dem Bus vorhanden ist. Für meine interne Schaltung benötige ich aber auch einen Clock. D.h. ich habe hier ClockDomain Übergänge. Und wie ich das dann intern synchronisiere weiß ich nicht. Und würde ich damit im Endeffekt wirklich an Zeit gewinnen? Die Sourcen stehen zur Verfügung, und Timings mit dem Logic Analyzer kann ich auch liefern, wenn Du eine Möglichkeit sieht das zu verbessern. Steht alles unter der BSD Lizenz, darum dann auch von anderen benutzbar. Ach, vergessen, das FPGA läuft intern mit 200MHz. Viele Grüße, Michael
Michael Fischer schrieb: >>Das ist ja nun noch nicht die Killerapplikation ;-) > Das habe ich mir gedacht das so etwas kommen wird. Deswegen war ja ein Smilie dran. > einen Wishbone Master zum laufen zu bekommen. Können an diesem Wishbone noch weiter Master agieren? Wenn ja, kann das GPMC warten, falls gerade ein anderer Master den Bus verwendet? > Mit 80ns > und 16Bit Breite komme ich auf einen Wert von 25MByte/s. Ok. Unterstützt das GPMC Burstzugriffe? > > Warum jetzt nur 50ns und 30ns Cycle2Cycle Delay? > > Der CPU Bus läuft asynchrone zum FPGA. D.h. die Steuersignale > wie CS, WE und OE werden erst mal einsynchronisiert. Da hierdurch jetzt > die FPGA Signale verzögert sind gegenüber der CPU, werden die FPGA > Signale auch später wieder deaktiviert gegenüber der CPU. Darum benötige > ich das Cycle2Cycle Delay. Vielleicht ist das auch der falsche Ansatz, > und es gibt bessere Möglichkeiten für das Bus Interface. Immer her > damit, Schau Dir mal den Anhang an, Seite 25/26. Vielleicht kannst Du noch einen Takt rausholen. > Alternativ zum ersten Ansatz könnte man das CPU Interface auch synchron > betreiben. Hier wird der 100MHz Clock aber nur so lange erzeugt wie auch > ein Zugriff auf dem Bus vorhanden ist. Für meine interne Schaltung > benötige ich aber auch einen Clock. D.h. ich habe hier ClockDomain > Übergänge. Und wie ich das dann intern synchronisiere weiß ich nicht. > Und würde ich damit im Endeffekt wirklich an Zeit gewinnen? Wenn der Takt nicht permanent anliegt nützt er nix. Man könnte evtl. das Boarddesign umstellen, um Controller und FPGA mit dem gleichen Takt zu versorgen, aber damit schränkt man sich m.E. unnötig ein (auf beiden Seiten). Duke
Vielen Dank für das Beispiel, sowas hatte ich vor längerer Zeit mal gesucht.
Hallo Duke, >Deswegen war ja ein Smilie dran. :o) >Können an diesem Wishbone noch weiter Master agieren? >Wenn ja, kann das GPMC warten, falls gerade ein anderer Master den Bus >verwendet? Theoretisch ja, aber das wb_interconnect ist im Moment nur für einen Master ausgelegt. Der GPMC kann warten, d.h. es werden Waits unterstützt. Aber, dann muß das Timing von 50ns auf 60ns erhöht werden. Das Problem ist hier das das Wait Signal 3 Takte vor dem Ende des Buszyklus anliegen muß. Darum dann der zusätzliche Clock. Mann müßte dann wohl eine Crossbar und keine einfache Interconnect erstellen. >Ok. Unterstützt das GPMC Burstzugriffe? Der GPMC ja, mein Master im Moment noch nicht. >Schau Dir mal den Anhang an, Seite 25/26. Vielleicht kannst Du noch >einen Takt rausholen. Danke für die weiteren Infos. Ich habe die beiden Seiten gerade mal angeschaut. Das sollte aber kein Problem sein bei mir. Mein Source sieht hier wie folgt aus:
1 | process (clk_i, rst_i) |
2 | begin
|
3 | if (rst_i = '1') then |
4 | cs_s1 <= '0'; |
5 | cs_s2 <= '0'; |
6 | |
7 | oe_s1 <= '0'; |
8 | oe_s2 <= '0'; |
9 | |
10 | we_s1 <= '0'; |
11 | we_s2 <= '0'; |
12 | elsif rising_edge(clk_i) then |
13 | cs_s1 <= not GPMC_CS_n; |
14 | cs_s2 <= cs_s1; |
15 | |
16 | oe_s1 <= not GPMC_OE_n; |
17 | oe_s2 <= oe_s1; |
18 | |
19 | we_s1 <= not GPMC_WE_n; |
20 | we_s2 <= we_s1; |
21 | end if; |
22 | end process; |
23 | |
24 | cs <= cs_s2; |
25 | oe <= oe_s2; |
26 | we <= we_s2; |
Somit habe ich schon mal stabile Signale. Ahhh, ich verstehe Dich jetzt. Eine Flankenerkennung damit ich das spätere Cycle2Cycle Delay nicht mehr benötige?! Ich würde hier zwar beim FPGA ein zusätzliches FF benötigen, kann dann aber auf das Cycle2Cycle Delay verzichten. OK, werde ich die Tage mal genauer testen... Viele Grüße, Michael
Hallo ARMdran, >Vielen Dank für das Beispiel, sowas hatte ich vor längerer Zeit mal >gesucht. Ich bin beim Suchen auf folgende Lösung gestoßen: http://valentfx.com/logi-bone/ Habe aber beim genaueren hinschauen festgestellt das die Signale hier nicht einsynchronisiert werden. Das war dann ein Zeichen für mich das nicht weiter zu verfolgen und selber was zu machen. Gruß, Michael
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.