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émentDétail
CPUDual-core ARM Cortex-A9 (jusqu'à 866 MHz)
CacheL1 (32 KB) + L2 (512 KB)
RAMDDR3/DDR2/LPDDR2 (connexion externe)
PériphériquesUSB, Ethernet, UART, SPI, I2C, GPIO
OSBare-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 :

InterfaceDirectionUsage
AXI HP (High Performance)PS ↔ PLTransferts DMA haute vitesse vers la RAM
AXI GP (General Purpose)PS → PLAccès aux registres de la PL par le CPU
AXI ACP (Accelerator Coherency Port)PL → PSCache-coherent access
EMIOPS ↔ PLExtension 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 :

  1. Tools → Create and Package New IP
  2. Choisissez "AXI-Lite Slave" comme interface
  3. Définissez les registres AXI (lecture/écriture)
  4. 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 :

  1. Clic droit → Add IP et cherchez votre IP personnalisée
  2. 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

  1. Validate Design (F6) pour vérifier les connexions
  2. Clic droit sur le block design → Generate Output Products
  3. Clic droit → Create HDL Wrapper
  4. Generate Bitstream

Vivado : Generate Bitstream en cours — progression de l'implémentation

Image à ajouter


Étape 8 — Exporter vers Vitis / SDK

  1. File → Export → Export Hardware (inclure le bitstream)
  2. Ouvrez Vitis (ou SDK pour les versions < 2020.1)
  3. 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èreFPGA purSoC Zynq
TraitementTout en VHDLCPU pour le soft, FPGA pour l'accélération
FlexibilitéTrès hauteHaute (+ OS possible)
DébogageSignaux matérielsprintf + ILA matériel
Interfaces haut niveauÀ coder en VHDLUSB, Ethernet, Linux natifs
Temps de devLongPlus court pour la partie soft
Cas d'usageTraitement temps-réel purCo-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