From 6c1e42f741e1b0d599cb5a9c96165ce4e8d10422 Mon Sep 17 00:00:00 2001 From: galmes Date: Fri, 12 Mar 2004 09:20:36 +0000 Subject: Modifications sur le rapport partie userland ! --- 2004/n/fpga/doc/dcd/interrupt/interrupt.tex | 160 ++-------------------------- 1 file changed, 11 insertions(+), 149 deletions(-) (limited to '2004/n/fpga/doc/dcd/interrupt/interrupt.tex') diff --git a/2004/n/fpga/doc/dcd/interrupt/interrupt.tex b/2004/n/fpga/doc/dcd/interrupt/interrupt.tex index 2c162a3..320eeae 100644 --- a/2004/n/fpga/doc/dcd/interrupt/interrupt.tex +++ b/2004/n/fpga/doc/dcd/interrupt/interrupt.tex @@ -4,11 +4,8 @@ Voici les contraintes du bloc de gestion des interruptions : \begin{itemize} \item{Gestion de 24 interruptions différentes} -\item{3 niveaux de priorité} -\item{Fréquence de fonctionnement à XXXX} % TODO : fq du bus ISA -\item{Codage de l'addresse du bloc sur 10 bits} -\item{Un signal de RAZ} \item{Transmission des interruptions par bloc de 8 bits} +\item{Un signal de RAZ} \end{itemize} @@ -33,156 +30,21 @@ lui transmettre. On pourra voir la figure \ref{entity_interrupt} page % TODO : Question -% Est-ce que pour les lignes d'interruption on ne devrait pas juste -% laisser une ligne IRQ et traiter en interne les priorités ? En effet, la -% seule choses que voit l'ordinateur est qu'il y a une interruption. Pour la -% priorité de celle-ci, il en a rien à foutre non ? -% -% Ou ça peut-être intéressant pour lui pour savoir si il y réagit de suite ou -% si il peut continuer ce qu'il est en train de faire. % % TODO : Si garde 2 fils, changer entity.fig % Si garde 1 fils, changer schéma global (toute la carte fpga) % changer archi_phy.fig -On rappel que chaque bloc ayant un fil d'interruption le relie au gestionnaire -d'interruption. Suivant l'emplacement choisi, le module aura une priorité plus -ou moins importante, sachant que la priorité de niveau 1 est la plus -importante. - -Du point de vue comportemental, son fonctionnement est le suivant. Lorsqu'une -interruption est émise par un bloc, notre module la détecte et transmet le -signal IRQ sur le bus ISA. Dès que l'ordinateur est prêt à traiter -l'interruption, il demande à accéder au gestionnaire en transmettant -l'addresse du gestionnaire sur le bus ISA. - -En retour, le gestionnairerecopie une sorte de "masque d'interruption" -représentant quel a ou quels ont été les blocs ayant émis les interruptions de -plus haut niveau. Dès que l'ordinateur a effectué une lecture des données, il -le signal à l'aide du signal d'acquittement. Le gestionnaire repasse en mode -d'attente des interruptions suivantes. -interruptions suivante - -% Ici, on détail l'intérieur du bloc -\subsection{Architecture physique} - -% Pipo -Voici donc une explication du fonctionnement de ce bloc. On remarquera que ce -bloc est crucial, car la perte d'une interruption peut résulter en une perte -de temps, voir s'avérer désastreuse pour le robot. Il est donc nécessaire de -prendre les plus grandes précautions lors de sa réalisation. On pourra -consulter l'architecture physique sur la figure \ref{archi_interrupt} page -\pageref{archi_interrupt}. Pour le séquenceur, son graphcet est illustré -figure \ref{graphcet_interrupt} page \pageref{graphcet_interrupt}. - -\begin{figure}[htbp] -\caption{Architecture physique du bloc de gestion des interruptions} -\begin{center} -%\scalebox{0.7}{\includegraphics {./interrupt/images/archi_phy.pdf}} -\includegraphics[width=\textwidth]{./interrupt/images/archi_phy.pdf} -\end{center} -\label{archi_interrupt} -\end{figure} - -\begin{figure}[htbp] -\caption{Graphcet du séquenceur du bloc de gestion des interruptions} -\begin{center} -\scalebox{0.7}{\includegraphics {./interrupt/images/graphcet.pdf}} -%\includegraphics[width=\textwidth]{./interrupt/images/graphcet.pdf}} -\end{center} -\label{graphcet_interrupt} -\end{figure} - -% -Lorsqu'un bloc génère une interruption, celle-ci arrive sur le -\textbf{détecteur d'interruptions} ou ID associé à son niveau de priorité. Ces -niveaux de priorité son au nombre de 3, le niveau 1 étant la priorité maximale -et 3 la minimale. - -% Fonctionnement du bloc ID. -Cet ID envoie alors le signal \textit{Interrupt detected} au module -\textbf{Priority choice}. De plus, cet ID met un état haut en sortie sur le -bit correspondant et le conserve tant qu'il n'a pas reçu de signal de reset. - -% Fonctionnement du bloc Priority choice. -C'est au tour du module \textbf{Priority choice} d'agir. Celui-ci, à la -réception du signal identifie à quel niveau de priorité il est associé et -prévient le séquenceur de l'arrivée d'une interruption. Il attend alors la -réponse du séquenceur. - -Dès que ce signal (nommé \textit{enChoice}) arrive, l'addresse de l'ID ayant -émis ce signal est codée en sortie sur deux bits. C'est le signal appelé IRQ0 -et IRQ1. Si plusieurs interruptions sont arrivées simultanément, le module -choisira celle de priorité la plus haute. - -% TODO : Question -% pour le bloc priority choice, je peux soit le faire à base de graphcet -% (machine de Moore), soit en concurentiel. Pour l'instant, je serai bien -% partant pour le faire en concurentiel, mais ce choix est fait juste car cela -% me semble plus simple pour l'instant. -% -% Le seul probl_me est que je ne sait pas si ce sera synthétisable... -% D'ailleurs, comment sait-on qu'un bloc sera synthétisable ? -% Une idée pour orienter ce choix ? - -% Le MUX -Le \textbf{multiplexeur} choisi alors l'ID dont l'addresse lui a été transmise -par l'IRQ. et la recopie sur sa sortie. Le \textbf{séquenceur} récupère alors -la main et demande au registre de mémoriser la sortie du multiplexeur. Cette -opération s'effectue grâce au signal \textit{enRegID}. - -Cette mémorisation permet de prendre un "instantané" de l'état de l'ID -traité. Cela est une précaution dans les cas ou plusieurs interruptions -arrivent sur le même bloc pendant que l'on traite la première interruption. - -Une fois la mémorisation effectuée, on peut alors remettre l'ID à zéro et le -laisser intercepter les interruptions suivantes. Simultanément, on écrit sur -le bus ISA que l'on a reçu au moins une interruption. Ceci est effectué à -l'aide d'un registre et des lignes IRQ0 et IRQ1. Les deux dernières actions -décrites sont effectuées grâce au signal \textit{enRegIRQ} que l'on pourra -trouver aussi sou le nom \textit{RstID}. - -Le séquenceur attend alors que l'ordinateur demande une lecture. Pour -effectuer cette lecture, l'ordinateur doit mettre sur le bus d'addresse -l'addresse du bloc de gestion des interruptions. - -% Fonctionnement du bloc d'interface ISA -Lorsque ce signal arrive, le séquenceur prévient le \textbf{module -d'interfaçage} avec le bus ISA. Ce module, qui jusqu'à présent avait ses -sorties à l'état haut, recopie alors sur en sorties (sur le bus ISA) ses -entrées. On attend alors plus que l'\textit{acquittement} de l'ordinateur pour -recommencer le cycle. - - -% TODO : mettre en forme. Pour l'instant, c'est brouillon -% Ici, je vais finir de mettre des explications demain. Là je vais dormir :) - -% TODO : Ça, en fait, je vais inclure un module pour gérer les 3 cycles -% d'horloge dans mon bloc ! - -\textit{Remarque 1 :} On remarquera premièrement que pour que l'on ai pas de -perte d'interruptions pendant le traitement - -En effet, si une interruption arrive... - -Pour générer une interruption, on -doit produire un front montant et garder un état haut pendant 3 cycles -d'horloge. - -Rq : si 2 interruptions arrivent simultanément sur le même ID, on les transmet -toutes les deux lorsque l'on recopie sur le bus ISA le registre contenant les -interruptions détectées. - -Si un bloc a pas de réponses, il reposte son interruption. Est-ce possible ? - -Séquenceur teste les registres successivement, dès qu'il voit que l'un -de ceux-ci n'est plus égale à x"00", il modifie l'IRQ en conséquence. - - -\subsection{Décomposition RTL} -% Ici, détailler chaque petit bloc et mettre le code VHDL correspondant. +Du point de vue comportemental, son fonctionnement est le suivant. Chaque bloc +ayant un fil d'interruption le relie au gestionnaire d'interruption. +Lorsqu'une interruption est émise par un bloc, notre module la détecte et +transmet le signal IRQ sur le bus ISA. Dès que l'ordinateur est prêt à traiter +l'interruption, il demande à accéder au gestionnaire. -\subsection{Simulation} +Pour cela, il va lire successivement trois registres. Chaque registre est +représenté par une addresse différente. Chacun de ces registres contient un +masque. Les bits de ce masque signalent si un bloc a généré une interruption +ou non. En retour à chaque demande du PC, le gestionnaire placera sur le bus de +données le masque correspondant. -% mettre aussi peut-être les tests unitaires de chaque bloc ? -- cgit v1.2.3