0% ont trouvé ce document utile (0 vote)
15 vues32 pages

TD N°3: Conception Conjointe Avec Le Processeur Embarqué Hardcore Du Sopc Zedboard

Transféré par

hiba akkari
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
15 vues32 pages

TD N°3: Conception Conjointe Avec Le Processeur Embarqué Hardcore Du Sopc Zedboard

Transféré par

hiba akkari
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Institut Supérieur d'Informatique L3SE

TD N°3 : Conception conjointe avec le processeur embarqué hardcore du


SoPC zedboard

Exercice 1 : PS avec PL, EMIO et compteur 32 bits


On souhaite utiliser le PS avec la PL, les EMIO ainsi qu’un compteur 32 bits en VHDL (voir
la figure ci-dessous). Le PS fournit à la PL une horloge (CLK0) ainsi qu’un signal reset et une
entrée de validation CE. Il lit la valeur sur 32 bits du compteur.

Nous allons utiliser la bank 2 des EMIO (32 bits) en entrée plus 2 EMIO supplémentaires en
sortie (34 EMIO au total). Le bouton poussoir (BP est connecté au PS via les MIO). Le
tableau suivant vous indique les connexions à respecter :

Entrées/ Sorties/ Signaux Connecté au Sens (par Remarque


rapport au PS)
BP MIO 50 entrée
Cpt (résultat du comptage) EMIO de 54 à 85 entrée EMIO utilisées en bank
(bank 2)
reset EMIO 86 sortie EMIO utilisées en broche
CE EMIO 87 sortie

Le bloc design est le suivant:

1
Institut Supérieur d'Informatique L3SE

Le Wrapper généré par vivado est le suivant:


1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL;
3 library UNISIM;
4 use [Link];

5 entity design_1_wrapper is
6 port (
7 DDR_addr : inout STD_LOGIC_VECTOR ( 14 downto 0 );
8 DDR_ba : inout STD_LOGIC_VECTOR ( 2 downto 0 );
9 DDR_cas_n : inout STD_LOGIC;
10 DDR_ck_n : inout STD_LOGIC;
11 DDR_ck_p : inout STD_LOGIC;
12 DDR_cke : inout STD_LOGIC;
13 DDR_cs_n : inout STD_LOGIC;
14 DDR_dm : inout STD_LOGIC_VECTOR ( 3 downto 0 );
15 DDR_dq : inout STD_LOGIC_VECTOR ( 31 downto 0 );
16 DDR_dqs_n : inout STD_LOGIC_VECTOR ( 3 downto 0 );
17 DDR_dqs_p : inout STD_LOGIC_VECTOR ( 3 downto 0 );
18 DDR_odt : inout STD_LOGIC;
19 DDR_ras_n : inout STD_LOGIC;
20 DDR_reset_n : inout STD_LOGIC;
21 DDR_we_n : inout STD_LOGIC;
22 FCLK_CLK0 : out STD_LOGIC;
23 FIXED_IO_ddr_vrn : inout STD_LOGIC;
24 FIXED_IO_ddr_vrp : inout STD_LOGIC;
25 FIXED_IO_mio : inout STD_LOGIC_VECTOR ( 53 downto 0 );
26 FIXED_IO_ps_clk : inout STD_LOGIC;
27 FIXED_IO_ps_porb : inout STD_LOGIC;
28 FIXED_IO_ps_srstb : inout STD_LOGIC;
29 GPIO_I : in STD_LOGIC_VECTOR ( 33 downto 0 );
30 GPIO_O : out STD_LOGIC_VECTOR ( 33 downto 0 )
31 );
32 end design_1_wrapper;

33 architecture STRUCTURE of design_1_wrapper is

2
Institut Supérieur d'Informatique L3SE

34 component design_1 is
35 port (
36 FCLK_CLK0 : out STD_LOGIC;
37 GPIO_I : in STD_LOGIC_VECTOR ( 33 downto 0 );
38 GPIO_O : out STD_LOGIC_VECTOR ( 33 downto 0 );
39 DDR_cas_n : inout STD_LOGIC;
40 DDR_cke : inout STD_LOGIC;
41 DDR_ck_n : inout STD_LOGIC;
42 DDR_ck_p : inout STD_LOGIC;
43 DDR_cs_n : inout STD_LOGIC;
44 DDR_reset_n : inout STD_LOGIC;
45 DDR_odt : inout STD_LOGIC;
46 DDR_ras_n : inout STD_LOGIC;
47 DDR_we_n : inout STD_LOGIC;
48 DDR_ba : inout STD_LOGIC_VECTOR ( 2 downto 0 );
49 DDR_addr : inout STD_LOGIC_VECTOR ( 14 downto 0 );
50 DDR_dm : inout STD_LOGIC_VECTOR ( 3 downto 0 );
51 DDR_dq : inout STD_LOGIC_VECTOR ( 31 downto 0 );
52 DDR_dqs_n : inout STD_LOGIC_VECTOR ( 3 downto 0 );
53 DDR_dqs_p : inout STD_LOGIC_VECTOR ( 3 downto 0 );
54 FIXED_IO_mio : inout STD_LOGIC_VECTOR ( 53 downto 0 );
55 FIXED_IO_ddr_vrn : inout STD_LOGIC;
56 FIXED_IO_ddr_vrp : inout STD_LOGIC;
57 FIXED_IO_ps_srstb : inout STD_LOGIC;
58 FIXED_IO_ps_clk : inout STD_LOGIC;
59 FIXED_IO_ps_porb : inout STD_LOGIC
60 );
61 end component design_1;

62 begin

63 design_1_i: component design_1


64 port map (
65 DDR_addr(14 downto 0) => DDR_addr(14 downto 0),
66 DDR_ba(2 downto 0) => DDR_ba(2 downto 0),
67 DDR_cas_n => DDR_cas_n,
68 DDR_ck_n => DDR_ck_n,
69 DDR_ck_p => DDR_ck_p,
70 DDR_cke => DDR_cke,
71 DDR_cs_n => DDR_cs_n,
72 DDR_dm(3 downto 0) => DDR_dm(3 downto 0),
73 DDR_dq(31 downto 0) => DDR_dq(31 downto 0),
74 DDR_dqs_n(3 downto 0) => DDR_dqs_n(3 downto 0),
75 DDR_dqs_p(3 downto 0) => DDR_dqs_p(3 downto 0),
76 DDR_odt => DDR_odt,
77 DDR_ras_n => DDR_ras_n,
78 DDR_reset_n => DDR_reset_n,
79 DDR_we_n => DDR_we_n,
80 FCLK_CLK0 => FCLK_CLK0,
81 FIXED_IO_ddr_vrn => FIXED_IO_ddr_vrn,
82 FIXED_IO_ddr_vrp => FIXED_IO_ddr_vrp,
83 FIXED_IO_mio(53 downto 0) => FIXED_IO_mio(53 downto 0),
84 FIXED_IO_ps_clk => FIXED_IO_ps_clk,
85 FIXED_IO_ps_porb => FIXED_IO_ps_porb,
86 FIXED_IO_ps_srstb => FIXED_IO_ps_srstb,

3
Institut Supérieur d'Informatique L3SE

87 GPIO_I(33 downto 0) => GPIO_I(33 downto 0),


88 GPIO_O(33 downto 0) => GPIO_O(33 downto 0)
89 );
90 end STRUCTURE;

