FICHE 10 – FINALE

Programmation et Logique

De l’algèbre de Boole au code : opérateurs bit à bit, FPGA et au-delà

L’Algèbre de Boole en Programmation

Tout ce que nous avons appris sur l’algèbre de Boole et les circuits logiques trouve une application directe en programmation. Les langages modernes offrent des opérateurs bit à bit qui permettent de manipuler directement les bits.

Pourquoi les opérations bit à bit ?
  • Performance : Opérations extrêmement rapides (1 cycle CPU)
  • Compacité : Stocker plusieurs informations dans un seul entier
  • Bas niveau : Contrôle précis des ports I/O, registres
  • Algorithmes : Certains algorithmes s’appuient sur les bits
  • Protocoles : Manipulation de trames, masques réseau

Opérateurs Bit à Bit

Les langages C, C++, Java, Python, JavaScript, etc. offrent tous des opérateurs bit à bit.

Table des opérateurs

Opération C/C++/Java Python Description
AND&&ET bit à bit
OR||OU bit à bit
XOR^^OU exclusif
NOT~~Complément
Shift Left<<<<Décalage gauche
Shift Right>>>>Décalage droite

Exemples en C

// Opérations de base
uint8_t a = 0b10110010;  // 178
uint8_t b = 0b11001100;  // 204

uint8_t and_result = a & b;  // 0b10000000 = 128
uint8_t or_result  = a | b;  // 0b11111110 = 254
uint8_t xor_result = a ^ b;  // 0b01111110 = 126
uint8_t not_result = ~a;     // 0b01001101 = 77 (sur 8 bits)

// Décalages
uint8_t left  = a << 2;  // 0b11001000 = 200 (× 4)
uint8_t right = a >> 2;  // 0b00101100 = 44  (÷ 4)

Applications pratiques

Tester un bit (masquage)

// Tester si le bit 3 est à 1
uint8_t value = 0b00101010;
if (value & (1 << 3)) {
    printf("Bit 3 est à 1\n");
}

Mettre un bit à 1 (set)

// Mettre le bit 5 à 1
value |= (1 << 5);  // value = 0b00101010 | 0b00100000 = 0b00101010

Mettre un bit à 0 (clear)

// Mettre le bit 3 à 0
value &= ~(1 << 3);  // value = 0b00101010 & 0b11110111 = 0b00100010

Inverser un bit (toggle)

// Inverser le bit 1
value ^= (1 << 1);  // XOR avec 1 inverse le bit

Extraire des champs de bits

// Registre de contrôle 8 bits : [MODE:2][SPEED:3][ENABLE:1][RESERVED:2]
uint8_t reg = 0b10101101;

// Extraire SPEED (bits 3-5)
uint8_t speed = (reg >> 3) & 0b111;  // Décale puis masque 3 bits
printf("Speed: %d\n", speed);  // Speed: 5

// Extraire MODE (bits 6-7)
uint8_t mode = (reg >> 6) & 0b11;
printf("Mode: %d\n", mode);  // Mode: 2

Exemple : Contrôle des GPIO sur Arduino

Les microcontrôleurs comme l'Arduino utilisent massivement les opérations bit à bit pour contrôler les ports I/O.

💡 Contrôle direct des registres

// Port D = pins 0-7 sur Arduino
// Au lieu de digitalWrite() qui est lent...

// Méthode lente (1 pin à la fois)
digitalWrite(8, HIGH);   // ~5 µs

// Méthode rapide (manipulation directe des registres)
PORTB |= (1 << 0);       // ~125 ns (40× plus rapide !)

// Configurer plusieurs pins en une seule opération
DDRB = 0b00111111;  // Pins 8-13 en sortie
PORTB = 0b00101010; // Écrire pattern binaire sur les 6 pins

// Lire l'état d'un port complet
uint8_t portState = PINB;
if (portState & (1 << 2)) {
    // Pin 10 est HIGH
}
🚀 Performance :

Les opérations bit à bit directes sur les registres sont jusqu'à 50× plus rapides que les fonctions Arduino standard ! Crucial pour les applications temps réel.

Application Radio : Décodage de Trame

Décoder une trame APRS

Les trames APRS contiennent des informations codées en bits. Exemple simplifié :

