Académique Documents
Professionnel Documents
Culture Documents
Spécialité Instrumentation
TP projet FPGA
Moteur pas à pas
Travaux pratiques
1
Sommaire
Sommaire .............................................................................................. 2
Présentation TP…………………………………………………………………………………………………………………………………………..….3-5
Objectif ............................................................................................. 3
Introduction ......................................................................................... 4
Schéma de principe…………………………………………………………………………………………………………………………………….4-5
Annexes................................................................................. ......11-54
Les tests bench (simulations) des principaux modules………………………………………………………………11-12
Les codes VHDL à éditer et à completer sous ISE…………………………………………………………………14-26
2
Présentation TP
Objectif
Contrôler un moteur numérique du type pas à pas, sens de rotation, vitesse de rotation, contrôle du
pas en mode local par potentiomètre numérique et à distance avec une liaison USB-série avec le
pont UART à disposition sur la carte FPGA.
Dans un premier temps on développera la partie contrôle local avec des encodeurs numériques et
Dans un second temps on ajoutera le module de communication UART (liaison série asynchrone)
Pour charger les données à distance via un PC.
La carte FPGA dispose d’un port USB double pont FTDI FT2232HQ USB-UART, un pour
programmer la puce FPGA et l’autre pour communiquer avec une liaison série, port COM.
Voir document ci-joint suivant la carte utilisée : NEXYS 4
https://reference.digilentinc.com/reference/programmable-logic/nexys-4-ddr/reference-manual
Voir document ci-joint suivant la carte utilisée : A7-100T
https://reference.digilentinc.com/reference/programmable-logic/nexys-a7/reference-
manual?s[]=a7&s[]=100t
On utilisera l’utilitaire PuTTY (émulateur de terminal) pour communiquer avec la carte FPGA et
l’électronique à développer, à télécharger sur https://www.putty.org/.
En pratique, il faudra afficher la fréquence de fonctionnement du moteur, le pas ainsi que la vitesse
en tr/min. Attention dans le projet vous devrez afficher sur 12 afficheurs, le projet ci-dessous
utilise 8 afficheurs.
Le moteur fonctionne en boucle ouverte non asservi, moteur utilisé : 28BYJ-48 5V moteur unipolaire
à 4 enroulements avec réducteur, driver moteur ULN2003 et encodeur PEC11R 24 pas/tours.
Le moteur à une réduction de 1/64 soit 360 degrés/64 = 5.625 degré/pas.
En mode demi-pas qui correspond à 8 états et 4 phases la réduction finale est de 4096 (64x64).
Le moteur aura un pas unitaire angulaire de 5.625/64 = 0,0879 degrés !
Vitesse max du moteur = 255Hz
• Alimentation : 5 Vcc
• Résistance : 21 ohms
• Intensité : 25 mA
• Réduction : 1/64
• Nombre de pas par tour : 64 (réduction de 4096 en sortie d'axe)
• Entraxe de fixation : 35 mm
• Axe : Ø5 mm avec double méplat (épaisseur 3 mm)
• Longueur de l’axe : 12 mm
3
Présentation TP
Introduction
Les moteurs pas à pas permettent de réaliser un positionnement précis à partir d’une commande
simple et peu coûteuse. Leur champ d’application est très vaste (montre à aiguille à quartz, lecteur
de disquette...) et touche beaucoup de domaines pour les entraînements à faible puissance.
Schéma de principe
Contrairement à l’ensemble des autres moteurs, le comportement du moteur pas à pas est de type
numérique : c’est à dire qu’il fonctionne par impulsions tout ou rien.
La plupart des actionneurs, qu’ils soient électriques ou hydrauliques fournissent un couple ou une
vitesse qui est fonction du niveau d’entrée de leur système de commande.
Avec le moteur pas à pas, il suffit d’envoyer une impulsion pour le faire tourner d’un pas. Si ces
impulsions sont envoyées à fréquence fixe le moteur tourne à vitesse constante.
Chaque impulsion envoyée par le système de commande au module de puissance se traduit par la
rotation d'un pas du moteur. La résolution angulaire¸ d'un moteur pas à pas va de 4 à 400 pas.
4
Présentation TP
CW
CCW
Figure 2 ci-dessus chronogramme de fonctionnement en mode demi pas
Partie 1. Développement des cartes électroniques associé à la carte FPGA NEXYS 4 ou A7-100T
Partie 2. Développement du code VHDL pour programmer la carte FPGA sous ISE web pack 14.7
5
Partie 1 CAO
Il faudra développer deux cartes électroniques avec le logiciel de CAO électronique ALTIUM qui se
connecteront à la carte FPGA. Carte encodeur numérique et Carte driver stepper motor.
Les librairies pour les composants seront fournies. Télécharger la version Etudiant pour le travail
hors TP en présentiel sur le site https://www.altium.com/solutions/academic-programs/student-
licenses. Licence gratuite pour 6 mois avec une adresse e-mail accréditée (EDU/Université).
D’un point de vue pratique nous utiliserons une machine à gravure anglaise, la LPKF protoMatE44
pour développer les deux circuits imprimés, (démonstration si possible au laboratoire de physique
des lasers).
La première carte permet le contrôle de la fréquence du moteur avec un encodeur numérique.
La seconde carte permet le contrôle en puissance des phases d’allumage des bobinages du moteur et
l’affichage de la fréquence de rotation.
Les deux cartes se connecterons sur les connecteurs « Pmod » de la carte FPGA.
L’affichage de la vitesse en tr/min et le pas seront à implémenter sur la carte de développement
FPGA Nexys 4 ou A7-100T déjà étudié en première année à l’aide des afficheurs disponibles.
6
Carte à développer sous ALTIUM DESIGNER 20
7
Carte à développer sous ALTIUM DESIGNER 20
8
Partie 2
Xilinx ISE 14.7
Le projet pour la partie numérique doit être développé sous ISE 14.7, télécharger la version 14.7
https://www.xilinx.com/downloadNav/vivado-design-tools/archive-ise.html
Attention éviter de prendre la version 14.7 Windows 10 qui est une machine virtuelle.
Prendre la version 14.7 et patcher ISE 14.7 pour Windows 10 avec le lien ci-dessous.
https://github.com/cbureriu/xilinx-14.7-patch-for-Win10-32-64
Vous pouvez également utiliser les outils les plus récent de Xilinx pour la programmation FPGA.
Vivado Suite https://www.xilinx.com/support/download.html
Cependant vous n’aurais pas accès aux outils graphiques tels que la saisi de schéma dans cette
version.
Supports des TP : https://moodlelms.univ-paris13.fr/my/ ... FPGA2- INSTR2 mais aussi les
supports De TP ELN de première année.
Figure 12 Carte
Carte FPGA
FPGA avec
avec les
les cartes
cartes filles
filles
9
Figure 4 vue RTL sous Xilinx ISE 14.7 du projet
10
ANNEXES
Tests bench
Module CLOCK manager 1
11
ANNEXES
Tests bench
Module encodeur numérique
12
ANNEXES
Basé sur Le code de Gray, également appelé binaire réfléchi, permet de ne faire changer qu'un seul
bit à la fois quand un nombre est incrémenté ou décrémenté d'une unité.
13
ANNEXES
--Code codeur numérique à completer-
-- Déclaration des bibliothèques utilisées
library IEEE;
use IEEE.STD_LOGIC_1164.all; -- inclus signaux améliorés du type std_ulogic--
use IEEE.STD_LOGIC_ARITH.all; -- fournit le calcul numérique--
use IEEE.STD_LOGIC_UNSIGNED.all; -- calcul numérique non signé sur le type std_logic_vector--
entity codeur_numerique is
Port (
CLK : in STD_LOGIC; --1000Hz--
Reset : in STD_LOGIC;
rotary_A : in STD_LOGIC;
rotary_B : in STD_LOGIC;
compte_out_codeur : out STD_LOGIC_VECTOR(7 downto 0));
end codeur_numerique;
elsif CLK'event and CLK ='1' then -- sur front montant d’horloge--
… --code à compléter
End case;
14
ANNEXES
--Code state machine moteur à completer—
-- Déclaration des bibliothèques utilisées
library IEEE;
use IEEE.STD_LOGIC_1164.all; -- inclus signaux améliorés du type std_ulogic--
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use ieee.numeric_std.all; -- fournit le calcul numérique tableaux signés non signés de type std_logic
pour les signaux--
entity state_machine_stepper_motor is
Port (
clk : in STD_LOGIC; --1000Hz--
bouton_UP : in STD_LOGIC;
bouton_DOWN : in STD_LOGIC;
change_frequency_motor : in STD_LOGIC_VECTOR (7 downto 0);
Commandes_demi_pas : out STD_LOGIC_VECTOR (3 downto 0);
vers_change_frequency_motor : out STD_LOGIC_VECTOR (7 downto 0);
reset : in STD_LOGIC;
visu_UP : out STD_LOGIC;
visu_DOWN : out STD_LOGIC);
end state_machine_stepper_motor;
15
ANNEXES
--Code state machine moteur à completer suite—
case state_machine is
… --code à compléter
End case;
end if;
end process;
end Behavioral;
16
ANNEXES
--Code clock manager à completer—
entity clock_manager_project is
Port ( clk : in STD_LOGIC; --100MHz
clk_div1 : out STD_LOGIC; --1000Hz
clk_div2 : out STD_LOGIC; --1000Hz
ce : in STD_LOGIC;
reset : in STD_LOGIC);
end clock_manager_project;
Begin
--Divise par 10000 FOUT = 1000Hz synchro affichage et synchro state machine—
PROCESS(clk,ce,reset)
BEGIN
… --code à completer—
END PROCESS;
17
ANNEXES
--Code Mux à completer—
entity MUX is
Port (
A : in STD_LOGIC_VECTOR (3 downto 0);
B : in STD_LOGIC_VECTOR (3 downto 0);
C : in STD_LOGIC_VECTOR (3 downto 0);
D : in STD_LOGIC_VECTOR (3 downto 0);
E : in STD_LOGIC_VECTOR (3 downto 0);
F : in STD_LOGIC_VECTOR (3 downto 0);
G : in STD_LOGIC_VECTOR (3 downto 0);
H : in STD_LOGIC_VECTOR (3 downto 0);
SEL : in STD_LOGIC_VECTOR (2 downto 0);
sortie_mux : out STD_LOGIC_VECTOR (3 downto 0));
end MUX;
begin
process(sel,A,B,C,D,E,F,G,H)
begin
case sel is
--when "000" => Sortie_Mux <= A;
when "001" => Sortie_Mux <= B;
---- code à completer
when others => Sortie_Mux <= A;
end case;
end process;
end Behavioral;
18
ANNEXES
--Code decode 2 to 8 à completer—
process(Sel,select_freq_or_vitesse)
begin
afficheur_0 <='1';afficheur_1 <='1';afficheur_2 <='1';afficheur_3 <='1';afficheur_4 <='1';
afficheur_5 <='1'; afficheur_6 <='1'; afficheur_7 <='1'; DP1 <='1';
if select_freq_or_vitesse = '1' then
case sel is
--when "000" =>afficheur_0 <='0'; DP1 <='1';
----code à completer
when others => afficheur_0 <='0'; DP1 <='1';
end case;
else
case sel is
--when "000" =>afficheur_0 <='0'; DP1 <='1';
----code à completer
when others => afficheur_0 <='0'; DP1 <='1';
end case;
end if;
end process;
end Behavioral;
19
ANNEXES
--Code BCD 7 segements complet—
entity BCD_7Segments is
Port (
d : in STD_LOGIC_VECTOR (3 downto 0);
s : out STD_LOGIC_VECTOR (6 downto 0));
end BCD_7Segments;
-- segment encoding
-- 0
-- ---
-- 5 | | 1
-- --- <- 6
-- 4 | | 2
-- ---
-- 3
begin
with d select
s<= "1111001" when "0001", --1
"0100100" when "0010", --2
"0110000" when "0011", --3
"0011001" when "0100", --4
"0010010" when "0101", --5
"0000010" when "0110", --6
"1111000" when "0111", --7
"0000000" when "1000", --8
"0010000" when "1001", --9
"0001000" when "1010", --A
"0000011" when "1011", --b
"1000110" when "1100", --C
"0100001" when "1101", --d
"0000110" when "1110", --E
"0001110" when "1111", --F
"1000000" when others; --0
end Behavioral;
20
ANNEXES
--Code compteur 3 bits à complet—
entity compteur_3bits is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
enable : in STD_LOGIC;
sortie_compteur : out STD_LOGIC_VECTOR (2 downto 0)); -3 bits on affiche sur 8 digits--
end compteur_3bits;
…--code à completer
END PROCESS;
Sortie_compteur <= compte;
end Behavioral;
21
ANNEXES
--Code compteur BCD à compléter—
Port (
CLK : in STD_LOGIC; --1000Hz
change_frequency_motor : in STD_LOGIC_VECTOR (7 downto 0);
bouton_UP : in STD_LOGIC;
bouton_DOWN : in STD_LOGIC;
Enable : in STD_LOGIC;
Reset : in STD_LOGIC;
Full : out STD_LOGIC;
Empty : out STD_LOGIC;
BCD_U : out STD_LOGIC_VECTOR (3 downto 0);
BCD_D : out STD_LOGIC_VECTOR (3 downto 0);
BCD_H : out STD_LOGIC_VECTOR (3 downto 0);
BCD_T: out STD_LOGIC_VECTOR (3 downto 0)
);
end CompteurBCD;
22
ANNEXES
--Code compteur BCD à completer—
--le compteur BCD permet d’afficher la valeur du pas 0 to 4096 sur 4 digits--
process(clock_int3, Enable,reset,bouton_UP,bouton_DOWN)
begin
if Reset='1' then --on initialize le compteur au démarrage--
COUNTER_U <= 0;
COUNTER_D <= 0;
COUNTER_H <= 0;
COUNTER_T <= 0;
elsif rising_edge(clock_int3) then
end Behavioral;
23
ANNEXES
--Exemple de Code pour le calcul de la Vitesse du moteur en tr/min—
--Ce code est une possibilitée de calcul de la Vitesse du moteur mais il y en a sans doute d’autres—
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use ieee.numeric_std.all;
--en fonction de la fréquence d’entrée du moteur entre 0-255Hz on calcul la Vitesse en tr/mn--
entity calcul_vitesse_stepper_motor is
Port ( frequency_in_motor : in STD_LOGIC_VECTOR (7 downto 0); --entre 0 et 255Hz--
select_freq_or_vitesse : in STD_LOGIC;
affichage_vitesse_digit0 : out STD_LOGIC_VECTOR (3 downto 0);
affichage_vitesse_digit1 : out STD_LOGIC_VECTOR (3 downto 0);
affichage_vitesse_digit2 : out STD_LOGIC_VECTOR (3 downto 0);
affichage_vitesse_digit3 : out STD_LOGIC_VECTOR (3 downto 0));
end calcul_vitesse_stepper_motor;
begin
24
ANNEXES
--Code calcul de la Vitesse du moteur en tr/min suite —
Le double dabble
-- <---------ORIGINAL
--000 0000 0000 11110011 b243 en base binaire
--Le double dabble est un algorithme utilisé pour convertir des nombres d'un système--
--binaire vers un système décimal. Pour des raisons pratiques, le résultat est--
--généralement stocké sous la forme de décimal codé en binaire (BCD)--
--En partant du registre initial, l'algorithme effectue n itérations (soit 8 dans l'exemple ci-dessous)
--a chaque itération, le registre est décalé d'un bit vers la gauche. Avant d'effectuer cette
opération,
--la partie au format BCD est analysée, décimale par décimale. Si une décimale en BCD (4 bits)
--est plus grande que 4 alors on lui ajoute 3. Cette incrément permet de s'assurer qu'une valeur de
5 après incrémentation et décalage, devient 16 et se propage correctement à la décimale suivante.
if select_freq_or_vitesse ='1' then -- select bit pour afficher soit la fréquence sur les
afficheurs 4 digits annexes ou la Vitesse en tr/mn--
temp (11 downto 0) := Q ;-- lire le signal Q dans la variable
25
ANNEXES
--Code pour le calcul de la Vitesse du moteur en tr/min suite —
Le double dabble
end loop;
temp2(7 downto 0) := Q2 ;
--- boucle d’itération—affichage sur 8 bits
for i in 0 to 7 loop -- car on souhaite afficher sur 8 bits la fréquence--
end loop;
end if;
-- set outputs→ vers le multiplexeur et 7 segments---
affichage_vitesse_digit0 <= STD_LOGIC_VECTOR (bcd(3 downto 0));
affichage_vitesse_digit1 <= STD_LOGIC_VECTOR (bcd(7 downto 4));
affichage_vitesse_digit2 <= STD_LOGIC_VECTOR (bcd(11 downto 8));
affichage_vitesse_digit3 <= STD_LOGIC_VECTOR (bcd(15 downto 12));
end process;
end Behavioral;
26
ANNEXES
Schéma principal TOP modul sous ISE
Deux types de développement pour le projet ISE et la forme du fichier principal :
Sous forme de schéma ci-dessous
27
ANNEXES
Fichier principal VHDL TOP modul sous ISE
Sous forme de déclaration des composants et d’instanciation VHDL ci-dessous :
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Top_level_module_moteur_pas_a_pas is
Port (
bouton_DOWN : in STD_LOGIC;
bouton_UP : in STD_LOGIC;
CLK : in STD_LOGIC;
reset : in STD_LOGIC;
enable : in STD_LOGIC;
rotary_A : in STD_LOGIC;
rotary_B : in STD_LOGIC;
select_freq_or_vitesse : in STD_LOGIC;
afficheur_0 : out STD_LOGIC;
afficheur_1 : out STD_LOGIC;
afficheur_2 : out STD_LOGIC;
afficheur_3 : out STD_LOGIC;
afficheur_4 : out STD_LOGIC;
afficheur_5 : out STD_LOGIC;
afficheur_6 : out STD_LOGIC;
afficheur_7 : out STD_LOGIC;
Commande_4_Phase : out STD_LOGIC_VECTOR (3 downto 0);
DP : out STD_LOGIC;
EMPTY : out STD_LOGIC;
FULL : out STD_LOGIC;
SEG : out STD_LOGIC_VECTOR (6 downto 0);
Visu_DOWN_freq : out STD_LOGIC;
Visu_UP_freq : out STD_LOGIC);
end Top_level_module_moteur_pas_a_pas;
28
ANNEXES
Fichier principal VHDL TOP modul sous ISE
Sous forme d’instanciation VHDL ci-dessous suite
component BCD_7Segments
port ( d : in std_logic_vector (3 downto 0);
s : out std_logic_vector (6 downto 0));
end component;
component MUX
port (
A : in std_logic_vector (3 downto 0);
B : in std_logic_vector (3 downto 0);
C : in std_logic_vector (3 downto 0);
D : in std_logic_vector (3 downto 0);
E : in std_logic_vector (3 downto 0);
F : in std_logic_vector (3 downto 0);
G : in td_logic_vector (3 downto 0);
H : in std_logic_vector (3 downto 0);
SEL : in std_logic_vector (2 downto 0);
sortie_mux : out std_logic_vector (3 downto 0));
end component;
component compteur_3bits
port ( clk : in std_logic;
reset : in std_logic;
enable : in std_logic;
sortie_compteur : out std_logic_vector (2 downto 0));
end component;
29
ANNEXES
Fichier principal VHDL TOP modul sous ISE
Sous forme d’instanciation VHDL ci-dessous suite
component calcul_vitesse_stepper_motor
port (
select_freq_or_vitesse : in std_logic;
frequency_in_motor : in std_logic_vector (7 downto 0);
affichage_vitesse_digit0 : out std_logic_vector (3 downto 0);
affichage_vitesse_digit1 : out std_logic_vector (3 downto 0);
affichage_vitesse_digit2 : out std_logic_vector (3 downto 0);
affichage_vitesse_digit3 : out std_logic_vector (3 downto 0));
end component;
component state_machine_stepper_motor
port ( clk : in std_logic;
bouton_UP : in std_logic;
bouton_DOWN : in std_logic;
reset : in std_logic;
change_frequency_motor : in std_logic_vector (7 downto 0);
visu_UP : out std_logic;
visu_DOWN : out std_logic;
Commandes_demi_pas : out std_logic_vector (3 downto 0);
vers_change_frequency_motor : out std_logic_vector (7 downto 0));
end component;
component DECODE_2_to_8
port ( select_freq_or_vitesse : in std_logic;
SEL : in std_logic_vector (2 downto 0);
DP1 : out std_logic;
afficheur_0 : out std_logic;
afficheur_1 : out std_logic;
afficheur_2 : out std_logic;
afficheur_3 : out std_logic;
afficheur_4 : out std_logic;
afficheur_5 : out std_logic;
afficheur_6 : out std_logic;
afficheur_7 : out std_logic);
end component;
30
ANNEXES
Fichier principal VHDL TOP modul sous ISE
Sous forme d’instanciation VHDL ci-dessous suite
component CompteurBCD
port ( CLK : in std_logic;
bouton_UP : in std_logic;
bouton_DOWN : in std_logic;
Enable : in std_logic;
Reset : in std_logic;
change_frequency_motor : in std_logic_vector (7 downto 0);
Full : out std_logic;
Empty : out std_logic;
BCD_U : out std_logic_vector (3 downto 0);
BCD_D : out std_logic_vector (3 downto 0);
BCD_H : out std_logic_vector (3 downto 0);
BCD_T : out std_logic_vector (3 downto 0));
end component;
component clock_manager_project
port ( clk : in std_logic;
ce : in std_logic;
reset : in std_logic;
clk_div1 : out std_logic;
clk_div2 : out std_logic);
end component;
component codeur_numerique
port ( CLK : in std_logic;
reset : in std_logic;
rotary_A : in std_logic;
rotary_B : in std_logic;
compte_out_codeur : out std_logic_vector (7 downto 0));
end component;
begin
-- BUFG: Global Clock Simple Buffer
-- 7 Series
-- Xilinx HDL Libraries Guide, version 14.1
BUFG_inst1 : BUFG
port map (
O => clk_synchro_affichage, -- 1-bit output: Clock output
I => clk_div1 -- 1-bit input: Clock input
);
-- End of BUFG_inst instantiation
31
ANNEXES
Fichier principal VHDL TOP modul sous ISE
Sous forme d’instanciation VHDL ci-dessous suite
module_3 : BCD_7Segments
port map (
d(3 downto 0)=>sortie_mux(3 downto 0),
s(6 downto 0)=>SEG(6 downto 0)
);
module_4 : MUX
port map (
A(3 downto 0)=>A(3 downto 0),
B(3 downto 0)=>B(3 downto 0),
C(3 downto 0)=>C(3 downto 0),
D(3 downto 0)=>D(3 downto 0),
E(3 downto 0)=>E(3 downto 0),
F(3 downto 0)=>F(3 downto 0),
G(3 downto 0)=>G(3 downto 0),
H(3 downto 0)=>H(3 downto 0),
SEL(2 downto 0)=>SEL(2 downto 0),
sortie_mux(3 downto 0)=>sortie_mux(3 downto 0)
);
module_5 : compteur_3bits
port map (
clk=>clk_synchro_affichage,
enable=>enable,
reset=>reset,
sortie_compteur(2 downto 0)=>SEL(2 downto 0)
);
32
ANNEXES
Fichier principal VHDL TOP modul sous ISE
Sous forme d’instanciation VHDL ci-dessous suite
module_6 : calcul_vitesse_stepper_motor
port map (
frequency_in_motor(7 downto 0)=>frequency_in_motor(7 downto 0),
select_freq_or_vitesse=>select_freq_or_vitesse,
affichage_vitesse_digit0(3 downto 0)=>E(3 downto 0),
affichage_vitesse_digit1(3 downto 0)=>F(3 downto 0),
affichage_vitesse_digit2(3 downto 0)=>G(3 downto 0),
affichage_vitesse_digit3(3 downto 0)=>H(3 downto 0)
);
module_7 : state_machine_stepper_motor
port map (
bouton_DOWN=>bouton_DOWN,
bouton_UP=>bouton_UP,
change_frequency_motor(7 downto 0)=>change_frequency_motor(7 downto 0),
clk=>clk_synchro_state_machine,
reset=>reset,
Commandes_demi_pas(3 downto 0)=>Commande_4_Phase(3 downto 0),
vers_change_frequency_motor(7 downto 0)=>frequency_in_motor(7 downto 0),
visu_DOWN=>Visu_DOWN_freq,
visu_UP=>Visu_UP_freq
);
module_8 : DECODE_2_to_8
port map (
SEL(2 downto 0)=>SEL(2 downto 0),
select_freq_or_vitesse=>select_freq_or_vitesse,
afficheur_0=>afficheur_0,
afficheur_1=>afficheur_1,
afficheur_2=>afficheur_2,
afficheur_3=>afficheur_3,
afficheur_4=>afficheur_4,
afficheur_5=>afficheur_5,
afficheur_6=>afficheur_6,
afficheur_7=>afficheur_7,
DP1=>DP
);
33
ANNEXES
Fichier principal VHDL TOP modul sous ISE
Sous forme d’instanciation VHDL ci-dessous suite
module_9 : CompteurBCD
port map (
bouton_DOWN=>bouton_DOWN,
bouton_UP=>bouton_UP,
change_frequency_motor(7 downto 0)=>change_frequency_motor(7 downto 0),
CLK=>clk_synchro_state_machine,
Enable=>enable,
Reset=>reset,
BCD_D(3 downto 0)=>B(3 downto 0),
BCD_H(3 downto 0)=>C(3 downto 0),
BCD_T(3 downto 0)=>D(3 downto 0),
BCD_U(3 downto 0)=>A(3 downto 0),
Empty=>EMPTY,
Full=>FULL
);
module_10 : clock_manager_project
port map (
ce=>enable,
clk=>clk,
reset=>reset,
clk_div1=>clk_div1,
clk_div2=>clk_div2
);
module_11 : codeur_numerique
port map (
CLK=>clk_synchro_state_machine,
reset=>reset,
rotary_A=>rotary_A,
rotary_B=>rotary_B,
compte_out_codeur(7 downto 0)=>change_frequency_motor(7 downto 0)
);
end Behavioral;
34
ANNEXES
Le fichier de contrainte (entrées-sorties à “cabler”)
À completer et à verifier suivant la carte FPGA utilisée
## 7 segment display
#Bank = 34, Pin name = IO_L2N_T0_34, Sch name = CA
NET "SEG[0]" LOC = L3;
NET "SEG[0]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L3N_T0_DQS_34, Sch name = CB
NET "SEG[1]" LOC = N1;
NET "SEG[1]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L6N_T0_VREF_34, Sch name = CC
NET "SEG[2]" LOC = L5;
NET "SEG[2]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L5N_T0_34, Sch name = CD
NET "SEG[3]" LOC = L4;
NET "SEG[3]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L2P_T0_34, Sch name = CE
NET "SEG[4]" LOC = K3;
NET "SEG[4]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L4N_T0_34, Sch name = CF
NET "SEG[5]" LOC = M2;
NET "SEG[5]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L6P_T0_34, Sch name = CG
NET "SEG[6]" LOC = L6;
NET "SEG[6]" IOSTANDARD = LVCMOS33;
35
ANNEXES
Le fichier de contrainte (entrées-sorties à “cabler”)
À completer et à verifier suivant la carte FPGA utilisée
## Pmod Header JD
NET "rotary_A" LOC = G3;
NET "rotary_A" IOSTANDARD = LVCMOS33;
NET "rotary_B" LOC = G1;
NET "rotary_B" IOSTANDARD = LVCMOS33;
36
ANNEXES
Le fichier de contrainte (entrées-sorties à “cabler”)
À completer et à verifier suivant la carte FPGA utilisée
## Pmod Header JA
#Bank = 15, Pin name = IO_L1N_T0_AD0N_15, Sch name = JA1
NET "Commande_4_Phase[0]" LOC = B13;
NET "Commande_4_Phase[0]" IOSTANDARD = LVCMOS33;
#Bank = 15, Pin name = IO_L5N_T0_AD9N_15, Sch name = JA2
NET "Commande_4_Phase[1]" LOC = F14;
NET "Commande_4_Phase[1]" IOSTANDARD = LVCMOS33;
#Bank = 15, Pin name = IO_L16N_T2_A27_15, Sch name = JA3
NET "Commande_4_Phase[2]" LOC = D17;
NET "Commande_4_Phase[2]" IOSTANDARD = LVCMOS33;
#Bank = 15, Pin name = IO_L16P_T2_A28_15, Sch name = JA4
NET "Commande_4_Phase[3]" LOC = E17;
NET "Commande_4_Phase[3]" IOSTANDARD = LVCMOS33;
37
ANNEXES
Le fichier de contrainte (entrées-sorties à “cabler”)
À completer et à verifier suivant la carte FPGA utilisée
## 7 segment display
#Bank = 34, Pin name = IO_L2N_T0_34, Sch name = CA
NET "seg[0]" LOC = T10;
NET "seg[0]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L3N_T0_DQS_34, Sch name = CB
NET "seg[1]" LOC = R10;
NET "seg[1]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L6N_T0_VREF_34, Sch name = CC
NET "seg[2]" LOC = K16;
NET "seg[2]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L5N_T0_34, Sch name = CD
NET "seg[3]" LOC = K13;
NET "seg[3]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L2P_T0_34, Sch name = CE
NET "seg[4]" LOC = P15;
NET "seg[4]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L4N_T0_34, Sch name = CF
NET "seg[5]" LOC = T11;
NET "seg[5]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L6P_T0_34, Sch name = CG
NET "seg[6]" LOC = L18;
NET "seg[6]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L16P_T2_34, Sch name = DP
NET "dp" LOC = M4;
NET "dp" IOSTANDARD = LVCMOS33;
38
ANNEXES
Le fichier de contrainte (entrées-sorties à “cabler”)
À completer et à verifier suivant la carte FPGA utilisée
## Pmod Header JD
NET "rotary_A" LOC =G2;
NET "rotary_A" IOSTANDARD = LVCMOS33;
NET "rotary_B" LOC =F3;
NET "rotary_B" IOSTANDARD = LVCMOS33;
39
ANNEXES
Le fichier de contrainte (entrées-sorties à “cabler”)
À completer et à verifier suivant la carte FPGA utilisée
## Pmod Header JA
#Bank = 15, Pin name = IO_L1N_T0_AD0N_15, Sch name = JA1
NET "Commande_4_Phase[0]" LOC = C17;
NET "Commande_4_Phase[0]" IOSTANDARD = LVCMOS33;
#Bank = 15, Pin name = IO_L5N_T0_AD9N_15, Sch name = JA2
NET "Commande_4_Phase[1]" LOC = D18;
NET "Commande_4_Phase[1]" IOSTANDARD = LVCMOS33;
#Bank = 15, Pin name = IO_L16N_T2_A27_15, Sch name = JA3
NET "Commande_4_Phase[2]" LOC = E18;
NET "Commande_4_Phase[2]" IOSTANDARD = LVCMOS33;
#Bank = 15, Pin name = IO_L16P_T2_A28_15, Sch name = JA4
NET "Commande_4_Phase[3]" LOC = G17;
NET "Commande_4_Phase[3]" IOSTANDARD = LVCMOS33;
40
Ajout du module de communication UART (liaison série asynchrone)
Et des modules supplémentaires au projet
Les modules ci-dessous permettrons de piloter via un PC la vitesse du moteur (fréquence entre 0 et
255Hz) le sens de rotation et le démarrage du moteur avec le clavier du PC et l’application PuTTY
41
ANNEXES
--Code UART liaison Série asynchrone—
Appelé port série, interface RS-232, port COM, mais le nom correct est en fait UART (Universal
Asynchronous Receiver Transmitter). Un UART est l'une des méthodes les plus simples pour parler
à votre FPGA. Il peut être utilisé pour envoyer des commandes d'un ordinateur à un FPGA et vice
versa.
Un UART est une interface qui envoie généralement un octet à la fois sur un seul fil. Il ne transmet
pas le long d'une horloge avec les données, c'est pourquoi il est appelé asynchrone par opposition à
synchrone. Les UART peuvent fonctionner en semi-duplex (deux émetteurs partageant une ligne) ou
en duplex intégral (deux émetteurs chacun avec leur propre ligne). Les UART ont plusieurs
paramètres qui peuvent être définis par l'utilisateur. Ceux-ci sont :
Le débit en bauds est la vitesse à laquelle les données série sont transmises. 9600 bauds signifie
9600 bits par seconde. Le nombre de bits de données est presque toujours défini sur huit. Un bit
de parité peut être ajouté après l'envoi des données. La parité est toujours calculée en effectuant
une opération XOR sur tous les bits de données. Un bit d'arrêt toujours mis à 1, et il peut y avoir 0,
1 ou 2 bits d'arrêt. Le contrôle de flux n'est généralement pas utilisé dans les applications
actuelles et sera probablement défini sur Aucun.
Comme mentionné précédemment, aucune horloge n'est envoyée avec les données. Dans toute
interface qui n'a pas d'horloge, les données doivent être échantillonnées pour les récupérer
correctement. Il doit être échantillonné au moins huit fois plus rapidement que le débit des bits de
données. Cela signifie que pour un UART de 115200 bauds, les données doivent être échantillonnées
à au moins 921,6 KHz (115200 baud * 8). Une horloge d'échantillonnage plus rapide peut être
utilisée.
42
ANNEXES
--Code UART liaison Série asynchrone—
-- This file contains the UART Receiver and UART Transmitter.
--This receiver is able to receive 8 bits of serial data, one start bit, one stop bit, and no parity bit.
--When receive is complete data_send will be driven high for one clock cycle.
-- CLKS_PER_BIT = (Frequency of Clk) / (Frequency of UART) 100 MHz Clock, 9600 baud UART
-- (100000000) / (9600) = 10416
Library ;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.all;
entity UART_RX is
generic (
CLKS_PER_BIT : integer := 10416 -- pour 100MHz d’horloge et 9600 bps
);
port (
clk : in std_logic;
RX_Serial : in std_logic;
data_send : out std_logic;
RX_Byte : out std_logic_vector(7 downto 0)
);
end UART_RX;
begin
-- Purpose: Double-register the incoming data.
-- This allows it to be used in the UART RX Clock Domain.
-- (It removes problems caused by metastabiliy)
process (clk)
begin
if rising_edge(clk) then
r_RX_Data_R <= RX_Serial;
r_RX_Data <= r_RX_Data_R;
end if;
end process;
43
ANNEXES
--Code UART liaison Série asynchrone—
case state_machine is
44
ANNEXES
--Code UART liaison Série asynchrone—
end case;
end if;
end process;
end Behavioral;
45
ANNEXES
--Code gestion moteur à compléter—
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Gestion_commande_motor is
Port (
bouton_montee : in STD_LOGIC;
bouton_descente : in STD_LOGIC;
start_motor_UP_PCcontrol : in STD_LOGIC;
start_motor_DOWN_PCcontrol : in STD_LOGIC;
bouton_UP : out STD_LOGIC;
bouton_DOWN : out STD_LOGIC
);
end Gestion_commande_motor;
begin
process(bouton_montee,bouton_descente,start_motor_UP_PCcontrol,start_motor_DOWN_PCcont
rol)
begin
-- code à completer
end process;
end Behavioral;
46
ANNEXES
--Code Communication USB or codeur and RAM—
library IEEE;
use IEEE.STD_LOGIC_1164.all;
--use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use ieee.numeric_std.all;
entity USB_codeur_and_RAM is
Port (
reset : in std_logic;
codeur_in : in STD_LOGIC_VECTOR (7 downto 0);
enable: in std_logic;
RX_DV : in STD_LOGIC;
Rx_data_Uart : in STD_LOGIC_VECTOR (7 downto 0);
select_codeur_or_uart : in STD_LOGIC;
start_motor_UP : out STD_LOGIC;
start_motor_down : out STD_LOGIC;
reglage_frequency_motor : out STD_LOGIC_VECTOR (7 downto 0)
);
end USB_codeur_and_RAM;
begin
47
ANNEXES
--Code Communication USB or codeur and RAM—
process(RX_DV,enable,reset,RST_RAM)
begin
if reset ='1' or RST_RAM ='1' then
RAM_ADDR <= "00";
RAM(0) <=X"00";
RAM(1) <=X"00";
RAM(2) <=X"00";
elsif rising_edge(RX_DV) then
end if;
end if;
end process;
--this module is for converting a 4 digit BCD number into binary number.
--the range of the input in decimal is 0 to 999.
end Behavioral;
48
ANNEXES
--Connection PC et Carte FPGA—
Figure 6
7 Carte FPGA avec les cartes filles
49
ANNEXES
Le fichier de contrainte (entrées-sorties à “cabler”)
Pour l’ajout du module UART
À completer et à verifier suivant la carte FPGA utilisée
## 7 segment display
#Bank = 34, Pin name = IO_L2N_T0_34, Sch name = CA
NET "SEG[0]" LOC = L3;
NET "SEG[0]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L3N_T0_DQS_34, Sch name = CB
NET "SEG[1]" LOC = N1;
NET "SEG[1]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L6N_T0_VREF_34, Sch name = CC
NET "SEG[2]" LOC = L5;
NET "SEG[2]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L5N_T0_34, Sch name = CD
NET "SEG[3]" LOC = L4;
NET "SEG[3]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L2P_T0_34, Sch name = CE
NET "SEG[4]" LOC = K3;
NET "SEG[4]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L4N_T0_34, Sch name = CF
NET "SEG[5]" LOC = M2;
NET "SEG[5]" IOSTANDARD = LVCMOS33;
#Bank = 34, Pin name = IO_L6P_T0_34, Sch name = CG
NET "SEG[6]" LOC = L6;
NET "SEG[6]" IOSTANDARD = LVCMOS33;
50
ANNEXES
Le fichier de contrainte (entrées-sorties à “cabler”)
À completer et à verifier suivant la carte FPGA utilisée
## Pmod Header JD
NET "rotary_A" LOC = G3;
NET "rotary_A" IOSTANDARD = LVCMOS33;
NET "rotary_B" LOC = G1;
NET "rotary_B" IOSTANDARD = LVCMOS33;
51
ANNEXES
Le fichier de contrainte (entrées-sorties à “cabler”)
À completer et à verifier suivant la carte FPGA utilisée
## Pmod Header JA
#Bank = 15, Pin name = IO_L1N_T0_AD0N_15, Sch name = JA1
NET "Commande_4_Phase[0]" LOC = B13;
NET "Commande_4_Phase[0]" IOSTANDARD = LVCMOS33;
#Bank = 15, Pin name = IO_L5N_T0_AD9N_15, Sch name = JA2
NET "Commande_4_Phase[1]" LOC = F14;
NET "Commande_4_Phase[1]" IOSTANDARD = LVCMOS33;
#Bank = 15, Pin name = IO_L16N_T2_A27_15, Sch name = JA3
NET "Commande_4_Phase[2]" LOC = D17;
NET "Commande_4_Phase[2]" IOSTANDARD = LVCMOS33;
#Bank = 15, Pin name = IO_L16P_T2_A28_15, Sch name = JA4
NET "Commande_4_Phase[3]" LOC = E17;
NET "Commande_4_Phase[3]" IOSTANDARD = LVCMOS33;
52
ANNEXES
Carte de développement Digilent Nexys A7
Branchement de la carte
Pour démarrer la Carte d'Evaluation Nexys 4 ou A7-100T, suivez la procédure décrite ci-dessous :
1. Branchez la Carte sur votre PC à l'aide du câble USB prévu à cet effet
2. Le driver s’installe automatiquement
3. Charger le programme *.*.bit dans la cible à l’aide de l’utilitaire IMPACT sous ISE.
53
ANNEXES
Carte de développement Digilent Nexys 4
D. Nexys 4 board
E. Custom Digilent cardboard box with protective foam
F. One USB A to micro-B cable
Branchement de la carte
Pour démarrer la Carte d'Evaluation Nexys 4 ou A7-100T, suivez la procédure décrite ci-dessous :
4. Branchez la Carte sur votre PC à l'aide du câble USB prévu à cet effet
5. Le driver s’installe automatiquement
6. Charger le programme *.*.bit dans la cible à l’aide de l’utilitaire IMPACT sous ISE.
54