1. Modifier le Wrapper afin qu'il réponde au cahier des charges


2. Donner la description VHDL du compteur 32 bits. On suppose que Reset et CE sont
synchrones par rapport au signal d’horloge, Reset étant prioritaire par rapport à CE.
3. Donner le code C à implémenter sur le processeur embarqué ARM qui permet de :
- mettre reset et CE au niveau bas et afficher la valeur initiale du compteur ;
- lire toute les 100ms l’état du bouton poussoir (BP) et passer cet état au signal CE. Afficher à
chaque fois la valeur du compteur.

Exercice 2 (Examen SP 2017-2018)


On souhaite implémenter une application embarquée sur le FPGA Zynq du SoPC Zedboard.
Cette application fait appel à la logique programmable (PL) ainsi qu'au système à base de
processeur (PS) du FPGA. L'interfaçage entre la PL et le PS est réalisé avec les EMIO
(Extended Multiplexed Input/Output). Le système à implémenter dans le FPGA est décrit par
la figure 1.

Figure 1

On suppose que :
- Le PS fournit au PL (et plus précisément au compteur 8 bits implémenté au niveau du PL)
une horloge CLK0, un signal Reset et une entrée de validation CE.
- Le compteur 8 bits envoie la valeur courante du comptage (compt codée sur 8 bits) vers le
PS.
- Les états des 8 switches (qui sont physiquement connectés au PL) sont acheminés vers le PS.
Ces switches donnent une valeur codée sur 8 bits. SW0 correspond au bit de poids faible et
SW7 correspond au bit de poids fort.
- Le PS calcule la valeur moyenne de l'état des switches et de la valeur du comptage. Cette
valeur moyenne sera envoyée vers les LEDs. La LED0 correspond au bit de poids faible et la
LED7 correspond au bit de poids fort.

On se propose d'utiliser la bank 2 des EMIO (32 bits) en entrée afin de simplifier l’écriture du
programme C. Il sera en effet plus facile de faire une écriture 32 bits dans la bank 2 que

4
Institut Supérieur d'Informatique L3SE

d’écrire chacun des 16 bits dans l’EMIO correspondante. Les 16 entrées inutilisées de la bank
2 seront simplement ignorées par le PS. Les 10 EMIO de sorties seront, en revanche, utilisées
broche par broche. Le tableau suivant indique les connexions à respecter:

Entrées/ Sorties/ Signaux Connecté au Sens (par Remarque


rapport au PS)
Switches : SW0 à SW7 EMIO de 54 à 61 entrée EMIO utilisées en bank
compt (valeur envoyée par EMIO de 62 à 69 entrée (bank 2) Les EMIO de 70
le compteur) à 85 sont non utilisées
LEDs : LED0 à LED7 EMIO de 86 à 93 sortie EMIO utilisées en broche
Reset EMIO 94 sortie EMIO utilisée en broche
CE EMIO 95 sortie EMIO utilisée en broche

La conception sera divisée en deux parties: la partie I est consacrée à l'implémentation


matérielle et la partie II est consacrée à l'implémentation logicielle. Les deux parties peuvent
être considérées indépendantes et chaque question de chaque partie peut être développée
indépendamment des autres.

Partie I : Implémentation matérielle

Le block design du système est donné par la figure suivante :

Figure 2

Le Wrapper généré par vivado est le suivant :

1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL;

3 library UNISIM;
4 use [Link];

5 entity design_1_wrapper is
6 port (
7 DDR_addr : inout STD_LOGIC_VECTOR(14 downto 0);

5
Institut Supérieur d'Informatique L3SE

8 DDR_ba : inout STD_LOGIC_VECTOR(2 downto 0);


9 DDR_cas_n : inout STD_LOGIC;
10 DDR_ck_n : inout STD_LOGIC;
11 DDR_ck_p : inout STD_LOGIC;
12 DDR_cke : inout STD_LOGIC;
13 DDR_cs_n : inout STD_LOGIC;
14 DDR_dm : inout STD_LOGIC_VECTOR(3 downto 0);
15 DDR_dq : inout STD_LOGIC_VECTOR(31 downto 0);
16 DDR_dqs_n : inout STD_LOGIC_VECTOR(3 downto 0);
17 DDR_dqs_p : inout STD_LOGIC_VECTOR(3 downto 0);
18 DDR_odt : inout STD_LOGIC;
19 DDR_ras_n : inout STD_LOGIC;
20 DDR_reset_n : inout STD_LOGIC;
21 DDR_we_n : inout STD_LOGIC;
22 FCLK_CLK0 : out STD_LOGIC;
23 FIXED_IO_ddr_vrn : inout STD_LOGIC;
24 FIXED_IO_ddr_vrp : inout STD_LOGIC;
25 FIXED_IO_mio : inout STD_LOGIC_VECTOR(53 downto 0);
26 FIXED_IO_ps_clk : inout STD_LOGIC;
27 FIXED_IO_ps_porb : inout STD_LOGIC;
28 FIXED_IO_ps_srstb : inout STD_LOGIC;
29 GPIO_I : in STD_LOGIC_VECTOR(41 downto 0);
30 GPIO_O : out STD_LOGIC_VECTOR(41 downto 0)

31 );
32 end design_1_wrapper;

33 architecture STRUCTURE of design_1_wrapper is

34 component design_1 is
35 port (
36 DDR_cas_n : inout STD_LOGIC;
37 DDR_cke : inout STD_LOGIC;
38 DDR_ck_n : inout STD_LOGIC;
39 DDR_ck_p : inout STD_LOGIC;
40 DDR_cs_n : inout STD_LOGIC;
41 DDR_reset_n : inout STD_LOGIC;
42 DDR_odt : inout STD_LOGIC;
43 DDR_ras_n : inout STD_LOGIC;
44 DDR_we_n : inout STD_LOGIC;
45 DDR_ba : inout STD_LOGIC_VECTOR(2 downto 0);
46 DDR_addr : inout STD_LOGIC_VECTOR(14 downto 0);
47 DDR_dm : inout STD_LOGIC_VECTOR(3 downto 0);
48 DDR_dq : inout STD_LOGIC_VECTOR(31 downto 0);
49 DDR_dqs_n : inout STD_LOGIC_VECTOR(3 downto 0);
50 DDR_dqs_p : inout STD_LOGIC_VECTOR(3 downto 0);
51 FIXED_IO_mio : inout STD_LOGIC_VECTOR(53 downto 0);
52 FIXED_IO_ddr_vrn : inout STD_LOGIC;
53 FIXED_IO_ddr_vrp : inout STD_LOGIC;
54 FIXED_IO_ps_srstb : inout STD_LOGIC;
55 FIXED_IO_ps_clk : inout STD_LOGIC;
56 FIXED_IO_ps_porb : inout STD_LOGIC;
57 FCLK_CLK0 : out STD_LOGIC;
58 GPIO_I : in STD_LOGIC_VECTOR(41 downto 0);
59 GPIO_O : out STD_LOGIC_VECTOR(41 downto 0)

6
Institut Supérieur d'Informatique L3SE

60 );
61 end component design_1;

