\documentclass[a11paper]{article}

\usepackage{karnaugh-map}
\usepackage{subcaption}
\usepackage{tabularx}
\usepackage{titlepage}
\usepackage{document}
\usepackage{booktabs}
\usepackage{multicol}
\usepackage{float}
\usepackage{varwidth}
\usepackage{graphicx}
\usepackage{siunitx}
% \usepackage[toc,page]{appendix}
\usepackage[usenames,dvipsnames]{xcolor}

\title{Rapport d'APP}

\class{Logique Combinatoire}
\classnb{GEN420 \& GEN430}

\teacher{Marwan Besrour \& Gabriel Bélanger}

\author{
  \addtolength{\tabcolsep}{-0.4em}
  \begin{tabular}{rcl} % Ajouter des auteurs au besoin
      Benjamin Chausse & -- & CHAB1704 \\
      Shawn Couture    & -- & COUS1912 \\
  \end{tabular}
}

\newcommand{\todo}[1]{\begin{color}{Red}\textbf{TODO:} #1\end{color}}
\newcommand{\note}[1]{\begin{color}{Orange}\textbf{NOTE:} #1\end{color}}
\newcommand{\fixme}[1]{\begin{color}{Fuchsia}\textbf{FIXME:} #1\end{color}}
\newcommand{\question}[1]{\begin{color}{ForestGreen}\textbf{QUESTION:} #1\end{color}}

\begin{document}
\maketitle
\newpage
\tableofcontents
\newpage

\section{Module \texttt{thermo2bin}}
\subsection{Démarche et équations}

L’objectif était de convertir un code thermométrique de 12 bits en un code
binaire non signé sur 4 bits. Le nombre représenté par un tel code est obtenu
en comptant le nombre de bits à 1. Les équations logiques doivent donc
effectuer ce comptage. Étant donné que le code est sur 12 bits, il a été
divisé en trois groupes de 4 bits, ce qui a permis l'utilisation de tables de
Karnaugh pour déterminer les équations logiques.

D'après la table de vérité du code thermométrique 4 bits
(\ref{tab:table-de-vérité-thermométrique-4-bits}), le bit le plus
significatif du résultat binaire n’est jamais à 1. L'équation du bit $E$ est
donc simplement $E = 0$. Le bit $F$ est à 1 uniquement si $A$ l’est
également, d’où l’équation $F = A$. Les tables de Karnaugh ont donc été
utilisées uniquement pour les deux bits restants. Les deux tables, une pour
chaque bit, se trouvent en annexe (\ref{tab:karnaugh-bit-G} et
\ref{tab:karnaugh-bit-H}). Les équations étant assez simple, aucune simplification d'équations était nécessaire.

\begin{align}
	E & = 0         \\
	F & = A         \\
	G & = A'C       \\
	H & = C'D + A'B
\end{align}

Les trois résultats binaires sont ensuite additionnés à l’aide d’un
additionneur 4 bits, afin d’obtenir la valeur totale correspondant au nombre
de bits à 1 dans le code thermométrique. En ce qui concerne la détection
d'erreurs, une vérification par groupe de 2 bits est effectuée. Celle-ci
s’assure que, pour chaque paire consécutive, le LSB n’est pas à 0 si le MSB
est à 1, ce qui permet une détection rapide d’erreurs éventuelles (voir le
code en annexe).

\subsection{Explication des schémas blocs}

Le module \texttt{thermo2bin} est constitué de deux additionneurs 4 bits,
chacun composé de quatre additionneurs 1 bit. Les additionneurs 1 bit ont été
implémentés à l’aide de logique combinatoire ainsi que de blocs utilisant des
instructions \texttt{case}. Le module thermométrique comprend trois sections
identiques effectuant la conversion d’un code thermométrique 4 bits en un
code binaire non signé. Il intègre également une section de détection
d’erreurs, qui agit directement sur l’entrée du module. Il est à noter que
Vivado optimise certains sous-modules à l’aide de tables de correspondance
(\textit{look-up tables}) afin d’améliorer leur performance par rapport à une
implémentation reposant uniquement sur des portes logiques élémentaires.

\subsection{Fréquence d’opération}

Pour déterminer la fréquence d’opération maximale, il faut analyser le schéma
obtenu lorsque tout les sous-modules sont combinés et identifier le chemin le
plus long qu’un signal peut parcourir de l’entrée à la sortie. Cette analyse
peut être effectuée en observant les schémas générés par Vivado.

Le chemin le plus long à l’intérieur d’un additionneur 1 bit se situe entre
les bits d’entrée et le signal de retenue (\textit{carry-out}), ce qui
représente un total de 3 portes logiques dans le premier additionneur 1 bit.
Par la suite, les additionneurs 1 bit sont chaînés via les signaux
\textit{carry-in} et \textit{carry-out}, avec 2 portes logiques
supplémentaires par liaison. Un additionneur 4 bits utilise ainsi 4
additionneurs 1 bit en série, ce qui donne un chemin critique de
$2 \times 4 + 1 = 9$ portes logiques.

Le module \texttt{thermo2bin} contient deux additionneurs 4 bits chaînés. Le
second additionneur reçoit en entrée le \textit{carry-out} du premier,
ajoutant 8 portes logiques supplémentaires. Le total pour les deux blocs est
donc d’environ 17 portes logiques. Du côté des entrées, le bit le plus
coûteux en logique est $H$, avec le chemin suivant : $C' \rightarrow (C'D)
	\rightarrow (C'D + A'B)$, soit 3 portes logiques supplémentaires. On obtient
ainsi un total d’environ 20 portes logiques.

En supposant un temps de propagation de $5,\text{ns}$ par porte, le temps de
propagation maximal est donc approximativement $20 \times 5 = 100,\text{ns}$.
Sans tenir compte du temps de lecture ni des \textit{buffers} que Vivado
pourrait ajouter aux entrées et sorties, la fréquence maximale estimée est :

\begin{align}
	\frac{1}{100 \times 10^{-9}} & \approx \SI{10}{\mega\hertz}
\end{align}

Ce résultat est loin des $20,\text{MHz}$ exigés. Cependant, Vivado optimise
les additionneurs 1 bit à l’aide de \textit{look-up tables}, réduisant le
circuit logique de 3 à 1 porte logique dans certains cas. Cela abaisse le
nombre total de portes logiques à environ 11, ce qui améliore la fréquence
maximale à:

\begin{align}
	\frac{1}{11 \times 5 \times 10^{-9}} & \approx \SI{18.18}{\mega\hertz}
\end{align}

Ce n’est toujours pas suffisant pour atteindre l’objectif fixé.

\subsection{Implémentation}

Le code VHDL du module \texttt{thermo2bin} est fourni en annexe. Trois
composantes sont utilisées de façon hiérarchique. Le module principal aurait
pu être divisé en sous-modules de 4 bits, mais pour des raisons
d’optimisation, les trois conversions de segments de 4 bits du vecteur
thermométrique de 12 bits sont intégrées dans un seul bloc.

Après l’instruction \texttt{begin}, on retrouve trois sections quasi
identiques effectuant les équations booléennes de conversion. Les résultats
sont stockés dans trois signaux intermédiaires, lesquels sont additionnés
séquentiellement à l’aide d’additionneurs 4 bits. Le résultat du premier et
du deuxième segment est additionné, puis le résultat est additionné au
troisième segment. Un signal de retenue (\textit{carry}) permet la liaison
entre les deux additionneurs. Le résultat final est assigné à la sortie du
module \texttt{thermo2bin}. La logique de détection d’erreur est placée à la
fin du code et a été expliquée dans la section sur la démarche.

Le code VHDL de l’additionneur 4 bits est simple : quatre instances de
l’additionneur 1 bit y sont instanciées. Des signaux intermédiaires assurent
la propagation du \textit{carry} d’un bloc à l’autre ainsi que la
transmission des bits à additionner à chaque position. Le premier
additionneur traite les bits de poids faible (\textit{LSB}) et transmet le
\textit{carry} au suivant, qui additionne les bits de poids 1, et ainsi de
suite.

Les additionneurs 1 bit sont eux aussi simples : ils sont issus d’une table
de vérité à partir de laquelle une expression booléenne a été dérivée.

\section{Simulation complète}

Tous les modules du projet possèdent leur propre banc de test, couvrant leurs
cas d’utilisation de manière unitaire. Par conséquent, le banc de test de
\texttt{AppCombiTop} ne reprend pas l’ensemble des tests du module 7
segments. Il vérifie que les boutons modifient les deux DELs de parité et que
l’entrée \texttt{ADCth} modifie les DELs PMOD.

Le banc de test de \texttt{thermo2bin} couvre tous les cas valides, ainsi que
quelques cas invalides. Les autres bancs de test valident les modules de
manière individuelle pour tous — ou presque tous — les cas pertinents. Il
aurait donc été redondant et inutilement long de dupliquer ces tests
unitaires dans \texttt{AppCombiTop}.

Le banc de test du \texttt{Mux} ne couvre pas toutes les combinaisons
possibles. Étant donné qu’il est composé de trois sous-modules ayant chacun
leur propre banc de test, cela aurait engendré une duplication inutile. Le
test se concentre sur les combinaisons de boutons causant une erreur, vérifie
que l’erreur est bien transmise à l’affichage 7 segments, que l’erreur en
entrée est bien gérée, et que toutes les combinaisons valides produisent la
bonne valeur affichée. Il vérifie aussi la présence du \texttt{Moins 5} sur
la sortie signée.

Il n’est pas nécessaire que le test de \texttt{thermo2bin} couvre les
$2^{12}$ combinaisons possibles. Il suffit de tester les 12 cas valides, de
vérifier la détection d’erreur sur toutes les paires de 2 bits, puis de
réaliser quelques tests aléatoires avec des zéros pour confirmer le bon
fonctionnement général.


Les bancs de test utilisent des instructions \texttt{assert} permettant
d’afficher dans le terminal si une divergence entre le résultat obtenu et le
résultat attendu survient. La majorité fonctionnent correctement, mais
certains rencontrent des problèmes liés aux valeurs indéfinies (\texttt{'U'})
entraînant des messages incohérents comme : "Obtenu 0, Voulu 0".
Malgré un débogage approfondi et un fonctionnement correct du module en
simulation, le banc de test du \texttt{Mux} présente encore des incohérences
dans les transitions, rendant les résultats difficiles à interpréter. Le
numéro de chaque test est donc indiqué directement sur son chronogramme.
Pour le banc de test de parité, deux chronogrammes sont fournis,
correspondant chacun à un état différent du bouton de configuration
(\texttt{cfg}). Certains tests présentent des problèmes de valeurs initiales,
comme des sorties changeant d'état sans modification des entrées. La
méthodologie utilisée pour concevoir les bancs de tests devra être revue pour
mitiger ces erreurs et clarifier les chronogrammes.
Tous les bancs de test incluent des valeurs \texttt{expected} pour les
sorties attendues. Les noms des signaux sont choisis pour refléter la
fonctionnalité du module testé, et non nécessairement le nom des signaux
internes de plus haut niveau.

\section{Démarche d'analyse de compatibilité}

La première étape a été d'analyser le signal d'entrée de la carte
thermométrique. La DEL 2 est connectée au connecteur \texttt{JD1} en
configuration \textit{pull-up}, ce qui signifie qu'un niveau logique bas
(\texttt{0}) est requis pour l'allumer.

Cependant, trois inverseurs sont connectés en série avant elle : deux
\texttt{74V1T04STR} et un \texttt{NC7SP04P5X}, alimentés à \SI{1.2}{V}. Après
analyse des seuils $V_{OH}$, $V_{OL}$, $V_{IH}$ et $V_{IL}$ des composants :

% La premiere etape a ete d'analy

\begin{itemize}
	\item Le \texttt{NC7SP04P5X} produit un $V_{OH}$ maximal de \SI{1.1}{V} ;
	\item Le \texttt{74V1T04STR} requiert un $V_{IH}$ minimal de \SI{2.0}{V}.
\end{itemize}

Cela implique que le signal en sortie du \texttt{NC7SP04P5X} est toujours
considéré comme un niveau bas par le \texttt{74V1T04STR}. En conséquence, la
DEL reste allumée en permanence, sauf lorsque le connecteur de test force un
niveau haut adéquat à l’entrée des \texttt{74V1T04STR}.

\input{annexe.tex}
\end{document}
