IP AXI et pilote personnalisé
Créer un périphérique AXI-Lite, définir sa carte de registres, le packager puis intégrer un pilote dans le BSP.
Partir d'une interface stable
Une IP personnalisée est un bloc matériel réutilisable conçu pour un besoin précis. Son contrat comprend les ports, les paramètres, la carte de registres, le comportement du reset et les erreurs possibles.
Pour appliquer la méthode, nous créons dans ce cours une IP appelée LED_Controller. Elle reçoit des commandes par AXI-Lite et pilote un bus de LED. Après le lancement de Create and Package IP, Vivado génère le squelette de l'esclave AXI-Lite et de ses registres. Nous ajoutons ensuite la logique fonctionnelle dans un module séparé.
Carte de registres
Une carte courte suffit pour un premier périphérique.
| Offset | Nom | Accès | Rôle |
|---|---|---|---|
0x00 | DATA | Lecture et écriture | Valeur affichée |
0x04 | CONTROL | Lecture et écriture | Activation et mode |
0x08 | STATUS | Lecture | État du périphérique |
0x0C | VERSION | Lecture | Version de l'interface |
Les bits réservés doivent avoir une valeur définie à la lecture. Une écriture partielle doit respecter WSTRB. Chaque bit de ce masque indique quel octet de WDATA est réellement valide. Le reset doit ramener les registres à une valeur documentée.
for byte_index in 0 to C_S_AXI_DATA_WIDTH / 8 - 1 loop
if S_AXI_WSTRB(byte_index) = '1' then
slv_reg0(byte_index * 8 + 7 downto byte_index * 8) <=
S_AXI_WDATA(byte_index * 8 + 7 downto byte_index * 8);
end if;
end loop;Le nom des signaux AXI doit respecter les conventions du wizard. Elles permettent à l'outil d'identifier automatiquement l'interface.
Séparer AXI et logique métier
Le wrapper AXI, c'est-à-dire la couche d'interface autour de la logique utile, gère les canaux de lecture et d'écriture. Le contrôleur de LED reste ainsi indépendant du protocole.
led_controller_i : entity work.LED_Controller
generic map (
LED_WIDTH => 8
)
port map (
clk => S_AXI_ACLK,
resetn => S_AXI_ARESETN,
value_in => slv_reg0(7 downto 0),
leds_out => LEDs
);Une IP réutilisable expose les paramètres utiles dans son fichier de packaging. Les paramètres internes qui ne changent jamais ne doivent pas encombrer l'interface utilisateur.
Packager et réutiliser
Le wizard crée un projet temporaire pour vérifier et packager l'IP. Le paquet rejoint ensuite un dépôt IP référencé par le projet principal. Après une modification, il faut incrémenter la version ou mettre à jour le catalogue puis régénérer les produits de sortie.
Les étapes de vérification comprennent l'analyse des ports, la validation des adresses, la synthèse du module et un test de lecture écriture. L'implémentation finale se fait dans le projet qui instancie l'IP.
Concevoir le pilote
Un pilote standalone peut comporter deux niveaux. Le niveau 0 contient les offsets et les macros d'accès. Le niveau 1 définit une instance et les services de haut niveau.
#define XLED_DATA_OFFSET 0x00U
#define XLED_CONTROL_OFFSET 0x04U
static inline void XLed_Write(UINTPTR base, u32 value)
{
Xil_Out32(base + XLED_DATA_OFFSET, value);
}typedef struct {
UINTPTR base_address;
u32 is_ready;
} XLed;
int XLed_Initialize(XLed *instance, UINTPTR base)
{
if (instance == NULL) {
return XST_FAILURE;
}
instance->base_address = base;
instance->is_ready = 1U;
return XST_SUCCESS;
}Une structure classique utilise un répertoire src pour le code et un répertoire data pour les métadonnées. Les flots Vitis récents s'appuient davantage sur les métadonnées de composant et la génération de plateforme, mais le BSP doit toujours connaître le nom compatible, les adresses et les dépendances.
Test autonome
Une fonction SelfTest peut écrire plusieurs motifs, relire les registres et restaurer l'état initial. Elle ne peut pas prouver seule que les broches physiques fonctionnent. Un vrai test de production ajoute une boucle de retour ou une observation externe.
Le test doit aussi vérifier les valeurs de reset, les écritures partielles et les offsets non valides. Un périphérique qui fonctionne uniquement avec des écritures de 32 bits alignées doit le documenter.
Références officielles
Les exemples de structure de pilote se trouvent dans le dépôt officiel embeddedsw. Le catalogue des guides Vivado référence UG1118 pour la création et le packaging d'IP dans la page Vivado Design Suite User and Reference Guides.
À retenir
Une IP AXI est un contrat matériel et logiciel. La carte de registres, le reset et les écritures partielles doivent être définis avant le pilote. Le wrapper gère AXI. La logique métier reste séparée. Le BSP fournit au logiciel les adresses et l'interface de pilotage.
Tester mes connaissances - Quiz du chapitre