62 begin

63 design_1_i: component design_1


64 port map (
65 DDR_addr(14 downto 0) => DDR_addr(14 downto 0),
66 DDR_ba(2 downto 0) => DDR_ba(2 downto 0),
67 DDR_cas_n => DDR_cas_n,
68 DDR_ck_n => DDR_ck_n,
69 DDR_ck_p => DDR_ck_p,
70 DDR_cke => DDR_cke,
71 DDR_cs_n => DDR_cs_n,
72 DDR_dm(3 downto 0) => DDR_dm(3 downto 0),
73 DDR_dq(31 downto 0) => DDR_dq(31 downto 0),
74 DDR_dqs_n(3 downto 0) => DDR_dqs_n(3 downto 0),
75 DDR_dqs_p(3 downto 0) => DDR_dqs_p(3 downto 0),
76 DDR_odt => DDR_odt,
77 DDR_ras_n => DDR_ras_n,
78 DDR_reset_n => DDR_reset_n,
79 DDR_we_n => DDR_we_n,
80 FCLK_CLK0 => FCLK_CLK0,
81 FIXED_IO_ddr_vrn => FIXED_IO_ddr_vrn,
82 FIXED_IO_ddr_vrp => FIXED_IO_ddr_vrp,
83 FIXED_IO_mio(53 downto 0) => FIXED_IO_mio(53 downto 0),
84 FIXED_IO_ps_clk => FIXED_IO_ps_clk,
85 FIXED_IO_ps_porb => FIXED_IO_ps_porb,
86 FIXED_IO_ps_srstb => FIXED_IO_ps_srstb,
87 GPIO_I(41 downto 0) => GPIO_I(41 downto 0),
88 GPIO_O(41 downto 0) => GPIO_O(41 downto 0)
89 );
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

7
Institut Supérieur d'Informatique L3SE

end STRUCTURE;

Q1. Modifier le Wrapper afin qu'il réponde au cahier des charges en termes d'entrées/sorties
du système ainsi qu'en termes de signaux internes qui relient le PS et la PL.

Le compteur à implémenter dans la PL possède comme entrée une horloge active au front
montant, un signal Reset actif au niveau haut, une entrée de validation CE active au niveau
haut. Il est à noter que les signaux Reset et CE sont synchrones par rapport au signal d'horloge
et que le signal reset est prioritaire par rapport au signal CE. Le compteur est initialisé à zéro.

Q2. Rajouter dans le Wrapper un process qui décrit le comportement du compteur 8 bits.
Rajouter des signaux internes et des bibliothèques si nécessaire.

Partie II : Implémentation logicielle


L'application à implémenter sur le processeur embarqué ARM permet de:
- mettre le signal Reset et le signal de validation CE au niveau bas,
- lire les valeurs en entrée sur le bank 2 (la valeur du comptage et les états des switches),
- extraire et afficher la valeur du comptage ainsi que les états des switches dans des variables
dédiées (compteur et E_SW). Utiliser les masques binaires pour l'extraction des bits adéquats,
- calculer la valeur moyenne de la valeur du comptage et des états des switches et affecter la
valeur de chaque bit de cette valeur au LED correspondante. On rappelle que LED0
correspond au bit de poids faible,
- introduire un délai d'une demi-seconde et mettre le signal de validation au niveau haut.

N.B : Suivre les commentaires pour écrire ces différentes étapes du programme.

Q3. Compléter le code C à implémenter sur le processeur embarqué.

#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
int main(void)

8
Institut Supérieur d'Informatique L3SE

{
/* variable pour les données lues en entrée sur le bank 2 (switches
et valeur du comptage)*/
u32 data_in;
u8 compteur; // variable pour la valeur du comptage
u8 E_SW; // variable pour les états des switches
u8 Moy; // variable pour la valeur moyenne

//Déclaration et initialisation des structures


__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
// Direction du bank 2 (pour les entrées)
__________________________________________________________________________________
__________________________________________________________________________________
// Direction des sorties
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
While(1)
{
// mettre le signal Reset au niveau bas
___________________________________________________________________________

//mettre le signal de validation au niveau bas


____________________________________________________________________

/* lire les valeurs en entrée sur le bank 2 (la valeur du comptage


et les états des switches */

____________________________________________________________________

9
Institut Supérieur d'Informatique L3SE

// Extraire la valeur du comptage dans la variable compteur

____________________________________________________________________
// afficher la valeur du compteur
____________________________________________________________________

// Extraire les états des switches dans la variable E_SW

____________________________________________________________________

// afficher les états des switches

____________________________________________________________________

// Calculer la valeur moyenne ((compteur + E_SW)/2)

____________________________________________________________________

____________________________________________________________________

/* Affecter la valeur de chaque bit de la valeur moyenne au LED


correspondante */

__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
// introduire un délai de 0.5s

____________________________________________________________________
// mettre le signal de validation CE au niveau haut

____________________________________________________________________
}
return 0;
}

10
Institut Supérieur d'Informatique L3SE

Exercice 3 (Examen SR 2017-2018)


On souhaite implémenter une application embarquée sur le FPGA Zynq du SoPC Zedboard.
Cette application fait appel à la logique programmable (PL) ainsi qu'au système à base de
processeur (PS) du FPGA. L'interfaçage entre la PL et le PS est réalisé avec les EMIO
(Extended Multiplexed Input/Output). Le système à implémenter dans le FPGA est décrit par
la figure 1.

Figure 1

L'application permet de faire l'addition ou la multiplication de deux nombres codés chacun sur
4 bits. On suppose que :
- Les boutons poussoirs BP1 et BP2 (qui sont physiquement connectés au PS via les MIO)
permettent de choisir le type d'opération: Si on appuie sur BP1 alors on choisit l'addition, et si
on appuie sue BP2 alors on choisit la multiplication des deux nombres.
- Les états des 8 switches (qui sont physiquement connectés au PL) donnent les deux nombres
à additionner ou à multiplier. Les 4 switches de poids faible (de SW0 à SW3) représentent le
premier nombre et les 4 switches de poids fort (de SW4 à SW7) représentent le second
nombre. Les états des 8 switches sont acheminés vers le PS.
- Le PS extrait les deux nombres. Dans le cas d'une addition, la somme est calculée au niveau
PS. Dans le cas d'une multiplication, le PS renvoie les deux nombres (via les signaux N1 et
N2) vers la PL et plus précisément au multiplieur qui calcule le produit (codé sur 8 bits) et
l'envoie à son tour au PS.
- Le résultat de l'addition ou de la multiplication est ensuite envoyé vers les LEDs (qui sont
physiquement connectés au PL). La LED0 correspond au bit de poids faible et la LED7
correspond au bit de poids fort.

On se propose d'utiliser les deux banks (2 et 3) des EMIO afin de simplifier l’écriture du
programme C. Il sera en effet plus facile de faire une écriture 32 bits dans une bank que
d’écrire chacun des bits dans l’EMIO correspondante. La bank 2 est utilisée pour les entrées
et la bank 3 est utilisée pour les sorties. Les entrées ou sorties inutilisées des banks seront
simplement ignorées par le PS. Le tableau suivant indique les connexions à respecter:

11
Institut Supérieur d'Informatique L3SE

