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
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.
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.
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.
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
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.
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,
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.
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?
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,
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
>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
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
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.!*
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.