Estoy tratando de capturar datos DDR de ADS5463 (TI ADC). Como sugirió la hoja de datos, necesito retrasar el reloj y muestrear los datos con DRY clock. Estoy usando Lattice FPGA LFE3-35EA... y usando la interfaz de E/S de alta velocidad de Lattice con IPexpress:
usando Diamond, creé esta interfaz sugerida:
Luego usé esta IP tal como está... hice mi módulo superior y solo conecté los pines, hice muy pocos cambios en los leds y las entradas/salidas.
Conecté el ADC al FPGA usando estos pines:
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" ;
Proporcioné una frecuencia de muestreo de 400M (por lo que el reloj SECO es de 200M como lo configuré) y algunos datos de onda sinusoidal en diferentes frecuencias:
1M:
Por un lado, capturo la frecuencia correcta, pero obtengo resultados muy ruidosos cuando sé que no debería suceder. Debería obtener una onda sinusoidal limpia con FFT limpia.
Estoy agregando el código de matlab también:
%% 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)|')
¿Por qué sucede eso, alguien tiene una idea? Estoy usando la interfaz como sugirió Lattice y estoy obteniendo malos resultados. Cualquiera que esté trabajando con Lattice FPGA estaré encantado de recibir ayuda.
Editar:
Agrego los datos de 1MHz que salen del FPGA:
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
Estoy agregando también los puntos de datos de 2MHz:
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
Agregué 100 puntos de 8192 puntos capturados. Además, agregaré una imagen de los generadores de señal que utilicé:
todas las señales aquí que traté de analizar son -20dBm en diferentes frecuencias.
Ok, creo que descubrí mi problema, en el analizador Diamond proporcioné un reloj de muestra: buf clock y debería haber proporcionado sclk como el reloj de muestra en el analizador, ahora cuando estoy usando sclk obtengo estos resultados:
entonces obtuve una salida limpia y por lo que pregunté aquí, el problema se resolvió, así que para quienes usan Diamond Lattice, presten atención a qué reloj de muestra proporciona en el Analizador.
Gracias por todos los ayudantes.
ahora el problema es que espero muestrear una señal de entrada de -70dBm+ y en realidad solo tengo éxito con -35dBm+.
bruce abbott
Michael Astahov
bruce abbott
Michael Astahov
cristiano b
Michael Astahov
cristiano b
Michael Astahov
Michael Astahov
Michael Astahov