[100] | 1 | %------------------------------------------------------------------------------ |
---|
| 2 | % $Id: document-morpheo-vhdl_generation-fr-02_vhdl_declaration.tex 100 2009-01-08 13:06:27Z rosiere $ |
---|
| 3 | %------------------------------------------------------------------------------ |
---|
| 4 | |
---|
| 5 | \Section{VHDL : déclaration}\label{vhdl_declaration} |
---|
| 6 | |
---|
| 7 | Les déclarations se font dans le fichier {\it Component\_vhdl\_declaration.cpp}. |
---|
| 8 | |
---|
| 9 | \subSection{Interfaces} |
---|
| 10 | L'interface est définie dans le modèle SystemC. Il n'est pas nécessaire de la redéfinir pour le modèle VHDL. |
---|
| 11 | |
---|
| 12 | La nomenclature est la suivante : |
---|
| 13 | \begin{itemize} |
---|
| 14 | \item La direction en minuscule ({\it in}, {\it out}). |
---|
| 15 | \item Le nom de l'interface en majuscule ({\it READ}, {\it PUSH}, \dots). |
---|
| 16 | \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). |
---|
| 17 | \item Le nom du signal en majuscule ({\it VAL}, {\it ADDRESS}, \dots). |
---|
| 18 | \end{itemize} |
---|
| 19 | |
---|
| 20 | Par exemple pour la 2 ème interface de lecture d'un banc de registre : |
---|
| 21 | \lstparam{VHDL} |
---|
| 22 | \begin{lstlisting} |
---|
| 23 | in_READ_1_VAL : in std_logic; |
---|
| 24 | out_READ_1_ACK : out std_logic; |
---|
| 25 | in_READ_1_ADDRESS : in std_logic_vector(8 downto 0); |
---|
| 26 | out_READ_1_DATA : out std_logic_vector(31 downto 0); |
---|
| 27 | \end{lstlisting} |
---|
| 28 | |
---|
| 29 | Chaque composant (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 tous les deux le même nom quelque soit le composant. |
---|
| 30 | \lstparam{VHDL} |
---|
| 31 | \begin{lstlisting} |
---|
| 32 | in_CLOCK : in std_logic; |
---|
| 33 | in_NRESET : in std_logic; |
---|
| 34 | \end{lstlisting} |
---|
| 35 | |
---|
| 36 | \subSection{Types} |
---|
| 37 | |
---|
| 38 | Le type de base utilisé est le {\it std\_logic\_vector} (ou std\_logic si le vecteur est sur un seul bit). Pour cela on utilise la fonction suivante : |
---|
| 39 | |
---|
| 40 | \lstparam{C++} |
---|
| 41 | \begin{lstlisting} |
---|
| 42 | std::string std_logic (uint32_t size); |
---|
| 43 | \end{lstlisting} |
---|
| 44 | |
---|
| 45 | Pour accéder à une partie du vecteur, on utilise la fonction {\it std\_logic\_range}. Elle a les prototypes suivant : |
---|
| 46 | \lstparam{C++} |
---|
| 47 | \begin{lstlisting} |
---|
| 48 | std::string std_logic_range (uint32_t size, |
---|
| 49 | uint32_t max , |
---|
| 50 | uint32_t min); |
---|
| 51 | std::string std_logic_range (uint32_t max , |
---|
| 52 | uint32_t min); |
---|
| 53 | std::string std_logic_range (uint32_t size); |
---|
| 54 | std::string _std_logic_range (uint32_t size, |
---|
| 55 | uint32_t max , |
---|
| 56 | uint32_t min); |
---|
| 57 | std::string _std_logic_range (uint32_t max , |
---|
| 58 | uint32_t min); |
---|
| 59 | std::string _std_logic_range (uint32_t size); |
---|
| 60 | \end{lstlisting} |
---|
| 61 | |
---|
| 62 | La première fonction fait un test sur la taille que la seconde ne fait pas. |
---|
| 63 | 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). |
---|
| 64 | Toutes les fonctions préfixées par un underscore n'effectuent pas de test sur les bornes. |
---|
| 65 | |
---|
| 66 | Par exemple : |
---|
| 67 | \begin{verbatim} |
---|
| 68 | std_logic_range(4) renvoie "(3 downto 0)". |
---|
| 69 | std_logic_range(1) renvoie "(0)". |
---|
| 70 | _std_logic_range(1) renvoie "(0 downto 0)". |
---|
| 71 | \end{verbatim} |
---|
| 72 | |
---|
| 73 | Pour les types plus complexes, 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. |
---|
| 74 | |
---|
| 75 | \lstparam{C++} |
---|
| 76 | \begin{lstlisting} |
---|
| 77 | void set_type (std::string name, |
---|
| 78 | std::string type); |
---|
| 79 | \end{lstlisting} |
---|
| 80 | |
---|
| 81 | L'exemple suivant définit un type représentant un tableau de {\it nb\_word} mots de {\it size\_word} bit chacun : |
---|
| 82 | \lstparam{C++} |
---|
| 83 | \begin{lstlisting} |
---|
| 84 | vhdl->set_type ("Tregfile", |
---|
| 85 | "array "+std_logic_range(nb_word)+" of "+std_logic(size_word)); |
---|
| 86 | \end{lstlisting} |
---|
| 87 | |
---|
| 88 | \subSection{Constantes} |
---|
| 89 | |
---|
| 90 | La déclaration de constante, ce fait avec la méthode {\it set\_constant} de la classe {\it Vhdl}. Les différentes surcharges de cette méthode est le type des arguments {\it type} et {\it init}. |
---|
| 91 | |
---|
| 92 | \lstparam{C++} |
---|
| 93 | \begin{lstlisting} |
---|
| 94 | void set_constant (std::string name, |
---|
| 95 | std::string type, |
---|
| 96 | std::string init); |
---|
| 97 | void set_constant (std::string name, |
---|
| 98 | uint32_t size, |
---|
| 99 | std::string init); |
---|
| 100 | void set_constant (std::string name, |
---|
| 101 | uint32_t size, |
---|
| 102 | uint32_t init); |
---|
| 103 | \end{lstlisting} |
---|
| 104 | |
---|
| 105 | Par exemple pour coder les états d'un automate à 5 états en One Hot : |
---|
| 106 | \lstparam{C++} |
---|
| 107 | \begin{lstlisting} |
---|
| 108 | vhdl->set_constant ("State_idle",5,1); |
---|
| 109 | \end{lstlisting} |
---|
| 110 | |
---|
| 111 | 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. |
---|
| 112 | La première est {\it std\_logic\_others}. Elle permet de définir des constantes dont soit les bits sont à plein un soit à plein zéro. |
---|
| 113 | |
---|
| 114 | \lstparam{C++} |
---|
| 115 | \begin{lstlisting} |
---|
| 116 | std::string std_logic_others (uint32_t size, |
---|
| 117 | bool cst ); |
---|
| 118 | \end{lstlisting} |
---|
| 119 | |
---|
| 120 | Pour toutes les autres constantes, la méthode {\it std\_logic\_conv} transforme un entier en {\it std\_logic\_vector}. |
---|
| 121 | |
---|
| 122 | \lstparam{C++} |
---|
| 123 | \begin{lstlisting} |
---|
| 124 | std::string std_logic_conv (uint32_t size, |
---|
| 125 | std::string value); |
---|
| 126 | std::string std_logic_conv (uint32_t size, |
---|
| 127 | uint32_t value); |
---|
| 128 | \end{lstlisting} |
---|
| 129 | |
---|
| 130 | |
---|
| 131 | \subSection{Signaux internes} |
---|
| 132 | |
---|
| 133 | Les signaux internes sont définis grâce à la méthode {\it set\_signal}. Le premier argument est le nom du signal. Le second est soit un type soit une taille (dans le cas où le type est un {\it std\_logic\_vector}). |
---|
| 134 | \lstparam{C++} |
---|
| 135 | \begin{lstlisting} |
---|
| 136 | void set_signal (std::string name, |
---|
| 137 | std::string type); |
---|
| 138 | void set_signal (std::string name, |
---|
| 139 | uint32_t size); |
---|
| 140 | \end{lstlisting} |
---|
| 141 | |
---|
| 142 | La méthode est également surchargée si le signal a besoin d'une initialisation. |
---|
| 143 | |
---|
| 144 | \lstparam{C++} |
---|
| 145 | \begin{lstlisting} |
---|
| 146 | void set_signal (std::string name, |
---|
| 147 | std::string type, |
---|
| 148 | std::string init); |
---|
| 149 | void set_signal (std::string name, |
---|
| 150 | uint32_t size, |
---|
| 151 | std::string init); |
---|
| 152 | void set_signal (std::string name, |
---|
| 153 | uint32_t size, |
---|
| 154 | uint32_t init); |
---|
| 155 | \end{lstlisting} |
---|
| 156 | |
---|
| 157 | En vhdl il est possible de renommer un champ d'un signal. Ceci se 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 renommé. Les deux derniers concernés le signal à renommé : le nom de ce dernier ainsi que l'intervalle. Pour le dernier paramètre, il est recommandé d'utiliser la fonction {\it std\_logic\_range}. |
---|
| 158 | |
---|
| 159 | \lstparam{C++} |
---|
| 160 | \begin{lstlisting} |
---|
| 161 | void set_alias (std::string name1 , |
---|
| 162 | std::string type1 , |
---|
| 163 | std::string name2 , |
---|
| 164 | std::string range2); |
---|
| 165 | void set_alias (std::string name1 , |
---|
| 166 | uint32_t size1 , |
---|
| 167 | std::string name2 , |
---|
| 168 | std::string range2); |
---|
| 169 | \end{lstlisting} |
---|