\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}


