Ignore:
Timestamp:
Dec 15, 2008, 12:04:03 PM (16 years ago)
Author:
rosiere
Message:

Update document on Vhdl generation.

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  
    99\begin{itemize}
    1010\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.
    1211\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.
    1312\item Dans la section \ref{vhdl_body}, nous présenterons l'API pour générer le comportement des composants.
    1413\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.
    1515\end{itemize}
    1616
     
    1919Dans le répertoire contenant le projet, nous avons les répertoires suivant :
    2020\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 :]
    2345\end{description}
    2446
    25 \Section{Fichiers}\label{files}
    26 
    2747\Section{VHDL : déclaration}\label{vhdl_declaration}
    2848
    29 Les déclarations ce font dans le fichier {\it COMPONENT\_vhdl\_declaration.cpp}.
     49Les déclarations ce font dans le fichier {\it Component\_vhdl\_declaration.cpp}.
     50
     51\subSection{Interfaces}
     52L'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
     54La 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
     62Par exemple pour la 2 ème interface de lecture d'un banc de registre :
     63\begin{verbatim}
     64 in_READ_1_VAL     : in  std_logic;
     65out_READ_1_ACK     : out std_logic;
     66 in_READ_1_ADDRESS : in  std_logic_vector(8 downto 0);
     67out_READ_1_DATA    : out std_logic_vector(31 downto 0);
     68\end{verbatim}
     69
     70Chaque 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}
    3075
    3176\subSection{Types}
     
    4186std::string std_logic_range (uint32_t size,
    4287                             uint32_t max ,
    43                              uint32_t min );
     88                             uint32_t min ,
     89                             bool force=false);
    4490std::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);
     93std::string std_logic_range (uint32_t size,
     94                             bool force=false);
     95\end{verbatim}
     96
     97La première fonction fais un test sur la taille que la seconde ne fait pas.
     98L'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).
     99Toute 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
     101Par exemple :
     102\begin{verbatim}
     103std_logic_range(4,false) renvoie "(3 downto 0)".
     104std_logic_range(1,false) renvoie "(0)".
     105std_logic_range(1,true ) renvoie "(0 downto 0)".
     106\end{verbatim}
    56107
    57108Pour 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.
     
    89140\end{verbatim}
    90141
     142Dans 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.
     143La 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}
     146std::string std_logic_others (uint32_t size,
     147                              bool cst  );
     148\end{verbatim}
     149
     150Pour toute les autres constantes, la méthode {\it std\_logic\_conv} transforme un entier en {\it std\_logic\_vector}.
     151
     152\begin{verbatim}
     153std::string std_logic_conv (uint32_t    size,
     154                            std::string value);
     155std::string std_logic_conv (uint32_t    size,
     156                            uint32_t    value);
     157\end{verbatim}
     158
     159
    91160\subSection{Signaux internes}
    92161
     
    113182\end{verbatim}
    114183
    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}
     184En 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}
     187void set_alias (std::string name1 ,
     188                std::string type1 ,
     189                std::string name2 ,
     190                std::string range2);
     191void set_alias (std::string name1 ,
     192                uint32_t    size1 ,
     193                std::string name2 ,
     194                std::string range2);
     195\end{verbatim}
    127196
    128197
    129198\Section{VHDL : comportement}\label{vhdl_body}
    130199
     200Le comportement du composant est définit dans le fichier  {\it Component\_vhdl\_body.cpp}.
     201
     202Il n'y a pas de fonction aidant à l'écriture du Vhdl.
     203La 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}
     205void set_body (uint32_t    depth,
     206               std::string text );
     207void set_body (std::string text );
     208\end{verbatim}
     209
     210Pour les commentaires, il y a la fonction {\it set\_comment}.
     211\begin{verbatim}
     212void set_comment (uint32_t    depth,
     213                  std::string text );
     214void set_comment (std::string text );
     215\end{verbatim}
     216
     217
     218
    131219\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}
     227void 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}
     238void 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}
     300library 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
     311library work;
     312use work.RegisterFile_Monolithic_Pack.all;
     313
     314
     315entity 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       );
     327end RegisterFile_Monolithic;
     328
     329architecture 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
     334begin
     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;
     362end behavioural;
     363
     364\end{verbatim}
Note: See TracChangeset for help on using the changeset viewer.