Schlechte Ergebnisse bei der Verwendung von Lattice FPGA Interface zur Erfassung von ADC-Daten

Ich versuche, DDR-Daten von ADS5463 (TI ADC) zu erfassen. Wie im Datenblatt vorgeschlagen, muss ich die Uhr verzögern und die Daten mit der DRY-Uhr abtasten. Ich verwende Lattice FPGA LFE3-35EA .. und verwende Lattice High Speed ​​I/O Interface mit IPexpress:Geben Sie hier die Bildbeschreibung ein

Mit Diamond habe ich diese vorgeschlagene Schnittstelle erstellt:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Danach habe ich diese IP so verwendet, wie sie ist. Ich habe mein Top-Modul gemacht und nur die Pins angeschlossen, ich habe nur sehr wenige Änderungen an den LEDs und Ein- / Ausgängen vorgenommen.

Ich habe den ADC über diese Pins mit dem FPGA verbunden:

USE PRIMARY NET "clk" ;
LOCATE COMP "clk" SITE "L4" ;
//FREQUENCY NET "clk" 200.000000 MHz ;

LOCATE COMP "rstn" SITE "C21" ;
LOCATE COMP "datain[0]" SITE "Y3" ;
LOCATE COMP "datain[1]" SITE "W2" ;
LOCATE COMP "datain[2]" SITE "T4" ;
LOCATE COMP "datain[3]" SITE "U1" ;
LOCATE COMP "datain[4]" SITE "P1" ;
LOCATE COMP "datain[5]" SITE "N2" ;
LOCATE COMP "datain[6]" SITE "L3" ;
LOCATE COMP "datain[7]" SITE "J2" ;
LOCATE COMP "datain[8]" SITE "G1" ;
LOCATE COMP "datain[9]" SITE "E1" ;
LOCATE COMP "datain[10]" SITE "D2" ;
LOCATE COMP "datain[11]" SITE "B1" ;

LOCATE COMP "led_clk" SITE "F19" ;

Ich habe eine Abtastfrequenz von 400 M (also die DRY-Uhr ist 200 M, wie ich sie konfiguriere) und einige Datensinuswellen in verschiedenen Frequenzen bereitgestellt:

1M:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

2M:Geben Sie hier die Bildbeschreibung ein

Einerseits nehme ich die richtige Frequenz auf, aber ich bekomme sehr verrauschte Ergebnisse, obwohl ich weiß, dass es nicht passieren sollte. Ich sollte eine saubere Sinuswelle mit sauberer FFT bekommen.

Ich füge auch den Matlab-Code hinzu:

%% Read data from files
data1 = get_data('C:\Users\---\--.txt', '%*10s%13s%[^\n\r]', 11, inf);
data2 = get_data('C:\---\--.txt', '%*23s%14s%[^\n\r]', 11, inf);

source1 = zeros;
for k1 = 1:length(data1)
    val = convertStringsToChars(data1(k1));
    val = fliplr(val);    
    val = bin2dec(val);
    source1(k1) = val;
end

source2 = zeros;
for k2 = 1:length(data2)
    val = convertStringsToChars(data2(k2));
    val = fliplr(val);    
    val = bin2dec(val);
    source2(k2) = val;
end



source = zeros;
index=1;
for k2 = 1:length(source1)
    source(index) = source1(k2);
    index = index+1;
    source(index) = source2(k2);
    index = index+1;
end


% Plot the data

figure ('Name','test', 'units','normalized','outerposition',[0 0 1 1])

range = 1:1:length(source);
subplot(2,1,1);
plot(range,source); 
axis([0 max(range) 0 4096])
title('Data - Time scale')
xlabel('Samples [n]')
ylabel('Amplitude')
grid

% FFT

Fs = 400e6;            % Sampling frequency                    
T = 1/Fs;             % Sampling period       
L = max(range);             % Length of signal
t = (0:L-1)*T;        % Time vector

Y = fft(source);
Y(1)=0;

P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;

subplot(2,1,2);
plot(f,P1)
axis([0 100e6 0 100])
title('Data - Spectrum')
xlabel('f (Hz)')
ylabel('|P1(f)|')

Warum ist das so, hat jemand eine Idee? Ich verwende die Schnittstelle wie von Lattice vorgeschlagen und erhalte schlechte Ergebnisse. Wer mit Lattice FPGA i arbeitet, wird sich über Hilfe freuen.

Bearbeiten:

