Forum: FPGA, VHDL & Co. Xilinx Spartan3E DMA


von Mario B. (Firma: private) (mario-boehm)


Lesenswert?

Hey.

Ich arbeite gerade am Spartan3E-Xilinx-Board an meinem Diplomprojekt.

Leider habe ich hier einen Mangel an VHDL-Experten, die mir bei Fragen 
beistehen könnten und da ich die Member hier sehr schätze,
will ich gleich mal hier meine Frage stellen.


Es geht darum Daten in den DDR zu schreiben. Die DDR-Connection ist 
schon aufgebaut, wobei dies der Part meines Kollegens war. Um die Daten 
auf eine möglichst elegante Art rauszuschreiben, wollen wir eine (bzw 
wurde uns nahegelegt) eine DMA zu verwenden.

Leider gibt es kaum (habe zumindest bis jetzt noch keine einzige 
Referenz gefunden) Informationen darüber. Wenndann bezüglich des 
Virtex-Boards, oder irgendwelche anderen bereiche.
Aber diskreter, welche Befehle ich bei meinem Spartan3E-Board verwenden 
kann
und wie genau ich diese Funktion einsätze.

Der IP-Core der DMA lässt sich ja ganz leicht im EDK (von ISE 10.1)
hinzufügen. Und weiter?

Bin leider noch ziemlich unerfahren auf dem gebiet.

Das wissen könnte man denk ich ziemlich schnell vermitteln, sonst müsste 
wohl ein Monat für das Herausarbeiten von Konzepten aus Datenblättern 
usw unnötig verschwendet werden.

lg Mario

von Christian R. (supachris)


Lesenswert?

Hm, ist da ein Softcore Prozessor mit drin, also der MicroBlaze? Der DMA 
Controller aus dem EDK lässt sich eigentlich nur sinnvoll mit einem 
Prozessor einsetzen, da er über den PLB parametriert wird.

von Mario B. (Firma: private) (mario-boehm)


Lesenswert?

Christian R. schrieb:
> Hm, ist da ein Softcore Prozessor mit drin, also der MicroBlaze? Der DMA
> Controller aus dem EDK lässt sich eigentlich nur sinnvoll mit einem
> Prozessor einsetzen, da er über den PLB parametriert wird.

Jaja.
Sorry hätte ich erwähnen müssen.
Ja...wir implementieren den MicroBlaze mit hinein.
Haben auch einige andere Perephierien am PLB-Buss
hängen (ADC  DAC ...).
Um diese Daten zu handeln brauchen wir dann die DMA.

von Christian R. (supachris)


Lesenswert?

Und wo ist da jetzt das Problem? Im EDK ist doch die PDF-Anleitung für 
den DMA da. Wenn du die Standard-Interfaces wie den PLB benutzt, ist das 
nicht weiter aufwendig, einen DMA TRansfer zu starten. Stressig wirds 
nur, wenn du z.B. einen eigenen Core noch dranbinden willst, 
beispielsweise per NPI oder LL. Aber du hast ja ADC und DAC offenbar 
schon als PLB-Slaves.

von Mario B. (Firma: private) (mario-boehm)


Lesenswert?

Christian R. schrieb:
> Und wo ist da jetzt das Problem? Im EDK ist doch die PDF-Anleitung für
> den DMA da. Wenn du die Standard-Interfaces wie den PLB benutzt, ist das
> nicht weiter aufwendig, einen DMA TRansfer zu starten. Stressig wirds
> nur, wenn du z.B. einen eigenen Core noch dranbinden willst,
> beispielsweise per NPI oder LL. Aber du hast ja ADC und DAC offenbar
> schon als PLB-Slaves.

Danke für die Antwort!
Jah das Problem ist, diese "PDF-Anleitung" ist nur ein Datenblatt über 
die DMA. Dort steht drinnen: Takt, Busbreite, Leitungen,.........
Infos ohne Ende.
Aber für einen "Einsteiger" wäre ein Tutorial, ein Referenzprojekt mit 
entsprechendem C-Code hilfreicher.
Das Wissen, was wir so mit ein paar C-Zeilen übermittelt werden würde,
müsste man sonnst mit unnötigem Arbeitsaufwand iwie aus dem Datenblatt 
rauszaubern.

lg Mario

von mac4ever (Gast)


Lesenswert?

Wenn ich bei Xilinx mal DMA suche, finde ich schon einiges an 
Informationen. Inklusive XAPPs, also Application Notes. Den Code dazu 
solltest du gleich mit runterladen können.

von Fpgakuechle K. (Gast)


Lesenswert?

