\subsection{Le TXserie} \subsubsection{Cahier des charges} Le cahier des charges du transmetteur série est le suivant : \begin{itemize} \item Transmission série 8 bits, 1 start, 2 stop \item Vitesse : paramétrable 9600 et 115200 bauds \item Fifo de stockage avant transmision \item Interruption activable signalant que la pile est pleine \end{itemize} \subsubsection{Schéma-bloc} \begin{figure}[htbp] \caption{Schéma-bloc du TXserie} \includegraphics[width=\textwidth]{./portserie/images/txserie.pdf} \label{schematxserie} \end{figure} Le schéma modulaire est visible sur la figure \ref{schematxserie} page \pageref{schematxserie}. \subsubsection{Descritpion des modules} \label{descriptmodules} \paragraph{La fifo} C'est une fifo générée avec coregen. Elle contient des mots de 8 bits en mémoire distribuée (car les BRAMs du FPGA seront utilisés à d'autres fins). Elle possède une entrée avec son horloge ckin, une sortie avec son horloge ckout, et un pannel de flags en sortie. L'entrée ckin est la combinaison du csData et de la clock du bus. Ainsi, dès qu'on écrit à son adresse mémoire, la fifo charge la donnée présente sur le bus. \paragraph{Le TXcever} C'est un transmetteur série qui reçoit en entrée les données provenant de la fifo. Dès qu'il est vide, il agit sur le signal ckout de la fifo, ce qui dépile un élément, et le charge dans le transmetteur, qui peut alors le transmettre. \paragraph{Le générateur de clock} C'est un prédiviseur de la fréquence d'horloge du fpga. Il a pour but de fournir l'horloge de référence pour le transmetteur (égale à 16 fois le baudrate). Il est paramétrable, pour pouvoir choisir la fréquence utilisée parmis les 4 baudrates disponibles. Pour avoir la bonne fréquence en sortie, on doit avoir en entrée une fréquence multiple de 16 fois 115200 (le baudrate maxi). Les quartz qui sont utilisables sont : 14.7456MHz, 29.4912MHz (14.7456*2), et 44.2368MHz (14.7456*3), \paragraph{Registre config} C'est un registre de 8 bits branché sur le bus, en lecture/écriture, dans lequel le PC vient déposer les bits de configuration du port série. La sortie du registre controle le générateur de clock (pour fixer le baudrate), et le gestionaire d'IRQ. \paragraph{Registre flag} C'est un registre de 8 bits branché sur le bus en lecture seule dans lequel le PC vient lire l'état des flags de la fifo. Son entrée est branchée sur les sorties flag de la fifo. \paragraph{IRQ} Le gestionaire d'IRQ est tout simplement un activateur d'interruptions. Il déclenche des IRQ sur front montant, et ceci à condition que le signal IntEn soit activé. \subsubsection{Fonctionalités et utilisation} Ce port série utilise 3 registres : TxData, Flag, et Config \paragraph{Txdata} Ce registre 8 bits sert à recevoir les données à envoyer. On les écrit séquentiellement, et chaque écriture dans ce registre empile la donnée en haut de la fifo. \paragraph{Flag} C'est le registre d'état. il donne essentiellement des informations sur l'état de remplissage de la pile de transmision. Structure : \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} \hline bit & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 \\ \hline nom & x & x & x & x & Empty & Full/Int & FLI1 & FLI0 \\ \hline \end{tabular} \begin{description} \item [FL1/FL0] : Fifo Level 1/0. Ces bits donnent le niveau de remplissage de la fifo. \begin{center} \begin{tabular}{|c|c|c|} \hline FL1/FL0 & Tx de remplissage \\ \hline 00 & < 25\% \\ \hline 01 & 25\% < Tx < 50\% \\ \hline 10 & 20\% < Tx < 75\% \\ \hline 11 & 75\% < Tx \\ \hline \end{tabular} \end{center} \item [Full/Int] : indique que la pile est pleine, ce qui déclenche une interruption \item [Empty] : indique que la pile ET le transmetteur sont vides, que la transmission est donc terminée. \end{description} \paragraph{Config} Ce registre sert de configuration pour la transmission. Structure : \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} \hline bit & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 \\ \hline nom & x & x & x & On/Off & Purge & IntEn & BdR1 & BdR0 \\ \hline \end{tabular} \begin{description} \item [BdR1/BdR0] : BaudRate1/0. Ces bits paramètrent la vitesse de transmission. \\ \begin{center} \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} \hline BdR1/BdR0 & Vitessse \\ \hline 00 & 9600 \\ \hline 00 & 9600 \\ \hline 01 & 19200 \\ \hline 10 & 57600 \\ \hline 11 & 115200 \\ \hline \end{tabular} \end{center} \item [Int/En] : active ou non l'interruption de fifo pleine \item [Purge] : vide la fifo de toutes ses données \item [On/Off] : active ou non la transmission \end{description} \subsubsection{Procédure d'utilisation} Pour utiliser ce port série, on doit pouvoir effectuer les actions suivantes : \begin{itemize} \item Mettre le bit On/Off à 1 pour activer la transmission \item Paramétrer la vitesse à l'aide des bits BdR1/0 \item Il est conseillé d'activer l'interruption de fifo pleine en mettant à 1 le bit IntEn. \item Ecriture dans txdata pour charger les données dans la fifo. Elles sont alors automatiquement transférées, au plus tôt. Dès que le registre à décalage est vide, il dépile le dernier élément de la fifo et le transmet à nouveau. \item On peut lire en permanence l'état de la fifo grâce aux bits FL1/0. \item Quand la fifo est pleine, le flag Full/Int passe à 1, et le front montant de ce bit génère une interruption. \item Il est possible de vider la fifo en mettant Purge à 1. Il faut le remettre à 0 pour qu'il puisse être à nouveau actif, car la purge de la fifo ne s'effectue que sur front montant de ce bit. \end{itemize} \subsubsection{Interfaçage vhdl} Voici le code vhdl de l'entité txserie : \begin{verbatim} entity txserie is generic(adr : integer); constant adr_w : integer :=10; port( databus: inout std_logic_vector(7 downto 0); rw: in std_logic; busck: in std_logic; rst: in std_logic; masterck: in std_logic; txout: out std_logic; intout: out std_logic; csData: in std_logic; csFlag: in std_logic; csConfig: in std_logic; ); end txserie; \end{verbatim} Voici une description de ces signaux : \begin{description} \item [databus] : bus de données \item [rw] : ligne Read/Write\_ \item [busck] : horloge bus \item [rst] : patte de reset \item [masterck] : horloge générale du fpga \item [txout] : patte de sortie série \item [intout] : sortie d'interruption \item [csData] : chip select du registre de data \item [csFlag] : chip select du registre de flag \item [csConfig] : chip select du registre de configuration \end{description} % Deuxième partie : le RXserie \subsection{Le RXserie} \subsubsection{Cahier des charges} Le cahier des charges du récepteur série est le suivant : \begin{itemize} \item Réception série 8 bits, 1 start, 2 stop \item Vitesse : paramétrable 9600 et 115200 bauds \item Fifo de stockage des données reçues \item Interruption activable signalant que la fifo est pleine \item Interruption activable signalant qu'on a reçu une donnée \end{itemize} \subsubsection{Schéma-bloc} Le schéma modulaire est visible sur la figure \ref{schemarxserie} page \pageref{schemarxserie}. \begin{figure}[htbp] \caption{Schéma-bloc du RXserie} \includegraphics[width=\textwidth]{./portserie/images/rxserie.pdf} \label{schemarxserie} \end{figure} \subsubsection{Descritpion des modules} \paragraph{Le RXcever} C'est un récepteur série qui présente ses données à l'entrée de la fifo Dès qu'il a reçu un octet, il agit sur le signal fifockin de la fifo ce qui empile l'octet reçu. \paragraph{Autres modules} Les autres modules utilisés sont les mêmes que pour le transmetteur. Voir chapitre \ref{descriptmodules}. \subsubsection{Fonctionalités et utilisation} Ce port série utilise 3 adresses mémoire : \paragraph{Rxdata} Ce registre 8 bits permet de récupérer les données reçues. On les lit séquentiellement, et chaque lecture dans ce registre dépile la donnée en bas de la fifo. \paragraph{Flag} C'est le registre d'état. Il donne essentiellement des informations sur l'état de remplissage de la pile de réception. Structure : \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} \hline bit & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 \\ \hline nom & x & x & x & x & DR & FFull & FL1 & FL0 \\ \hline \end{tabular} \begin{description} \item [FL1/FL0] : Fifo Level 1/0. Ces bits donnent le niveau de remplissage de la fifo. \\ \begin{center} \begin{tabular}{|c|c|c|} \hline FL1/FL0 & Tx de remplissage \\ \hline 00 & < 25\% \\ \hline 01 & 25\% < Tx < 50\% \\ \hline 10 & 20\% < Tx < 75\% \\ \hline 11 & 75\% < Tx \\ \hline \end{tabular} \end{center} \item [FFull] : indique que la pile est pleine. Chaque front montant de ce bit déclenche l'interruption FifoFullInt \item [DR] : DataReady. Indique que la fifo n'est plus vide, et donc qu'une donnée est arrivée dans le récepteur. Chaque front montant de ce bit déclenche l'interruption DRInt \end{description} \paragraph{Config} Ce registre sert de configuration pour la transmission. Structure \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} \hline bit & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 \\ \hline nom & x & x & x & On/Off & DRIE & FFIE & BdR1 & BdR0 \\ \hline \end{tabular} \begin{description} \item [BdR1/BdR0] : BaudRate1/0. Ces bits paramètrent la vitesse de transmission. \\ \begin{center} \begin{tabular}{|c|c|c|} \hline BdR1/BdR0 & Vitessse \\ \hline 00 & 9600 \\ \hline 01 & 19200 \\ \hline 10 & 57600 \\ \hline 11 & 115200 \\ \hline \end{tabular} \end{center} \item [FFIF] : FifoFull-Int-Enable. Active ou non l'interruption FifoFull (actif à 1) \item [DRIE] : DataReady-Int-Enable. Active ou non l'interruption DataReady (actif à 1) \item [On/Off] : active ou non la réception de données \end{description} \subsubsection{Procédure d'utilisation} Pour utiliser ce port série, on doit pouvoir effectuer les actions suivantes : \begin{itemize} \item Mettre le bit On/Off à 1 pour activer la réception des données. \item Paramétrer la vitesse à l'aide des bits BdR1/0 \item Il est conseillé d'activer l'interruption de fifo pleine (FFInt) en mettant à 1 le bit FFIE. \item On peut également activer l'interruption de donnée reçue DRInt en mettant à 1 le bit DRIE. \item Tester si une donnée est présente dans le buffer en testant le bit DR. S'il est à 1, lire la donnée dans rxdata. La donnée est alors automatiquement dépilée de la fifo. \item On peut lire en permanence l'état de la fifo grâce aux bits FL1/0. \item Quand la fifo est pleine, le flag FFI passe à 1, et le front montant de ce bit génère une interruption. Il faut alors lire les 512 octets de la fifo pour la vider. \end{itemize} \subsubsection{Interfaçage vhdl} Voici le code vhdl de l'entité rxserie : \begin{verbatim} entity rxserie is generic(adr : integer); constant adr_w : integer :=10; port( databus: inout std_logic_vector(7 downto 0); rw: in std_logic; busck: in std_logic; rst: in std_logic; masterck: in std_logic; rxin: in std_logic; DRIout: out std_logic; FFIout: out std_logic; csData: in std_logic; csFlag: in std_logic; csConfig: in std_logic ); end rxserie; \end{verbatim} \begin{description} \item [databus] : bus de données \item [rw] : ligne Read/Write\_ \item [busck] : horloge bus \item [rst] : patte de reset \item [masterck] : horloge générale du fpga \item [rxin] : patte de sortie série \item [DRIout] : sortie d'interruption DRInt \item [FFIout] : sortie d'interruption FFInt \item [csData] : chip select du registre de data \item [csFlag] : chip select du registre de flag \item [csConfig] : chip select du registre de configuration \end{description}