Débutez avec le Zynq-7000 et ZYBO/Premiers pas

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche


Après avoir installé la suite logicielle, cet exemple introductif vise à démontrer le confort que représente l'utilisation d'une architecture Zynq, au travers de l'emploi de blocs IP et de la séparation PL/PS.

Qu'est-ce qu'un bloc intellectual property (IP) ?[modifier | modifier le wikicode]

Hello World![modifier | modifier le wikicode]

Dans le cadre de ce premier exemple, nous allons utiliser le programme Hello World! fourni par Xilinx, en nous contentant d'abord de le faire fonctionner sur la carte ZYBO. Pour cela, nous allons d'abord configurer l'interface PL du matériel avec Vivado, puis nous utiliserons le SDK pour exécuter un programme sur la ZYBO.

Configuration du PL avec Vivado[modifier | modifier le wikicode]

Avant d'aller plus loin, nous allons créer un répertoire unique dans lequel nous stockerons tous nos projets. Nous vous proposons de le nommer Projets_Zynq et de le positionner :

  • sur Linux :
  • sur Windows :
  • sur Mac :

Création d'un nouveau projet[modifier | modifier le wikicode]

  1. Lancez Vivado. Dans l'onglet Quick Start de la fenêtre qui s'ouvre, cliquez sur Create Project pour afficher l'assistant de création de projet (New Project Wizard).
  2. Cliquez sur Next.
  3. Entrez un nom pour votre projet dans le champ Project name, par exemple « hello_world ». Utilisez le bouton ... pour lancer un navigateur afin de vous positionner dans le répertoire « Projets_Zynq » que nous avons créé précédemment.
  4. Vérifiez que la case Create project subdirectory est bien cochée, afin que Vivado ajoute un nouveau répertoire dédié à ce projet, puis cliquez sur Next.
  5. Cocher la case RTL Project. RTL, pour Register Transfer Level, est une méthode de description du fonctionnement d'un circuit utilisée en VHDL. Comme nous n'avons pas encore écrit de codes sources, nous pouvons également cocher la case Do not specify sources at this time. Cliquez sur Next.
  6. Afin d'utiliser la carte ZYBO, sélectionnez l'onglet Boards puis cherchez la carte ZYBO. Validez avec Next.
  7. Pour ouvrir l'environnement de développement, cliquez sur Finish.

Gestion des GPIO[modifier | modifier le wikicode]