Mario Böhm schrieb:
> Christian R. schrieb:

> Aber für einen "Einsteiger" wäre ein Tutorial, ein Referenzprojekt mit
> entsprechendem C-Code hilfreicher.


Was soll in dem C Code stehen? Ohne das ich den EDK-DMA im Detail kenne, 
ist doch Softwaretechnisch DMA-Aufsetzen immer gleich:
 -jeweils in die richtigen Register Start- und Zieladresse rsp. Gerät 
schreiben, ebenso die Anzahl der zu übertragenen Daten in das richtige 
Register eintragen.
 -eventuell Intterupt aufsetzen (IRQ Maske, enable und 
Interruptservice),da das DMA Ende gern per IRQ signalisiert wird
 -per Bitsetzen im DMA controlregister den DMA starten

MfG,

von Christian R. (supachris)


Lesenswert?

Zumal EDK ja automatisch die entsprechenden "Treiber" samt Header-Files 
und Funktionsrümpfen generiert. Da muss man dann nur das MPMC Manual 
lesen und verstehen, welche Register für die Adressen und Datenlängen zu 
beschreiben sind, was den DMA triggert usw.

von Mario B. (Firma: private) (mario-boehm)


Lesenswert?

hmm danke

Ich habe es bereits schon geschafft, über die DMA werte aus dem DDR, an 
eine darüberliegende Adresse im DDR zu schreiben.

Nicht realitätsbezogenes Beispiel:
von DDR Baseadress 0x10

Daten werden in 0x20 geschrieben

---------------------------------------------

Das Problem tritt auf, wenn ich von DDR ins FIFO schreiben will. Die 
Source-Adress soll ja Incremented werden.
Die Destination-Adress ist ja ne fixe, weil das FIFO nur eine 
Ansprechadresse hat.

Endstand:
DDR -> DDR mit Source Increment, Destination Increment funktioniert.
DDR -> FIFO mit Source Increment, Destination do not Increment liefert 
einen Error

Ideen?

von Fpgakuechle K. (Gast)


Lesenswert?

Hallo Mario,

