« Very High Speed Integrated Circuit Hardware Description Language/Le MicroBlaze » : différence entre les versions

Contenu supprimé Contenu ajouté
m Robot : Remplacement de texte automatisé (-\n(==={0,3})(?: *)([^\n=]+)(?: *)\1(?: *)\n +\n\1 \2 \1\n)
m Robot : Remplacement de texte automatisé (-(<|</)source([ \t>]) +\1syntaxhighlight\2)
Ligne 106 :
| titre = Ce que l'environnement XPS vous cache
| contenu =
<sourcesyntaxhighlight lang="text">
xbash -q -c "cd /cygdrive/d/MBProjet/; /usr/bin/make -f demoMB5.make bits; exit;" started...
****************************************************
Ligne 142 :
# trce -e 3 -xml demoMB5.twx demoMB5.ncd demoMB5.pcf
#----------------------------------------------#
</syntaxhighlight>
</source>
}}
 
Ligne 190 :
| contenu =
La compilation se fait par la commande :
<sourcesyntaxhighlight lang="bash">
make all
 
Ligne 200 :
 
Finished building: TestApp_Memory.elf
</syntaxhighlight>
</source>
 
La mise à jour du logiciel dans le cœur se fait par une commande "data2mem" déjà évoquée dans un [[../Programmer in Situ et déboguer#Avant de commencer.2C un petit détour par data2mem|chapitre précédent]]. Si mon projet s’appelle demoMB4 alors la commande est :
 
<sourcesyntaxhighlight lang="bash">
data2mem -bm "implementation/demoMB4_bd" -bt "implementation/demoMB4.bit" -bd
</syntaxhighlight>
</source>
 
Son objectif est d'écrire directement dans le fichier .bit pour initialiser la BRAM.
Ligne 218 :
 
Nos interrupteurs d'entrée sont reliées à un port. Notre problème est donc d'apprendre comment lire le PORT.
<sourcesyntaxhighlight lang="C">
//****** C MicroBlaze *******
#include "xio.h" // n’est pas présent par défaut
Ligne 225 :
//....
data = XIo_In32(XPAR_DIP_SWITCHES_8BIT_BASEADDR);
</syntaxhighlight>
</source>
La fonction qui permet de lire un PORT est donc XIo_In32 et elle demande un nom majuscule comme paramètre. Ce nom est à trouver quelque part. C'est le fichier xparameters.h qui contient ces définitions importantes et il est facile à trouver et à lire avec le SDK. Voici les détails de ce qui nous intéresse :
<sourcesyntaxhighlight lang="C">
//****** Extrait du fichier xparameters.h *******
 
Ligne 236 :
#define XPAR_DIP_SWITCHES_8BIT_INTERRUPT_PRESENT 0
#define XPAR_DIP_SWITCHES_8BIT_IS_DUAL 0
</syntaxhighlight>
</source>
 
En fait vous n'avez pas besoin de connaître la valeur de l'adresse de base (ici 0x81420000) mais par contre il vous faut connaître comment la désigner.
Ligne 243 :
Allumer des [[w:Diode_électroluminescente|led]]s est l'opération inverse de la lecture de valeurs à partir des interrupteurs. Cela veut dire que ce qui était entrée devient maintenant sortie. Sans grande surprise maintenant, la fonction qui s'occupe des sorties s’appelle "XIo_Out32".
 
<sourcesyntaxhighlight lang="C">
//****** C MicroBlaze *******
#include "xio.h" // n’est pas présent par défaut
Ligne 250 :
//....
XIo_Out32(XPAR_LEDS_8BIT_BASEADDR, data);
</syntaxhighlight>
</source>
 
Encore une fois cette constante à rallonge est à trouver dans le fichier xparameters.h
À noter que les LEDs sont câblées à l’envers : le [[w:Bit_de_poids_faible|poids faible]] de la variable data allumera la led de gauche (qui porte le numéro 7). Voici, encore une fois, comment j’ai trouvé le nom du premier paramètre, en examinant le fichier d'entête :
 
<sourcesyntaxhighlight lang="C">
//****** Extraits du fichier xparameters.h *******
/* Definitions for peripheral LEDS_8BIT */
Ligne 264 :
#define XPAR_LEDS_8BIT_INTERRUPT_PRESENT 0
#define XPAR_LEDS_8BIT_IS_DUAL 0
</syntaxhighlight>
</source>
 
==== Allumer des afficheurs sept segments ====
Ligne 270 :
Notre carte est dotée de quatre [[w:Afficheur_7_segments|afficheurs sept segments]] qu’il nous faut apprendre à utiliser. Bon commençons par chercher l'adresse, toujours avec le fichier d'entête :
 
<sourcesyntaxhighlight lang="C">
//****** Extraits du fichier xparameters.h *******
//* Definitions for peripheral LED_7SEGMENT */
Ligne 279 :
#define XPAR_LED_7SEGMENT_INTERRUPT_PRESENT 0
#define XPAR_LED_7SEGMENT_IS_DUAL 0
</syntaxhighlight>
</source>
 
Mais les choses se compliquent ensuite car vous devez envoyer 8 bits (pour les sept segments et le point) et quatre bits ensuite pour sélectionner un afficheur.
Ligne 290 :
Voici donc un bout de code capable d'afficher une valeur hexadécimale sur un afficheur sept segments :
 
<sourcesyntaxhighlight lang="C">
#include "xio.h"
//....
Ligne 299 :
//....
XIo_Out32(XPAR_LED_7SEGMENT_BASEADDR, t[data&0x000F]<<5|0x1E);
</syntaxhighlight>
</source>
 
Il est important pour le lecteur d'essayer de comprendre ce code.
Ligne 393 :
Vous devez chercher dans ce fichier l'entité qui s’appelle myleds8 puis la partie PORT de cette entité et ajouter dans la partie faite pour cela votre sortie qui s’appelle leds8 ici :
 
<sourcesyntaxhighlight lang="VHDL">
port
(
Ligne 405 :
SPLB_Clk : in std_logic;
-- ....
</syntaxhighlight>
</source>
 
Vous devez connecter cette sortie au bon composant. Il y en a deux et c’est le deuxième qui a une entité "user_logic".
 
<sourcesyntaxhighlight lang="VHDL">
------------------------------------------
-- instantiate User Logic
Ligne 433 :
Bus2IP_Reset => ipif_Bus2IP_Reset,
-- ......
</syntaxhighlight>
</source>
 
où l’on a ajouté que leds8 est relié à leds8. Mais "user_logic" se trouve dans le deuxième fichier et n'a pas cette sortie pour le moment.
Ligne 441 :
On commence par ajouter la sortie dans l'entité :
 
<sourcesyntaxhighlight lang="VHDL">
entity user_logic is
generic
Ligne 476 :
-- DO NOT EDIT ABOVE THIS LINE ---------------------
);
</syntaxhighlight>
</source>
 
Maintenant, il va nous falloir relier tout le monde. Ceci est fait en modifiant la fin de l'architecture (regardez de près l'extrait donné ci-dessous, il finit par le "END" de l'architecture) :
 
<sourcesyntaxhighlight lang="VHDL">
------------------------------------------
-- Example code to drive IP to Bus signals
Ligne 495 :
 
end IMP;
</syntaxhighlight>
</source>
 
{{remarque
Ligne 545 :
 
Pour trouver le nom de la sortie véritable à utiliser dans le fichier ucf il vous faudra lire le fichier *.mhs correspondant à votre projet. Pour nous, nous trouvons l'information cherchée au début du fichier :
<sourcesyntaxhighlight lang="text">
###############################################################################
PARAMETER VERSION = 2.1.0
Ligne 566 :
PORT myleds8_0_leds8_pin = myleds8_0_leds8, DIR = O, VEC = [7:0]
PORT ExternalPort_0 = net_ExternalPort_0, DIR = O
</syntaxhighlight>
</source>
 
qui nous dit que les noms que nous devrons utiliser dans le fichier ucf sont "myleds8_0_leds8_pin" !!!! Nous y avons mis quelques points d'exclamation car ce détail nous a bloqué plusieurs heures. Eh bien oui c’est plus facile si l’on vous dit où trouver l'information !
Ligne 572 :
Nous pouvons maintenant modifier le fichier ucf comme suit :
 
<sourcesyntaxhighlight lang="text">
....
#### Module LEDs_8Bit constraints
Ligne 594 :
Net myleds8_0_leds8_pin<7> LOC=p11;
....
</syntaxhighlight>
</source>
 
Reste maintenant à utiliser le périphérique.
Ligne 602 :
Ici notre périphérique est tellement simple qu’il est facile à programmer. Voici un extrait d'un code possible :
 
<sourcesyntaxhighlight lang="c">
// Located in: microblaze_0/include/xparameters.h
#include "xparameters.h"
Ligne 636 :
print("-- Entering main() --\r\n");
// La suite est coupée
</syntaxhighlight>
</source>
 
Ce programme utilise directement "XIo_Out32" sans utiliser la librairie qui est faite en même temps que le projet.
Ligne 688 :
==== Connexion du périphérique et VHDL ====
Voici des extraits VHDL qui montrent le travail réalisé. On ajoute d’abord les sorties au périphérique :
<sourcesyntaxhighlight lang="VHDL">
entity vgacassbriqu is
generic
Ligne 724 :
SPLB_Rst : in std_logic;
.....
</syntaxhighlight>
</source>
Toujours dans le même fichier on connecte maintenant :
<sourcesyntaxhighlight lang="VHDL">
------------------------------------------
-- instantiate User Logic
Ligne 753 :
Bus2IP_Clk => ipif_Bus2IP_Clk,
-- .............
</syntaxhighlight>
</source>
On ajoute ensuite les sorties à l'entité usr_logic
<sourcesyntaxhighlight lang="VHDL">
entity user_logic is
generic
Ligne 779 :
-- Bus protocol ports, do not add to or delete
Bus2IP_Clk : in std_logic;
</syntaxhighlight>
</source>
Et enfin on connecte tout le monde comme ceci :
<sourcesyntaxhighlight lang="VHDL">
------------------------------------------
-- Example code to drive IP to Bus signals
Ligne 822 :
end IMP;
</syntaxhighlight>
</source>
Après cela il suffit de connecter le périphérique en ajoutant celui-ci dans notre projet et en ajoutant les sorties VGA dans le fichier ucf :
<pre>
Ligne 839 :
Le fichier usr_logic.vhd est généré automatiquement lors de la création du périphérique. Mais il est modifié comme suit.
{{Boîte déroulante|titre=Solution pour "usr_logic.vhd" modifié|contenu=
<sourcesyntaxhighlight lang="vhdl">
------------------------------------------------------------------------------
-- user_logic.vhd - entity/architecture pair
Ligne 1 521 :
end a_ligne8briques;
</syntaxhighlight>
</source>
}}
 
Ligne 1 527 :
Vgacassbrik est le nom de mon périphérique. Ainsi ce fichier est généré automatiquement mais modifié comme suit.
{{Boîte déroulante|titre=Solutions pour le périphérique|contenu=
<sourcesyntaxhighlight lang="vhdl">
------------------------------------------------------------------------------
-- vgacassbrik.vhd - entity/architecture pair
Ligne 1 947 :
 
end IMP;
</syntaxhighlight>
</source>
}}
=== Développement du logiciel ===
Ligne 1 956 :
 
Voici en attendant un petit bout de programme C qui fait bouger la balle :
<sourcesyntaxhighlight lang="c">
#include "xparameters.h"
#include "xio.h"
Ligne 1 982 :
return 0;
}
</syntaxhighlight>
</source>
La boucle d'attente fonctionne correctement : elle n'a pas été optimisée par le compilateur.
{{remarque|contenu=Nos étudiants utilisent une version 9.2 sous XP sous MAC et pour une raison que nous ignorons la boucle d'attente a été optimisée !!! Nous avons été obligé d'ajouter une instruction de sortie de PORT "XIo_Out32" pour éviter cette optimisation !!!
Ligne 1 993 :
La solution présentée ci-dessous gère un certain nombre de niveaux, le changement de pente de trajectoire et semble tenir dans un peu plus de {{Unité|4|{{Abréviation|ko|kilooctet}}}}. Il y a certainement encore bien des choses à développer d'un point de vue logiciel mais ce sera fait un peu plus tard.
{{Solution|contenu=
<sourcesyntaxhighlight lang="c">
// Welcome to Xilinx Platform Studio SDK !
//
Ligne 2 196 :
XIo_Out32(XPAR_VGACASSBRIK_0_BASEADDR,posXY);
}
</syntaxhighlight>
</source>
Nous avons regroupé le calcul de rebond sur les deux murs de briques dans un seul sous-programme dans [[../Exercices/Autres projets pour ATMEL ATMega8#Projet pour l.27année universitaire 2011.2F2012|un autre projet]], ce qui n'a pas été fait ici. Par contre le lecteur attentif aura certainement remarqué la présence d'offset dans les instructions "XIo_Out32". Cela est dû à un manque de savoir faire de l'auteur : le SDK utilisait le mauvais xparameters.h et nous n'avons pas trouvé pourquoi ! Il est donc très probable que pour réaliser ce projet par vous-même, vous soyez amener à retirer un certain nombre d'offset.