Entrées/ Sorties/ Signaux Connecté au Sens (par Remarque


rapport au PS)
BP1 MIO 50 entrée
BP2 MIO 51 entrée
Switches : SW0 à SW7 EMIO de 54 à 61 entrée EMIO utilisées en bank
Produit (valeur envoyée EMIO de 62 à 69 entrée (bank 2) Les EMIO de 70
par le multiplieur) à 85 sont non utilisées
LEDs : LED0 à LED7 EMIO de 86 à 93 sortie EMIO utilisées en bank
N1 (premier nombre) EMIO de 94 à 97 sortie (bank 3) Les EMIO de 102
N2 (second nombre) EMIO de 98 à 101 sortie à 117 sont non utilisées

La figure ci-dessous représente le bank2:

Figure 2

La figure ci-dessous représente le bank3:

Figure 3
La conception sera divisée en deux parties: la partie I est consacrée à l'implémentation
matérielle et la partie II est consacrée à l'implémentation logicielle. Les deux parties peuvent
être considérées indépendantes et chaque question de chaque partie peut être développée
indépendamment des autres.

12
Institut Supérieur d'Informatique L3SE

Partie I : Implémentation matérielle

Le Wrapper généré par vivado est le suivant :

1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL;

3 library UNISIM;
4 use [Link];

5 entity design_1_wrapper is
6 port (
7 DDR_addr : inout STD_LOGIC_VECTOR(14 downto 0);
8 DDR_ba : inout STD_LOGIC_VECTOR(2 downto 0);
9 DDR_cas_n : inout STD_LOGIC;
10 DDR_ck_n : inout STD_LOGIC;
11 DDR_ck_p : inout STD_LOGIC;
12 DDR_cke : inout STD_LOGIC;
13 DDR_cs_n : inout STD_LOGIC;
14 DDR_dm : inout STD_LOGIC_VECTOR(3 downto 0);
15 DDR_dq : inout STD_LOGIC_VECTOR(31 downto 0);
16 DDR_dqs_n : inout STD_LOGIC_VECTOR(3 downto 0);
17 DDR_dqs_p : inout STD_LOGIC_VECTOR(3 downto 0);
18 DDR_odt : inout STD_LOGIC;
19 DDR_ras_n : inout STD_LOGIC;
20 DDR_reset_n : inout STD_LOGIC;
21 DDR_we_n : inout STD_LOGIC;
22 FIXED_IO_ddr_vrn : inout STD_LOGIC;
23 FIXED_IO_ddr_vrp : inout STD_LOGIC;
24 FIXED_IO_mio : inout STD_LOGIC_VECTOR(53 downto 0);
25 FIXED_IO_ps_clk : inout STD_LOGIC;
26 FIXED_IO_ps_porb : inout STD_LOGIC;
27 FIXED_IO_ps_srstb : inout STD_LOGIC;
28 GPIO_I : in STD_LOGIC_VECTOR(63 downto 0);
29 GPIO_O : out STD_LOGIC_VECTOR(63 downto 0)

30 );
31 end design_1_wrapper;

13
Institut Supérieur d'Informatique L3SE

32 architecture STRUCTURE of design_1_wrapper is

33 component design_1 is
34 port (
35 DDR_cas_n : inout STD_LOGIC;
36 DDR_cke : inout STD_LOGIC;
37 DDR_ck_n : inout STD_LOGIC;
38 DDR_ck_p : inout STD_LOGIC;
39 DDR_cs_n : inout STD_LOGIC;
40 DDR_reset_n : inout STD_LOGIC;
41 DDR_odt : inout STD_LOGIC;
42 DDR_ras_n : inout STD_LOGIC;
43 DDR_we_n : inout STD_LOGIC;
44 DDR_ba : inout STD_LOGIC_VECTOR(2 downto 0);
45 DDR_addr : inout STD_LOGIC_VECTOR(14 downto 0);
46 DDR_dm : inout STD_LOGIC_VECTOR(3 downto 0);
47 DDR_dq : inout STD_LOGIC_VECTOR(31 downto 0);
48 DDR_dqs_n : inout STD_LOGIC_VECTOR(3 downto 0);
49 DDR_dqs_p : inout STD_LOGIC_VECTOR(3 downto 0);
50 FIXED_IO_mio : inout STD_LOGIC_VECTOR(53 downto 0);
51 FIXED_IO_ddr_vrn : inout STD_LOGIC;
52 FIXED_IO_ddr_vrp : inout STD_LOGIC;
53 FIXED_IO_ps_srstb : inout STD_LOGIC;
54 FIXED_IO_ps_clk : inout STD_LOGIC;
55 FIXED_IO_ps_porb : inout STD_LOGIC;
56 GPIO_I : in STD_LOGIC_VECTOR(63 downto 0);
57 GPIO_O : out STD_LOGIC_VECTOR(63 downto 0)
58 );
59 end component design_1;

60 begin

61 design_1_i: component design_1


62 port map (
63 DDR_addr(14 downto 0) => DDR_addr(14 downto 0),
64 DDR_ba(2 downto 0) => DDR_ba(2 downto 0),
65 DDR_cas_n => DDR_cas_n,

14
Institut Supérieur d'Informatique L3SE

66 DDR_ck_n => DDR_ck_n,


67 DDR_ck_p => DDR_ck_p,
68 DDR_cke => DDR_cke,
69 DDR_cs_n => DDR_cs_n,
70 DDR_dm(3 downto 0) => DDR_dm(3 downto 0),
71 DDR_dq(31 downto 0) => DDR_dq(31 downto 0),
72 DDR_dqs_n(3 downto 0) => DDR_dqs_n(3 downto 0),
73 DDR_dqs_p(3 downto 0) => DDR_dqs_p(3 downto 0),
74 DDR_odt => DDR_odt,
75 DDR_ras_n => DDR_ras_n,
76 DDR_reset_n => DDR_reset_n,
77 DDR_we_n => DDR_we_n,
78 FIXED_IO_ddr_vrn => FIXED_IO_ddr_vrn,
79 FIXED_IO_ddr_vrp => FIXED_IO_ddr_vrp,
80 FIXED_IO_mio(53 downto 0) => FIXED_IO_mio(53 downto 0),
81 FIXED_IO_ps_clk => FIXED_IO_ps_clk,
82 FIXED_IO_ps_porb => FIXED_IO_ps_porb,
83 FIXED_IO_ps_srstb => FIXED_IO_ps_srstb,
84 GPIO_I(63 downto 0) => GPIO_I(63 downto 0),
85 GPIO_O(63 downto 0) => GPIO_O(63 downto 0)
86 );
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________

Process(_________________________________)
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________

15
Institut Supérieur d'Informatique L3SE

________________________________________________________________
________________________________________________________________
End process;
end STRUCTURE;

Q1. Modifier le Wrapper afin qu'il réponde au cahier des charges en termes d'entrées/sorties
du système ainsi qu'en termes de signaux internes qui relient le PS et la PL.

Le multiplieur à implémenter dans la PL possède comme entrées les deux nombres N1 et N2