Ich füge die 1-MHz-Daten hinzu, die vom FPGA kommen:

 ps    posedge_data  negedge_data
 delta                          rstn
  0 +0 101111000001  101111000001  1  
  1 +0 101111000001  101111000001  1  
  2 +0 101111000001  101111000001  1  
  3 +0 101111000001  001111000001  1  
  4 +0 001111000001  101111000001  1  
  5 +0 101111000001  101111000001  1  
  6 +0 101111000001  101111000001  1  
  7 +0 001111000001  011111000001  1  
  8 +0 010111000001  010111000001  1  
  9 +0 010111000001  010111000001  1  
 10 +0 010111000001  010111000001  1  
 11 +0 110111000001  110111000001  1  
 12 +0 110111000001  110111000001  1  
 13 +0 110111000001  000111000001  1  
 14 +0 000111000001  010011000001  1  
 15 +0 000111000001  011011000001  1  
 16 +0 011011000001  111011000001  1  
 17 +0 101011000001  011011000001  1  
 18 +0 011011000001  011011000001  1  
 19 +0 010011000001  010011000001  1  
 20 +0 010011000001  000011000001  1  
 21 +0 000011000001  100101000001  1  
 22 +0 000011000001  101101000001  1  
 23 +0 101101000001  001101000001  1  
 24 +0 001101000001  001101000001  1  
 25 +0 001101000001  001101000001  1  
 26 +0 100101000001  100101000001  1  
 27 +0 000101000001  000001000001  1  
 28 +0 001001000001  001001000001  1  
 29 +0 001001000001  101001000001  1  
 30 +0 101001000001  101001000001  1  
 31 +0 101001000001  111110000001  1  
 32 +0 101001000001  111110000001  1  
 33 +0 111110000001  101110000001  1  
 34 +0 001110000001  011110000001  1  
 35 +0 010110000001  010110000001  1  
 36 +0 000110000001  010010000001  1  
 37 +0 011010000001  011010000001  1  
 38 +0 001010000001  011010000001  1  
 39 +0 001010000001  010010000001  1  
 40 +0 010010000001  110100000001  1  
 41 +0 111100000001  111100000001  1  
 42 +0 101100000001  011100000001  1  
 43 +0 010100000001  010100000001  1  
 44 +0 000100000001  010000000001  1  
 45 +0 000100000001  011000000001  1  
 46 +0 011000000001  010000000001  1  
 47 +0 010000000001  110111111110  1  
 48 +0 000000111111  111111111110  1  
 49 +0 111111111110  011111111110  1  
 50 +0 011111111110  011111111110  1  
 51 +0 110111111110  100111111110  1  
 52 +0 100111111110  010011111110  1  
 53 +0 011011111110  011011111110  1  
 54 +0 011011111110  010011111110  1  
 55 +0 010011111110  110101111110  1  
 56 +0 100011111110  111101111110  1  
 57 +0 011101111110  011101111110  1  
 58 +0 011101111110  110101111110  1  
 59 +0 110101111110  110101111110  1  
 60 +0 100101111110  111001111110  1  
 61 +0 111001111110  111001111110  1  
 62 +0 111001111110  111001111110  1  
 63 +0 110001111110  100001111110  1  
 64 +0 000001111110  010110111110  1  
 65 +0 011110111110  011110111110  1  
 66 +0 101110111110  111110111110  1  
 67 +0 001110111110  010110111110  1  
 68 +0 010110111110  010010111110  1  
 69 +0 000110111110  011010111110  1  
 70 +0 011010111110  011010111110  1  
 71 +0 001010111110  011010111110  1  
 72 +0 110010111110  110010111110  1  
 73 +0 010010111110  010100111110  1  
 74 +0 011100111110  011100111110  1  
 75 +0 011100111110  001100111110  1  
 76 +0 001100111110  011100111110  1  
 77 +0 001100111110  010100111110  1  
 78 +0 010100111110  010100111110  1  
 79 +0 010100111110  110100111110  1  
 80 +0 111000111110  111000111110  1  
 81 +0 101000111110  101000111110  1  
 82 +0 101000111110  001000111110  1  
 83 +0 001000111110  011000111110  1  
 84 +0 010000111110  110000111110  1  
 85 +0 110000111110  110000111110  1  
 86 +0 110000111110  110000111110  1  
 87 +0 100000111110  000000111110  1  
 88 +0 000000111110  110111011110  1  
 89 +0 111111011110  111111011110  1  
 90 +0 111111011110  111111011110  1  
 91 +0 111111011110  111111011110  1  
 92 +0 111111011110  111111011110  1  
 93 +0 101111011110  001111011110  1  
 94 +0 001111011110  001111011110  1  
 95 +0 001111011110  001111011110  1  
 96 +0 001111011110  001111011110  1  
 97 +0 001111011110  001111011110  1  
 98 +0 001111011110  001111011110  1  
 99 +0 001111011110  011111011110  1   

