mikrocontroller.net

Forum: FPGA, VHDL & Co. Xilinx Spartan3E DMA


Autor: Mario Böhm (Firma: private) (mario-boehm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario Böhm (Firma: private) (mario-boehm)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario Böhm (Firma: private) (mario-boehm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mac4ever (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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,

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario Böhm (Firma: private) (mario-boehm)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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,

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dumdidum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario Böhm (Firma: private) (mario-boehm)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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....


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.!*

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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,

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.