(codé chacun sur 4 bits) et comme sortie le produit (codé sur 8 bits). Le produit est initialisé à
zéro. La multiplication binaire est réalisée sur 4 itérations et chaque itération est décrite
comme suit:
- si N1 est impaire alors le produit=produit+N2
- décaler N1 de un bit à droite,
- décaler N2 de un bit à gauche.

Q2. Dans le Wrapper, compléter le process qui décrit le comportement du multiplieur.


Rajouter des signaux internes, des variables et des bibliothèques si nécessaire.

Partie II : Implémentation logicielle


L'application à implémenter sur le processeur embarqué ARM permet de:
- lire les valeurs en entrée sur le bank 2,
- extraire le premier nombre puis l'afficher,
- extraire le second nombre puis l'afficher,
- lire les états des boutons poussoirs BP1 et BP2,
- si le bouton poussoir BP1 est détecté au niveau haut alors réaliser la somme des deux
nombres et afficher le résultat,
- si le bouton poussoir BP2 est détecté au niveau haut alors envoyer les valeurs des deux
nombres au multiplieur et mettre les LEDs au niveau bas (voir le bank 3 la figure 3). Lire le
bank 2, extraire le produit et l'afficher,
- envoyer le résultat de l'opération sur le bank 3 pour allumer les LEDs

N.B : Suivre les commentaires pour écrire ces différentes étapes du programme.

Q3. Compléter le code C à implémenter sur le processeur embarqué.

#include <stdio.h>
__________________________________________________________________________________

___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
int main(void)

/* variable pour les données lues en entrée sur le bank 2*/

16
Institut Supérieur d'Informatique L3SE

u32 data_in;

/* variable pour les données à envoyer en sortie sur le bank 3*/

u32 data_out;

u32 Nbre1; // variable pour le premier nombre

u32 Nbre2; // variable pour le second nombre

u32 Resultat; //variable qui contient le résultat de l'opération

int E_BP1; // variable qui contient l'état du bouton poussoir BP1

int E_BP2; // variable qui contient l'état du bouton poussoir BP2

//Déclaration et initialisation des structures

___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

// Direction du bank 2 (pour les entrées)

___________________________________________________________________________

// Direction du bank 3 (pour les sorties)

___________________________________________________________________________

// Direction des MIO (les deux boutons poussoirs)

___________________________________________________________________________
___________________________________________________________________________
While(1)

// lire les valeurs en entrée sur le bank 2

____________________________________________________________________

17
Institut Supérieur d'Informatique L3SE

// Extraire le premier nombre dans la variable Nbre1

____________________________________________________________________

// afficher le premier nombre

____________________________________________________________________

// Extraire le second nombre dans la variable Nbre2

____________________________________________________________________

// afficher le second nombre

____________________________________________________________________

/* Lire les états des boutons poussoirs BP1 et BP2 (utiliser les
variables E_BP1 et E_BP2) */

____________________________________________________________________
____________________________________________________________________

/* Si le bouton poussoir BP1 est détecté au niveau haut alors


réaliser la somme des deux nombres et afficher le résultat */

___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

/* Si le bouton poussoir BP2 est détecté au niveau haut alors


envoyer les valeurs des deux nombres au multiplieur et mettre les
LEDs au niveau bas (voir le bank 3 la figure 3). Utiliser pour cela
la variable data_out. Lire le bank 2, extraire le produit dans la
variable Resultat (voir figure 2) et l'afficher */

__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________

18
Institut Supérieur d'Informatique L3SE

__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
// Ecrire le résultat sur le bank 3 pour allumer les LEDs
____________________________________________________________________
}
return 0;
}

Exercice 4 : PS et PL, AXI et EMIO


On souhaite implémenter une application embarquée sur le FPGA Zynq du SoPC Zedboard.
Cette application fait appel à la logique programmable (PL) ainsi qu'au système à base de
processeur (PS) du FPGA. L'interfaçage entre la PL et le PS est réalisé avec le port AXI ainsi
qu’avec les EMIO (Extended Multiplexed Input/Output). Le système à implémenter dans le
FPGA est décrit par la figure 1.

On suppose que :
- le contrôleur VGA permet l’affichage d’un rectangle d’une certaine couleur à une position
bien précise de l’écran (voir TD1).
- Le PS fournit au PL (et plus précisément au contrôleur VGA) une horloge CLK0 et un signal
Reset.
- Les états des 4 boutons poussoirs (qui sont physiquement connectés au PL) sont acheminés
vers le PS. Ces boutons permettent le déplacement du rectangle. BP0 pour un déplacement en
haut, BP1 en bas, BP2 à gauche et BP3 à droite. Ce déplacement est égale à delta_x si c’est un
déplacement horizontal et à delta_y si c’est un déplacement vertical.
- Le PS fournit au contrôleur les valeurs de x_rect, y_rect, delta_x et delta_y.

On se propose d'utiliser la bank 2 des EMIO (32 bits) pour delta_x et delta_y. On utilise le
channel 1 de l’AXI GPIO pour x_rect et y_rect. Le channel 2 de l’AXI GPIO est réservé pour
les boutons poussoirs. Le tableau suivant indique les connexions à respecter:

19
Institut Supérieur d'Informatique L3SE

Entrées/ Sorties/ Signaux Connecté au Sens (par Remarque


rapport au PS)
Delta_x EMIO de 54 à 63 sortie EMIO utilisées en bank
Delta_y EMIO de 64 à 73 sortie (bank 2) Les EMIO de 74
à 85 sont non utilisées
Reset EMIO 86 sortie EMIO utilisées en broche
x_rect GPIO0 à GPIO9 sortie AXI channel 1
Y_rect GPIO10 à GPIO19 sortie
BP0 à BP3 GPIO32 à GPIO35 entrée AXI channel 2

La conception sera divisée en deux parties: la partie I est consacrée à l'implémentation


matérielle et la partie II est consacrée à l'implémentation logicielle.

Partie I : Implémentation matérielle

Le wrapper généré automatiquement par vivado est le suivant :

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use [Link];

entity design_1_wrapper is
port (
DDR_addr : inout STD_LOGIC_VECTOR ( 14 downto 0 );
DDR_ba : inout STD_LOGIC_VECTOR ( 2 downto 0 );
DDR_cas_n : inout STD_LOGIC;
DDR_ck_n : inout STD_LOGIC;
DDR_ck_p : inout STD_LOGIC;
DDR_cke : inout STD_LOGIC;
DDR_cs_n : inout STD_LOGIC;
DDR_dm : inout STD_LOGIC_VECTOR ( 3 downto 0 );
DDR_dq : inout STD_LOGIC_VECTOR ( 31 downto 0 );
DDR_dqs_n : inout STD_LOGIC_VECTOR ( 3 downto 0 );
DDR_dqs_p : inout STD_LOGIC_VECTOR ( 3 downto 0 );
DDR_odt : inout STD_LOGIC;
DDR_ras_n : inout STD_LOGIC;
DDR_reset_n : inout STD_LOGIC;
DDR_we_n : inout STD_LOGIC;
FCLK_CLK0 : out STD_LOGIC;
FIXED_IO_ddr_vrn : inout STD_LOGIC;
FIXED_IO_ddr_vrp : inout STD_LOGIC;
FIXED_IO_mio : inout STD_LOGIC_VECTOR ( 53 downto 0 );
FIXED_IO_ps_clk : inout STD_LOGIC;
FIXED_IO_ps_porb : inout STD_LOGIC;
FIXED_IO_ps_srstb : inout STD_LOGIC;
GPIO_O_0 : out STD_LOGIC_VECTOR ( 32 downto 0 );
gpio2_io_o_0 : out STD_LOGIC_VECTOR ( 19 downto 0 );
gpio_io_i_0 : in STD_LOGIC_VECTOR ( 3 downto 0 )
);
end design_1_wrapper;

