Intégration d un processeur spécialisé et de la logique Programmable au sein d un FPGA 1) Problématique et objectifs L objectif de cette séance est d intégrer un processeur spécialisé (PS) avec la logique programmable (PL) sur un FPGA. Le processeur spécialisé sur le Kit ATLYS SPARTAN 6 est baptisé Microblaze (voir cours sur les SOPC) et reste façonnable. On donne le symbole ci-dessous du PS (le system top). La suite logicielle software development kit SDK nous permettra de développer la partie software du PS. La partie PL ne sera pas modélisée en VHDL, on utilisera des IPCORE pré-câblés comme le clocking wizard et l IPCORE counter. L IPCORE counter sera simplement un compteur de 2 bits avec une horloge CLK et un reset synchrone sclr. Le FPGA sera connecté à 2 LEDS qui seront l image binaire des sorties du compteur LED0 et LED1 du kit. L interrupteur SW1 permettra de générer le signal d horloge. Sw0 actif au 0 logique nous permettra de réinitialiser le compteur via la broche sclr. PAGE 1
2) Méthodologie La méthodologie est la suivante : XPS Xilinx platform studio Définir la plateforme du système microprogrammé CPU microblaze ISE Integrated system editor - Créez notre schematic sous ISE afin d intégrer notre CPU des blocs de fonction numérique écrite en VHDL et des IPCORE propriétaires le tout synthétisé sur un FPGA -Simulez avec lsim le comportement du système - Programmez avec impact la partie matérielle du FPGA SDK software development kit Développez en langage C notre programme pour le cpu microblaze et programmez la partie logicielle FPGA On aura besoin de créer un répertoire projet et trois sous-répertoires pour nos 3 étapes : ISE pour l intégration RTL VHDL XPS pour la création et la configuration du processeur spécialisé PS SDK pour le développement logiciel du SOPC PAGE 2
3) Partie 1 :définir et configurer le processeur spécialisé Lancez le logiciel XPS On définit par la suite un board support package (BSB) qui sera fonction de l architecture matérielle du FPGA et du kit ATLYS La Prise en compte matériel du board support package de la carte ATLYS XILINX DIGILENT PAGE 3
La configuration du PS et les IPCORE intégrables du BSP s effectue sur la fenêtre suivante : PAGE 4
Cliquez sur next On peut intégrer dans le PS, des IPCORE compatibles avec le CPU microblaze. La fenêtre de droite nous donne tous les IPCORE qui constituent l architecture actuelle du PS Dans notre application on va Intégrer dans le PS, l IPCORE gpio afin de piloter notre compteur et de récupérer des consignes sur SW0 et SW1. On reliera par la suite le processeur spécialisé via le GPIO à l IPCORE compteur et aux interrupteurs SW0 et SW1 comme ceci est indiqué dans la figure suivante : PAGE 5
L Intégration de l IPCORE gpio dans le PS se fait par le bus AXI4lite du CPU Microblaze Le paramétrage de l IPCORE gpio a lieu par la suite : PAGE 6
En cliquant sur system on peut définir la plage d adresse du périphérique dans la cartographie mémoire du CPU Microblaze. Si on laisse par défaut ces adresses le logiciel SDK définira automatiquement une plage d adresse libre pour le périphérique gpio. La définition du choix de la plage d adresse n est donc pas obligatoire. En cliquant sur + sur la figure on voit apparaitre les broches d entrées sorties du périphériques gpio, coté gauche le bus AXI4lite et coté droit le bus du gpio qu il va falloir configurer par la suite. PAGE 7
On peut changez le nom de note périphérique gpio et on aperçoit la connexion du périphérique au bus AXI4LITE du PS: PAGE 8
On doit connecter les broches de sorties et d entrées du GPIO sur les broches externes du CPU microblaze : Pour le port de sortie du GPIO : PAGE 9
Pour le port d entrée du GPIO : On peut faire apparaitre la cartographie mémoire du CPU Microblaze qui nous sera utilie lors du développement logicielle sur SDK PAGE 10
On peut lancer une vérification architecturale du PS en cliquant sur run DRC (design rule check) Mais en fait, il y a un bug. Sur l axi_gpio, les ports GPIO_IO et GPIO2_IO sont restés en l air alors qu ils auraient dû être supprimés. Si vous faites un DRC, il y a deux erreurs. Pour corriger ce bug, il faut éditer le fichier system.mhs qui contient toutes les informations concernant le PS. Il faut faire apparaitre l onglet «Project» puis double cliquez sur le fichier : PAGE 11
Lancez à nouveau un DRC (design rule check ) et Sauvegardez le projet A ce stade notre processeur spécialisé a été façonné, on va donc intégrer ce PS dans un environnement matériel plus complexe sous ISE PAGE 12
4) Partie 2 : Intégration matérielle sous ISE Intégration PSOC 06/02/2014 Lancez le logiciel ISE qui traite les FPGA du type VIRTEX, SPARTAN, ZINQ, ARTIX. Créez un nouveau projet sur ISE PAGE 13
Comme vu lors des TPS VHDL, choisir notre FPGA de la carte ATLYS : Cliquez sur finish PAGE 14
Associez le système CPU Microblaze à notre projet Intégration PSOC 06/02/2014 Naviguez vers le dossier XPS PAGE 15
Générez le code source VHDL faisant apparaitre l entité du CPU Microblaze On va modifier l entité afin de faire apparaitre nos broches d entrée-sorties qui nous permettront de nous connecter au compteur et aux interrupteurs SW0 et SW1 PAGE 16
En sélectionnant system_top on peut vérifier la syntaxe VHDL du module CPU en double cliquant sur check syntax On doit par la suite intégrer l IPCORE compteur En sélectionnant system_top on peut vérifier la syntaxe VHDL du module CPU par check syntax PAGE 17
PAGE 18
On va paramétrer le compteur On intégre l IPCORE du type clocking wizard PAGE 19
Suivre la procédure vue lors des TPS VHDL pour produire une horloge à 100MHz sans entrée RESET et LOCKED On va créer un symbole pour le cœur de CPU Microblaze PAGE 20
On verra par la suite que le symbole créé du CPU microblaze aura la forme suivante : PAGE 21
Nos différentes entités (CPU, CLOCKING, compteur) seront reliées ensemble sur un top schematic, on va donc créer un top schematic PAGE 22
Complétez alors le schéma PAGE 23
Le schéma final aura l aspect suivant et permettra d intégrer dans notre FPGA, deux IPCORE préfabriqués (PL), et un PS CPU microblaze Pour associer les broches aux broches externes du FPGA, deux possibilités s offrent à nous : Complétez directement un fichier de contrainte.ucf en maitrisant la syntaxe Se servir du logiciel plan ahead pour établir ce fichier de contrainte Sélectionner implementation Contraints file PAGE 24
PAGE 25
Le fichier top_schema.ucf est créé automatiquement PAGE 26
Il nous reste à programmer matériellement et façonner notre FPGA (voir la procédure lors des TPs VHDL). Afin de développer le logiciel du CPU microblaze, double cliquez sur export hardware to sdk sans l exportation du ficher de programmation matérielle bit PAGE 27
5) Développement logiciel en langage C du processeur spécialisé Le lancement du logicielle SDK eclipse s effectue automatiquement SDK (software development kit) PAGE 28
Le BSP board support package a été créé par XPS PAGE 29
Modifiez le fichier source en C afin qu il réponde à notre application. PAGE 30
#include <stdio.h> #include "platform.h" //#include <sleep.h> #include "xparameters.h" #include "xgpio.h" void print(char *str); void usleep(unsigned int useconds); int main() { int Status, i; u32 Data_out, Data_in; XGpio Gpio; /* The Instance of the GPIO Driver */ init_platform(); xil_printf("essai tp10\n"); /* * Initialize the GPIO driver */ Status = XGpio_Initialize(&Gpio, 0); if (Status!= XST_SUCCESS) { return XST_FAILURE; } /* * GPIO channel 2 = en entrée * */ XGpio_SetDataDirection(&Gpio, 2, 0xffffffff); /* * GPIO channel 1 = sortie * */ XGpio_SetDataDirection(&Gpio, 1, 0x00000000); Data_out = 0; Data_in = XGpio_DiscreteRead(&Gpio, 2); xil_printf("datain = %x\n", Data_in);// etat des ports while(1){ Data_in = XGpio_DiscreteRead(&Gpio, 2);// lecture des ports entrées xil_printf("datain = %x\n", Data_in); if (Data_in==0x01)// fonctionnement libre du compteur for (i = 0; i < 4; i++) { // les 8 bits faibles de data_out sont // envoyés sur channel 2 Data_out=0x00; XGpio_DiscreteWrite(&Gpio, 1, Data_out); usleep(1000000); Data_out=0x01;// XGpio_DiscreteWrite(&Gpio, 1, Data_out); //Data_out++; // lecture dans l'ordre de SW5, SW7, SW12-1, SW12-2 //Data_in = XGpio_DiscreteRead(&Gpio, 1); //xil_printf("datain = %x\n", Data_in); } else PAGE 31
} { Data_out=0x02; XGpio_DiscreteWrite(&Gpio, 1, Data_out); } } return 0; void usleep(unsigned int useconds) { int i,j; for (j=0;j<useconds;j++) for (i=0;i<15;i++) asm("nop"); } La compilation se fait logiquement automatiquement quand on sauvegarde l environnement File save project PAGE 32
Cliquez droit puis sur new pour lancer la configuration Intégration PSOC 06/02/2014 La page principale apparait : PAGE 33
Définir le comportement de la carte ATLYS après la fin de configuration On peut émuler la liaison série RS232 du kit FPGA sur la prise usb/uart (port com8 ici) Cliquez sur run dans le menu le fichier de programmation est chargé dans la mémoire vive du kit FPGA et l application matérielle et logicielle doivent se lancer PAGE 34