Nous allons utiliser la PL comme un gestionnaire de General Purpose Input/Output (GPIO).

  1. Dans le Flow Navigator à gauche de l'écran, sous l'onglet IP Integrator, cliquez sur Create Block Design.
  2. La fenêtre qui s'ouvre permet de donner un nom au design nouvellement créé, par exemple « premier_design ». Cliquez sur OK'.
  3. Vivado permet de manipuler les IPs comme des blocs dans une interface graphique, à savoir l'onglet Diagram à droite de l'écran. L'IP central du design sera évidemment le PS du Zynq. Pour l'ajouter, cliquez sur l'icône Blue cross.svg Add IP, puis cherchez l'IP ZYNQ7 Processing System. Double-cliquez sur l'IP pour l'insérer dans le Diagram.
  4. Le bloc PS a besoin de liens avec le matériel embarqué sur la carte ZYBO. Plutôt que d'écrire ces liens manuellement, utilisons l'outil Bloc Automation avec le bouton Run Block Automation.
  5. Dans la fenêtre Run Block Automation qui s'ouvre, vérifiez que la case Apply Board Preset est bien cochée. Cela indiquera à Vivado d'utiliser les fichiers de contraintes propres à la carte ZYBO pour faire les liens. Validez avec OK.
  6. Le Diagram évolue avec les liens tracés automatiquement. Nous allons maintenant connecter les interrupteurs.
    1. Insérez un bloc IP AXI GPIO. Ce bloc AXI permettra d'utiliser les boutons-poussoirs (buttons, btns) et les interrupteurs (switches, sws).
    2. Doublez-cliquez sur le bloc axi_gpio_0 nouvellement créé. Sous l'onglet IP Configuration, cochez la case Enable Dual Channel. Cela permettra au bloc d'avoir deux rangées de GPIO distinctes : une première pour les interrupteurs, l'autre pour les boutons-poussoirs. Validez avec OK.
    3. Lancez la Connection Automation pour câbler le bloc. Dans la fenêtre Run Connection Automation, cochez All Automation pour effectuer tous les câblages.
    4. Cliquez sur GPIO, sous axi_gpio_0, et dans la boîte déroulante Select Board Interface choisissez l'option sws_4bits pour lier les interrupteurs avec le GPIO.
    5. Cliquez sur GPIO2, sous axi_gpio_0, et dans la boîte déroulante Select Board Interface choisissez l'option btns_4bits pour lier les boutons-poussoirs avec le GPIO2.
    6. Validez avec OK pour lancer le câblage automatique. Des blocs supplémentaires sont apparus sur le Diagram, nécessaires au fonctionnement du circuit. Remarque : plutôt que d'utiliser un AXI GPIO à deux voies, nous aurions pu aussi utiliser deux IPs AXI différents.
  7. Les interrupteurs sont connectés au PS. Nous allons maintenant connecter les LEDs, de la même façon que pour les interrupteurs.
    1. Insérez un bloc IP AXI GPIO. Ce bloc AXI permettra d'utiliser les LEDS.
    2. Cette fois, il n'est pas nécessaire d'activer les deux canaux sur le bloc. En effet, nous allons n'utiliser que les LEDs.
    3. Lancez la Connection Automation pour câbler le bloc. Dans la fenêtre Run Connection Automation, cochez All Automation pour effectuer tous les câblages.
    4. Cliquez sur GPIO, sous axi_gpio_1, et dans la boîte déroulante Select Board Interface choisissez l'option leds_4bits pour lier les interrupteurs avec le GPIO.
    5. Validez avec OK pour lancer le câblage automatique. Des blocs supplémentaires sont apparus sur le Diagram, nécessaires au fonctionnement du circuit. Remarque : en toute rigueur, nous aurions pu sauter l'étape 6.3 et effectuer tous les câblages des deux blocs GPIO en même temps.
  8. Nettoyez l'affichage du Diagram avec le bouton Reload Icon Blue.svg Regenerate Layout.
  9. Lancez la vérification du design avec le bouton Checked box.svg Validate Design (touche F6).

Le matériel est maintenant connecté au PS.

Génération du bitstream et export[modifier | modifier le wikicode]

Cette dernière étape avec Vivado va nous conduire à la génération d'un fichier VHDL puis à la génération du bitstream.

  1. Pour transformer le Diagram en code VHDL, faites un clic droit sur le design dans l'onglet Sources du Block Design, puis sélectionnez Create HDL Wrapper. Dans la fenêtre qui s'ouvre, cochez Let Vivado manage wrapper and auto-update, puis validez avec OK.
  2. Nous pouvons maintenant générer le bitstream, fichier binaire qui sera téléchargé sur la carte ZYBO.
    1. Commencez par sauvegarder le projet (menu File puis Save Block Design, Ctrl + S).
    2. Dans le Flow Navigator, lancez la synthèse VHDL avec le bouton Green Arrow Right.svg Run Synthetis sous l'onglet Synthetis. La synthèse peut prendre plusieurs minutes, suivant la configuration de votre ordinateur.
    3. Une fois la synthèse terminée, une fenêtre Synthetis successfully completed s'ouvre. Cochez la case Run Implementation et validez avec OK, afin de lancer l'implémentation.
    4. Une fois l'implémentation terminée, une fenêtre Implementation successfully completed s'ouvre. Cochez la case Generate Bitstream et validez avec OK, afin de lancer la génération du bistream.
    5. Une fois le bitstream généré, une fenêtre Bitstream Generation successfully completed s'ouvre. Cochez la case View Reports et validez avec OK. Remarque : il aurait été possible de sauter les étapes 2.2 à 2.4 en lançant directement Generate Bitstream. Vivado aurait alors proposé d'effectuer Run Synthetis, Run Implementation puis Generate Bitstream, les deux premières étapes étant indispensables à la génération du bitstream.
  3. Il ne nous reste plus qu'à exporter les fichiers générés pour le PL en direction du SDK, afin de pouvoir programmer le PS. Pour cela, dans le menu File, sélectionnez Export >> Export Hardware. Dans la fenêtre d'exportation, cochez la case Include bitstream et validez avec OK.

Programmation avec le SDK[modifier | modifier le wikicode]

Observation du résultat avec un terminal série[modifier | modifier le wikicode]

Expliquons-nous...[modifier | modifier le wikicode]