
Utilisation d'un processeur Nios II
II.4 Les principaux blocs logiques de notre périphérique
II.4.1 Présentation du bloc gestion des registres (Register File)
Ce bloc est primordial dans la conception de notre driver matériel entre le processeur NiosII et notre bras manipulateur. En effet, c’est lui qui fait le lien entre le processeur via le bus Avalon et nos autres blocs VHDL.
Ses ports d’entrées doivent obligatoirement comporter certains signaux (resetn, clk, chip_select, address, writep, write_data, readp, read_data). Grâce à ces derniers, ce bloc va pouvoir stocker dans un de ses 9 registres des valeurs transmises par le processeur Nios II ou bien lui en envoyer.
Ces 9 registres sont :
· clock_divide
· duty_cycle
· enable
· pa
· startpom
· finpom
· moteur
· nb_pas
· sens
Ils sont connectés aux entrées/sorties des mêmes noms explicités ci dessous :
Explication du rôle des différentes entrées/sorties et signaux de ce bloc :
Entrées :
- clk: horloge servant à cadencer les processus séquentiels.
- resetn : reset asynchrone et synchrone des processus.
- chip_select : Permet au bloc de savoir si le processeur s’adresse à lui via le bus avalon.
- address : Permet de s’adresser à un registre précis.
- writep : indique si le processeur souhaite écrire dans un registre.
- write_data : bus sur lequel se trouve une information à enregistrer dans un registre.
- readp : indique si le processeur souhaite lire dans un registre.
- robot_nb_pas : valeur provenant du décompteur indiquant le nombre de pas restant à faire.
- robot_pa : Indique si un pas à été fait.
Sorties :
- read_data : bus sur lequel se trouve une information destinée à être lu par le processeur.
- robot_clock_divide : Valeur destinée au bloc production d’horloge indiquant le nombre total de coup de clock pour une période de la nouvelle clock
- robot_duty_cycle: Valeur destinée au bloc production d’horloge indiquant le nombre de coup de clock pour le temps haut de la nouvelle clock.
- robot_enable : signal envoyé indirectement au bloc "production de pas" pour autoriser l’éxecution des pas
- robot_startpom : signal envoyé vers le bloc POM pour déclencher une mise en POM
- robot_finpom : Indique si la POM est en cours.
- robot_moteur : Numéro de moteur envoyé indirectement vers le bloc "production de pas".
- robot_nb_pas_entree_tristate : nombre de pas souhaité envoyé indirectement via les tristates et un registre vers le décompteur.
- robot_nb_pas_rw : Signal envoyé aux tristates et au registre indiquant si la valeur initiale du nombre de pas à faire est écrite par le processeur dans le registre nb_pas_register.
Signaux :
- valid_write : signal servant à déterminer si l’on doit écrire dans un des registre de notre périphérique.
- valid_write : signal servant à déterminer si l’on doit lire dans un des registre de notre périphérique.
- xxx_reg_selected : signal servant déterminer quel registre est sélectionné.
- write_to_xxx : signal servant déterminer si l’on doit écrire dans le registre xxx.
- read_to_xxx : signal servant déterminer si l’on doit lire dans le registre xxx.
II.4.2 Présentation du bloc production d’horloge
Ce bloc se compose d'une horloge d'entrée (clk), d'un signal de sortie (pwm_out), d'un bit d’enable, d'un compteur modulo-N de 32 bits, et d'un circuit de comparateur de 32 bits.
La clock commande le compteur modulo n de 32 bits pour établir la période du signal de pwm_out.
Le comparateur compare la valeur courante du modulo n à la valeur du duty_cycle pour déterminer la sortie du pwm_out. Quand la valeur de compteur est inférieure ou égal à la valeur de du duty_cycle, le pwm_out prend la valeur 0 logique ; autrement, il prend la valeur 1 logique.

