TP Integration Num FPGA V1.7
TP Integration Num FPGA V1.7
TP Integration Num FPGA V1.7
fr
Année
2A - S8
Module
NRJ B4 Intégration Numérique
https://arche.univ-lorraine.fr/course/view.php?id=47701
Enseignants
L. Baghli, A. Lahmadi, J.P. Martin
TP partie 2 : FPGA
Version 1.6 – 09/06/2021
Objectifs
Acquérir les éléments de connaissance requis pour réaliser l’intégration des lois de commande des
systèmes électriques dans des circuits numériques programmés (DSP) et configurables (FPGA).
Apprendre à utiliser Quartus II. Configurer les éléments logiques d’un FPGA et implémenter des circuits
en utilisant VHDL. Implémenter une PWM. Utiliser l’ADC de la carte DE1 SoC.
Même application finale : Régulation de courant dans la charge RL.
Séances (6 x 4h)
TP 1 : Introduction à Code Composer et DSP F28069M, Timer et ISR
TP 2 : PWM et ADC sur DSC
TP 3 : PWM, hacheur et régulation de courant sur DSC
TP 4 : Introduction à Quartus II, VHDL, GPIO
TP 5 : PWM et ADC sur FPGA
TP 6 : PWM, hacheur et régulation de courant sur FPGA
Outils
Hardware
Digital Signal Controller (DSC) Texas Instruments LaunchPad F28069M
Carte d'adaptation CMD
Boitier puissance contenant : Hacheur 4 quadrants, mesure de courant, charge RL
Carte FPGA ALTERA DE1-SoC Cyclone V 5CSEMA5F31C6
Alimentation 15V 5A, Oscilloscope, sonde externe de courant
Software
TI Code Composer Studio 10.x, C2000Ware_3_04, BIOS 6.x
Quartus II
Voir l'Annexe pour la préparation des TP avant la séance.
Manipulations
Logiciel permettant de générer un circuit logique : Quartus II
Langage de description : VHDL
Circuit FPGA cible : Cyclone V 5CSEMA5F31C6
TP 4.1
La prise en main du logiciel Quartus II développé par la société ALTERA (intelFPGA) est basée sur le
tutorial Quartus_II_Introduction_v15.0.pdf. Le fichier associé à la version 15.0 est disponible sur
arche.
Réaliser votre premier circuit en suivant les différentes étapes du tutorial. La description du circuit
utilisé pour ce tutorial sera le circuit additionneur complet pour deux nombres 1 bit. La description
VHDL est indiquée ci-dessous.
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;
ENTITY tp1 IS
PORT(
a,b,cin : in std_logic_vector(0 downto 0);
s,cout : out std_logic);
END tp1;
Pour l’implantation sur la carte DE1-SOC, les broches suivantes sont utilisées :
TP 4.2
Réaliser en schématique un additionneur à retenue propagée de deux nombres a et b de 4 bits à partir
de l'additionneur complet précédant en intégrant les indicateurs de type Carry (C) et Overflow (OV).
Justifier la structure choisie.
Pour réaliser ce circuit, vous devez générer un nouveau projet (par exemple tp12) dans un répertoire
spécifique et coller le fichier vhdl de la partie TP1.1, sans changer le nom.
Créez un fichier Blog Diagram/Schematic file et sauvegardez le tp12.bdf (nom du circuit principal de
votre projet tp12)
TP 4.3a
Reprendre la question de l'exercice 2 en synthétisant cette fois ci les circuits logiques à l'aide d'une
description VHDL avec instanciation et génération (slide 113).
Valider le fonctionnement par simulation.
TP 4.3b
Modifier le circuit pour effectuer une addition lorsqu’un signal cmd est à 0 et une soustraction lorsque
cmd est à 1. Une entrée "GENERIC" permettant de définir la taille des nombres devra être implantée.
Valider le fonctionnement par simulation.
Visualiser à l'aide de "Netlist Viewers" dans le menu "Tools" le circuit (Register-Transfer Level : RTL)
obtenu et indiquer les ressources matérielles utilisées ainsi que le temps de propagation maximal de
ce circuit (via Quartus II - TimeQuest Timing Analyzer) lorsque les nombres a et b sont codés sur 16
bits.
TP 4.4
Réaliser en vhdl un additionneur/soustracteur de deux nombres 16 bits en utilisant la librairie de
modules paramétrés (LPM). Comparer les ressources nécessaires et le temps de propagation obtenu
avec ce type de circuit et l’additionneur/soustracteur à retenue propagée réaliser dans l’exercice 3.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY lpm;
USE lpm.all;
ENTITY addsub_lpm IS
GENERIC(N : integer:= 16);
PORT(
cmd_add_sub: IN STD_LOGIC ;
Cin: IN STD_LOGIC ;
Ain,Bin: IN STD_LOGIC_VECTOR (N-1 DOWNTO 0);
Cout,OVout : OUT STD_LOGIC ;
Sout: OUT STD_LOGIC_VECTOR (N-1 DOWNTO 0));
END addsub_lpm;
Indiquer les ressources matérielles utilisées (Logic utilization (in ALMs) dans Flow Summary) ainsi le
temps de propagation maximal de ce circuit (via Quartus II - TimeQuest Timing Analyzer) lorsque les
nombres sont sur 16 bits.
TP 4.5
Réaliser en vhdl un multiplieur de deux nombres 16 bits en utilisant la librairie de modules paramétrés
(LPM). Les nombres d’entrées et de sorties seront codés au format Q1.15.
References
Configuration des GPIO page 28 du DE1-SoC_User_manual.pdf
Voir Annexes
Nous avons déjà défini les notions de PWM et d’ADC dans la série de TP du DSC F28069M. Nous allons
voir comment implémenter les mêmes concepts avec la cible (target) DE1 SoC.
Les LED de l'afficheur Hex3 sont électriquement connectées au circuit FPGA comme précisé sur la
figure ci-dessous.
Les broches associées à chaque segment sont indiquées dans le fichier DE1-SoC_User_Manual.pdf à la
page 28.
entity affichage_7seg is
port(
valeur : in std_logic_vector(3 downto 0);
seg : out std_logic_vector(6 downto 0));
end affichage_7seg;
TP 5.2 Compteur-décompteur
Dans cette partie, copiez le contenu du fichier tp5_2.zip dans un répertoire nommé complet.
Ouvrez le projet.
Fonctionnement de l’ADC :
L’ADC de la carte est un LTC2308 de 12 bits qui communique via la liaison série synchrone SPI. Ce
protocole est implémenté dans le fichier adc_ltc2308.v que nous vous fournissons.
Les fichiers Verilog ont une syntaxe proche du langage C. Le début du fichier définit le module et
déclare les entrées/sorties :
module adc_ltc2308(
clk, // max 40 MHz
measure_start,
Imes_done, Iref_done,
Imes_dataread, Iref_dataread,
// adc interface
ADC_CONVST,
ADC_SCK,
ADC_SDI,
ADC_SDO,
EOC
);
input clk;
input measure_start;
output reg Imes_done;
output reg Iref_done;
output EOC;
output reg [11:0] Imes_dataread;
output reg [11:0] Iref_dataread;
output ADC_CONVST;
output ADC_SCK;
output reg ADC_SDI;
input ADC_SDO;
Le SPI comporte 2 lignes de données (communication full duplex) : SDI (MOSI : Master Output, Slave
Input) et SDO (MISO : Master Input, Slave Output), une SCK (CLK) imposée par le master (FPGA) au
slave (ADC LTC2308) et un signal de lancement de conversion CONVST. Une SPI classique a un /CS (Chip
Select), il est remplacé ici par CONVST et l’arrêt d’envoi du signal SCK.
La particularité de ce composant est que la configuration est envoyée pour la prochaine conversion.
C’est-à-dire que pendant qu’on envoie la configuration (6 bits) [MSB S/D, O/S, S1, S0, UNI, SLP LSB], on
récupère sur SDO (MISO) les données de la précédente conversion.
On prépare donc le composant à nous envoyer les données de conversion l’une après l’autre. On utilise
les voies : ADC_IN1 et ADC_IN2
Iref : ADC_IN1 [3] Imes : ADC_IN2 [4]
Déterminez la configuration qu’il faut pour ces voies et comparez avec le code du fichier (extrait ci-
dessous).
Voici un chronogramme réel de notre application. Calculez la durée complète de l’acquisition des 2
conversions.
Branchement et mesures. Remarquez le cavalier en position haute (5V) pour la connexion de la carte
CMD Verte) sur la carte DE1 SoC FPGA
En tournant le potentiomètre de la carte CMD (verte) vous changez la référence (tension de 0 à 5V)
imposé à : ADC_IN1 ou ADC_IN2, en fonction de la manière dont vous avez connecté le câble bifilaire
de l’ADC.
La référence, doit normalement être affectée aux 3 chiffres HEX de gauche (HEX5, HEX4, HEX3).
Le signal de la PWM (u) est obtenu en réalisant la comparaison de deux grandeurs (timer et CMPR par
exemple). On désire obtenir u=1 lorsque la valeur du CMPR est supérieure à la valeur du timer. De plus,
on désire que la valeur du registre CMPR soit modifiée lorsque la valeur courante du timer est à 0.
En utilisant une description VHDL, réalisez le circuit demandé. Validez le fonctionnement de ce circuit
par simulation.
Observez les signaux Imes done, Iref done et EOC sur les GPIO
Out1 : GPIO_0 [6] PIN_AK19 Out2 : GPIO_0 [7] PIN_AJ19
TP 6.2 Régulateur PI
Soit le régulateur qu’on avait écrit en TP3 en C :
void RegulI()
{
e = Iref - Imes;
alpha = Kp*e + xe_I;
if ( (alpha <0.5) && (alpha>-0.5) ) xe_I += Ki*e;
// limiteur de tension
if ( alpha > 0.5) alpha = 0.5;
if ( alpha <-0.5) alpha =-0.5;
cmpr = (-alpha+0.5)*FullPWM;
}
Décomposez la structure du régulateur numérique en plusieurs états afin qu’il n’y ait pas d’opérations
concurrentes qui puissent se chevaucher.
Ecrire la machine à états.
Implémentez la régulation en simulation et vérifiez que l’action intégrale cumule bien l’erreur quand
Iref != Imes dans les 2 sens.
if (BOBF == 1'b0)
begin // BO
cmpr <= Xrefin; // Direct 12 bits
end
Testez les deux configurations à l’aide de la carte CMD verte sans alimenter le hacheur.
Vérifiez les sorties PWM1 et PWM2.
Faites vérifier les signaux et le montage par l’enseignant, puis branchez le hacheur et observez
l’allure du courant dans la charge.
On doit avoir le même fonctionnement que lors du TP3 avec le DSC.
if (`EchOn)
begin
if (Ech) Iref <= Xref - 16'sd2500;
else Iref <= 16'sd2500 -Xref ;
end
else Iref <= Xref - 16'sd2500;
Conclusions
Prototypage rapide, complexité de design, temps de compilation, rapidité d’exécution et
optimisation.
Comparaison par rapport à l’approche DSC.
Pour le branchement sur la carte FPGA, nous utilisons un câble spécial qui se divise en 2 :
Un connecteur HE8 (2xSIL4) sur le connecteur GPIO_0 et un connecteur (2 contacts) sur le
connecteur ADC (ADC_In1, ADC_In2).
Attention, la pin 1 de ces 2 connecteurs est vers le bas de la carte (connecteur à 180°).
C’est votre enseignant qui câblera ce connecteur.
GPIO_0[0] PIN_AC18 GPIO Connection 0[0]
GPIO_0 [1] PIN_Y17 GPIO Connection 0[1]
GPIO_0 [2] PIN_AD17 GPIO Connection 0[2]
GPIO_0 [3] PIN_Y18 GPIO Connection 0[3]
GPIO_0 [4] PIN_AK16 GPIO Connection 0[4]
GPIO_0 [5] PIN_AK18 GPIO Connection 0[5]
GPIO_0 [6] PIN_AK19 GPIO Connection 0[6]
GPIO_0 [7] PIN_AJ19 GPIO Connection 0[7]
GPIO_0 [8] PIN_AJ17 GPIO Connection 0[8]
GPIO_0 [9] PIN_AJ16 GPIO Connection 0[9]
GPIO_0 [10] PIN_AH18 GPIO Connection 0[10]
GPIO_0 [11] PIN_AH17 GPIO Connection 0[11]
GPIO_0 [12] PIN_AG16 GPIO Connection 0[12]
GPIO_0 [13] PIN_AE16 GPIO Connection 0[13]
GPIO_0 [14] PIN_AF16 GPIO Connection 0[14]
GPIO_0 [15] PIN_AG17 GPIO Connection 0[15]
GPIO_0 [16] PIN_AA18 GPIO Connection 0[16]
GPIO_0 [17] PIN_AA19 GPIO Connection 0[17]
GPIO_0 [18] PIN_AE17 GPIO Connection 0[18]
GPIO_0 [19] PIN_AC20 GPIO Connection 0[19]
GPIO_0 [20] PIN_AH19 GPIO Connection 0[20]
GPIO_0 [21] PIN_AJ20 GPIO Connection 0[21]
GPIO_0 [22] PIN_AH20 GPIO Connection 0[22]
GPIO_0 [23] PIN_AK21 GPIO Connection 0[23]
GPIO_0 [24] PIN_AD19 GPIO Connection 0[24]
GPIO_0 [25] PIN_AD20 GPIO Connection 0[25]
GPIO_0 [26] PIN_AE18 GPIO Connection 0[26]
GPIO_0 [27] PIN_AE19 GPIO Connection 0[27]
GPIO_0 [28] PIN_AF20 GPIO Connection 0[28]
GPIO_0 [29] PIN_AF21 GPIO Connection 0[29]
GPIO_0 [30] PIN_AF19 GPIO Connection 0[30]
GPIO_0 [31] PIN_AG21 GPIO Connection 0[31]
GPIO_0 [32] PIN_AF18 GPIO Connection 0[32]
GPIO_0 [33] PIN_AG20 GPIO Connection 0[33]
GPIO_0 [34] PIN_AG18 GPIO Connection 0[34]
GPIO_0 [35] PIN_AJ21 GPIO Connection 0[35]
Connecteur HE10 de la carte d’interface CMD (verte) et correspondance avec la carte DE1-SoC
Iref : ADC_IN1 [3] Imes : ADC_IN2 [4]
In1 : GPIO_0 [4] PIN_AK16 In1 : GPIO_0 [5] PIN_AK18
Out1 : GPIO_0 [6] PIN_AK19 Out2 : GPIO_0 [7] PIN_AJ19
PWM1 : GPIO_0 [8] PIN_AJ17 PWM2 : GPIO_0 [9] PIN_AJ16
+5V GND
J20 In1
J21 In2
Branchement des sondes d'oscilloscopes pour l'affichage des signaux Out1, Imes, PWM1.
Remarquez le cavalier en position basse (1-2) 3.3V pour l'utilisation avec le Launchpad F28069M.
Ce cavalier sera mis en position haute (2-3) 5.0V pour une utilisation avec le FPGA.
PWM1 R PWM2
ADC L
Imes
PWM2 R PWM1