mikrocontroller.net

Forum: FPGA, VHDL & Co. FPGA Datenakquisition


Autor: Joge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich arbeite momentan an einem PC-Oszilloskop.
Hier ist mein Hardware:
-  Flaschy Board
-  Xylo-L USB Board
Der ADC läuft mit 125Mhz und der FIFO (FX2) mit 50Mhz.
Ich werde für das Zwischenspeichern einen Block-RAM verwenden.

Meine Vermutung  ist, der RAM wird sehr schnell gefüllt als gelesen was 
zu Daten Verluste führen kann.
Liege ich hier Falsh? Wenn ja, gibt es eine andere Möglichkeit die Daten 
fast Verlustfrei zu senden?

Gruß
Ming Lee

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joge schrieb:
> Meine Vermutung  ist, der RAM wird sehr schnell gefüllt als gelesen was
> zu Daten Verluste führen kann. Liege ich hier Falsh?
Nein.
> Wenn ja, gibt es eine andere Möglichkeit die Daten
> fast Verlustfrei zu senden?
Der einzige Weg: du mußt die Daten schneller zum PC senden als sie 
eingelesen werden. Wenn du das nicht kannst, wird dein Puffer irgendwann 
gefüllt sein und du hast einen Datenverlust.

In der Praxis wird das dann ganz einfach so gemacht, dass ein Speicher 
ab einem Triggerzeitpunkt gefüllt wird. Und wenn er dann voll ist, wird 
das weitere Einlesen von Daten angehalten.

Autor: Joge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort^^

> In der Praxis wird das dann ganz einfach so gemacht, dass ein Speicher
> ab einem Triggerzeitpunkt gefüllt wird. Und wenn er dann voll ist, wird
> das weitere Einlesen von Daten angehalten.

Das Einlesen der Daten soll nicht eingehalten werden. Deswegen habe ich 
mir gedacht, wenn die RAM voll ist, sollen die hinkommenden Daten 
irgendwie zwischengespeichert. Aber ich weiß nicht wie ich das 
bewerkstelligen kann?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joge schrieb:
> Das Einlesen der Daten soll nicht eingehalten werden.

Wenn du "angehalten" meinst, geht das nur, wenn die Datenverbindung zum 
PC incl. Abspeichern oder was der PC sonst noch damit anstellen soll, 
immer und garantiert im Mittel schneller ist als die Aufnahme. 
Kurzzeitige Einbrüche lassen sich durch große FIFOs umgehen, aber wenn 
die Datenverbindung im Mittel langsamer ist als die Aufnahme kannst du 
nichts machen. Wenn ich da allerdings 125MS/s lese und dann den Cypress 
FX2. Tja, dann passt das nicht zusammen. Der FX2 schafft maximal 40MB/s, 
und das nur bei guter Pufferung und nur im Mittel. Damit kannst du 
niemals die Daten in Echtzeit zum PC streamen. Dafür bräuchte es schon 
PCIe, damit könnte es klappen, wenn die Puffer groß genug sind und du 
einen schnellen PC mit schnellen Festplatten hast. Denn irgendwo müssen 
die Daten ja hin. Außerdem wirst du mit dem S3E500 auf dem Board keinen 
Blumentopf gewinnen, der hat kaum BRAM.

Autor: Joge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort ^^

Lothar Miller schrieb:
> In der Praxis wird das dann ganz einfach so gemacht, dass ein Speicher
> ab einem Triggerzeitpunkt gefüllt wird. Und wenn er dann voll ist, wird
> das weitere Einlesen von Daten angehalten.

Ich habe versucht deinen Ansatz zu implementieren, aber bin leider 
gescheitert.Bei mir war das USB (CyAPI) Empfang einen Problem.
Kannst du mir dienen Ansatz detaillierter erklären?
Für Vorschläge und Tutorials-Links bin ich sehr dankbar.

Gruß
Lee

Autor: Joge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist hier den USB C++ Code für matlab:
#include <stdio.h>
#include <windows.h>
#include "math.h"
#include "mex.h"
#include "CyAPI.h"

static GUID GUID_KNJN_FX2 = {0x0EFA2C93, 0x0C7B, 0x454F, 0x94, 0x03, 0xD6, 0x38, 0xF6, 0xC3, 0x7E, 0x65};

#define BulkOutPipe0 USBDevice->EndPoints[1]
#define BulkInPipe1  USBDevice->EndPoints[2]
#define BulkOutPipe2 USBDevice->EndPoints[3]
#define BulkOutPipe3 USBDevice->EndPoints[4]
#define BulkInPipe4  USBDevice->EndPoints[5]
#define BulkInPipe5  USBDevice->EndPoints[6]

//using namespace std;
void mexFunction(int nlhs, mxArray *phls[], int nrhs, const mxArray *prhs[])
{
  CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL, GUID_KNJN_FX2);
    mxArray *xData;
    double *xValues;
  double *dataOut;
    unsigned char bufin[512]; 
    //xData = (mxArray*)prhs[0];
          
    /* get pointers to data */
    //xValues = mxGetPr(xData);
  //int command = mxGetN(xData);
    //printf("--------command: %d ------\n", command);
  
  
  LONG len = 512;
  int i=0, j=0;
  double max=1000;
  
  phls[0] = mxCreateDoubleMatrix(1, max, mxREAL);
  dataOut = mxGetPr(phls[0]);

    for(i=0;i<max;i++)
  {  
    BulkInPipe4->XferData(bufin, len);
    dataOut[i]= bufin[j];
    //printf("Received %d bytes: %d %d\n", len, bufin[0]-'0', bufin[1]-'0');
    j++;
    if(i==511)j=0;
  }
  
    
     
  delete USBDevice;
}


Autor: Joge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry falscher Code!!

Richtig ist:
for(i=0;i<max;i++)
  {  
    if(j==0)BulkInPipe4->XferData(bufin, len);
    dataOut[(int)i]= bufin[j];
    j++;
    if(j==512)j=0;
  }

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.