architecture STRUCTURE of design_1_wrapper is

component design_1 is
port (

20
Institut Supérieur d'Informatique L3SE

FCLK_CLK0 : out STD_LOGIC;


DDR_cas_n : inout STD_LOGIC;
DDR_cke : inout STD_LOGIC;
DDR_ck_n : inout STD_LOGIC;
DDR_ck_p : inout STD_LOGIC;
DDR_cs_n : inout STD_LOGIC;
DDR_reset_n : inout STD_LOGIC;
DDR_odt : inout STD_LOGIC;
DDR_ras_n : inout STD_LOGIC;
DDR_we_n : inout STD_LOGIC;
DDR_ba : inout STD_LOGIC_VECTOR ( 2 downto 0 );
DDR_addr : inout STD_LOGIC_VECTOR ( 14 downto 0 );
DDR_dm : inout STD_LOGIC_VECTOR ( 3 downto 0 );
DDR_dq : inout STD_LOGIC_VECTOR ( 31 downto 0 );
DDR_dqs_n : inout STD_LOGIC_VECTOR ( 3 downto 0 );
DDR_dqs_p : inout STD_LOGIC_VECTOR ( 3 downto 0 );
FIXED_IO_mio : inout STD_LOGIC_VECTOR ( 53 downto 0 );
FIXED_IO_ddr_vrn : inout STD_LOGIC;
FIXED_IO_ddr_vrp : inout STD_LOGIC;
FIXED_IO_ps_srstb : inout STD_LOGIC;
FIXED_IO_ps_clk : inout STD_LOGIC;
FIXED_IO_ps_porb : inout STD_LOGIC;
GPIO_O_0 : out STD_LOGIC_VECTOR ( 32 downto 0 );
gpio2_io_o_0 : out STD_LOGIC_VECTOR ( 19 downto 0 );
gpio_io_i_0 : in STD_LOGIC_VECTOR ( 3 downto 0 )
);
end component design_1;

begin

design_1_i: component design_1


port map (
FCLK_CLK0=> FCLK_CLK0,
DDR_addr(14 downto 0) => DDR_addr(14 downto 0),
DDR_ba(2 downto 0) => DDR_ba(2 downto 0),
DDR_cas_n => DDR_cas_n,
DDR_ck_n => DDR_ck_n,
DDR_ck_p => DDR_ck_p,
DDR_cke => DDR_cke,
DDR_cs_n => DDR_cs_n,
DDR_dm(3 downto 0) => DDR_dm(3 downto 0),
DDR_dq(31 downto 0) => DDR_dq(31 downto 0),
DDR_dqs_n(3 downto 0) => DDR_dqs_n(3 downto 0),
DDR_dqs_p(3 downto 0) => DDR_dqs_p(3 downto 0),
DDR_odt => DDR_odt,
DDR_ras_n => DDR_ras_n,
DDR_reset_n => DDR_reset_n,
DDR_we_n => DDR_we_n,
FIXED_IO_ddr_vrn => FIXED_IO_ddr_vrn,
FIXED_IO_ddr_vrp => FIXED_IO_ddr_vrp,
FIXED_IO_mio(53 downto 0) => FIXED_IO_mio(53 downto 0),
FIXED_IO_ps_clk => FIXED_IO_ps_clk,
FIXED_IO_ps_porb => FIXED_IO_ps_porb,
FIXED_IO_ps_srstb => FIXED_IO_ps_srstb,
GPIO_O_0( 32 downto 0 )=> GPIO_O_0( 32 downto 0 ),
gpio_io_o_0( 19 downto 0 )=> gpio2_io_o_0( 19 downto 0 ),
gpio2_io_i_0( 3 downto 0 )=> gpio_io_i_0( 3 downto 0 )
);
end STRUCTURE;

21
Institut Supérieur d'Informatique L3SE

On suppose que l’entité du bloc IP contrôleur VGA est la suivante :


Entity TOP_VGA is
port(
clk,rst : in std_logic;
R,G,B : in std_logic; --connectées à des switches
X_rect, y_rect, Delta_x, Delta_y :in std_logic_vector(9 downto 0) ;
hsync, vsync : out std_logic;
Red, Green, Blue : out std_logic);
end TOP_VGA;

1. Modifier le Wrapper afin de répondre au cahier des charges

Partie II : Implémentation logicielle


L'application à implémenter sur le processeur embarqué ARM permet de:
- mettre le signal Reset au niveau bas,
- fixer les valeurs de delta_x et delta_y : delta_x=delta_y=32,
- fixer les valeurs de x_rect à 320 et y_rect à 160,
- Ecrire les valeurs initiales,
Dans une boucle infinie :
- lire les valeurs des boutons poussoirs sur le channel 2 du port AXI.
- calculer la nouvelle position du rectangle (x_rect et y_rect) selon l’état des boutons
poussoirs. On suppose que si le rectangle déborde d’un côté de l’écran, il apparait de l’autre
(comme c’est le cas pour le jeu de serpent par exemple).

2. Donner le code C à implémenter sur le processeur embarqué.

Exercice 5 (Examen SR 2018-2019)

On souhaite implémenter une application embarquée sur le FPGA Zynq du SoPC Zedboard.
Cette application fait appel à la logique programmable (PL) ainsi qu'au système à base de
processeur (PS) du FPGA. L'interfaçage entre la PL et le PS est réalisé avec le port AXI ainsi
qu’avec les EMIO. Le système à implémenter dans le FPGA est décrit par la figure 1.

Figure 1

22
Institut Supérieur d'Informatique L3SE

On suppose que :
-l’application a pour but de piloter un afficheur 7 segments et une matrice de LEDs 4x4. Si
SW=0 alors un chenillard est implémenté sur l’afficheur 7 segments (un seul segment est
allumé à la fois : le segment a puis le segment b puis le segment c…). Si SW=1, une LED est
initialement allumée sur la matrice et selon les états des boutons poussoirs, la LED au-dessus,
au-dessous, à gauche ou à droites sera allumée.

- Le PS fournit au diviseur de fréquence (implémenté dans la PL) une horloge clk0 et de


fréquence 100MHz. Le signal de sortie clkout du diviseur de fréquence représente le signal
d’horloge du second bloc IP implémenté dans la PL (C_7seg : le contrôleur de l’afficheur 7
segments). Le PS fournit au bloc C_7seg une entrée de validation En. La sortie de ce bloc est
le signal 7seg.

- L’état du switch SW et des 4 boutons poussoirs BPs (qui sont physiquement connectés au
PL) sont acheminés vers le PS.

On se propose d'utiliser le channel 1 de l’AXI GPIO pour acheminer les états des boutons
poussoirs et le channel 2 pour En et LEDs. On utilise l’EMIO 54 en broche pour SW. Le
tableau suivant indique les connexions à respecter:

