1 | %------------------------------------------------------------------------------ |
---|
2 | % $Id: document-morpheo-vhdl_generation-fr-04_vhdl_structural.tex 100 2009-01-08 13:06:27Z rosiere $ |
---|
3 | %------------------------------------------------------------------------------ |
---|
4 | |
---|
5 | \Section{VHDL : structurelle}\label{vhdl_structural} |
---|
6 | |
---|
7 | \subSection{Description du fichier {\it Component\_vhdl.cpp}} |
---|
8 | Les modèles systemC structurels sont des modèles qui instancient d'autres modèles. Il n'y a pas de description comportementale. Ces modèles sont générés automatiquement. |
---|
9 | Par contre, les modèles systemC comportementaux peuvent être décrit par un modèle VHDL mixte (incluant une description comportementale et des instances d'autre composant). |
---|
10 | |
---|
11 | Les modèles génériques sont dans le répertoire {\it IPs/systemC/processor/Morpheo/Behavioural/Generic}. |
---|
12 | |
---|
13 | \lstparam{C++} |
---|
14 | \begin{lstlisting}[caption={Component\_vhdl.cpp}, label=component_vhdl.cpp] |
---|
15 | void component::vhdl (void) |
---|
16 | { |
---|
17 | Vhdl * vhdl = new Vhdl (_name); |
---|
18 | |
---|
19 | _interfaces->set_port(vhdl); |
---|
20 | _component->vhdl_instance(vhdl); |
---|
21 | |
---|
22 | vhdl_declaration (vhdl); |
---|
23 | vhdl_body (vhdl); |
---|
24 | |
---|
25 | vhdl->generate_file(); |
---|
26 | |
---|
27 | delete vhdl; |
---|
28 | }; |
---|
29 | \end{lstlisting} |
---|
30 | |
---|
31 | |
---|
32 | La première étape est d'éditer le fichier {\it Component\_vhdl.cpp}. Le listing \ref{component_vhdl.cpp} représente le contenu de ce fichier. |
---|
33 | \begin{itemize} |
---|
34 | \item Ligne 3 : Déclaration et construction de la variable {\it vhdl} qui est du type {\it Vhdl}. |
---|
35 | \item Ligne 5 : Ajout dans le modèle VHDL des interfaces présentes dans le modèle SystemC. (cf fichiers Component.h). |
---|
36 | \item Ligne 6 : Ajout dans le modèle VHDL des composants internes dans le modèle SystemC. (cf fichiers Component.h et Component\_allocation.cpp). |
---|
37 | \item Ligne 8 : Ajout dans le modèle VHDL des déclarations définit dans le fichiers Component\_vhdl\_declaration.cpp (cf section \ref{vhdl_declaration}). |
---|
38 | \item Ligne 9 : Ajout dans le modèle VHDL de la description comportemental définit dans le fichiers Component\_vhdl\_body.cpp (cf section \ref{vhdl_body}). |
---|
39 | \item Ligne 11 : Génération des fichiers VHDL. Le nom du fichier est construit à partir du nom fourni lors de la construction de la variable {\it vhdl}. |
---|
40 | \item Ligne 13 : Destruction de l'objet. |
---|
41 | \end{itemize} |
---|
42 | |
---|
43 | Pour la suite, nous allons supposer l'instanciation d'une FIFO. |
---|
44 | |
---|
45 | \subSection{Ajout d'une instance} |
---|
46 | |
---|
47 | Dans le fichier Component\_vhdl.cpp : |
---|
48 | \begin{enumerate} |
---|
49 | \item Inclure la définition de la classe désirée. |
---|
50 | \lstparam{C++} |
---|
51 | \begin{lstlisting} |
---|
52 | #include "Behavioural/Generic/Queue/include/Queue.h" |
---|
53 | \end{lstlisting} |
---|
54 | \item Creer les paramètres du modèle. |
---|
55 | \lstparam{C++} |
---|
56 | \begin{lstlisting} |
---|
57 | morpheo::behavioural::generic::queue::Parameters * param_queue; |
---|
58 | param_queue = new morpheo::behavioural::generic::queue::Parameters |
---|
59 | (16, //size_queue |
---|
60 | 32);//size_data |
---|
61 | \end{lstlisting} |
---|
62 | \item Creer le modèle |
---|
63 | \lstparam{C++} |
---|
64 | \begin{lstlisting} |
---|
65 | morpheo::behavioural::generic::queue::Queue * queue; |
---|
66 | std::string queue_name = _name + "_queue"; |
---|
67 | |
---|
68 | queue = new morpheo::behavioural::generic::queue::Queue |
---|
69 | (queue_name.c_str() // nom du modèle |
---|
70 | #ifdef STATISTICS |
---|
71 | ,NULL // Pas paramètres pour les statistiques |
---|
72 | #endif |
---|
73 | ,param_queue // Paramètres de la file |
---|
74 | ,USE_VHDL); // Utilisation du modèle VHDL |
---|
75 | \end{lstlisting} |
---|
76 | \item Inclure le modèle dans la liste des composants internes |
---|
77 | \lstparam{C++} |
---|
78 | \begin{lstlisting} |
---|
79 | _component->set_component(queue->_component |
---|
80 | #ifdef POSITION |
---|
81 | , 20, 20, 20, 20 |
---|
82 | // Coordonée pour l'outil de visualisation |
---|
83 | #endif |
---|
84 | , INSTANCE_LIBRARY |
---|
85 | // Instancier uniquement les librairies |
---|
86 | ); |
---|
87 | \end{lstlisting} |
---|
88 | \item indiquer dans le fichier Makefile.deps que le composant dépend de ce modèle. |
---|
89 | \lstparam{make} |
---|
90 | \begin{lstlisting} |
---|
91 | # Inclure les dépendances |
---|
92 | ifndef Queue |
---|
93 | include $(DIR_MORPHEO)/Behavioural/Generic/Queue/Makefile.deps |
---|
94 | endif |
---|
95 | |
---|
96 | # Inclure les librairies |
---|
97 | Component_LIBRARY = -lComponent \ |
---|
98 | $(Queue_LIBRARY) |
---|
99 | |
---|
100 | # Les chemins vers les librairies |
---|
101 | Component_DIR_LIBRARY = -L$(Component_DIR)/lib \ |
---|
102 | $(Queue_DIR_LIBRARY) |
---|
103 | |
---|
104 | # Construction de la librairie ``Component'' |
---|
105 | Component_library : |
---|
106 | @\ |
---|
107 | $(MAKE) Queue_library; \ |
---|
108 | $(MAKE) --directory=$(Component_DIR) --makefile=Makefile; |
---|
109 | |
---|
110 | # Effacement des fichiers générés |
---|
111 | Component_library_clean : |
---|
112 | @\ |
---|
113 | $(MAKE) Queue_library_clean; \ |
---|
114 | $(MAKE) --directory=$(Component_DIR) --makefile=Makefile clean; |
---|
115 | \end{lstlisting} |
---|
116 | \end{enumerate} |
---|
117 | |
---|
118 | \subSection{Instanciation} |
---|
119 | L'instanciation ce fait comme avec des composants VHDL classiques : |
---|
120 | \lstparam{C++} |
---|
121 | \begin{lstlisting} |
---|
122 | vhdl->set_comment(0,""); |
---|
123 | vhdl->set_comment(0,"-----------------------------------"); |
---|
124 | vhdl->set_comment(0,"-- Instance queue "); |
---|
125 | vhdl->set_comment(0,"-----------------------------------"); |
---|
126 | vhdl->set_comment(0,""); |
---|
127 | |
---|
128 | vhdl->set_body (0,"instance_"+_name+"_queue : "+_name+"_queue"); |
---|
129 | vhdl->set_body (0,"port map ("); |
---|
130 | vhdl->set_body (1," in_CLOCK \t=>\t in_CLOCK "); |
---|
131 | vhdl->set_body (1,", in_NRESET \t=>\t in_NRESET"); |
---|
132 | vhdl->set_body (1,", in_INSERT_VAL \t=>\tinternal_QUEUE_INSERT_VAL"); |
---|
133 | vhdl->set_body (1,",out_INSERT_ACK \t=>\tinternal_QUEUE_INSERT_ACK"); |
---|
134 | vhdl->set_body (1,", in_INSERT_DATA \t=>\tinternal_QUEUE_INSERT_DATA"); |
---|
135 | vhdl->set_body (1,",out_RETIRE_VAL \t=>\tinternal_QUEUE_RETIRE_VAL"); |
---|
136 | vhdl->set_body (1,", in_RETIRE_ACK \t=>\tinternal_QUEUE_RETIRE_ACK"); |
---|
137 | vhdl->set_body (1,",out_RETIRE_DATA \t=>\tinternal_QUEUE_RETIRE_DATA"); |
---|
138 | vhdl->set_body (0,");"); |
---|
139 | \end{lstlisting} |
---|