Changeset 94 for trunk/IPs/systemC/processor/Morpheo/Documentation
- Timestamp:
- Dec 15, 2008, 12:04:03 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Documentation/doc/document-morpheo-vhdl_generation/tex/document-morpheo-vhdl_generation-fr.tex
r93 r94 9 9 \begin{itemize} 10 10 \item Dans la section \ref{tree}, nous présentons l'arborescence des répertoires. 11 \item Dans la section \ref{files}, nous détailerons les fichiers ainsi que leurs contenus.12 11 \item Dans la section \ref{vhdl_declaration}, nous expliciterons l'API ({\it Application Programming Interface}) pour la déclaration des signaux et des types du VHDL. 13 12 \item Dans la section \ref{vhdl_body}, nous présenterons l'API pour générer le comportement des composants. 14 13 \item Dans la section \ref{vhdl_structural}, nous expliquerons la manière de créer des sous composants. 14 \item Dans la section \ref{example}, nous montrerons quelques exemples. 15 15 \end{itemize} 16 16 … … 19 19 Dans le répertoire contenant le projet, nous avons les répertoires suivant : 20 20 \begin{description} 21 \item[IPs/systemC/processor/Morpheo/Documentation/ :] Contient différent document décrivant certain point du projet, dont ce présent document. 22 \item[IPs/systemC/processor/Morpheo/Behavioural/ :] 21 \item[IPs/systemC/processor/Morpheo/Documentation/ :] Contient différent document décrivant certain point du projet, dont cette documentation. 22 \item[IPs/systemC/processor/Morpheo/Behavioural/ :] 23 \item[IPs/systemC/processor/Morpheo/Behavioural/include/ :] 24 \begin{description} 25 \item [Parameters.h :] Contient la classe {\it Parameters}, cette classe définit les paramètres constants. 26 \item [Vhdl.h :] Contient la classe {\it Vhdl}. 27 \end{description} 28 \item[IPs/systemC/processor/Morpheo/Behavioural/\dots/Component :] Chaque composant est inclue dans un répertoire spécifique. 29 \item[IPs/systemC/processor/Morpheo/Behavioural/\dots/Component/include :] 30 \begin{description} 31 \item [Parameters.h :] Contient la classe {\it Parameters}, elle dérive de la classe contenu dans le fichier le répertoire {\it \dots/Behavioural/include/}. 32 \item [Component.h :] Contient la classe {\it Component}. Il définit l'interface, les registres ainsi que les méthodes du modèle systemC. 33 \item [Types.h :] Contient les types spéciaux. 34 \end{description} 35 \item[IPs/systemC/processor/Morpheo/Behavioural/\dots/Component/src :] 36 \begin{description} 37 \item [Component\_transition.cpp :] 38 \item [Component\_genMoore.cpp :] 39 \item [Component\_genMealy\_XXX.cpp :] 40 41 \item [Component\_vhdl\_declaration.cpp :] 42 \item [Component\_vhdl\_body.cpp :] 43 \end{description} 44 \item[IPs/systemC/processor/Morpheo/Behavioural/\dots/Component/Selftest :] 23 45 \end{description} 24 46 25 \Section{Fichiers}\label{files}26 27 47 \Section{VHDL : déclaration}\label{vhdl_declaration} 28 48 29 Les déclarations ce font dans le fichier {\it COMPONENT\_vhdl\_declaration.cpp}. 49 Les déclarations ce font dans le fichier {\it Component\_vhdl\_declaration.cpp}. 50 51 \subSection{Interfaces} 52 L'interface est définit dans le modèle SystemC. Il n'ont pas nécessaire de la redéfinir pour le modèle VHDL. 53 54 La nomenclature est la suivante : 55 \begin{itemize} 56 \item La direction en minuscule ({\it in}, {\it out}). 57 \item Le nom de l'interface en majuscule ({\it READ}, {\it PUSH}, \dots). 58 \item Le numéro de l'interface (la première interface aura le numéro 0. S'il n'y a qu'une interface, celle ci aura tout de même le numéro 0). 59 \item Le nom du signal en majuscule ({\it VAL}, {\it ADDRESS}, \dots). 60 \end{itemize} 61 62 Par exemple pour la 2 ème interface de lecture d'un banc de registre : 63 \begin{verbatim} 64 in_READ_1_VAL : in std_logic; 65 out_READ_1_ACK : out std_logic; 66 in_READ_1_ADDRESS : in std_logic_vector(8 downto 0); 67 out_READ_1_DATA : out std_logic_vector(31 downto 0); 68 \end{verbatim} 69 70 Chaque composent (aussi bien combinatoire que séquentielle) possède un signal d'horloge et un signal de reset. (Ce dernier est actif à l'état bas). Ils ont tout les deux le même nom quelque soit le composant. 71 \begin{verbatim} 72 in_CLOCK : in std_logic; 73 in_NRESET : in std_logic; 74 \end{verbatim} 30 75 31 76 \subSection{Types} … … 41 86 std::string std_logic_range (uint32_t size, 42 87 uint32_t max , 43 uint32_t min ); 88 uint32_t min , 89 bool force=false); 44 90 std::string std_logic_range (uint32_t max , 45 uint32_t min ); 46 std::string std_logic_range (uint32_t size); 47 \end{verbatim} 48 49 La première fonction fais un test sur la taille que la seconde ne fait pas. L'argument de la troisième définit la taille ce qui implique que la borne minimum est 0. 50 51 \begin{verbatim} 52 std::string std_logic_others (uint32_t size, 53 uint32_t cst ); 54 \end{verbatim} 55 91 uint32_t min , 92 bool force=false); 93 std::string std_logic_range (uint32_t size, 94 bool force=false); 95 \end{verbatim} 96 97 La première fonction fais un test sur la taille que la seconde ne fait pas. 98 L'argument de la troisième définit la taille (ce qui implique que la borne minimum est 0 et la borne maximum est size-1). 99 Toute les surcharges ont le bolléen optionnel {\it force}. S'il est à faux, alors des tests seront effectués sur les bornes et la taille, sinon aucun test n'est effectué. 100 101 Par exemple : 102 \begin{verbatim} 103 std_logic_range(4,false) renvoie "(3 downto 0)". 104 std_logic_range(1,false) renvoie "(0)". 105 std_logic_range(1,true ) renvoie "(0 downto 0)". 106 \end{verbatim} 56 107 57 108 Pour les types plus complexe, la classe {\it Vhdl} possède une méthode générique. Le premier argument est le nom du type le second est le type. … … 89 140 \end{verbatim} 90 141 142 Dans le cas de signaux de type {\it std\_logic}, au lieu de déclarer des constantes, il existe deux fonctions permettant d'utiliser des constantes directement dans le corps du composant. 143 La première est {\it std\_logic\_others}. Elle permet de définir des constantes dont soit les bits sont à pleins un soit à plein zéro. 144 145 \begin{verbatim} 146 std::string std_logic_others (uint32_t size, 147 bool cst ); 148 \end{verbatim} 149 150 Pour toute les autres constantes, la méthode {\it std\_logic\_conv} transforme un entier en {\it std\_logic\_vector}. 151 152 \begin{verbatim} 153 std::string std_logic_conv (uint32_t size, 154 std::string value); 155 std::string std_logic_conv (uint32_t size, 156 uint32_t value); 157 \end{verbatim} 158 159 91 160 \subSection{Signaux internes} 92 161 … … 113 182 \end{verbatim} 114 183 115 116 117 %\begin{verbatim}118 %void set_alias (std::string name1 ,119 %std::string type1 ,120 %std::string name2 ,121 %std::string range2);122 %void set_alias (std::string name1 ,123 %uint32_t size1 ,124 %std::string name2 ,125 %std::string range2);126 %\end{verbatim}184 En vhdl il est possible de renommer une champ d'un signal. Ceci ce fait à l'aide de la fonction {\it set\_alias}. Elle prend 4 arguments. Le premier étant le nom du signal après le renommage. le second est soit le type, soit la taille du {\it std\_logic\_vector} du signal rénommé. Les deux derniers conserné le signal à renommé : le nom de ce dernier ainsi que l'intervalle. Pour le dernier paramètre il est recommandé d'utilisé la fonction {\it std\_logic\_range}. 185 186 \begin{verbatim} 187 void set_alias (std::string name1 , 188 std::string type1 , 189 std::string name2 , 190 std::string range2); 191 void set_alias (std::string name1 , 192 uint32_t size1 , 193 std::string name2 , 194 std::string range2); 195 \end{verbatim} 127 196 128 197 129 198 \Section{VHDL : comportement}\label{vhdl_body} 130 199 200 Le comportement du composant est définit dans le fichier {\it Component\_vhdl\_body.cpp}. 201 202 Il n'y a pas de fonction aidant à l'écriture du Vhdl. 203 La méthode {\it set\_body} permet de définir une ligne de code VHDL. Un retour à la ligne est automatiquement inséré. Le premier argument est pour l'indentation. 204 \begin{verbatim} 205 void set_body (uint32_t depth, 206 std::string text ); 207 void set_body (std::string text ); 208 \end{verbatim} 209 210 Pour les commentaires, il y a la fonction {\it set\_comment}. 211 \begin{verbatim} 212 void set_comment (uint32_t depth, 213 std::string text ); 214 void set_comment (std::string text ); 215 \end{verbatim} 216 217 218 131 219 \Section{VHDL : structurelle}\label{vhdl_structural} 220 221 \Section{Exemples}\label{example} 222 223 \subSection{Banc de Registres Monolithique} 224 225 \subsubSection{Fichier RegisterFile\_Monolithic\_vhdl\_declaration.cpp} 226 \begin{verbatim} 227 void RegisterFile_Monolithic::vhdl_declaration (Vhdl * & vhdl) 228 { 229 vhdl->set_type ("Tregfile", "array " + std_logic_range(_param->_nb_word,true)+ 230 " of "+ 231 std_logic(_param->_size_word)); 232 233 vhdl->set_signal ("reg_DATA", "Tregfile"); 234 }; 235 \end{verbatim} 236 \subsubSection{Fichier RegisterFile\_Monolithic\_vhdl\_body.cpp} 237 \begin{verbatim} 238 void RegisterFile_Monolithic::vhdl_body (Vhdl * & vhdl) 239 { 240 vhdl->set_body (0,""); 241 vhdl->set_comment(0,"---------------------------------------------------"); 242 vhdl->set_comment(0," Ackitement"); 243 vhdl->set_comment(0,"---------------------------------------------------"); 244 vhdl->set_body (0,""); 245 246 for (uint32_t i = 0; i < _param->_nb_port_read; i++) 247 vhdl->set_body (0,"out_READ_"+toString(i)+"_ACK <= '1';"); 248 for (uint32_t i = 0; i < _param->_nb_port_write; i++) 249 vhdl->set_body (0,"out_WRITE_"+toString(i)+"_ACK <= '1';"); 250 251 vhdl->set_body (0,""); 252 vhdl->set_comment(0,"---------------------------------------------------"); 253 vhdl->set_comment(0," Read RegisterFile"); 254 vhdl->set_comment(0,"---------------------------------------------------"); 255 vhdl->set_body (0,""); 256 257 for (uint32_t i = 0; i < _param->_nb_port_read; i++) 258 { 259 std::string str_address; 260 if (_param->_have_port_address) 261 str_address = "conv_integer(in_READ_"+toString(i)+"_ADDRESS)"; 262 else 263 str_address = "0"; 264 265 vhdl->set_body (0,"out_READ_"+toString(i)+"_DATA <= reg_DATA ("+str_address+ 266 ") when in_READ_"+toString(i)+"_VAL = '1' else "+ 267 std_logic_others(_param->_size_word,0)+";"); 268 } 269 270 vhdl->set_body (0,""); 271 vhdl->set_comment(0,"---------------------------------------------------"); 272 vhdl->set_comment(0," Write RegisterFile"); 273 vhdl->set_comment(0,"---------------------------------------------------"); 274 vhdl->set_body (0,""); 275 276 vhdl->set_body (0,"RegisterFile_write: process (in_CLOCK)"); 277 vhdl->set_body (0,"begin -- process RegisterFile_write"); 278 vhdl->set_body (1,"if in_CLOCK'event and in_CLOCK = '1' then"); 279 280 for (uint32_t i = 0; i < _param->_nb_port_write; i++) 281 { 282 std::string str_address; 283 if (_param->_have_port_address) 284 str_address = "conv_integer(in_WRITE_"+toString(i)+"_ADDRESS)"; 285 else 286 str_address = "0"; 287 288 vhdl->set_body (2,"if (in_WRITE_"+toString(i)+"_VAL = '1') then"); 289 vhdl->set_body (3,"reg_DATA("+str_address+") <= in_WRITE_"+toString(i)+"_DATA;"); 290 vhdl->set_body (2,"end if;"); 291 } 292 293 vhdl->set_body (1,"end if;"); 294 vhdl->set_body (0,"end process RegisterFile_write;"); 295 }; 296 \end{verbatim} 297 298 \subsubSection{Fichier RegisterFile\_Monolithic.vhdl} 299 \begin{verbatim} 300 library ieee; 301 use ieee.numeric_bit.all; 302 use ieee.numeric_std.all; 303 use ieee.std_logic_1164.all; 304 use ieee.std_logic_arith.all; 305 use ieee.std_logic_misc.all; 306 --use ieee.std_logic_signed.all; 307 use ieee.std_logic_unsigned.all; 308 --use ieee.std_logic_textio.all; 309 310 311 library work; 312 use work.RegisterFile_Monolithic_Pack.all; 313 314 315 entity RegisterFile_Monolithic is 316 port ( in_CLOCK : in std_logic; 317 in_NRESET : in std_logic; 318 in_READ_0_VAL : in std_logic; 319 out_READ_0_ACK : out std_logic; 320 in_READ_0_ADDRESS : in std_logic_vector(8 downto 0); 321 out_READ_0_DATA : out std_logic_vector(31 downto 0); 322 in_WRITE_0_VAL : in std_logic; 323 out_WRITE_0_ACK : out std_logic; 324 in_WRITE_0_ADDRESS: in std_logic_vector(8 downto 0); 325 in_WRITE_0_DATA : in std_logic_vector(31 downto 0) 326 ); 327 end RegisterFile_Monolithic; 328 329 architecture behavioural of RegisterFile_Monolithic is 330 type Tregfile is array (511 downto 0) of std_logic_vector(31 downto 0); 331 332 signal reg_DATA : Tregfile; 333 334 begin 335 ----------------------------------------------------- 336 -- Ackitement 337 ----------------------------------------------------- 338 339 out_READ_0_ACK <= '1'; 340 out_WRITE_0_ACK <= '1'; 341 342 ----------------------------------------------------- 343 -- Read RegisterFile 344 ----------------------------------------------------- 345 346 out_READ_0_DATA <= reg_DATA (conv_integer(in_READ_0_ADDRESS)) 347 when in_READ_0_VAL = '1' 348 else (others => '0'); 349 350 ----------------------------------------------------- 351 -- Write RegisterFile 352 ----------------------------------------------------- 353 354 RegisterFile_write: process (in_CLOCK) 355 begin -- process RegisterFile_write 356 if in_CLOCK'event and in_CLOCK = '1' then 357 if (in_WRITE_0_VAL = '1') then 358 reg_DATA(conv_integer(in_WRITE_0_ADDRESS)) <= in_WRITE_0_DATA; 359 end if; 360 end if; 361 end process RegisterFile_write; 362 end behavioural; 363 364 \end{verbatim}
Note: See TracChangeset
for help on using the changeset viewer.