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.

Caractéristiques du XADC Artix-7

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 :

xadc_wrapper.v — acquisition continue sur VP/VN
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 :

\[V_{\text{analog}} = \frac{\text{adc\_val}}{4095} \times 1\,\text{V}\]

adc_val (hex)

Tension analogique

Interprétation

12'h000

0 V

Signal au niveau bas

12'h800 (2048)

≈ 0,5 V

Seuil de comparaison recommandé

12'hFFF (4095)

≈ 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 :

\[f_{\text{fronts détectés}} \approx \frac{f_{\text{XADC}}}{f_{\text{signal}}} \times f_{\text{signal fronts}} = \frac{1\,\text{Msps}}{20\,\text{MHz}} \times 20\,\text{MHz fronts/s} \approx 1\,\text{MHz}\]

et la fréquence de sortie effective sera :

\[f_{\text{out}} \approx \frac{1\,\text{MHz}}{16} \approx 62{,}5\,\text{kHz}\]

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.