\documentclass[a4paper,dvips,pdftex,titlepage]{article} % Inclusion de packages : %{{{1 \usepackage[T1]{fontenc} \usepackage[latin1]{inputenc} \usepackage[french]{babel} \usepackage{fancyhdr} \usepackage[dvips]{graphicx,color} %\usepackage[pdftex]{graphicx,color} %\usepackage{verbatim} \usepackage{times} % Pour inclure les listings VHDL \usepackage{listings} \lstset{language=VHDL,extendedchars=true,inputencoding=latin1,breaklines} \lstset{language=vhdl, basicstyle=\footnotesize, %diminue la taille de listings numbers=left, % nombre à gauche numberstyle=\tiny, stepnumber=5, xleftmargin=30pt % extendedchars=true, % inputencoding=latin1, % breaklines } % Pour les maths : %\usepackage{amssymb} %\usepackage{amsfonts} %\usepackage{amsmath,amsthm} %}}}1 % Mise en page du document : %{{{1 \pagestyle{fancy} \parskip=10pt \baselineskip=11pt \parindent=0pt % alinéa \addtolength{\textwidth}{0.6cm} % Entête de page : \lhead{\small{Thomas Burg - Pierre-Andre Galmes \\ Fidèle Gafan - Pierre Prot}} \rhead{I2 ET\\ Février 2004} % Structure du document : \begin{document} \title{Pré-projet de VHDL : \\ Réalisation d'un périphérique ISA pour PC104} \author{Thomas Burg - Pierre-Andre Galmes - Fidèle Gafan - Pierre Prot\\ EFREI - Ingénieur 2$^{\textrm{ième}}$ année} \date{Février 2004} \maketitle \tableofcontents \pagebreak %1}}} \vfill \section*{Remerciements} Avant toute chose, nous tenons, avec tous les membres d'EFREI Robotique, à remercier les personnes qui nous ont aidé dans la réalisation de cette carte, particulièrement : \begin{itemize} \item Monsieur Villedieu, pour ses schémas, ses conseis avisés, et surtout le temps et la disponibilité qu'il a bien voulu nous consacrer aussi bien pour la conception hardware que pour le code vhdl de cette carte. Son soutient nous a été vital. \item Messieurs Roger, Pelletier Joel et Rémy, pour leur aide sur le vhdl. \item Olivier Desbrosses pour son soutient logistique. \item Nicolas Bouquet, et ses collègues pour la validation du PCB \item Enfin, n'oublions pas Yvan Bourne de la société YBDesign (ingénierie électronique : http://www.ybdesign.fr/), qui nous a offert de nombreuseuses facilités lors de la réalisation du PCB. \end{itemize} \vfill % Todo : % Remerciements ? \section{Introduction} Suite au cahier des charges, écrit précédement, voici un rapport détaillant l'implémentation de la solution pour laquelle nous avons opté : la réalisation d'une carte FPGA. En effet, les avantages de ce type de carte sont nombreux. Tout d'abord, une fois le routage et la fabrication effectuée, cette carte peut-être reprogrammée à "volonté". En effet, cela est très utile autant lors de la phase de mise au point des différents modules que plus tard, si le besoin d'apporter des modification se fait sentir. On pourrait par exemple remplacer un module inutilisé (bus $I^2C$, gpio...) pour implémenter un autre module plus utile à ce moment. Pour cela, il suffirait de ré-affecter les pattes (fichier de contrainte) associées au module inutilisé et de modifier légèrement le code VHDL. Ensuite, cette carte a été faite dans une optique de réutilisation. En effet, pour gagner du temps de développement, il devient important que nos prédécesseurs puissent reprendre ce que nous avons développé. Ainsi, nous avons par exemple décider de choisir d'utiliser une carte PC104 pour la réalisation de ce robot. Ce type de carte a en effet l'avantage d'être standardisée. Il est donc facile de trouver des fournisseurs, critère très important pour la pérennité du système conçu ! Le présent dossier a pour but de présenter la carte FPGA. Nous présenterons une première vision globale de cette carte dans laquelle nous donnerons ses principales caractéristiques, à savoir, à quoi servira cette carte, de quels modules elle sera composée et les informations relatives au routage de cette carte. Nous expliquerons aussi le fonctionnement des différents modules et en particulier comment piloter ceux-ci à partir de la carte PC104. Pour chaque module, nous avons détaillé son fonctionnement interne ou architecture physique et listé le code VHDL créé. \pagebreak % Ici, explication sur la carte dans son ensemble ? \section{Architecture globale} Cette première vision a pour but de donner un aperçu des fonctionnalités que nous souhaitons implémenter. On se reportera au schéma de l'architecture globale, figure \ref{archiglobale} page \pageref{archiglobale} pour plus de facilitées à comprendre cette carte. \begin{figure}[htbp] \caption{Architecture globale de la carte FPGA} \begin{center} \includegraphics[width=1.4\textwidth,angle=90]{./images/carte_globale.pdf} \end{center} \label{archiglobale} \end{figure} La carte FPGA est composée de différents blocs : bus $I^2C$, ports série, bloc de gestion caméra, génération de signaux modulés en largeur d'impulsion ou Pulse Width Modulation (pwm) pour la commande de servomoteurs et blocs d'entrées / sorties ou General Purpose Input / Output (gpio). Comme cela a été spécifié dans le cahier des charges, pour la réalisation de notre robot, nous utiliserons une carte PC104. Cette carte est un ordinateur avec les entrées standard (port série, PS2...). Cette carte n'ayant pas tous le nécessaire pour le contrôle d'un robot, il nous faut développer une carte annexe permettant d'avoir ce qu'il nous manque. Pour les branchements, la carte FPGA est destinée à être connectée à la PC104 via un bus ISA. Tous les blocs précédement enoncés sont connectés sur le bus ISA et sont accessibles directement par le PC104. Le fpga gère les interruptions générées par ses blocs et les transmet au PC104 à l'aide des IRQ. \pagebreak % Les différents modules de la carte \section{Le décodage du bus ISA} \subsection{Role} Le premier module en entrée du FPGA est le décodeur du bus ISA. Il effectue deux tâches : \subsubsection{Le décodage de l'adresse} Décoder l'adresse ISA du FPGA, et si celle-çi est valide, l'adresse de sous-réseau du registre sélectionné. En effet, nous avons découpé l'adresse des registres comme suit : \begin{tabular}{|c|c|c|} \hline Adresse FPGA & Sous-adresse registre \\ \hline 16 bits & 8 bits \\ \hline \end{tabular} \subsubsection{La conversion des signaux de contrôle} Les signaux de contrôle de bus sont AEN (Address ENable), MEMR (MEMRead), et MEMW (MEMWrite). Nos registres, quand à eux, utilisent des signaux CS (Chip Select), RW, et clk (la clock ne sert que pour écrire dans le registre). La conversion de ces signaux est effectuée par le décodeur de bus. Pour cela l'algorithme est très simple : RW <= not MEMR clk <= (MEMR or MEMW) and not AEN CS prend la sortie du décodeur de la sous-adresse registre correspondant au registre voulu. \begin{figure}[htbp] \caption{Conversion des signaux de contrôle de bus} \begin{center} \includegraphics[width=1\textwidth,angle=90]{images/pdf/timespec.pdf} \end{center} \label{convbus} \end{figure} \subsection{Implémentation} Pour implémenter ce module, nous avons utilisé un décodeur généré par coregen. Il possède 256 sorties, ce qui laisse des possibilités suffisantes pour le fpga (256 sous-adresses). Chacune de ses sorties est à relier au registre correspondant. On obtient donc un mappage des registres. L'adresse du fpga est quand à elle décodée par un simple comparateur binaire. Elle est validée par le signal AEM, qui doit être à 0 pour que la comparaison puisse s'effectuer. En entrant sur l'enable du décodeur de sous-adresse, la sortie de ce comparateur active ou non tous les CS d'un coup pourvu que AEN soit à 0. La conversion des signaux est faite par table de vérité. \subsection{Testbench} Sur ce testbench, nous avons mis l'adresse du FPGA à 000100, ce qui signifie que l'espace adressable pour les registres s'étend de 0000100 à 0001FF. Dans le testbench, l'adresse balaye l'intervale 000000-000300. En même temps, les signaux de contrôle de bus varient aléatoirement. On remarque que la conversion des signaux MEMR/MEMW en RW/clk s'effectue comme voulu. On voit également très bien le moment où les CS commencent à être actifs (à partir de l'adresse 000100), ainsi que le moment où ils sont inhibés par la remonté du signal AEN. \begin{figure}[htbp] \caption{Conversion des signaux de contrôle de bus} \begin{center} \includegraphics[width=1\textwidth,angle=90]{images/decod.png} \end{center} \label{benchdecod} \end{figure} \subsection{Synthese} Voici le rapport de synthèse. On voit que le décodeur de 256 sorties prend vraiment beaucoup de place ( 16 à 18\% du fpga), mais cela semble être le prix à payer. \begin{verbatim} Release 6.1.03i - xst G.26 Copyright (c) 1995-2003 Xilinx, Inc. All rights reserved. --> Reading design: decodisa.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 RTL Top Level Output File Name : decodisa.ngr Top Level Output File Name : decodisa Output Format : NGC Optimization Goal : Speed Keep Hierarchy : NO Design Statistics # IOs : 285 Cell Usage : # BELS : 774 # GND : 1 # LUT3 : 3 # LUT4 : 770 # IO Buffers : 277 # IBUF : 19 # OBUF : 258 ========================================================================= Device utilization summary: --------------------------- Selected Device : 2s200fg456-6 Number of Slices: 445 out of 2352 18% Number of 4 input LUTs: 773 out of 4704 16% Number of bonded IOBs: 277 out of 288 96% ========================================================================= TIMING REPORT Timing Summary: --------------- Speed Grade: -6 Minimum period: No path found Minimum input arrival time before clock: No path found Maximum output required time after clock: No path found Maximum combinational path delay: 19.457ns \end{verbatim} \section{La gestion des interruptions} \input{./interrupt/interrupt.tex} \pagebreak \section{Le bloc d'entrées / sorties} \input{./gpio/gpio.tex} \pagebreak \section{Le bloc port série} \input{./portserie/portserie.tex} \pagebreak \section{Le bloc PWM} \input{./pwm/pwm.tex} \pagebreak \section{Le bloc de gestion de la caméra} \input{./ovcam/ovcam.tex} \pagebreak \section{La carte} \input{./carte/carte.tex} \pagebreak \section {Conclusion} % Là ou on en est Pour situer le niveau de finition de notre projet, voici une liste de ce qui a été réalisé jusqu'à maintenant. Tout d'abord, nous avons passé une grande partie de notre temps à concevoir les architectures physiques des différents modules. Ce projet étant le premier sur lequel nous étions totalement libre de toute la réalisation. En effet, nous avons dû choisir le type de bus et étudier le fonctionnement de celui-ci, étudier la réalisations des divers modules que nous implémentons (bus $I^2C$, port série...). Ensuite, nous avons découvert toute la chaîne de réalisation d'une carte FPGA. En effet, nous nous sommes rendu compte des différentes étapes allant de l'idée première d'une carte annexe, jusqu'à la fabrication et la programmation de celle-ci. Pour réaliser cette carte, nous aurons donc dû nous ateler à la découverte des étapes telles que le routage de carte à l'aide du logiciel Protel. Cette découverte aura été longue et douloureuse, mais nous aura permi de réaliser une carte parfaitement adaptée à nos besoins. L'une des autres étape que nous avons dû gérer est la fabriçation de la carte. Nous avons donc dû effectuer des recherches de fabriquant et étudier les différents offres proposées. Une fois cela fait, nous avons pris l'initiative de négocier les prix et de nous faire sponsoriser par la société réalisant la carte. A l'heure actuelle, nous avons envoyé la carte au fabriquant, réalisé une bonne partie des modules et testé la majorité de ces modules sur carte. Malheureusement, nous n'avons pas réussi à tenir le planning initial et nous ne sommes donc pas actuellement à la fin du travail. Nous allons de ce fait continuer le développement et espèrons que ceux-ci seront achevés pour mi-Mai. Si vous le désirez, nous pourrons vous fournir les versions suivantes de ce dossier pour montrer le résultat final. \pagebreak % TODO : Annexes \appendix \section{Listing des modules vhdl} \subsection{fichiers globaux} \subsubsection{nono\_const.vhd} \label{sec:nono_const} \lstinputlisting{../../src/packages/nono_const.vhd} \pagebreak \subsubsection{isa\_const.vhd} \label{sec:isa_const} \lstinputlisting{../../src/packages/isa_const.vhd} \pagebreak \subsubsection{pwm\_const.vhd} \label{sec:pwm_const} \lstinputlisting{../../src/packages/pwm_const.vhd} \pagebreak \subsubsection{or3.vhd} \label{sec:or3} \lstinputlisting{../../src/or/or3.vhd} \pagebreak \subsubsection{or8.vhd} \label{sec:or8} \lstinputlisting{../../src/or/or8.vhd} \pagebreak \subsubsection{reg\_rw.vhd} \label{sec:reg_rw} \lstinputlisting{../../src/registre/reg_rw.vhd} \pagebreak \subsubsection{tristate.vhd} \label{sec:tristate} \lstinputlisting{../../src/three-state/tristate.vhd} \pagebreak \subsection{Les GPIO} \subsubsection{gpio\_direction.vhd} \label{sec:gpio_direction} \lstinputlisting{../../src/gpio/gpio_direction.vhd} \pagebreak \subsubsection{gpio\_it\_detect\_up.vhd} \label{sec:gpio_it_detect_up} \lstinputlisting{../../src/gpio/gpio_it_detect_up.vhd} \pagebreak \subsubsection{gpio\_it\_detect\_down.vhd} \label{sec:gpio_it_detect_down} \lstinputlisting{../../src/gpio/gpio_it_detect_down.vhd} \pagebreak \subsubsection{interrupt.vhd} \label{sec:interrupt} \lstinputlisting{../../src/interrupt/interrupt.vhd} \pagebreak \subsubsection{gpio.vhd} \label{sec:gpio} \lstinputlisting{../../src/gpio/gpio.vhd} \pagebreak \subsection{clk1us.vhd} \label{sec:clk1us} \lstinputlisting{../../src/pwm/clk1us.vhd} \pagebreak \subsection{convert\_pwm.vhd} \label{sec:convert_pwm} \lstinputlisting{../../src/pwm/convert_pwm.vhd} \pagebreak \subsection{pwm\_generator.vhd} \label{sec:pwm_generator} \lstinputlisting{../../src/pwm/pwm_generator.vhd} \pagebreak \subsection{Le port série} \subsubsection{fpga.vhd} Le fichier qui inclut le TX et le RX pour le testbench des deux \label{sec:fpga} \lstinputlisting{../../src/fpga/fpga.vhd} \pagebreak \subsubsection{txserie.vhd} \label{sec:txserie} \lstinputlisting{../../src/portserie/portserie/txserie.vhd} \pagebreak \subsubsection{bch\_txserie.vhd} \label{sec:bch_txserie} \lstinputlisting{../../src/portserie/portserie/bch_txserie.vhd} \pagebreak \subsubsection{rxserie.vhd} \label{sec:rxserie} \lstinputlisting{../../src/portserie/rxserie/rxserie.vhd} \pagebreak \subsubsection{bch\_rxserie.vhd} \label{sec:bch_rxserie} \lstinputlisting{../../src/portserie/rxserie/bch_rxserie.vhd} \pagebreak \subsubsection{clockgene.vhd} \label{sec:clockgene} \lstinputlisting{../../src/portserie/clockgene/clockgene.vhd} \pagebreak \subsubsection{fifodriver.vhd} \label{sec:fifodriver} \lstinputlisting{../../src/portserie/fifo/fifodriver.vhd} \pagebreak \subsubsection{bch\_fifodriver.vhd} \label{sec:bch_fifodriver} \lstinputlisting{../../src/portserie/fifo/bch_fifodriver.vhd} \pagebreak \subsection{Le reste (à compléter)} \end{document}