Grâce à ce bloc nous allons pouvoir modifier la vitesse de déplacement du robot en temps réel. En effet les valeurs du duty_cycle et du clock_divide sont enregistrées dans deux registres modifiables par le processeur.
Pour duty_cycle=1 et clock_divide=10000, avec une fréquence d’horloge de 50Mhz (valeur attribuée dans SOPC builder) la vitesse du robot est maximum.
II.4.3 Présentation du bloc production de pas
Ce bloc permet de produire des pas sous forme de signaux de 8 bits. Il est aussi bien utilisé par le bloc gestion des registres que par le bloc POM.
Pour faire un pas, il faut suivre un protocole en six étapes :
-l'envoi d'un mot de sens :
Le mot de sens est composé de "10" puis le sens dans lequel chaque moteur doit tourner. Pour garder une cohérence et que l'appui sur le bouton 3 (sens = 1) et 4 (sens = 0) se fasse dans le bon sens, le mot de sens est "10110100" pour un appui sur bouton 4 (sens =0) et "10001011" pour un appui sur bouton 3 (sens =1).
-l'envoi de la confirmation du mot de sens :
La confirmation du mot de sens est similaire au mot de sens sauf pour les bits 6 et 7. La confirmation d'un mot de sens est composée de "00" puis le sens des moteurs.
-l'envoi d'une trame vide :
La trame vide est une trame composée uniquement de 0.
-l'envoi d'un mot d'adresse moteur :
Le mot d'adresse est composé de "01000" suivi du numéro du moteur moins un. Par exemple, pour le moteur numéro quatre: "01000011"
-l'envoi de la confirmation de l'adresse moteur :
La confirmation du mot d'adresse est composée de "0000" suivi de la même chose que le mot précédent.
-l'envoi d'une trame vide.
Tableau d’adressage des moteurs :
|
N° |
Moteur Correspondant |
D2 |
D1 |
D0 |
|
1 |
Base |
0 |
0 |
0 |
|
2 |
Epaule |
0 |
0 |
1 |
|
3 |
Coude |
0 |
1 |
0 |
|
4 |
Poignet |
0 |
1 |
1 |
|
5 |
Rotation Pince |
1 |
0 |
0 |
|
6 |
Ouverture Fermeture Pince |
1 |
0 |
1 |
Mot d’adressage :
|
En tête |
Non significatif |
Adresse Moteur |
|||||
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Les bits d’en-tête permettent au robot de différencier les mots de sens, les trames vides et les mots d’adressage.
Explication du rôle des différentes entrées/sorties et signaux de ce bloc :
Entrées :
- SYNVIT: horloge servant à cadencer la machine à états, ainsi que les process séquentiels.
- rst : reset asynchrone de la machine à états, ainsi que des process séquentiels.
- aut : signal envoyé par le bloc gestion des registres ou par le bloc POM pour autoriser ou non l’exécution d’un. (aut à '1' autorise un pas)
- sens : signal envoyé par le "register file" ou par le bloc POM pour informer le bloc production de pas du sens dans lequel il doit faire le pas.
- adrmot : signal de 3 bits envoyé par le "register file" ou pas le bloc POM pour informer le bloc production de pas du moteur sur lequel exécuter un pas.
Sorties :
- D : sortie de 8 bits envoyés sur le robot et les pas peuvent être effectués.
- pa : signal envoyé au "register file", au bloc butées pour leur signifier qu'un pas a été effectué.
Signaux :
- état: signal servant à stocker l'état de la machine à états.
- sens_p : signal gardant le sens du pas précédemment effectué.
Explication des différents états de ce bloc :
Test carte (test_carte) :
Etat servant lors du démarrage de la carte tant qu'aucun pas n'a été fait. Le bit 0 de D est à '1' pour tester si le robot est bien présent et correctement alimenté. Une fois la première mise en POM commandée par le bloc POM, nous passons à l'état d'envoi du mot de sens.
Envoi du mot de sens (mot_sens) :
C'est l'étape où le mot de sens est envoyé au robot et où le sens est sauvegardé dans sens_p grâce à la mise à '1' du signal enable_r.
Confirmation du mot de sens (valid_sens) :
C'est l'étape où la confirmation du mot de sens est faite.
Trame vide (vide_sens) :
Conformément au protocole, une trame vide est envoyée.
Envoi du mot d'adresse (mot_adress) :
Le mot d'adresse est envoyé au robot. La sortie pa est mise à '1' pour signifier au bloc butées qu'un pas va être fait. C'est cette étape qui a été choisie pour signifier qu'un pas allait être fait car c'est l'étape obligatoire, chronologiquement la première.
Confirmation du mot d'adresse (valid_adress) :
La confirmation du mot d'adresse est envoyée au robot. La sortie pa est remise à '0'.
Trame vide (vide_adress) :
Conformément au protocole, une trame vide est envoyée. On reste sur cette étape tant qu'une nouvelle autorisation n'a pas été délivrée (enable à ‘1’). Si une autorisation est délivrée, on compare le sens au sens précèdent (sens et sens_p) et s'ils sont identique on passe directement au mot d'adresse, sinon on passe au mot de sens.

