SoC Zynq — Intégration PS + PL
Comprendre l'architecture Zynq : la partie processeur (PS) et la partie FPGA (PL), leur communication via AXI, et la conception d'un système embarqué complet.
Qu'est-ce qu'un SoC ?
Un SoC (System on Chip) intègre sur une seule puce :
- Un ou plusieurs processeurs (ARM, RISC-V…)
- De la logique programmable (FPGA)
- Des périphériques (mémoire, USB, Ethernet, UART…)
La famille Zynq-7000 d'AMD/Xilinx est l'une des plus populaires dans l'industrie. Elle combine un dual-core ARM Cortex-A9 et une matrice FPGA sur le même silicium.
Architecture Zynq-7000 : PS (ARM Cortex-A9 + périphériques) connecté au PL (FPGA) via des interfaces AXI
Image à ajouter
Les deux parties du Zynq
Processing System (PS)
La partie PS est le monde logiciel :
| Élément | Détail |
|---|---|
| CPU | Dual-core ARM Cortex-A9 (jusqu'à 866 MHz) |
| Cache | L1 (32 KB) + L2 (512 KB) |
| RAM | DDR3/DDR2/LPDDR2 (connexion externe) |
| Périphériques | USB, Ethernet, UART, SPI, I2C, GPIO |
| OS | Bare-metal, FreeRTOS, Linux |
Le PS peut fonctionner indépendamment de la partie FPGA — il démarre depuis sa Flash ou sa SD card.
Programmable Logic (PL)
La partie PL est la partie FPGA classique :
- LUTs, bascules, BRAMs, DSPs
- Tout votre VHDL s'exécute ici
- Peut être reprogrammée à l'exécution (partiellement)
- Fréquences typiques : 100–300 MHz
Communication PS ↔ PL
La PS et la PL communiquent via des interfaces AXI :
| Interface | Direction | Usage |
|---|---|---|
| AXI HP (High Performance) | PS ↔ PL | Transferts DMA haute vitesse vers la RAM |
| AXI GP (General Purpose) | PS → PL | Accès aux registres de la PL par le CPU |
| AXI ACP (Accelerator Coherency Port) | PL → PS | Cache-coherent access |
| EMIO | PS ↔ PL | Extension GPIO, SPI, I2C via la PL |
Interfaces AXI entre PS et PL : AXI_GP (registres CPU→PL), AXI_HP (DMA PL→DDR), EMIO (GPIO étendu)
Image à ajouter
Créer un projet SoC dans Vivado
Étape 1 — Nouveau projet Vivado
Créez un projet RTL et sélectionnez votre carte Zynq (PYNQ-Z2, ZedBoard, Cora Z7…).
Vivado : création d'un projet avec la carte PYNQ-Z2 sélectionnée
Image à ajouter
Étape 2 — Créer le block design
Dans le panneau gauche : IP Integrator → Create Block Design.
Vivado : menu Create Block Design dans IP Integrator
Image à ajouter
Étape 3 — Ajouter le Processing System
Clic droit dans le canevas → Add IP → cherchez "Zynq7 Processing System".
Vivado Block Design : ajout du bloc ZYNQ7 Processing System
Image à ajouter
Cliquez sur "Run Block Automation" pour appliquer les contraintes de votre carte automatiquement (présets mémoire DDR, horloge…).
Vivado : Run Block Automation applique les présets de la carte PYNQ-Z2
Image à ajouter
Étape 4 — Configurer le PS
Double-cliquez sur le bloc PS pour ouvrir sa configuration :
- PS-PL Configuration : activer les interfaces AXI nécessaires (GP0, HP0…)
- Clock Configuration : régler la fréquence PL (100 MHz par défaut)
- MIO Configuration : choisir les périphériques PS activés (UART, USB…)
Vivado : fenêtre de configuration du PS Zynq — onglet PS-PL Configuration avec AXI GP0 activé
Image à ajouter
Étape 5 — Ajouter votre IP VHDL
Pour connecter votre VHDL au PS, il faut l'encapsuler dans une IP avec une interface AXI-Lite :
- Tools → Create and Package New IP
- Choisissez "AXI-Lite Slave" comme interface
- Définissez les registres AXI (lecture/écriture)
- Ajoutez votre logique VHDL dans le fichier généré
Vivado : assistant Create and Package New IP — sélection de l'interface AXI4-Lite
Image à ajouter
Étape 6 — Connecter les blocs
Après avoir ajouté votre IP dans le block design :
- Clic droit → Add IP et cherchez votre IP personnalisée
- Cliquez sur "Run Connection Automation" → Vivado relie l'AXI Interconnect automatiquement
Vivado Block Design complet : PS Zynq + AXI Interconnect + IP custom — connexions AXI visibles
Image à ajouter
Étape 7 — Générer le bitstream
- Validate Design (F6) pour vérifier les connexions
- Clic droit sur le block design → Generate Output Products
- Clic droit → Create HDL Wrapper
- Generate Bitstream
Vivado : Generate Bitstream en cours — progression de l'implémentation
Image à ajouter
Étape 8 — Exporter vers Vitis / SDK
- File → Export → Export Hardware (inclure le bitstream)
- Ouvrez Vitis (ou SDK pour les versions < 2020.1)
- Créez une application C/C++ bare-metal ou Linux
Vitis : création d'un projet C bare-metal sur la plateforme Zynq exportée
Image à ajouter
Communication CPU ↔ FPGA en pratique
Une fois le projet déployé, le CPU accède à vos registres VHDL via l'AXI-Lite :
// Bare-metal C — lecture/écriture des registres de la PL
#include "xparameters.h"
#include "xil_io.h"
// Adresse de base de votre IP (définie par xparameters.h)
#define MY_IP_BASEADDR XPAR_MY_IP_0_BASEADDR
// Écrire dans le registre 0 (offset 0x00)
Xil_Out32(MY_IP_BASEADDR + 0x00, 0xDEADBEEF);
// Lire le registre 1 (offset 0x04)
uint32_t val = Xil_In32(MY_IP_BASEADDR + 0x04);Du côté VHDL, votre IP lit/écrit ces registres via les signaux AXI-Lite générés par Vivado.
Comparaison : FPGA pur vs SoC Zynq
| Critère | FPGA pur | SoC Zynq |
|---|---|---|
| Traitement | Tout en VHDL | CPU pour le soft, FPGA pour l'accélération |
| Flexibilité | Très haute | Haute (+ OS possible) |
| Débogage | Signaux matériels | printf + ILA matériel |
| Interfaces haut niveau | À coder en VHDL | USB, Ethernet, Linux natifs |
| Temps de dev | Long | Plus court pour la partie soft |
| Cas d'usage | Traitement temps-réel pur | Co-design logiciel/matériel |
Points clés à retenir
- Le Zynq sépare PS (ARM, logiciel) et PL (FPGA, matériel)
- La communication PS ↔ PL passe par des interfaces AXI
- Vivado Block Design est l'outil pour assembler visuellement les blocs
- Votre code VHDL devient une IP encapsulée accessible depuis le CPU
- Le flot complet : VHDL → Package IP → Block Design → Bitstream → Vitis/SDK