Ich füge auch die 2-MHz-Datenpunkte hinzu:

 ps    posedge_data  negedge_data
 delta                          rstn
  0 +0 001100111110  001100111110  1  
  1 +0 000100111110  100000111110  1  
  2 +0 100100111110  101000111110  1  
  3 +0 101000111110  111000111110  1  
  4 +0 110000111110  100000111110  1  
  5 +0 100000111110  110111011110  1  
  6 +0 111111011110  011111011110  1  
  7 +0 011111011110  001111011110  1  
  8 +0 001111011110  011111011110  1  
  9 +0 010111011110  000111011110  1  
 10 +0 000111011110  000111011110  1  
 11 +0 000111011110  110011011110  1  
 12 +0 000111011110  111111011110  1  
 13 +0 111011011110  100111011110  1  
 14 +0 100111011110  100111011110  1  
 15 +0 100111011110  100111011110  1  
 16 +0 100111011110  100111011110  1  
 17 +0 100111011110  110111011110  1  
 18 +0 100111011110  110111011110  1  
 19 +0 110111011110  101000111110  1  
 20 +0 011111111110  000000111110  1  
 21 +0 000000111110  010000111110  1  
 22 +0 000000111110  100000111110  1  
 23 +0 110000111110  101000111110  1  
 24 +0 101000111110  111100111110  1  
 25 +0 100100111110  110100111110  1  
 26 +0 110100111110  101010111110  1  
 27 +0 011100111110  110010111110  1  
 28 +0 100010111110  110010111110  1  
 29 +0 111010111110  111110111110  1  
 30 +0 110110111110  110110111110  1  
 31 +0 110110111110  110001111110  1  
 32 +0 110001111110  010001111110  1  
 33 +0 011001111110  011101111110  1  
 34 +0 110101111110  110101111110  1  
 35 +0 111101111110  011011111110  1  
 36 +0 010011111110  110011111110  1  
 37 +0 111011111110  111111111110  1  
 38 +0 110111111110  110111111110  1  
 39 +0 111111100001  111000000001  1  
 40 +0 111000000001  011100000001  1  
 41 +0 011000000001  010100000001  1  
 42 +0 010100000001  011010000001  1  
 43 +0 011100000001  110010000001  1  
 44 +0 110010000001  111110000001  1  
 45 +0 111010000001  110110000001  1  
 46 +0 110110000001  111001000001  1  
 47 +0 011110000001  110001000001  1  
 48 +0 110001000001  111001000001  1  
 49 +0 111001000001  111101000001  1  
 50 +0 110101000001  110101000001  1  
 51 +0 011101000001  001011000001  1  
 52 +0 111101000001  100011000001  1  
 53 +0 100011000001  101011000001  1  
 54 +0 101011000001  101111000001  1  
 55 +0 101011000001  110111000001  1  
 56 +0 100111000001  100111000001  1  
 57 +0 110111000001  111111000001  1  
 58 +0 101111000001  111111000001  1  
 59 +0 111111000001  111111000001  1  
 60 +0 111111000001  111111000001  1  
 61 +0 111111100001  101000100001  1  
 62 +0 100000100001  100000100001  1  
 63 +0 100000100001  100000100001  1  
 64 +0 000000100001  100000100001  1  
 65 +0 100000100001  100000100001  1  
 66 +0 100000000001  110111000001  1  
 67 +0 111111000001  111111000001  1  
 68 +0 011111000001  001111000001  1  
 69 +0 001111000001  011111000001  1  
 70 +0 001111000001  000111000001  1  
 71 +0 010111000001  000011000001  1  
 72 +0 000111000001  001011000001  1  
 73 +0 001011000001  001011000001  1  
 74 +0 100011000001  110101000001  1  
 75 +0 111101000001  111101000001  1  
 76 +0 111101000001  110101000001  1  
 77 +0 110101000001  100001000001  1  
 78 +0 111001000001  101001000001  1  
 79 +0 001001000001  100110000001  1  
 80 +0 100001000001  101110000001  1  
 81 +0 001110000001  000010000001  1  
 82 +0 000110000001  010010000001  1  
 83 +0 010010000001  010100000001  1  
 84 +0 011100000001  011100000001  1  
 85 +0 001100000001  011000000001  1  
 86 +0 011000000001  010111111110  1  
 87 +0 010000111111  001111111110  1  
 88 +0 011111111110  101011111110  1  
 89 +0 101111111110  101011111110  1  
 90 +0 101011111110  101101111110  1  
 91 +0 101011111110  101101111110  1  
 92 +0 001101111110  101001111110  1  
 93 +0 101101111110  111001111110  1  
 94 +0 101001111110  111110111110  1  
 95 +0 111110111110  111110111110  1  
 96 +0 011110111110  110010111110  1  
 97 +0 110110111110  111010111110  1  
 98 +0 111010111110  110010111110  1  
 99 +0 010010111110  010100111110  1  

