Acquisition analogique — XADC¶
Le bloc XADC¶
L’Artix-7 intègre un bloc XADC (Xilinx Analog-to-Digital Converter) capable de convertir des signaux analogiques en valeurs numériques 12 bits. Il est accessible via un primitif instanciable directement en Verilog.
Paramètre |
Valeur |
|---|---|
Résolution |
12 bits (valeur dans les 12 MSB d’un mot 16 bits) |
Fréquence d’échantillonnage maximale |
1 Msps (un million d’échantillons par seconde) |
Plage d’entrée (mode différentiel VP/VN) |
0 à 1 V différentiel |
Canaux disponibles sur JXADC (Nexys 4) |
VP/VN, VAUXP/N[0], VAUXP/N[1], VAUXP/N[9] |
Danger
Tension maximale absolue : 1 V différentiel. Toute tension supérieure sur les broches VP/VN détruira le FPGA de façon permanente. Si le signal source dépasse 1 V (typiquement 3,3 V logique ou signal issu d’un générateur de fonctions), interposer un diviseur résistif ou un buffer opamp (ex. LM358 en suiveur avec résistances).
Exemple de diviseur pour un signal 0–3,3 V → 0–1 V : \(R_1 = 2{,}3\,\text{k}\Omega\), \(R_2 = 1\,\text{k}\Omega\).
Connecteur JXADC — correspondance des broches¶
Broche JXADC |
Signal XADC |
Broche FPGA (Package PIN) |
|---|---|---|
1 |
VP (différentiel +) |
A13 |
7 |
VN (différentiel −) |
A14 |
2 |
VAUXP[1] |
B13 |
8 |
VAUXN[1] |
A13 (partagé selon config) |
3 |
VAUXP[9] |
B14 |
9 |
VAUXN[9] |
B15 |
Instanciation du primitif XADC¶
Le XADC est configuré via des registres INIT_xx renseignés à la
synthèse comme paramètres du primitif :
module xadc_wrapper (
input wire clk, // 100 MHz système
input wire rst, // reset synchrone actif haut
input wire vp_in, // VP — JXADC broche 1
input wire vn_in, // VN — JXADC broche 7
output reg [11:0] adc_val, // valeur convertie (0x000–0xFFF)
output reg adc_valid // pulse 1 cycle : nouvelle donnée
);
wire [15:0] do_out;
wire drdy;
XADC #(
// Mode continu, canal VP/VN, moyenne x16
.INIT_40(16'h9000),
// Désactiver toutes les alarmes
.INIT_41(16'h2ef0),
// ADCCLK = DCLK / 4 → 100 MHz / 4 = 25 MHz
.INIT_42(16'h0400),
// Séquenceur : activer uniquement le canal 0 (VP/VN)
.INIT_48(16'h0100),
.INIT_49(16'h0000),
.INIT_4A(16'h0100),
.INIT_4B(16'h0000)
) u_xadc (
.CONVST (1'b0),
.CONVSTCLK(1'b0),
.DADDR (7'h00), // registre 0x00 = mesure VP/VN
.DCLK (clk),
.DEN (1'b1),
.DI (16'h0000),
.DWE (1'b0),
.RESET (rst),
.VAUXN (15'b0),
.VAUXP (15'b0),
.VN (vn_in),
.VP (vp_in),
.DO (do_out), // résultat 16 bits
.DRDY (drdy), // pulse 1 cycle par conversion
.EOC (),
.EOS ()
);
// Capture des 12 MSB sur front DRDY
always @(posedge clk) begin
adc_valid <= 1'b0;
if (drdy) begin
adc_val <= do_out[15:4]; // bits 15:4 = valeur (LSB = 0)
adc_valid <= 1'b1;
end
end
endmodule
Interprétation de la valeur ADC¶
La valeur numérique renvoyée par le XADC est :
|
Tension analogique |
Interprétation |
|---|---|---|
|
0 V |
Signal au niveau bas |
|
≈ 0,5 V |
Seuil de comparaison recommandé |
|
≈ 1 V |
Signal au niveau haut (pleine échelle) |
Limitation fréquentielle et conséquences¶
Le XADC échantillonne à 1 Msps maximum. Par le théorème de Shannon, il ne peut reconstituer fidèlement que des signaux de fréquence inférieure à 500 kHz. Pour un signal d’entrée à 20 MHz, il est impossible de reconstruire la forme d’onde — le XADC ne verra qu’environ 1 front sur 20.
La fréquence apparente des fronts détectés sera donc :
et la fréquence de sortie effective sera :
Important
Pour traiter un signal à 20 MHz, la solution recommandée est d’utiliser un comparateur analogique externe (ex. LM393, TLV3201) pour convertir le signal en niveau logique LVCMOS33, puis de câbler la sortie sur un PMOD et d’appliquer la détection de front directement sur ce signal numérique propre. Le XADC reste pertinent pour mesurer l’amplitude ou détecter des signaux de fréquence ≤ 500 kHz.
See also
Comparateur numérique pour l’étape de seuillage suivante.