\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[width=\textwidth]{./portserie/images/txrx1.pdf}
\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[width=\textwidth]{./portserie/images/txrx2.pdf}
\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.


