Académique Documents
Professionnel Documents
Culture Documents
1
BENNANI Mohamed NAUDOT François
Sommaire
I. Présentations du projet 3
V. Conclusion 16
2
BENNANI Mohamed NAUDOT François
I. Présentations du projet
Pour ce faire, nous avons tout d’abord compris le principe de fonctionnement de ce type de
liaison. Puis nous avons créé un code en langage VHDL sur le logiciel Altium à implémenter
sur la FPGA de la nanoboard. Par la suite, nous avons créé une fiche schematic sur le
logiciel Altium afin de relier la FPGA à d’autres éléments de la nanoboard. Pour finir nous
avons essayé cette configuration sur le logiciel Hyperterminal et testé des valeurs de notre
programme avec l’analyseur de signaux logiques pour essayer de corriger notre code.
Le principe de fonctionnement comme son nom l’indique est d’envoyer des bits en
série, c'est-à-dire les un après les autres, à la différence de liaisons en parallèle ou plusieurs
bits sont envoyés simultanément. Bien que la liaison en parallèle permet d’envoyer plusieurs
bits simultanément et donc d’envoyer plus d’information à fréquence de fonctionnement égal
à celle d'une liaison série, la liaison série compense cela par de nombreux avantages tel que
la fiabilité sur de plus grandes distance de communication (car les signaux envoyés en
parallèle sur de longues distance subissent des interférences provoqué par les autres
signaux envoyé en parallèle), de plus il est possible de faire fonctionner les liaisons en série
à des fréquences bien plus élevés que pour les liaisons en parallèles. Il est donc intéressant
de travailler sur ce type de liaisons que nous pouvons rencontrer fréquemment.
3
BENNANI Mohamed NAUDOT François
Pour envoyer les bits de l’information à envoyer, il est important de respecter la trame
suivante :
Sur cette trame est donc indiqué plusieurs informations qui nous permettront de créer
l’architecture de notre code :
-Lorsque aucune donnée n’est envoyée, un état haut ( bit =1) est envoyé à chaque
impulsion de la clock.
-Lorsqu'une donnée est envoyée, un bit “start” qui est un bit = 0 est envoyé. Cela
permet lors de la réception de détecter le début d’un message.
-Après l’envoi du bit “start”, les bits constituant le message sont transmis du bit de
poids faible jusqu’au bit de poids fort.
-Une fois le message émis, un bit “stop” est envoyé (bit = 1), puis la liaison se remet
un envoyer constamment un bit = 1, c'est-à-dire se remettre dans la configuration initiale.
C’est dans l’idée de respecter cette trame que nous avons créé notre code VHDL pour
configurer la FPGA.
Avant d’écrire le code VHDL qui utilisera la FPGA, nous avons établi la structure de
notre circuit et observé les éléments qui en faisaient partie pour savoir quelle fonctionnalité
nous avions besoin de créer dans notre code VHDL.
Notre circuit est constitué de :
-L’horloge de la FPGA réglée sur 50 MHz.
-Un bouton de la nanoboard qui nous servira de signal d’envoi de la donnée à
transmettre.
-Un instrument virtuel nous permettant de choisir le message à transmettre.
-Un port série RS232, qui sera donc la sortie de ce circuit.
-Un Bloc FPGA correspondant à la partie de la FPGA programmé grâce à notre code
VHDL.
A défaut d’avoir de véritables images de notre schematic que Altium voici une représentation
de notre circuit ressemblant fortement à ce que nous pouvions voir sur Altium.
4
BENNANI Mohamed NAUDOT François
On peut donc observer sur cette représentation du circuit plusieurs informations importantes
pour la réalisation du code VHDL.
Tout d’abord on observe que le bloc FPGA est relié à 3 entrées et à une sortie. Tous ces
signaux électriques sont des signaux logiques hormis le signal “data_in” qui est un bus de 8
signaux logiques. De plus, on s'aperçoit que l’horloge de ce circuit est une horloge de 50
MHz, or nous voulons une transmission en série à la vitesse de 9600 bauds. Il faudra donc
prévoir dans le code VHDL un moyen de passer d’une horloge de 50 MHz à une horloge de
9,6 kHz.
Voyons maintenant qu’elle est le code VHDL que nous avons créé pour ce bloc FPGA
central à notre circuit.
Notre code VHDL doit comporter deux parties lors de sa réalisation au vu de ce que
nous avons pu observer sur la configuration de notre circuit. Il doit comporter tout d’abord
une fonction permettant d’envoyer le message en liaison série en suivant le protocole de la
trame de transmission en série; puis il doit comporter une gestion de l’horloge afin d’avoir
une transmission à la vitesse convenue de 9600 bauds.
Pour l'envoi du message, nous avons choisis de créer une machine à état. Nous
avons donc créé un type VHDL nous permettant de représenter l’état dans lequel la liaison
se trouve. En étudiant la trame nous avons donc dégagé 5 états différents pour la liaison. Un
état “reset” permettant d’initialiser la liaison au démarrage et après la fin de l’envoie d’un
message. Un deuxième état “pas_de_transmission” correspondant à lorsqu’il ne faudra pas
5
BENNANI Mohamed NAUDOT François
Cette machine passera d’un état à un autre en suivant certaines conditions en fonction de
l’état actuel dans lequel elle se trouve. Pour contrôler ces différents transition d’état et les
conditions de passage d’un état à un autre, nous avons créé un process nommé “control_tx”
dont les signaux d’activations seront “activation”, “etat_actuel”, “bouton”et “compteur_bit”, de
cette manière à chaque changement de valeurs de ces signaux ce process s’activera. le
signal “activation” correspond à l’horloge créé par le deuxième process de notre code VHDL
que nous ferons par la suite, qui nous permet d’avoir une fréquence de transmission de
9600 bauds, et en effet lors du changement de valeur de “activation”, “control_tx” s’activera
et l’état de la liaison et ce que cela implique sera actualisé.
Pour comprendre notre code VHDL il est intéressant de détailler les conditions de passages
d’un état à un autre:
-Lorsque la liaison est dans un état de “reset” le bit envoyé est un 1 et l’
”état_suivant” est sans condition l’état “pas_de_transmission”.
- Lorsque la liaison est dans l’état “pas_de_transmission”, si l’on appuie sur le bouton
de la nanoboard et donc que le signal “bouton” passe à 0 ( les boutons de la nanoboard sont
inversés il envoie un signal à l’état bas lorsque l’on appuie dessus), l’état suivant sera celui
de début de transmission, “bit_start”. Tant que personne n’appuie sur le bouton d’envoie du
message il n’y a pas de transmission et donc l’état reste “pas_de_transmission” et continue
à envoyer constamment la valeur 1 sur le port série.
-Lorsque la liaison est dans l’état “bit_start”, on evoie un bit de départ égal à 0 et on
passe sans conditions à l’état “envoyer_les_donnes”.
-Lorsque la liaison est à l’état “envoyer_les_donnes”, on envoi les bits constituant le
message. Si on a envoyé tous les bit du message, donc 8 bits la valeurs de “compteur_bit”
se trouve à 7 et alors la liaison passe à l’état “bit_stop”. Si nous “compteur_bit” ne vaut
toujours pas 7, alors tous les bits de données n’ont pas été envoyés, la liaison reste alors à
l’état “envoyer_les_donnes”.
6
BENNANI Mohamed NAUDOT François
-Lorsque la liaison est à l’état “bit_stop”, le bit de fin de message égal à 1 est envoyé,
et la liaison passe sans conditions à l’état “reset”.
Cette fonction réalise donc des boucles pour l’envoi du message puis s’arrête lorsque l’envoi
de celui-ci est terminé pour stagner à l’état “pas_de_transmission”, jusqu’à ce que quelqu’un
appuie sur le bouton 0 de la nanoboard.
L’un des avantages de ce code est qu’il ne peut pas y avoir d’envoi superposé par un appui
prolongé sur le bouton 0, car la valeur de celui-ci n’est pris en compte que dans un seul état
de la liaison, et que l’on passe à un autre état dès que l’on appuie sur le bouton.
7
BENNANI Mohamed NAUDOT François
Pour obtenir l’horloge de 9600 Hz que nous désirons, nous avons créé un process
“nouvelle_clk” qui s’active avec les fronts montant de l’horloge de la FPGA. Nous avons
introduit un signal compteur_clk qui est un entier entre 0 et 5207, initialisé à 0.
“clk_par_bit” est une constante de valeur de 5208. cette valeur est trouvé en divisant
50 000 000 par 9600. Ce qui représente donc le nombre de d’impulsion de l’horloge de la
FPGA que nous avons besoin pour créer une impulsion de notre horloge à 9600 Hz.
generic (
clk_par_bit : integer := 5208 );
nouvelle_clk : process(clk)
begin
if (clk ='1' and clk'event) then
if (compteur_clk = clk_par_bit-1) then
compteur_clk <= 0;
etat_actuel <= etat_suivant;
activation <= not activation;
if (etat_actuel = envoyer_les_donnés) then
compteur_bit <= compteur_bit + 1;
else
compteur_bit <= 0;
end if;
else
compteur_clk <= compteur_clk + 1;
end if;
end if;
end process nouvelle_clk;
8
BENNANI Mohamed NAUDOT François
Une fois les deux processus créés, il suffit d’ajouter les initialisations de signaux ou
autres valeurs nécessaires au code et surtout de rajouter la syntaxe VHDL pour obtenir le
code complet de la liaison série.
library ieee;
use ieee.std_logic_1164.all;
use iee.std_logic_unsigned.all;
use ieee.numeric_std.all;
entity liaison_serie_tx is
generic (
clk_par_bit : integer := 5208 );
port (
clk : in std_logic;
data_in : in std_logic_vector(7 downto 0);
bouton : in std_logic;
data_out : out std_logic);
end entity liaison_serie_tx;
begin
nouvelle_clk : process(clk)
begin
if (clk ='1' and clk'event) then
if (compteur_clk = clk_par_bit-1) then
compteur_clk <= 0;
etat_actuel <= etat_suivant;
activation <= not activation;
if (etat_actuel = envoyer_les_donnés) then
compteur_bit <= compteur_bit + 1;
else
9
BENNANI Mohamed NAUDOT François
compteur_bit <= 0;
end if;
else
compteur_clk <= compteur_clk + 1;
end if;
end if;
end process nouvelle_clk;
10
BENNANI Mohamed NAUDOT François
Après avoir réalisé le code VHDL, la fiche schematic et introduit les contraintes de
bases de la FPGA, nous avons essayé de faire une transmission en liaison série de la
nanoboard à notre ordinateur en visualisant le message reçu grâce à Hyperterminal.
Seulement après plusieurs tentatives d’émission d’un message, nous ne recevions rien sur
l’ordinateur.
Nous avons donc utilisé l’analyseur de signaux logiques afin d’observer la sortie de notre
programme “data_out”. Pour observer ce signal grâce à l'analyseur de signaux, nous avons
utilisé une des broches présente sur la nanoboard prévu à cet effet. Pour cela, nous avons
rajouté une contrainte sur notre fichier de contrainte afin d’associer une broche de la
nanoboard à notre signal logique de sortie, et nous avons rajouté un point d’observation
nommé “signal_sortie” directement relié à la sortie “data_out”.
Nous avons ainsi pu observer que le signal “data_out” est à l’état bas constamment. Cela
est très problématique pour nous car le signal “data_out” ne peut, dans notre code, être qu’à
l’état bas lorsque nous envoyons un message. Cependant nous n’avions pas appuyé sur le
bouton de la nanoboard et de plus cet envoi est très rapide ce qui ne peut expliquer un état
constamment bas. Nous nous sommes donc interrogés sur le bon fonctionnement du bouton
de la nanoboard et sur l’état dans lequel notre liaison pouvait être.
Pour comprendre un peu mieux à quel endroit de notre code nous étions, nous avons ajouté
des signaux de sorties au code et des contraintes pour observer ces signaux sur les broches
de la nanoboard comme nous l’avons fait pour le signal “data_out” au préalable.
Nous avons donc le schematic suivant ainsi que ce fichier de contrainte :
;...............................................................................
Record=FileHeader | Id=DXP Constraints v1.0
;...............................................................................
11
BENNANI Mohamed NAUDOT François
Pour cela nous avons donc modifié les valeurs de ces sorties directement dans le code
VHDL.
Ainsi avec toutes les modification pour les tests de signaux nous obtenons ce nouveaux
code vhdl:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity liaison_serie is
generic (
clk_par_bit : integer :=5208
);
port(
clk : in std_logic ;
bouton: in std_logic;
data_in : in std_logic_vector(7 downto 0);
data_out : out std_logic;
test_etat1 : out std_logic;
test_etat2 : out std_logic;
test_etat3 : out std_logic;
12
BENNANI Mohamed NAUDOT François
nouvelle_clk : process(clk)
begin
if (clk ='1' and clk'event) then
if (compteur_clk = clk_par_bit-1 or
(etat_actuel=pas_de_transmission and etat_suivant=pas_de_transmission))
then
compteur_clk<=0;
etat_actuel<=etat_suivant;
activation<=not activation;
test_activation <= activation;
if (etat_actuel = envoyer_les_donnes) then
compteur_bit <= compteur_bit + 1;
else
compteur_bit <= 0;
end if;
else
compteur_clk <= compteur_clk +1;
end if;
end if;
end process nouvelle_clk ;
case etat_actuel is
when reset =>
test_etat1 <= '1';
test_etat2 <= '0';
test_etat3 <= '0';
test_est_un_etat <= '1';
data_out<='1';
etat_suivant <= pas_de_transmission;
when pas_de_transmission =>
test_etat1 <= '0';
test_etat2 <= '1';
test_etat3 <= '0';
test_est_un_etat <= '1';
13
BENNANI Mohamed NAUDOT François
data_out <='1';
if (bouton='0') then
etat_suivant <= bit_start;
else
etat_suivant <= pas_de_transmission;
end if;
when bit_start =>
test_etat1 <= '0';
test_etat2 <= '0';
test_etat3 <= '1';
test_est_un_etat <= '1';
data_out <= '0';
etat_suivant <= envoyer_les_donnes;
when envoyer_les_donnes =>
test_etat1 <= '1';
test_etat2 <= '1';
test_etat3 <= '0';
test_est_un_etat <= '1';
data_out <= data_in(compteur_bit);
if(compteur_bit = 7) then
etat_suivant <= bit_stop;
else
etat_suivant <= envoyer_les_donnes;
end if;
Avec toutes ses modifications nous avons donc visualiser les signaux de test avec
l’analyseur de signaux logique et nous avons obtenu ce chronogramme:
14
BENNANI Mohamed NAUDOT François
Sur ce chronogramme nous pouvons observer notre Horloge de 9600 Hz sur la voie D1 qui
fonctionne correctement, le problème de notre programme ne se trouve pas là. Sur la voie
D2 nous observons le signal “data_out” qui affiche un état bas constant comme observé
précédemment. Sur la voie D3 nous observons la valeur du bouton et celle-ci est à l’état
haut ce qui est normal puisque personne n’appuie dessus. Le problème ne vient pas non
plus d’un dysfonctionnement du bouton.
Cependant nous observons quelque chose de très intrigant, sur la voie D4 nous observons
le signal “test_etat” qui se trouve à l’état haut ainsi nous sommes bien dans un état de la
liaison. De plus grâce au voies D5 à D7 nous récupérons la valeur “010”, celle-ci correspond
à l’état “pas_de_transmission”. La liaison est donc bien initialisée seulement l’état
“pas_de_transmission” n’effectue pas les commandes que nous désirons, puisque dans
cette état, la liaison devrait mettre “data_out” constamment à l’état haut, ce qui n’est pas le
cas. De plus, le système ne change pas d’état lorsque nous appuyons sur le bouton de la
nanoboard.
15
BENNANI Mohamed NAUDOT François
Le Problème ici est donc que la valeur ‘1’ n’est pas attribuée à “data_out”. Ce qui est
troublant c’est que les test d’état voient leur valeur leur être attribuée alors que ce sont des
sorties du même type que “data_out”.
Nous n’avons finalement pas réussi à résoudre ce problème qui nous a empêché de mener
à bien ce projet.
V. Conclusion
Bien que nous n’ayons pas réussi à aboutir dans ce projet à un résultat viable, nous avons
compris beaucoup de choses sur la conception d’un circuit électronique avec une FPGA. De
plus, la manipulation du logiciel Altium nous a permis de nous familiariser avec les moyens
de concevoir ce type de systèmes et de comprendre comment écrire un code VHDL en
prenant en compte les autres appareils du système qui impose certaines contraintes lors de
la réalisation du code.
16