II.4.4 Présentation du bloc position d'origine machine ( POM )
Le but de ce bloc est de remettre les moteurs dans leur position d'origine. Cette action est nécessaire pour la gestion des butées, comme nous le verrons dans l'explication du bloc butées. L'utilisateur doit réaliser une mise POM après avoir connecté la carte au robot puis il peut animer les différents moteurs.
Des capteurs sont placés en face de disques qui tournent en même temps que les moteurs. Les disques sont divisés en deux par leur diamètre, un côté noir et un côté blanc, la transition montre la position d’origine du moteur. Les capteurs sont au nombre de six et sont interrogés via cap[0..2].
Explication du rôle des différentes entrées/sorties et signaux de ce bloc :
Entrées :
- clk : horloge servant à cadencer la machine à états, ainsi que les process séquentiels.
- rst : reset asynchrone de la machine à états, ainsi que des process séquentiels.
- startpom : signal envoyé par le "register_file" pour donner l'ordre de démarrer une mise en POM. Il sert à passer de l'état d'initialisation à l'état général ainsi que de l'état d'attente à l'état général.
- busy : signal servant à connaître la position du capteur sélectionné (coté blanc ou côté noir du disque)
- cap : signal de 3 bits servant à sélectionner un capteur ainsi que de transmettre au bloc production de pas le numéro de moteur à activer lors d'une mise en POM.
Sorties :
- aut : signal envoyé au bloc production de pas lors d'une mise en POM pour autoriser l’exécution des pas.
- sens : signal envoyé au bloc production de pas lors d'une mise en POM pour définir le sens dans lequel le pas doit être fait.
- fin_pom : signal servant à déterminer si une mise en POM est en cours. Il sert de plus à commander un multiplexeur situé à l'entrée du bloc production de pas pour sélectionner les signaux d'autorisation, de sens et de numéro de moteur venant du bloc POM ou du bloc gestion des registres selon qu'une mise en POM est en cours ou non. Il sert enfin à réinitialiser les butées pour qu'une fois la mise en POM effectuée, les butées soient bien à 0.
Signaux :
- num_cap : sachant que les sorties ne peuvent être lues, num_cap est un signal connecté à cap.
- en_c : signal servant d'enable pour le process p3 qui sert à incrémenter le numéro de moteur.
- etat: signal qui sert à stocker l'état de la machine à états.
Explication des différents états de ce bloc :
Initialisation (init) :
Cet état ne sert que lors de l'allumage de la carte. Toutes les sorties sont à '0'. Cet état sert à signifier qu'aucune mise en POM n'a été faite.
Attente (attente) :
Cet état est un état d'attente d’une demande de mise en POM.
Général (general) :
Cet état intervient une fois qu'une mise en POM a été demandée (start_pom à '1'). fin_pom est à '0' pour commander le multiplexeur en entrée du bloc production de pas, pour signifier qu'une mise en POM est en cours et enfin pour réinitialiser les butées.
Autorisation horaire (aut_h) :
Cet état intervient si le capteur busy est à '0'. Le moteur sélectionné doit tourner dans le sens horaire et pour cela la sortie aut est mise à '1' pour autoriser le bloc production de pas à fonctionner. On reste dans cet état tant que le capteur busy reste à '0'. Dès que busy passe à '1' , cela signifie que le moteur sélectionné vient de passer en position d'origine, on passe soit à l'état d'incrémentation (incr) si il reste des moteurs à mettre en position d'origine (si num_cap est inférieur à 5) soit à l'état de réinitialisation du numéro du moteur (incr_r).
Autorisation trigonométrique (aut_t) :
Etat identique à l’autorisation horaire (aut_h) à l'exception que le capteur busy est initialement à '1' et passe à '0' lorsque le moteur sélectionné passe dans la position d'origine.
Incrémentation (incr) :
Lors de cet état le signal en_c est mis à '1' pour donner l'ordre au process du compteur modulo 6 (process p3) d'incrémenter le numéro du moteur sélectionné. Après cet état, on repasse à l'état général pour mettre en position d'origine le moteur suivant.
Incrémentation reset (incr_r) :
La seule différence avec l'état incrémentation (incr) est qu'après avoir incrémenté (en fait, on passe de 5 à 0 vu que le process p3 est un compteur modulo 6 et que l'état dans lequel nous somme ne peut être exécuté que lorsque le numéro de capteur est égal à 5) on passe à l'état d'attente. En effet, tous les moteurs sont en position d'origine, la mise en POM est terminée et l'on passe dans l'état d'attente pour attendre l'ordre d'une nouvelle mise en POM.

II.4.5 Présentation du bloc butées :
Le but de ce bloc est de ne pas abîmer les moteurs en les faisant rester dans le domaine de rotation prévu par le constructeur. Cinq des six moteurs du robot possèdent des valeurs limites à ne pas dépasser dans le sens horaire et dans le sens trigonométrique (tous les moteurs sauf celui de la pince, le cinquième).
Pour vérifier que le moteur sélectionné par l'utilisateur a le droit de tourner dans le sens voulu par ce dernier, on suit l'évolution du nombre de pas effectués par chaque moteur depuis la mise en position d'origine de ces derniers. Pour se faire, on dispose pour chaque moteur d'un incrémenteur-décrémenteur et de deux comparateurs.
Chaque fois qu'un pas est effectué, l'incrémenteur-décrémenteur incrémente ou décrémente le nombre de pas effectués par rapport au nombre de pas précédent en fonction du sens de rotation du moteur.
Chaque incrémenteur-décrémenteur est remis à zéro à la position d'origine machine et fournit aux deux comparateurs auxquels il est connecté sa valeur de sortie. Le comparateur limite basse compare cette valeur avec la limite basse du moteur, si la valeur fournie par l'incrémenteur-décrémenteur n'est pas égale à cette limite, il autorise le pas, sinon il l'interdit. Le comparateur limite haute fonctionne de manière analogue.
L'ensemble incrémenteur-décrémenteur, comparateur de chaque moteur est relié en entrée de l'incrémenteur-décrémenteur à démultiplexeur un vers cinq dont le but est de gérer les pas. Ce démultiplexeur reçoit en entrée l'information qu'un pas va être effectué et en fonction de l'adresse du moteur sélectionné, il transmet cet ordre à l'incrémenteur-décrémenteur du moteur correspondant. Il donne alors l'ordre aux autres incrémenteurs-décrémenteurs de ne pas rien faire en ne leur transmettant aucun pas à faire.
L'ensemble incrémenteur-décrémenteur, comparateur de chaque moteur est relié en sortie à un multiplexeur cinq groupes de deux vers un groupe de deux. En fonction de l'adresse du moteur sélectionné, ce multiplexeur copie les valeurs des autorisations limites haute et basse du moteur sélectionné vers ses sorties d'autorisation de butées haute et basse (aut_bute_basse & aut_bute_haute). Ce sont ces deux derniers signaux qui donnent ou non l'autorisation à un moteur de tourner ou non dans le sens souhaité par le biais du bloc gestion des butées.
Pour le cinquième moteur qui ne possède pas de butées, les autorisations de butées haute et basse sont toujours à '1' afin que les pas soient toujours autorisés.

II.4.6 Présentation du bloc décompteur
Ce bloc à pour but de décrémenter le nombre de pas souhaités par l’utilisateur à chaque fois qu’un pas est réalisé. Cette valeur est automatiquement enregistrée dans le registre "nb_pas" du "register_file".
La valeur initiale est chargée dans le décompteur lorsque la production de pas n’est pas active. Cette valeur initiale est placée dans le registre intermédiaire au moment de son écriture par le processeur dans le registre "nb_pas". Ainsi, une fois "nb_pas" nul, la demande de production de pas (registre "enable" du "register_file") est passée à 0 et l’état des tristates est inversé.
Ainsi, le contrôle du nombre de pas effectué se fait de façon matérielle.
| Auteur: Visiteur | Posté le 08/03/2010, 12:47:29 |
| Auteur: | Posté le 08/03/2010, 12:47:31 |
| Auteur: kbzkhdkrjy | Posté le 31/12/2009, 17:58:08 |
| Auteur: | Posté le 31/12/2009, 17:58:09 |
Copyright 2006 Quantique.net
Sites partenaires :Grille de sudoku, gratuit
Sudoku expert
Sudoku diabolique