ich habe Deine Email erhalten, es war nicht gleich ersichtlich worauf Du 
dich beziehst. Die Fehlerbeschreibung (" liefert
einen Error ") hilft bei der Fehleranalyse nicht weiter. Ich kann nur 
vermuten, das der Fehler in der Anbindung des Fifos an den uB liegen 
kann, die DMA-Engine funktioniert ja offensichtlich. Kannst Du den Code 
simulieren (modelsim?), dann schau mal ob die Schreibleitung und 
Chipselect von Fifo schaltet. Vielleicht ist der Adressdecoder madig, 
oder es werden falsche Steuerworte in die DMA Controlregister 
geschrieben. Oder der DMA in die Fifo funktioniert, nur dein Fifozugriff 
um das zu Überprüfen geht in die Hose.

Zuviel Kaffeesatz für eine klare Antwort,

MfG,

von Stefan (Gast)


Lesenswert?

Hallo

bin ein Teamkollege von Mario.
Modelsim und Chipscope ziehen wir vorallem aus zeitlichen Gründen nicht 
(mehr) in Erwägung.
Kann es vielleicht sein, dass der FIFO des Peripherial (Pcore) indem 
sich unser DA bzw AD Wander, die Daten von der DMA nicht schnell genug 
verarbeiten kann?
Wenn wir nämlich die Lenght der DMA auf einen Wert beschränken, wird 
dies auch übertragen. Doch sobald man mehrere hintereinder schicken will 
(Lenght höher) bekommt man sofort einen Bus Error im Status Register der 
DMA und kein einziger Wert wird übertragen.

Hat schon einmal jemand dieses Problem gehabt oder behandelt?
Gibt es vielleicht noch eine andere Möglichkeit die Daten ohne 
Processorleitung zu übertragen?

Bin für alle funktionieren Lösungen offen!^^

In der älteren PLB Version (3.4) oder OPB Bus kann die DMA schon im 
Wizard ausgewählt werden. Hat jemand hiermit Erfahrung?

Examples wären sehr hilfreich!

lg
Stefan

von dumdidum (Gast)


Lesenswert?

>Das wissen könnte man denk ich ziemlich schnell vermitteln, sonst müsste
>wohl ein Monat für das Herausarbeiten von Konzepten aus Datenblättern
>usw unnötig verschwendet werden.

Wie willst du lernen wie es geht, wenn du das lesen von Datenblättern 
für verschwendete Zeit hälst ?

>Das Wissen, was wir so mit ein paar C-Zeilen übermittelt werden würde,
>müsste man sonnst mit unnötigem Arbeitsaufwand iwie aus dem Datenblatt
>rauszaubern

RTFM

>Modelsim und Chipscope ziehen wir vorallem aus zeitlichen Gründen nicht
>(mehr) in Erwägung.
gängige Tools wurden also gegen eine Glaskugel ausgetauscht, weils 
schneller geht tu raten.



So und nun lies die Datenblätter und Lerne, anstatt zu raten oder andere 
deinen Job machen zu lassen. Schliesslich bekommen wir für den selben 
Arbeitsaufwand kein Diplom

von Fpgakuechle K. (Gast)


Lesenswert?

Stefan schrieb:

> Modelsim und Chipscope ziehen wir vorallem aus zeitlichen Gründen nicht
> (mehr) in Erwägung.

Nicht nachahmenswert.

> Kann es vielleicht sein, dass der FIFO des Peripherial (Pcore) indem
> sich unser DA bzw AD Wander, die Daten von der DMA nicht schnell genug
> verarbeiten kann?

Ja, das ist eine Möglichkeit. Der uB hat meiner WErinnerung nach ein 
rdy, busy Signal, damit Zugriffe auch über mehrere Takte laufen können. 
Wenn in der Zwischenzeit ein zweiter Zugriff initiert wird, das ist das 
schon ein Grund für einen Bus Error.

> Wenn wir nämlich die Lenght der DMA auf einen Wert beschränken, wird
> dies auch übertragen. Doch sobald man mehrere hintereinder schicken will
> (Lenght höher) bekommt man sofort einen Bus Error im Status Register der
> DMA und kein einziger Wert wird übertragen.

Das könnte aber auch auf ein Problem mit dem Adresscounter hinweisen. 
Vielleicht wird ja dieser aktiviert, und die Fifo fühlt sich nur bei der 
ersten Adresse angesprochen.

Zur Analyse des Problems könnt ihr ja weiter mit dem DMA-Parametern 
variieren. Wenns DMA schreiben nicht klappt, dann vielleicht lesen. Wie
sieht es mit anderen DMA-Quellen, Senken aus? Sind vielleicht FiFo-Flags 
(empty,full) falsch verschaltet. etc.

Viel Erfolg wünschend

von Mario B. (Firma: private) (mario-boehm)


Angehängte Dateien:

Lesenswert?

Sooo....
schlussendlich hat es funktioniert.

Daten von DDR-Ram über eine DMA (using PLB-Bus)
zu einem FIFO!

>So und nun lies die Datenblätter und Lerne, anstatt zu raten oder andere
>deinen Job machen zu lassen. Schliesslich bekommen wir für den selben
>Arbeitsaufwand kein Diplom

Nachdem wir, 3 Diplomanten, von dem Wissensstand "0" (kein Detailwissen 
über yC Programmierung, kein Wissen über VHDL & EDK) uns auf ein Projekt 
gestürzt haben, wo ein ADC, DAC, DDR, LCD, Rotary Encoder, 2 FIFO, 
locale Steuerung & Remotesteuerung über den PC einbinden mussten, würde 
ich unser Angagement nicht so herunterreden, wenn wir schon die hälfte 
der Woche nicht vor 21:00 aus der Schule gehen. (Während der 
Schularbeiten Zeit).

-> 
###############################LÖSUNG###################################

Nach zahlreichem Durchforsten der Xilinx Foren und des allgemeinem Nets, 
hatte dann doch einer eine Lösung:

>Hi,
>I had the same problem and finally found a solution.
>    * You need to add "Burst and cacheline support" to your peripherial
>    * make sure the FIFO you want to use suppots package mode
>
>Let me now if that worked for you.
>
>Regards
>Claas

 @ 
http://forums.xilinx.com/xlnx/board/message?board.id=EDK&message.id=6594&jump=true#M6594


In der Praxis sieht das dann wie am anhängenden Bild aus
(beim Wizard, beim hinzufügen des FIFOs anhakerln)

*Thx zu  Fpga Kuechle and Christian R.!*

von Fpgakuechle K. (Gast)


Lesenswert?

Mario Böhm schrieb:
> Sooo....
> schlussendlich hat es funktioniert.
>

Gratulation und Dankeschön das Ihr uns an der Lösung teilhaben lasst!
Mir scheint, das Problem liegt weder im DMA noch in der FIFO sondern im 
Cache dazwischen. Es droht Dateninkonsistenz bei DMA -> 
http://de.wikipedia.org/wiki/Cache#Schreibstrategie .

MfG,

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.