summaryrefslogtreecommitdiff
path: root/rapport/main.tex
blob: addad1ae3c58bacbbbd4fd782555c8128ef6e8bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
\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}
Tout les modules du projet ont leurs propre test bench avec leurs tests unitaire. Par conséquent, le testbench de AppCombiTop n'a pas
tout les tests de 7 segments. Il test que les boutons changent les deux DELs de parité et que l'entrée ADCth change les DELs PMOD.
Le testbench de Thermo2bin test tout les cas de figure valide et quelques tests invalide. Les autres testbench testent les modules
individuellement pour tout les cas de figure ou presque tout. Il était donc redondant et trop long de refaire tout ces tests unitaire la
dans le test bench d'AppCombiTop, car une duplication des fonctionalitées testé aurait lieux.
\\
Le banc de test du Mux ne tests pas toutes les possibilitées. Étant donnée qu'il est composé de 3 autres composantes lesquels ont leurs
propre banc de tests, cela aurait créé des tests redondant. Il test les combinaisons de boutons donnant une erreur,
s'assure que celle-ci est envoyé aux 7 segments, que l'erreur en entrée fonctionne, et que toutes combinaisons de boutons valide affiche
les bon nombre sur les 7 segments en sortie. Il test aussi la présence du Moin 5 sur la sortie signée.
\\
Le test de thermo2bin n'a pas besoin de tester les $2^{12}$ possibilité. Il suffit de tester les $12$ valide puis de tester que la
détection d'erreur fonctionne sur toutes les paires de $2$ bits. Ensuite, quelques tests avec plusieurs zéros aléatoire sont effectué
juste pour confirmé.
\\
Les banc de tests utilisent des "assert" qui permet d'afficher dans le terminal si des problèmes ont eut lieux (résultat obtenu diffère
du résultat voulu). La plus part fonctionne parfaitement tandis que d'autre montre quelques problèmes liés aux "undefined" qui causent des
affichage d'erreur incohérent tel que: "Obtenu 0 Voulu 0". Malgrès beaucoup de deboggage et le fonctionnement réelle du module, le banc de
test du Mux montre des problème de changements et est difficile à lire. Le numéro de test est donc fournis dans son chronogramme. Pour le
banc de test de parité, deux chronogrammes sont fournis en fonction de l'état du bouton (cfg). Les banc de tests démontres quelques
problèmes de valeurs initiales, comme une valeur de sortie qui change alors que l'entrée n'a pas changé. L'approche utilisé pour faire
les bancs de tests devra être révisé afin de mitiger ces problèmes de chronogrammes. Tout les banc de tests ont des "expected" pour les
"outputs" attendu. Leurs noms sont directement en lien avec la fonctionalité du module et pas forcément le nom du signal haut niveau.

\section{Démarche d'analyse de compatibilité}
La première étape à été d'analyser le signal d'entrée de la carte thermométrique. La DEL 2 est connecté au connecteur JD1 en
configuration "pull-up". Ceci dit, il faut donc avoir un 0 logique à son entrée pour l'allumé. Cependant, trois inverseurs sont
connecté en série avant elle. Soit deux 74V1T04STR et un NC7SP04P5X alimenté à +1.2 Volts. Après analyse de $V_{OH}$, $V_{OL}$, $V_{IL}$
et $V_{IH}$ des deux portes logiques, le NC7SP04P5X à un $V_{OH}$ de maximum 1.1 volts tandis que le 74V1T04STR à besoin d'un $V_{IH}$
minimum de 2 Volts. Donc selon le 74V1T04STR, le NC7SP04P5X envoie toujours un niveau logique bas, ce qui résulte à une del
tout le temps allumé sauf lorsque le connecteur de test de la del est en mode de test car un bon niveau logique haut est envoyé à
l'entrée des 74V1T04STR.

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