Entrées/ Sorties/ Signaux Connecté au Sens (par Remarque


rapport au PS)
SW EMIO 53 entrée EMIO utilisée en broche
BPs GPIO0 à GPIO3 entrée AXI channel 1
EN GPIO32 sortie AXI Channel 2
LEDs GPIO33 à GPIO48 sortie

La conception sera divisée en deux parties: la partie I est consacrée à l'implémentation


matérielle et la partie II est consacrée à l'implémentation logicielle. Les deux parties peuvent
être considérées indépendantes.

Partie I : Implémentation matérielle


Le Wrapper généré par vivado est donné comme suit :

1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL;

3 library UNISIM;
4 use [Link];

5 entity design_1_wrapper is
6 port (
7 DDR_addr : inout STD_LOGIC_VECTOR ( 14 downto 0 );
8 DDR_ba : inout STD_LOGIC_VECTOR ( 2 downto 0 );
9 DDR_cas_n : inout STD_LOGIC;
10 DDR_ck_n : inout STD_LOGIC;
11 DDR_ck_p : inout STD_LOGIC;
12 DDR_cke : inout STD_LOGIC;

23
Institut Supérieur d'Informatique L3SE

13 DDR_cs_n : inout STD_LOGIC;


14 DDR_dm : inout STD_LOGIC_VECTOR ( 3 downto 0 );
15 DDR_dq : inout STD_LOGIC_VECTOR ( 31 downto 0 );
16 DDR_dqs_n : inout STD_LOGIC_VECTOR ( 3 downto 0 );
17 DDR_dqs_p : inout STD_LOGIC_VECTOR ( 3 downto 0 );
18 DDR_odt : inout STD_LOGIC;
19 DDR_ras_n : inout STD_LOGIC;
20 DDR_reset_n : inout STD_LOGIC;
21 DDR_we_n : inout STD_LOGIC;
22 FCLK_CLK0_0 : out STD_LOGIC;
23 FIXED_IO_ddr_vrn : inout STD_LOGIC;
24 FIXED_IO_ddr_vrp : inout STD_LOGIC;
25 FIXED_IO_mio : inout STD_LOGIC_VECTOR ( 53 downto 0 );
26 FIXED_IO_ps_clk : inout STD_LOGIC;
27 FIXED_IO_ps_porb : inout STD_LOGIC;
28 FIXED_IO_ps_srstb : inout STD_LOGIC;
29 GPIO_I_0 : in STD_LOGIC;
30 gpio_io_i_0 : in STD_LOGIC_VECTOR ( 3 downto 0 );
31 gpio2_io_o_0 : out STD_LOGIC_VECTOR ( 16 downto 0 )

32 );
33 end design_1_wrapper;

34 architecture STRUCTURE of design_1_wrapper is

35 component design_1 is
36 port (
35 DDR_cas_n : inout STD_LOGIC;

24
Institut Supérieur d'Informatique L3SE

36 DDR_cke : inout STD_LOGIC;


37 DDR_ck_n : inout STD_LOGIC;
38 DDR_ck_p : inout STD_LOGIC;
39 DDR_cs_n : inout STD_LOGIC;
40 DDR_reset_n : inout STD_LOGIC;
41 DDR_odt : inout STD_LOGIC;
42 DDR_ras_n : inout STD_LOGIC;
43 DDR_we_n : inout STD_LOGIC;
44 DDR_ba : inout STD_LOGIC_VECTOR ( 2 downto 0 );
45 DDR_addr : inout STD_LOGIC_VECTOR ( 14 downto 0 );
46 DDR_dm : inout STD_LOGIC_VECTOR ( 3 downto 0 );
47 DDR_dq : inout STD_LOGIC_VECTOR ( 31 downto 0 );
48 DDR_dqs_n : inout STD_LOGIC_VECTOR ( 3 downto 0 );
49 DDR_dqs_p : inout STD_LOGIC_VECTOR ( 3 downto 0 );
50 FIXED_IO_mio : inout STD_LOGIC_VECTOR ( 53 downto 0 );
51 FIXED_IO_ddr_vrn : inout STD_LOGIC;
52 FIXED_IO_ddr_vrp : inout STD_LOGIC;
53 FIXED_IO_ps_srstb : inout STD_LOGIC;
54 FIXED_IO_ps_clk : inout STD_LOGIC;
55 FIXED_IO_ps_porb : inout STD_LOGIC;
56 FCLK_CLK0_0 : out STD_LOGIC;
57 GPIO_I_0 : in STD_LOGIC;
58 gpio_io_i_0 : in STD_LOGIC_VECTOR ( 3 downto 0 );
59 gpio2_io_o_0 : out STD_LOGIC_VECTOR ( 16 downto 0 )
60 );
61 end component design_1;

62 begin

63 design_1_i: component design_1


64 port map (
65 DDR_addr(14 downto 0) => DDR_addr(14 downto 0),
66 DDR_ba(2 downto 0) => DDR_ba(2 downto 0),
67 DDR_cas_n => DDR_cas_n,
68 DDR_ck_n => DDR_ck_n,
69 DDR_ck_p => DDR_ck_p,
70 DDR_cke => DDR_cke,
71 DDR_cs_n => DDR_cs_n,
72 DDR_dm(3 downto 0) => DDR_dm(3 downto 0),
73 DDR_dq(31 downto 0) => DDR_dq(31 downto 0),
74 DDR_dqs_n(3 downto 0) => DDR_dqs_n(3 downto 0),
75 DDR_dqs_p(3 downto 0) => DDR_dqs_p(3 downto 0),
76 DDR_odt => DDR_odt,
77 DDR_ras_n => DDR_ras_n,
78 DDR_reset_n => DDR_reset_n,
79 DDR_we_n => DDR_we_n,
80 FCLK_CLK0_0 => FCLK_CLK0_0,
81 FIXED_IO_ddr_vrn => FIXED_IO_ddr_vrn,

25
Institut Supérieur d'Informatique L3SE

82 FIXED_IO_ddr_vrp => FIXED_IO_ddr_vrp,


83 FIXED_IO_mio(53 downto 0) => FIXED_IO_mio(53 downto 0),
84 FIXED_IO_ps_clk => FIXED_IO_ps_clk,
85 FIXED_IO_ps_porb => FIXED_IO_ps_porb,
86 FIXED_IO_ps_srstb => FIXED_IO_ps_srstb,
87 GPIO_I_0 => GPIO_I_0,
88 gpio_io_i_0( 3 downto 0 )=> gpio_io_i_0( 3 downto 0 ),
89 gpio2_io_o_0( 16 downto 0 )=> gpio2_io_o_0( 16 downto 0 )
90 );
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________

end STRUCTURE;

Q1. Modifier le Wrapper afin qu’il réponde au cahier des charges en termes d'entrées/sorties
du système ainsi qu'en termes de signaux internes qui relient le PS et la PL.

Q2. Rajouter un process dans le Wrapper afin d’implémenter le bloc IP diviseur de fréquence.
La fréquence du signal de sortie clkout doit être de fréquence 2Hz.

Q3. Rajouter un second process dans le Wrapper afin d’implémenter le bloc IP C_7seg (le
contrôleur de l’afficheur 7 segments). Quand En est au niveau haut et au front montant de

