\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{Description 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), soit 1,8432MHz. Le quartz utilisé pour la référence de vitesse est un 24MHz. On le divise par 13, pour obtenir 1,8462MHz, ce qui fait une erreur de 0.16\%, parfaitement acceptable sur une liaison série RS232. \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{Fonctionnalité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{Interfacage 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{Description 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{Fonctionnalité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 & ORErr & 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 \item [ORErr] : indique qu'il y a eu un overrun sur la réception, c'est à dire que le bit de stop n'a pas été reçu correctement. \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 & OErrIE & 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 [OErrIF] : Error-Int-Enable. Active ou non l'interruption OverRun \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{Interfacage 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} \subsection{Tests} \subsection{Principe du bench} Le testbench qui a été utilisé incorpore un émetteur et un récepteur, et les fait fonctionner ensemble en les bouclant l'un sur l'autre. Ainsi, on peut vérifier le bon fonctionnement de l'émission/réception. On voit les signaux de contrôle de l'émetteur, ainsi que ceux du récepteur. \subsubsection{Waveforms} Le premier waveform concerne l'émetteur. Il montre la succession des signaux à envoyer et des écritures de bus à affectuer pour envoyer une donnée par le transmetteur. (Cf "pilotage du port série" page \pageref{pilot}) Ici, tout d'abord, on écrit dans le registre de configuration (adresse 258) pour paramétrer l'ensemble, puis on le lit, pour vérifier la donnée. Ensuite, on écrit 3 octets à l'adresse 260 (entrée de la fifo). \begin{figure}[htbp] \begin{center} \includegraphics[height=\textheight]{./image/txrx1.png} \end{center} \label{pilot} \end{figure} Le second waveform concerne le bouclage de l'émetteur sur le récepteur. Il est donc pris sur une plus grande période de temps. (Cf "Test du port série" page \pageref{testportserie}) \begin{figure}[htbp] \begin{center} \includegraphics[height=\textheight]{./image/txrx2.png} \end{center} \label{testportserie} \end{figure} \subsubsection{Synthèse} Voici le rapport de synthèse. On voit que le décodeur + le TX + le RX prennent à peu près 25\% des ressources, ce qui fait 8\% pour le port série. La fréquence maximum de fonctionnement est de 56MHz. \begin{verbatim} Release 6.1.03i - xst G.26 Copyright (c) 1995-2003 Xilinx, Inc. All rights reserved. --> Reading design: fpga.prj TABLE OF CONTENTS 1) Synthesis Options Summary 2) HDL Compilation 3) HDL Analysis 4) HDL Synthesis 4.1) HDL Synthesis Report 5) Advanced HDL Synthesis 6) Low Level Synthesis 7) Final Report 7.1) Device utilization summary 7.2) TIMING REPORT ========================================================================= * Final Report * ========================================================================= Final Results Design Statistics # IOs : 45 Macro Statistics : # Registers : 53 # 1-bit register : 48 # 3-bit register : 3 # 8-bit register : 2 # Multiplexers : 14 # 2-to-1 multiplexer : 14 # Tristates : 5 # 8-bit tristate buffer : 5 # Adders/Subtractors : 1 # 4-bit adder : 1 Cell Usage : # BELS : 1111 # GND : 4 # LUT1 : 38 # LUT2 : 44 # LUT3 : 43 # LUT4 : 891 # MUXCY : 47 # VCC : 3 # XORCY : 41 # FlipFlops/Latches : 179 # FD : 2 # FDC : 25 # FDC_1 : 4 # FDCE : 18 # FDCP : 20 # FDCPE : 27 # FDE_1 : 14 # FDP : 20 # FDPE : 1 # FDR : 1 # FDRE : 27 # FDS : 1 # FDSE : 18 # LD_1 : 1 # Shifters : 16 # SRL16E : 16 # Tri-States : 40 # BUFT : 40 # Clock Buffers : 3 # BUFGP : 3 # IO Buffers : 33 # IBUF : 20 # IOBUF : 8 # OBUF : 5 ========================================================================= Device utilization summary: --------------------------- Selected Device : 2s200pq208-6 Number of Slices: 601 out of 2352 25% Number of Slice Flip Flops: 179 out of 4704 3% Number of 4 input LUTs: 1032 out of 4704 21% Number of bonded IOBs: 33 out of 144 22% Number of TBUFs: 40 out of 2352 1% Number of GCLKs: 3 out of 4 75% ========================================================================= TIMING REPORT Timing Summary: --------------- Speed Grade: -6 Minimum period: 17.604ns (Maximum Frequency: 56.805MHz) Minimum input arrival time before clock: 19.485ns Maximum output required time after clock: 12.296ns Maximum combinational path delay: 24.555ns \end{verbatim} \subsection{Conclusion} Ce port série est polyvalent, grâce à ses quatre baudrates sélectionables. Il est aussi performant grâce à sa FIFO, et très paramétrable grâce aux interruptions variées et masquables individuellement.