// Trame APRS simplifiée (en réalité beaucoup plus complexe)
typedef struct {
    uint8_t flags;      // [TYPE:3][PRIORITY:2][RESERVED:3]
    uint16_t position;  // Latitude/Longitude codée
    uint8_t data;       // Altitude, vitesse, etc.
} APRSFrame;

void decodeAPRS(APRSFrame *frame) {
    // Extraire le type de message
    uint8_t type = (frame->flags >> 5) & 0b111;
    
    // Extraire la priorité
    uint8_t priority = (frame->flags >> 3) & 0b11;
    
    // Décoder la position (exemple simplifié)
    float lat = (frame->position >> 8) * 0.01;  // 8 bits MSB
    float lon = (frame->position & 0xFF) * 0.01; // 8 bits LSB
    
    printf("Type: %d, Priority: %d\n", type, priority);
    printf("Position: %.2f, %.2f\n", lat, lon);
}

FPGA et Logique Programmable

Les FPGA (Field-Programmable Gate Array) sont des circuits qui permettent d'implémenter n'importe quelle logique numérique de façon matérielle.

Qu'est-ce qu'un FPGA ?

Un FPGA contient des milliers (voire millions) de cellules logiques configurables interconnectées. On peut "programmer" ces connexions pour créer n'importe quel circuit numérique.

Architecture d'un FPGA

🧩 LUT (Look-Up Table)

Tables de vérité programmables

Implémentent les fonctions logiques

🔄 Flip-Flops

Bascules D pour séquentiel

Mémoire et registres

🔌 Interconnexions

Réseau de routage programmable

Connexions entre cellules

🔢 DSP Blocks

Multiplicateurs dédiés

Traitement du signal

💾 Block RAM

Mémoire embarquée

Buffers, FIFOs, caches

🔌 I/O Blocks

Interfaces d'entrée/sortie

Communication externe

Avantages des FPGA

Pourquoi utiliser un FPGA ?
  • Parallélisme massif : Opérations simultanées
  • Performance : Logique dédiée, pas de software overhead
  • Flexibilité : Reconfigurable à volonté
  • Faible latence : Traitement en temps réel
  • Prototypage : Test avant fabrication d'ASIC

Applications en radio amateur

  • SDR (Software Defined Radio) : Traitement numérique du signal RF
  • Filtres numériques : FIR/IIR haute performance
  • Décodeurs rapides : FT8, WSPR en temps réel
  • FFT temps réel : Spectrogramme, waterfall
  • Modulateurs/démodulateurs

VHDL et Verilog

Les langages HDL (Hardware Description Language) permettent de décrire du matériel de façon textuelle. Le code est ensuite "synthétisé" en portes logiques.

Exemple en VHDL : Additionneur 4 bits

-- Additionneur 4 bits en VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity adder_4bit is
    Port ( 
        A : in  STD_LOGIC_VECTOR (3 downto 0);
        B : in  STD_LOGIC_VECTOR (3 downto 0);
        Cin : in  STD_LOGIC;
        Sum : out  STD_LOGIC_VECTOR (3 downto 0);
        Cout : out  STD_LOGIC
    );
end adder_4bit;

architecture Behavioral of adder_4bit is
    signal temp : unsigned(4 downto 0);
begin
    -- Addition avec retenue
    temp <= ('0' & unsigned(A)) + ('0' & unsigned(B)) + ("0000" & Cin);
    
    -- Sortie
    Sum <= std_logic_vector(temp(3 downto 0));
    Cout <= temp(4);
end Behavioral;

Exemple en Verilog : Détecteur de séquence

// Détecteur de séquence "101" en Verilog
module sequence_detector (
    input clk,
    input reset,
    input data_in,
    output reg detected
);

    // États de la FSM
    parameter S0 = 2'b00;  // État initial
    parameter S1 = 2'b01;  // "1" détecté
    parameter S2 = 2'b10;  // "10" détecté
    parameter S3 = 2'b11;  // "101" détecté
    
    reg [1:0] state, next_state;
    
    // Logique séquentielle (registre d'état)
    always @(posedge clk or posedge reset) begin
        if (reset)
            state <= S0;
        else
            state <= next_state;
    end
    
    // Logique combinatoire (transitions)
    always @(*) begin
        case (state)
            S0: next_state = data_in ? S1 : S0;
            S1: next_state = data_in ? S1 : S2;
            S2: next_state = data_in ? S3 : S0;
            S3: next_state = data_in ? S1 : S2;
            default: next_state = S0;
        endcase
    end
    
    // Sortie (Moore : dépend uniquement de l'état)
    always @(*) begin
        detected = (state == S3);
    end
    