Ich habe 100 Punkte von 8192 erfassten Punkten hinzugefügt. Außerdem werde ich ein Bild der Signalgeneratoren hinzufügen, die ich verwendet habe:Geben Sie hier die Bildbeschreibung ein

Alle Signale hier, die ich zu analysieren versucht habe, sind -20 dBm in verschiedenen Frequenzen.

Wie hoch ist Ihr Grundrauschen ohne Signal? Können Sie uns einige Zyklen der erfassten Wellenform bei jeder Frequenz zeigen?
@BruceAbbott Testgeräte stehen mir für ein paar Tage nicht zur Verfügung (hier ist Wochenende). Ich habe ein paar Tests durchgeführt, und das Grundrauschen liegt bei etwa -50 dBm, während ich Ergebnisse bei etwa -70 dBm erwarte. Ich verstehe eine fast flache Ebene bei -50dBm und nach unten
"Testgeräte stehen mir erst in ein paar Tagen zur Verfügung" - Aber die Daten hast Du doch, oder? Betrachtet man die 1-MHz-Welle, sieht es so aus, als würden viele Bits bei bestimmten Codeübergängen auf 1 umschalten (oder fälschlicherweise als 1 erkannt). Ein genauerer Blick auf diese Codes könnte einen Hinweis darauf geben, warum dies geschieht.
@BruceAbbott Ich habe den Beitrag editiert, leider habe ich nur die 100MHz Datendatei (ich überschreibe die exportierten Daten die ganze Zeit), sieht man da was? vielleicht etwas mit dem OVR-Signal (überschreite ich die 2,2 V?)
Es wäre interessant, die 1 MHz gegen eine 2 MHz zu sehen, um zu überprüfen, ob die Spitzen ein von Bruce vorgeschlagenes "Code-Übergangsproblem" sind oder ob es sich möglicherweise um einen weiteren Überlauf oder so handelt. Die abgetasteten Daten von 50 MHz oder 100 MHz im Zeitbereich zu betrachten, ist eher "sinnlos", da die Abtastrate 400 MHz beträgt, was bedeutet, dass man theoretisch 200 MHz erkennen kann, aber typischerweise nur Signale "sehen" kann, die mindestens Faktor 10 sind langsamer im Zeitbereich. Übrigens: auf was sind deine Filter eingestellt?
@ChristianB. ok, morgen als erstes werde ich hier genauere Daten zu den erfassten 1-MHz- und 2-MHz-Daten bereitstellen. Ich werde den Beitrag bearbeiten und erneut kommentieren, wenn ich es schaffe. Was meinst du mit meinen Filtereinstellungen?
Stichwort: Aliasing. Für eine detaillierte Erklärung siehe zB e2e.ti.com/blogs_/archives/b/precisionhub/archive/2015/09/04/… . Um einen ordnungsgemäßen Betrieb zu gewährleisten, muss das Eingangssignal des ADC also tiefpassgefiltert werden.
@ChristianB. oh ok, ja, ich weiß, was Aliasing in der Sampling-Theorie ist, aber der analoge Teil dieses Projekts ist nicht mein Teil der Arbeit, ich werde morgen auch überprüfen, wie der Tiefpassfilter auf der Platine eingerichtet wurde.
@BruceAbbott Ich habe die Datenpunkte und Diagramme für 1 MHz und 2 MHz hinzugefügt
@ChristianB. Die Antwort des Analogdesigners, dass LPF in diesem ADC-Eingang nicht und nicht erforderlich ist. Das LPF wird in externen Systemen sein, dieses System, das nur ADC und FPGA hat, das die Daten abtastet, braucht es nicht.

Antworten (1)

Ok, ich denke, ich habe mein Problem herausgefunden, im Diamond-Analysator habe ich die Sample-Uhr bereitgestellt: buf clock und ich hätte sclk als Sample-Uhr im Analysator bereitstellen sollen, wenn ich jetzt sclk verwende, bekomme ich folgende Ergebnisse:Geben Sie hier die Bildbeschreibung ein

So bekomme ich eine saubere Ausgabe und für das, was ich hier gefragt habe, ist das Problem gelöst. Wer also Diamond Lattice verwendet, achtet darauf, welche Sample-Clock Sie im Analyzer bereitstellen.

Danke für alle Helfer.

Jetzt ist das Problem, dass ich erwarte, ein Eingangssignal von -70dBm+ abzutasten, und in Wirklichkeit habe ich nur mit -35dBm+ Erfolg.