26
Institut Supérieur d'Informatique L3SE

l’horloge clkout, ce bloc permet d’allumer un seul segment à la fois (segment a puis segment
b puis segment c puis segment d…) et ce, dans le but d’implémenter un effet chenillard sur
l’afficheur. Si le signal En est au niveau bas alors éteindre tous les segments. On suppose que
le signal En est asynchrone par rapport à l’horloge clkout.

Partie II : Implémentation logicielle


L'application à implémenter sur le processeur embarqué ARM permet de :
- lire l’état du Switch SW,
- Si SW=0 alors mettre le signal En au niveau haut et éteindre toutes les LEDs de la matrice,
- Si SW=1 alors mettre le signal En au niveau bas et allumer uniquement la LED sur la 2ème
ligne et la 2ème colonne de la matrice,
- lire l’état des boutons poussoirs BPs,
- Si BP0=1 alors allumer la LED au-dessus. S’il s’agit de la LED sur la première ligne alors
ne rien faire,
- Si BP1=1 alors allumer la LED au-dessous. S’il s’agit de la LED sur la dernière ligne alors
ne rien faire,
- Si BP2=1 alors allumer la LED à gauche. S’il s’agit de la LED sur la première colonne alors
ne rien faire,
- Si BP3=1 alors allumer la LED à droite. S’il s’agit de la LED sur la dernière colonne alors
ne rien faire,

N.B : - Une seule LED est allumée à la fois.


- La matrice de LEDs est commandée par le signal LEDs (codé sur 16 bits). On suppose
que chaque LED est commandée par un bit. La LED en haut à gauche et LED0 et la
LED au-dessous est la LED4 etc..

Q4. Compléter le code C à implémenter sur le processeur embarqué. Suivre les commentaires
pour écrire ces différentes étapes du programme.

#include <stdio.h>

__________________________________________________________________________________

__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________

int main(void)

// Déclaration des différentes variables

___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________

27
Institut Supérieur d'Informatique L3SE

__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________

//Déclaration et initialisation des structures

__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________

// Direction des entrées/sorties

____________________________________________________________________

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

While(1)

// lire l’état du switch SW

____________________________________________________________________

//Si SW=0 alors mettre En au niveau haut et éteindre toutes les LEDs
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

/* Sinon En est mise au niveau bas et allumer la LED sur la 2ème


ligne et la 2ème colonne */
__________________________________________________________________________________
__________________________________________________________________________________

/* Selon les états des BP, allumer la LED suivante*/


__________________________________________________________________________________

28
Institut Supérieur d'Informatique L3SE

__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
____________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
____________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
____________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________

29
Institut Supérieur d'Informatique L3SE

__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
}

return 0;

30
Institut Supérieur d'Informatique L3SE

Annexe

Les différentes fonctions de XGpioPs sont les suivantes:

u32 XGpioPs_Read(XGpioPs *InstancePtr, u8 Bank)


void XGpioPs_Write (XGpioPs *InstancePtr, u8 Bank, u32 Data)
void XGpioPs_SetDirection(XGpioPs *InstancePtr, u8 Bank, u32 Direction)
u32 XGpioPs_GetDirection(XGpioPs *InstancePtr, u8 Bank)
void XGpioPs_SetOutputEnable(XGpioPs *InstancePtr, u8 Bank, u32 Enable)
u32 XGpioPs_GetOutputEnable(XGpioPs *InstancePtr, u8 Bank)
int XGpioPs_ReadPin(XGpioPs *InstancePtr, int Pin)
void XGpioPs_WritePin(XGpioPs *InstancePtr, int Pin, int Data)
void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, int Pin, int Direction)
int XGpioPs_GetDirectionPin(XGpioPs *InstancePtr, int Pin)
void XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, int Pin, int Enable)
int XGpioPs_GetOutputEnablePin(XGpioPs *InstancePtr, int Pin)
int XGpioPs_SelfTest(XGpioPs *InstancePtr)
void XGpioPs_IntrEnable(XGpioPs *InstancePtr, u8 Bank, u32 Mask)
void XGpioPs_IntrDisable(XGpioPs *InstancePtr, u8 Bank, u32 Mask)
u32 XGpioPs_IntrGetEnabled(XGpioPs *InstancePtr, u8 Bank)
u32 XGpioPs_IntrGetStatus(XGpioPs *InstancePtr, u8 Bank)
void XGpioPs_IntrClear(XGpioPs *InstancePtr, u8 Bank, u32 Mask)
void XGpioPs_SetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 IntrType,u32
IntrPolarity, u32 IntrOnAny)
void XGpioPs_GetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 *IntrType,
u32 *IntrPolarity, u32 *IntrOnAny)
void XGpioPs_SetCallbackHandler(XGpioPs *InstancePtr, void *CallBackRef,
XGpioPs_Handler FuncPtr)
void XGpioPs_IntrHandler(XGpioPs *InstancePtr)
void XGpioPs_SetIntrTypePin(XGpioPs *InstancePtr, int Pin, u8 IrqType)
u8 XGpioPs_GetIntrTypePin(XGpioPs *InstancePtr, int Pin)
void XGpioPs_IntrEnablePin(XGpioPs *InstancePtr, int Pin)
void XGpioPs_IntrDisablePin(XGpioPs *InstancePtr, int Pin)
int XGpioPs_IntrGetEnabledPin(XGpioPs *InstancePtr, int Pin)
int XGpioPs_IntrGetStatusPin(XGpioPs *InstancePtr, int Pin)
void XGpioPs_IntrClearPin(XGpioPs *InstancePtr, int Pin)
int XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr, u32
EffectiveAddr)
XGpioPs_Config * XGpioPs_LookupConfig(u16 DeviceId)

Les différentes fonctions de XGpio sont les suivantes:

int XGpio_Initialize(XGpio*InstancePtr,u16DeviceId)
void XGpio_SetDataDirection(XGpio *InstancePtr, unsigned Channel,u32 DirectionMask)
u32 XGpio_GetDataDirection(XGpio *InstancePtr, unsigned Channel)
u32 XGpio_DiscreteRead(XGpio *InstancePtr, unsigned Channel)
void XGpio_DiscreteWrite(XGpio *InstancePtr, unsigned Channel, u32 Mask)
void XGpio_DiscreteSet(XGpio *InstancePtr, unsigned Channel, u32 Mask)

31
Institut Supérieur d'Informatique L3SE

void XGpio_DiscreteClear(XGpio *InstancePtr, unsigned Channel, u32 Mask)


int XGpio_SelfTest(XGpio *InstancePtr)
void XGpio_InterruptGlobalEnable(XGpio *InstancePtr)
void XGpio_InterruptGlobalDisable(XGpio *InstancePtr)
void XGpio_InterruptEnable(XGpio *InstancePtr, u32 Mask)
void XGpio_InterruptDisable(XGpio *InstancePtr, u32 Mask)
void XGpio_InterruptClear(XGpio *InstancePtr, u32 Mask)
U32 XGpio_InterruptGetEnabled(XGpio *InstancePtr)
U32 XGpio_InterruptGetStatus(XGpio *InstancePtr)

32

Vous aimerez peut-être aussi