endmodule
💡 Différences VHDL vs Verilog :
  • VHDL : Plus verbeux, typé fortement, style Ada/Pascal
  • Verilog : Plus concis, style C, plus permissif
  • Choix : Les deux sont équivalents en puissance

Simulation de Circuits

Avant de programmer un FPGA ou de fabriquer un circuit, il est essentiel de simuler son fonctionnement.

Outils de simulation

Logisim Evolution

Simulateur graphique éducatif

Gratuit, parfait pour apprendre

ModelSim

Simulateur HDL professionnel

Industrie, très complet

GTKWave

Visualiseur de formes d'onde

Open source, léger

Vivado Simulator

Xilinx FPGA

Intégré à Vivado IDE

Testbench en VHDL

Tester l'additionneur 4 bits

-- Testbench pour l'additionneur
entity adder_4bit_tb is
end adder_4bit_tb;

architecture Behavioral of adder_4bit_tb is
    -- Déclaration du composant à tester
    component adder_4bit
        Port ( A, B : in STD_LOGIC_VECTOR(3 downto 0);
               Cin : in STD_LOGIC;
               Sum : out STD_LOGIC_VECTOR(3 downto 0);
               Cout : out STD_LOGIC );
    end component;
    
    -- Signaux de test
    signal A, B, Sum : STD_LOGIC_VECTOR(3 downto 0);
    signal Cin, Cout : STD_LOGIC;
    
begin
    -- Instanciation du composant
    UUT: adder_4bit port map (A, B, Cin, Sum, Cout);
    
    -- Processus de test
    stim_proc: process
    begin
        -- Test 1 : 5 + 3 = 8
        A <= "0101"; B <= "0011"; Cin <= '0';
        wait for 10 ns;
        assert (Sum = "1000" and Cout = '0')
            report "Test 1 failed!" severity error;
        
        -- Test 2 : 15 + 1 = 16 (overflow)
        A <= "1111"; B <= "0001"; Cin <= '0';
        wait for 10 ns;
        assert (Sum = "0000" and Cout = '1')
            report "Test 2 failed!" severity error;
        
        -- Fin de simulation
        wait;
    end process;
end Behavioral;

Projet Final : Récepteur SDR sur FPGA

Objectif ambitieux

Créer un récepteur SDR VHF simple sur FPGA pour décoder le trafic radio amateur.

Architecture du système

1 Frontend RF

ADC rapide (50-100 MSPS) pour numériser le signal RF directement

2 Mélangeur numérique (DDC)

Digital Down Converter : transposer la fréquence RF en bande de base

3 Filtres FIR/IIR

Filtrage passe-bande pour sélectionner le canal désiré

4 Démodulateur FM

Extraction du signal audio à partir de la FM

5 Décodeur CTCSS/DCS

Filtrage et détection des codes d'accès

6 Interface audio

DAC ou I2S vers codec audio

7 Contrôle et affichage

Microcontrôleur ou soft-core pour l'interface utilisateur

🛠️ Matériel suggéré :
  • FPGA : Xilinx Artix-7 ou Intel Cyclone V
  • Board : Digilent Arty A7 ou similaire (~100€)
  • ADC : Module AD9361 ou LTC2208 (IF sampling)
  • Frontend : RTL-SDR modifié ou circuit discret
Projet avancé :

Ce projet nécessite des connaissances solides en DSP, FPGA et RF. C'est un excellent objectif à long terme après avoir maîtrisé les bases !

Python et Logique

Python peut aussi être utilisé pour travailler avec la logique, notamment pour le prototypage rapide et la simulation.

Simuler un circuit logique

# Simulation d'un additionneur complet en Python
def full_adder(a, b, cin):
    """Additionneur complet : retourne (sum, cout)"""
    sum_bit = a ^ b ^ cin          # XOR à 3 entrées
    cout = (a & b) | (cin & (a ^ b))  # Logique de retenue
    return sum_bit, cout

def ripple_carry_adder(a_bits, b_bits, cin=0):
    """Additionneur 4 bits par propagation de retenue"""
    result = []
    carry = cin
    
    for a, b in zip(a_bits, b_bits):
        sum_bit, carry = full_adder(a, b, carry)
        result.append(sum_bit)
    
    return result, carry

# Test
a = [1, 0, 1, 0]  # 5 en binaire (LSB first)
b = [1, 1, 0, 0]  # 3 en binaire
sum_bits, cout = ripple_carry_adder(a, b)

print(f"A = {a} (5)")
print(f"B = {b} (3)")
print(f"Sum = {sum_bits} (8)")
print(f"Carry out = {cout}")

Bibliothèques Python pour l'électronique

  • MyHDL : Écrire du HDL en Python
  • Amaranth (ex-nMigen) : Framework Python pour FPGA
  • PySpice : Simulation de circuits analogiques
  • SciPy/NumPy : Traitement du signal (FFT, filtres)

Pour Aller Plus Loin

Livres recommandés

  • Digital Design (Morris Mano)
  • Computer Organization (Patterson & Hennessy)
  • RTL Hardware Design (Pong Chu)
  • The Art of Electronics (Horowitz & Hill)

Cours en ligne

  • Nand2Tetris (Build a computer)
  • MIT 6.004 (Computation Structures)
  • Coursera : Digital Systems
  • YouTube : Ben Eater, Computerphile

Kits et plateformes

  • Arduino (microcontrôleurs)
  • Raspberry Pi Pico (RP2040)
  • FPGA boards (Arty, DE0-Nano)
  • Kits d'électronique numérique

Logiciels gratuits

  • Logisim Evolution
  • KiCad (conception PCB)
  • Arduino IDE
  • Icarus Verilog (simulateur)

Félicitations !

Vous avez terminé la série complète sur l'Algèbre de Boole !

De la simple conversion binaire aux FPGA, en passant par les circuits combinatoires, séquentiels, et les machines à états, vous avez maintenant une solide compréhension des fondements de l'électronique numérique.

Cette connaissance est la base de TOUT ce qui est numérique : ordinateurs, smartphones, transceivers, satellites...

Récapitulatif de la Série

📖 FICHE 1 : Binaire

Conversions, arithmétique binaire

📖 FICHE 2 : Algèbre de Boole

Opérations logiques, lois fondamentales

📖 FICHE 3 : Portes Logiques

Symboles, familles TTL/CMOS

📖 FICHE 4 : Numération

Octal, hexa, BCD, Gray, signés

📖 FICHE 5 : Karnaugh

Simplification graphique des circuits

📖 FICHE 6 : Combinatoires

Additionneurs, MUX, décodeurs, ALU

📖 FICHE 7 : Séquentiels

Bascules, registres, compteurs, mémoires

📖 FICHE 8 : FSM

Machines à états Moore et Mealy

📖 FICHE 9 : Applications Radio

CTCSS, DCS, relais, DTMF, modes numériques

📖 FICHE 10 : Programmation

Opérateurs bit à bit, FPGA, VHDL

Vos Prochaines Étapes

1 Pratiquez !

Réalisez les projets proposés dans les fiches. Rien ne vaut l'expérience pratique.

2 Explorez les FPGA

Investissez dans une carte FPGA d'entrée de gamme et suivez des tutoriels VHDL/Verilog.

3 Approfondissez le SDR

Expérimentez avec GNU Radio, GQRX, et les modes numériques (FT8, WSPR).

4 Rejoignez la communauté

Participez aux activités de votre club radioamateur local, partagez vos projets.

5 Continuez d'apprendre

L'électronique et l'informatique évoluent constamment. Restez curieux !

Points de la FICHE 10

  • Les opérateurs bit à bit permettent de manipuler directement les bits en programmation
  • Les opérations bit à bit sont extrêmement rapides (1 cycle CPU)
  • Essentielles pour le contrôle de GPIO, protocoles, et optimisations
  • Les FPGA implémentent de la logique matérielle programmable
  • VHDL et Verilog sont les langages pour décrire le matériel
  • La simulation est cruciale avant l'implémentation
  • Les SDR sur FPGA offrent une flexibilité exceptionnelle
  • L'algèbre de Boole est la fondation de toute l'informatique moderne

🎓 Série Complétée !

10 fiches • 10 heures de contenu • 100% terminé

Vous maîtrisez maintenant les fondements de l'électronique numérique,
de la théorie à la pratique, du circuit aux FPGA.

73 de F4HXN 📡

Bon trafic et bonnes expérimentations !