Sale EPLD
 

 

 


Parental Advisory

 

La logique numérique est l’expression la plus aboutie de l’électronique, celle qui ouvre le vaste horizon du tout possible en épatant au passage sa grand-mère.

De plus c’est un excellent sujet palliatif au sempiternel affrontement  politique des repas familiaux du dimanche midi.

 

Hélas l’ayant déverminé sur un cobaye âgé de 3ans, j’ai le regret de vous informer que cette page ne s’adresse qu’à ceux ayant des notions (et + si affinités) avec l’électronique numérique appelé LOGIQUE ci-dessous

 

Le projet qui sert de support à cet exemple concret consiste en l’élaboration et la conception d’un dispositif qui permettra la mesure d’indice de liquide.

Cet appareil de mesure est appelé REFRACTOMETRE LASER.

Cette application est destinée à l’étude des fluides (Butane, propane, Number One, Jack Daniel’s…) lors du raffinage.

La R&D (Repos et Détente) a été menée à l’I.F.P. (Institut Français du Pétrole) en 1997.

 

Introduction

 

Ce projet est composée de deux études distinctes:

 

*   Interface carte P.C.

*   Elaboration de la partie logique.

 

I – Application industrielle

Le réfractomètre laser est un appareil de mesure qui est utilisé dans l’industrie pétrolière. Cet appareil sert à mesurer les indices de liquides en particulier lors du raffinage. La conception de cet appareil est le fruit d’un partenariat entre l’Institut Français du Pétrole et Normaland.

 

Le  principe de cet appareil est l’émission, à l’aide d’une diode laser, d’un faisceau lumineux qui traverse un liquide. Suivant l’indice du liquide, le déphasage et la période du signal vont évoluer. Le faisceau est récupéré par une photodiode, et le dispositif émet en sortie un signal sinusoïdal qui correspond au signal reçu comparé au signal émis. Un montage est ensuite chargé d’exploiter ce signal afin d’en mesurer le déphasage et la période. on peut décomposer le réfractomètre en trois parties distinctes:

 

 

 

 

 

 

 


1.   Le module comprenant la diode laser. Intégré dans un boîtier compact, on y retrouve la diode laser, la photodiode et le réservoir contenant le liquide à analyser.

2.   La diode laser nécessitant un signal d’entrée important (~2000 Volts), nous avons un dispositif de puissance comprenant notamment un transformateur.

La mise en forme en vue de l’exploitation du signal est un système analogique composé principalement d’un amplificateur et d’un comparateur.

3.   Le traitement de l’information est composé d’une logique numérique et d’un logiciel tournant sur P.C. chargée d’exploiter les résultats. De plus on y retrouve aussi le générateur de triangle pour attaquer la diode laser et un enregistreur pour visualiser le traitement des données effectuées par le logiciel.

 

La logique numérique comprenant la programmation de l’EPLD s’intéresse particulièrement à cette dernière partie; l’interface existante entre la carte et le CPU n’est pas adaptée à une production industrielle (design et obsolescence des composants).

 

 II - CAHIER DES CHARGES

 

            Nous devons élaborer une maquette d’une carte électronique qui comprend:

*   Un circuit logique qui permet la mesure d’un déphasage et d’une période en logique synchrone.

*   Une liaison carte-PC utilisant un bus ISA.

*   Un dispositif pouvant générer un signal triangulaire et l’écriture vers un enregistreur.

 

III - CONDUITE DU PROJET

 

            Le travail d’une durée de 3 mois se décompose en plusieurs parties:

*   Compréhension du système proposé:

o       Etude du réfractomètre existant.

o       Mode de fonctionnement.

o       Contraintes.

 

*   Elaboration du nouveau système:

o       Etude du BUS ISA.

o       Elaboration de la logique.

o       Choix des composants.

 

*   Réalisation de la carte:

o       Programmation sous MAX + PLUS II.

o       WRAPPING des composants.

 

*   Tests.

A - ARCHITECTURE.

 

Dans ce chapitre, nous allons vous présenter le principe général du projet. Dans un premier temps, nous allons nous intéresser à la logique, ensuite à l’interface carte-PC et enfin à la génération des signaux pour l’enregistreur et la diode laser.

 

I. - Principe général de la logique.

 

Une fois le signal mis en forme à la sortie du comparateur, il faut en extraire son déphasage et sa période. Ensuite nous devons envoyer les données vers le CPU. Celui ci va renvoyer des informations vers l’enregistreur. La logique doit gérer tous ces paramètres. Pour cela nous disposons :

*   d’un oscillateur de 3.072mhz.

*   de la sortie du comparateur.

*   d’un signal indiquant si le signal est valide.

I.1 - Organisation temporelle.

 

Ayant un défaut dans la partie amplification de puissance du signal (signal bruité) vers la diode laser et de plus la phase de transfert entre la carte et le CPU étant assez longue; on détermine une fenêtre de mesure dans laquelle le signal est valide où l’on calcule les données et une fenêtre où elles sont verrouillées pour avoir des résultats stables et corrects. Cette acquisition se fait toutes les demi-périodes du signal triangle émis vers la diode laser, soit tous les 3kHz (333µs). La phase de verrouillage est fixée à 20µs, durée du défaut du transformateur.

Figure 1:

O µs

 

333 µs

 
 

 

 

 

 


I.2 - Mesure du retard.

 

La mesure du retard (déphasage) se fait entre le début de la fenêtre de mesure et le premier front descendant afin de se caler sur le signal émis.

Pour quantifier cette mesure, nous allons compter à une fréquence de 3.072mhz pendant ce laps de temps. Le résultat de ce comptage sera traité par le logiciel. Nous aurons aussi besoin d’une détection de front descendant du signal sortant du comparateur.

I.3 - Mesure de la période.

 

La mesure de la période se fait entre le premier front dans la fenêtre de mesure et son front similaire.

Pour quantifier cette mesure nous utilisons le même procédé de comptage. nous avons besoin d’une détection de fronts montants et descendants et aussi d’un compteur de fronts. Le comptage aura lieu entre le premier et le troisième front dans la fenêtre de mesure et le résultat sera traité par le logiciel.

I.4 - Protections

 

Afin de nous assurer que nous avons une mesure correcte, nous mettons en place un système anti-rebond sur le signal sortant du comparateur afin d’éliminer toutes les perturbations. Seuls seront pris en compte les signaux ayant une certaine durée.

Il est évident que ce système n’est valable que pour une certaine plage de fréquence, la fenêtre de mesure étant fixe. Toutes les mesures sont arrêtées à la fin de la fenêtre de comptage en cas de signaux ayant une fréquence trop petite. De plus nous comptons le nombre de fronts à l’intérieur de la fenêtre de mesure afin de repérer les fréquences trop grandes.

 

II. - LIAISON CARTE - CPU

 

Pour des questions d’intégration de la carte et de coût, il est demandé de remplacer la liaison parallèle existante par un bus ISA.

II.1 - Présentation bus ISA

 

Nous allons utiliser pour la liaison carte-PC, un bus ISA (Industry standard Architecture) 16 bits. Ce bus est utilisé dans la plupart des ordinateurs de type P.C. Il fonctionne à la vitesse de 8 Mhz. Bien que dépassé technologiquement, ce bus est encore très utilisé pour les liaisons avec des cartes lentes. Le bus ISA est organisé en 7 catégories :

 

*   16 lignes de données.

*   24 lignes d’adresses.

*   contrôle cycle. Trois cycles sont possibles. Le cycle standard (durée fixe), ready (le cycle s’arrête quand la commande est inactive) et le cycle NOWS (NO Wait State, on réduit le nombre de cycle du processus).

*   contrôle bus. On y retrouve les signaux de commande Lecture et Ecriture.

*   15 niveaux d’interruption IRQ.

*   DMA (Direct Memory Access). Les données issues d’un périphérique sont directement canalisées dans la mémoire.

*   Alimentations: +12V, -12V, +5V, -5V, Masse.

 

Il existe deux modes d’utilisation de ce bus:

 

*   Accès I/O. Le CPU accède directement aux données sur la carte, seul les 10 premiers bits d’adresse sont décodés.

*   Accès mémoire. Le CPU dialogue avec les mémoires.

 

II.2 - Configuration retenue

 

Pour le projet, le CPU doit dialoguer avec la carte en lecture et en écriture. Les données à transmettre ayant une taille de 10 bits, seul l’accès I/O 16 bits nous intéresse. Nous allons donc maintenant nous attacher aux signaux que nous devons gérer pour avoir une liaison 16 bits.

 

Nous avons deux types de signaux à gérer. Les signaux de contrôle et les signaux de données. En ce qui concerne les signaux de contrôle, il faut gérer les signaux venant du CPU ou du DMA (Direct Memory Access) et répondre le type de transmission que la carte désire.

Les signaux de données à gérer:

 

NOM

PATTE

FONCTION

A[9..0]

A[22..31]

Bits d’adresses

D[15..0]

C[18..11]-A[2..9]

Bus de données Bidirectionnel.

IOR

B14

Commande en lecture par CPU, mode I/O. Actif à OV.

IOW

B13

Commande en écriture par CPU, mode I/O. Actif à OV.

SBHE

C1

CPU demande si transmission 16bits. Associé a A0. Si SBHE = OV et A0 = 0V => transmission 16 bits.

IOCS16

D2

Transmission 16 bits. La carte indique au CPU que l’on utilise la transmission 16 bits.

SRDY

B8

Transmission cycle accéléré (NO WAIT STATE). Généré par la carte.

RESET

B2

Signal RESET généré par le CPU. Actif à 1.

BCLK

B20

Horloge du bus. 8MHz.

AEN

A11

Bus utilisé par DMA. Si AEN = 0V => Libre.

IRQ

D[7..2]-B[4-25..21]

Demande d’interruption. Générée par la carte.

 

Sur le bus ISA, on trouve plusieurs types d’alimentations:

 

Type:

Patte:

+12V

B9

-12V

B7

+5V

B3, D16, B29

-5V

B5

Masse

B1 B10 B31 D18

 

Les autres signaux disponibles sur le bus ne sont pas pris en compte car ils concernent:

*   Cycle mémoire.MEMR, MEMW, MEMCS16, REFRESH..

*   DMA (direct Memory Access). DACK, DRQ

*   Signaux inintéressant dans notre cas. IOCHK, IOCHRDY, OSC.

II.3 - Adressage

 

La carte se situe à une certaine adresse de l’espace mémoire. Pour une transmission I/O 16 bits, le CPU :

*           ne décode que les 10 premiers bits d’adresses soit 1 kOctet utilisé sur 64 kOctet.

*           Le bit d’adresse A0 est toujours à l’état bas. En effet, un mot de 16 bits n’est jamais rangé à une adresse impaire. Pour autoriser une transmission 16 bits, A0 est associée avec le signal SBHE qui doit être actif. Nous désirons implanter la carte dans l’espace mémoire entre l’adresse h »300 » et « 318 » pour éviter un éventuel conflit de cartes.

 

II.4 - Interruption

 

Sur la carte, nous devons gérer les IRQ (Interrupt Request) du bus. Par ordre de priorité nous avons IRQ 9(2), 10, 11, 12, 14, 3, 4, 5, 6, 7. Les IRQ 0, 1, 2, 8 et 13 ne sont pas accessibles sur le bus.

 

III. GENERATION DES SIGNAUX ANALOGIQUES.

 

La logique a deux types de signaux analogiques à gérer. Elle doit d’abord créer un signal triangulaire de 1500Hz pour attaquer la diode laser. Nous allons utiliser pour cela un convertisseur numérique analogique (CNA ou DAC) pour lequel il faudra générer les bits d’incrémentation ou de décrémentation que l’on va inclure dans la partie logique. Cette gestion est indépendante de la sélection de la carte.

Ensuite nous devons sélectionner, pour l’écriture des données venant du logiciel vers l’enregistreur, deux autres CNA. Cette sélection répond à une demande du CPU, elle est donc réalisée lors de l’adressage de la carte

 

IV. FONCTIONNEMENT GLOBAL

 

Figure 2:

 

Lecture:

 

 

 

 


Ecriture:

 

 

 


B - LOGIQUE DU REFRACTOMETRE

 

Il est demandé de développer une logique synchrone qui réponde aux cahiers des charges. Dans le but de simplifier la mise en oeuvre de la logique du réfractomètre, nous allons utiliser un EPLD (Logique Device) de la société ALTERA qui se programme sous MAX + PLUS II.

 

La logique du réfractomètre est décomposée en quatre blocs distincts:

*   Générateur de moment.

*   Mise en forme des signaux.

*   Comptage et verrouillage des données.

*   Dialogue et transfert avec le bus ISA.

 

Différentes hypothèses ont été envisagées, néanmoins nous ne reprendrons dans ce chapitre que les solutions retenues.

I - Présentation du circuit logique programmable

 

            Dans le cas de système nécessitant l’utilisation d’un nombre important de portes logiques, il est judicieux d’utiliser un circuit logique programmable qui limite le nombre de composants tout en offrant une grande souplesse d’utilisation.

I.1 - E.P.L.D.

L’ EPLD (Erasable Programmable Logic Device) est un circuit logique programmable développé par la société ALTERA depuis 1984. Réalisé en technologie CMOS, il intègre plusieurs milliers de portes(10 000 pour la série 7000) et est effaçable électriquement. Dans le cadre du projet, nous utilisons la série 7000E. La société ALTERA commercialise un ensemble complet de développement que l’on installe sur un PC : MAX + PLUS II.

LES EPLD font appel à la notion de macro-cellule constituée :

1.   Signaux d’entrées dédiées.

2.   Signaux d’entrées/sorties.

3.   Signaux provenant d’autres macro-cellules, permettant l’interconnexion des macro-cellules.

4.   Bascule programmable.

figure 3:

structure d’une macro-cellule

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Les macro-cellules sont organisées dans l’EPLD en LAB. Nous avons 8 lab dans l’EPLD que nous utilisons. L’architecture est la suivante:

figure 4:

architecture d’un EPLD

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I.2 - MAX + PLUS II

 

Max + PLUS II est le logiciel de développement des EPLD. Il est composé de :

*   un éditeur de texte et de schéma pour entrer la fonction.

*   un compilateur qui permet de vérifier la conformité de la fonction et de choisir le type d’EPLD dans la famille sélectionnée (ici 7000E).

*   un simulateur du fichier compilé. Il est recommandé d’éditer un fichier vecteur (*.vec) afin de mieux commander la simulation.

 

Deux modes de programmation  sont possibles à partir de ce logiciel.

 

*   Mode graphique (extension .GDF). Les fonctions sont présentées comme un bloc prédéfini qu’il faut combiner entre eux à l’aide de liaisons. Sur MAX + PLUS II, on peut se servir de toutes les macrofonctions de type 74.

*   Mode texte (extension .TDF). Nous utilisons le langage A.H.D.L.(Altera Hardware Description Langage).Le mode texte est privilégié pour l’écriture des fonctions car il permet bien souvent une démarche simple (Par exemple un décodage d’adresse est écrit en une ligne).

 

Pour la programmation de notre circuit logique, nous avons combiné les deux modes ce qui a l’avantage d’une plus grande clarté. Ainsi la logique est décomposée en fonctions qui sont écrites en mode texte beaucoup plus souple en cas de modifications, et le mode graphique sera lui privilégié pour faire les liens entre ces différentes fonctions.

 

I.2.a - Mode graphique.

 

Ce mode est simple à utiliser car visuel. Nous sélectionnons les blocs, que nous plaçons sur le schéma. Nous définissons ensuite les entrées / sorties et relions le-tout par des fils. Pour une meilleure clarté, nous rajoutons des commentaires et un cartouche.

I.2.b - Mode texte.

 

Ce mode est plus souple en utilisation, mais nécessite une plus grande rigueur quant à sa programmation. Un programme a une certaine organisation et est divisé en plusieurs sections :

 

SUBDESIGN suivi du nom de l’élément (identique au « nom .TDF »).

(

Définition des ENTREES / SORTIES du programme : INPUT, OUTPUT.

Leur ordre de déclaration détermine leur place sur le symbole 

)

 

VARIABLE

(

On y définit les variables locales du programme, en particulier les outils utilisés, par défaut les NOEUDS et les LCELL sont connectés à la masse.

Dans ce projet nous avons utilisé principalement:

Bascule D;

Bascule JK;

LCELL;

TRI-STATE;

Noeud;

)

Le programme lui-même encadré par BEGIN et END;

BEGIN

Toutes les instructions doivent se terminer par « ; ».

Le principe est de ne pas utiliser les primitives afin d’une plus grande clarté lors de la lecture du programme.

Pour une simplification du programme, il est recommandé de donner le même nom aux variables qu’aux outputs.

Rajouter le maximum de commentaires pour une compréhension rapide du programme.

END;

 

Les commentaires sont placés entre « % ». En annexe, vous trouverez le listing complet du programme.

 

I.2.c - Présentation des principaux opérateurs

Nous allons vous présenter les différents opérateurs que la logique du réfractomètre utilise.

1.   INPUT / OUTPUT

Déclarées sous la rubrique SUBDESIGN, elles représentent les connections physiques du bloc lors de la création du symbole.

 

2.   BASCULES

Déclarées dans la rubrique VARIABLE. Elles nécessitent une initialisation. Chaque Macro-cellule ne contenant qu’une seule bascule, il est souhaitable de limiter leur utilisation.

-bascule.clk                      =>       Horloge

-bascule.clrn                     =>       Mise à zéro, active à « 0 », par défaut à « 1 ».

-bascule.prn                     =>       Mise à un, active à « 0 », par défaut à « 1 ».

-bascule.ena                    =>       Enable

-bascule.d             =>       Entrée

-bascule.q ou bascule     =>       sortie

 

Nous utilisons deux types de bascules:

*BASCULE D : DFF et DFFE (Enable). Il s’agit de la bascule la plus utilisée, notamment pour programmer les compteurs.

*BASCULE JK. JKFF et JKFFE (Enable). Utilisé pour faire la combinaison de 2 signaux (ENA_LATCH). bascule.j et bascule.k pour les entrées.

 

3.   GLOBAL

Ce buffer indique un signal synchrone, il concerne les entrées dédiées. Nous l’utilisons pour l’horloge générale de 3.072mhz.

 

4.   LCELL

Ce buffer permet d’assigner une opération logique à une cellule. Très pratique quand un calcul est réutilisé plusieurs fois car il évite au système de recalculer la valeur d’une variable à chaque fois qu’elle est utilisée, mais elle a l’inconvénient de consommer une macro-cellule.

 

5.   TRI-STATE

La tri-state est commandée par un signal output-enable (.oe). Active, la sortie recopie l’entrée, sinon la sortie est en haute impédance. On utilise ce dispositif quand la carte doit envoyer des données sur le bus.

 

6.   NODE

Variable locale. A chaque fois que le noeud est utilisé, sa valeur est calculée. On l’utilise dans le cadre de petit calcul peu répétitif (voir LCELL). Si un noeud est égal à une sortie, il est préférable de lui donner le même nom.

 

7.   MACHINES D’ETAT

Nous utilisons une  machine a deux états dans le cas ou la sortie doit prendre une valeur ou garder son état précédent, comme pour le dispositif anti-rebond.

 

8.   BOUCLES

Dans le cas de multiples conditions, il vaut mieux privilégier CASE et WHEN que IF car elles génèrent moins de paramètres lors de la compilation.

 

9.   OPERATEURS LOGIQUES

On utilise les opérateurs logiques usuels:

            - ET     :           &

            - OU    :           #

            - XOR :           $

            - NON:            !

I.2.d - Assignation des pattes

 

Nous utilisons des EPLD de la série 7000E. Ces EPLD ont une géométrie de type PLCC appelé aussi « crabe ». A l’aide de l’éditeur FLOORPLAN de MAX + PLUS II nous pouvons assigner les Entrées / Sorties du crabe.

Néanmoins, il faut respecter l’encombrement des cellules car on a un nombre de macro-cellules limité dans un LAB mais aussi chaque E/S est connecté à un LAB précis. Les macro-cellules restantes sont libres ou utilisées pour les noeuds internes.

 

I.2.e - Démarche suivie.

 

Pour la programmation du circuit logique, la démarche suivante a été suivie:

1.   Ecriture de la fonction en mode texte.

2.   Compilation de la fonction.

3.   Simulation de la fonction.

4.   Création du symbole pour l’utilisation du mode texte en graphique.

5.   Schéma général en graphique en utilisant les symboles créés précédemment.

6.   Compilation et simulation du schéma général.

7.   Assignation des pattes de EPLD.

 

II - Logique du réfractomètre synchrone:

Nous mettons en oeuvre le principe retenu (voir architecture). Le système va respecter l’organisation suivante :

 

II.1 - MOMENT:

 

Ce module est chargé de générer différents signaux. Nous devons générer un signal triangulaire, à partir d’un CNA, sur la diode laser d’une fréquence de 1500Hz, indiquer au logiciel si nous sommes sur la rampe montante ou descendante de ce signal, générer les bits d’entrée pour le CNA et enfin générer le signal d’interruption.

En cas de RESET du système, nous réinitialisons le système donc les compteurs et les sorties sont mises à zéro.

II.1.a - fréquence 1500Hz

La fréquence la plus faible à générer est celle de 1500Hz (~666µs), pour le générateur de triangle. Pour obtenir cette fréquence, nous utilisons un compteur 11 bits appelé 1_5kHz cadencé à 3.072MHz/

3.072 Mhz / 1500Hz = 2048 = 211

 

Ce compteur nous servira de référence pour les autres signaux.

 

II.1.b - Début et Fin de mesure

Tous les 333µs (3kHz), nous devons effectuer une mesure de la période et du retard. Nous devons aussi laisser une plage de temps pour la transmission des données via le bus. Cette plage est fixée a 20µs et se situe à la fin de la fenêtre de comptage (voir cahier des charges). On considère qu’ entre 2 fronts montants d’horloge on a 0.33µs.

Figure 5:

deb_mesure

 

fin_mesure

 
 

 

 

 

 


DEB_MESURE = « 1 » pour 1_5kHz = 61 et 1_5kHz = 1085.

FIN_MESURE = « 1 » pour 1_5kHz = 1023 et 1_5kHz = 2047.

 

II.1.c - Interruption

A la fin de chaque mesure, les données sont envoyées vers le CPU. Nous créons un signal d’interruption INT paramétrable sur sa durée afin que ce signal soit suffisamment long pour être pris en compte par le CPU.

 

II.1.d - Compteur TRIANGLE

Le signal triangulaire qui attaque la diode laser est généré par un CNA de 12 bits d’entrée. Le CNA travaille à une fréquence de 375 KHz, nous divisons la fréquence d’horloge par 8. A chaque fois que le compteur compte 8, on incrémente le compteur du CNA (256 fronts sur 1500Hz). On désire une rampe montante sur [0µs..333µs], et une rampe descendante sur [333µs..666µs].

212 = 4096.=> 4096/128 = 32

Figure 6:

 

 

 

 

 


Pour avoir  un signal triangulaire, nous utilisons un pas de 31 pour éviter le retour à zéro au dernier comptage et décaler le comptage (maximum à 128) afin d’éviter un plat lors de la transition rampe montante / descendante (2 valeurs similaires). Pour éviter des problèmes lors de la mise en route, la remise à zéro de ce compteur s’effectue selon une valeur du compteur 15KhZ (fixée à 0).

 

1_5kHz [10..3]

CPT_TRIANGLE

0 =>   128

0 =>  3968

128 => 255

3968 => 31

 

II.1.e - 1500Hz -3000Hz

Nous devons indiquer au logiciel si nous sommes sur la rampe montante ou descendante du triangle:

*   1500Hz est à « 1 » sur la rampe montante.

*   1500Hz est à « 0 » sur la rampe descendante.

 

La sortie 3000HZ indique au logiciel la fréquence de 3kHz.

II.2 - SIGNAUX

Ce module est chargé de traiter le signal sortant du comparateur, il comprend :

*   Un dispositif anti-rebond pour éviter des signaux parasites.

*   Un procédé de détection des fronts montants et descendant.

*   Comptage du nombre de fronts.

*   Générateur des créneaux de comptage du retard et de la période.

 

Pour plus de clarté, nous avons scindé ce module en deux fonctions:

*   PRODIS : Protection de la mesure et disjonction des fronts.

*   FR_R_P : Comptage du nombre de fronts et créneaux de comptage.

II.2.a - Protection et séparation des fronts montants et descendant (Prodis)

Un dispositif anti-rebond (ar) est chargé de ne prendre en compte que les signaux qui ont une durée minimale (paramétrable par la constante FIN_TEST. Cette machine a deux états, soit elle recopie l’entrée (changement d’état), soit elle conserve son état précédent. C’est cette dernière spécificité qui nous a conduits à ce type de machine. Le changement d’état est conditionné par un compteur paramétrable qui est actif quand le comparateur à un état différent de l’état de la machine (OU EXCLUSIF).

Nous désirons repérer les fronts montants des fronts descendants du signal comparateur. Pour cela nous activons pendant un top d’horloge la sortie désirée. Le dispositif est en mode texte dans le programme.

Figure 7:

Front montant descendant:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ces deux systèmes dépendent seulement du signal sortant du comparateur.

 

II.2.b - Nombre de fronts, créneaux de retard et de période (FR_R_P)

 

Pour éviter des erreurs de mesure en particulier dans la mesure de période, il est intéressant de compter le nombre de fronts. Pour pouvoir le cas échéant mesurer un nombre de front important, nous avons décidé de mettre sur 3 bits cette mesure (jusqu’à 7 fronts).

 

La mesure du retard se fait du début de la fenêtre de mesure jusqu’au premier front descendant afin de caler la mesure sur le signal émis.

La mesure de la période se fait sur le premier front et le front suivant de même sens. On va donc activer ce signal entre le nombre de fronts = 1 et nombre de fronts = 3.

 

NOMBRE DE FRONTS

MESURE

3

CORRECTE

2

PERIODE FAUSSE

1 et moins

RETARD LITIGIEUX, PERIODE FAUSSE

3 et plus

CORRECTE MAIS FREQUENCE TROP GRANDE

 

En cas de RESET du système, les créneaux et le compteur de fronts sont mis à zéro.

II.3 - Comptage et verrouillage (CMPT_VER)

La remise à zéro des compteurs se fait sur deb_mesure et l’arrêt du comptage sur fin_mesure Ainsi il n’est pas nécessaire de verrouiller les données pendant la période de transfert.

Ce module est séparé en deux fonctions :

1.   CPT10E (compteur 10 bits enable).Pour indiquer la largeur d’un créneau de comptage, nous actionnons un compteur valable pendant le créneau. Nous comptons à la fréquence de 3.072Mhz (horloge globale). Etant donné que la fenêtre de mesure soit au maximum de 333µs, on utilise un compteur 10 bits.

2.   VER_AUTRE (verrouillage et mise en forme du bus autres).L’acquisition des données pouvant être longue (200µs), il est nécessaire de verrouiller les données à transmettre sur FIN_MESURE. Ensuite il s’agit de mettre en forme le bus autres, troisième paquet de données à envoyer sur le CPU. On place:

*          Nombre de fronts sur AUTRES [2..0].

*          Présence signal sur AUTRES 3.

*          1500Hz sur AUTRES 4.

*          3000Hz sur AUTRES 5.

 

II.4 - Transfert

La fonction de ce module est le dialogue entre la carte et le CPU afin de pouvoir transmettre ses données ou sélectionner le CNA voulu.

Le bus ISA dans le mode de transmission I/O ne décode que les 10 premières adresses, nous utilisons l’espace mémoire libre à partir de l’adresse H »300 ». Afin de d’avoir un plus grand choix d’adressage nous décidons d’implanter la carte à partir de l’adresse H »300 » à H »318 » paramétrable selon SELECT pour éviter un éventuel conflit avec une carte déjà existante. La variable CARTE est active quand la carte est sélectionnée.

Les données sont transmises dans le mode 16 bits. Ce mode nécessite de gérer les signaux de contrôle AEN et SBHE pour la sélection de la carte et IO16 et SRDY pour la transmission des données. une tri-state active à zéro assure l’interface avec le bus. Nous respectons le protocole du bus suivant:

Figure 8:

Chronogramme bus isa, entrées / sorties 16 bits.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Nous constatons que la lecture du signal IO16 se fait sur le deuxième front descendant après l’adressage de la carte. Nous décidons d’activer les signaux IO16 et SRDY quand:

*   La carte est sélectionnée.

*   Le signal de commande (IOR ou IOW) est valide.

 

Une fois l’adressage de la carte effectuée, nous devons sélectionner les ports avec

*   3 ports en lecture : retard, période, autres (nombre de fronts, présence signal et 1500Hz).

*   2 ports en écriture : /CNA1 et /CNA2 (actifs à zéro pour être compatible avec les CHIP SELECT du CNA).

 

La dernière opération est le multiplexage des données une fois le port sélectionné. Une tri-state est mise sur le bus de sortie pour assurer l’interfaçage avec ISA. Bien que nous ne transférions que 10 bits, nous avons décidé de câbler le bus de données en sortie sur 16 bits pour des modifications ultérieures.

 

II.5 - BILAN EPLD

Nous utilisons l’EPLD EPM7128ELC84-12 pour la logique appelée REF_FIN (refractomètre final):

*   Série 7000E.

*   128 Macro-cellules. 109 occupées.

*   Boîtier PLCC 84 broches.

*   Rapidité: 12ns (Moyenne).

20 entrées : AEN, SBHE, A[9..1], CLK3M, COMPARATEUR, IOR, IOW, RESET, PRES_SIGN, SELECT[2..0].

 

33 sorties : DAC_TRIANGLE[11..0], DATA[15..0], /ENA_CNA[2..1], INT, IO16, SRDY.

 

L’assignation des pattes a été faite de façon à avoir un wrapping clair. Les connections ont été faites en fonction du connecteur BUS ISA et au détriment de l’organisation interne de l’EPLD. Cette assignation pourra être maximisée plus tard.

Le signal RESET a été mis sur l’entrée dédiée de l’EPLD grâce au floorplan editor, malgré l’impossibilité de le mettre en GLOBAL dans le schéma (voir solutions non retenues).

II.6 - Solutions non retenues

 

Nous allons passer en revue les principaux principes qui n’ont pas été retenus.

 

Il a été envisagé de mettre le signal RESET en GLOBAL dans le schéma général, mais nous avons eu un conflit lors de la compilation car il commande une tri-state.

 

Dans le module moment, nous avons envisagé de remplacer les deux signaux deb_mesure et fin-mesure par un seul qui représente la fenêtre de mesure. Cette solution a été abandonnée car il aurait fallu synchroniser certains signaux sur le front montant ou descendant de ce signal (les remises à zéro des compteurs par exemple), en contradiction avec la logique synchrone.

 

Dans le module moment, le signal d’interruption pouvait être identifié à fin_mesure. Mais il risquait d’être trop bref et ne soit pas pris en compte par le CPU.

 

Dans le module signaux, nous avions la possibilité de compter la demi-période d’un signal en cas de période trop longue en sortie du comparateur. Mais le réfractomètre nécessite une grande précision et à une certaine plage de fonctionnement. Nous avons privilégié le comptage du nombre de fronts pour nous indiquer une éventuelle erreur de mesure.

 

Le verrouillage des données dans le module CMPT_VER, lors de la phase de transfert, en utilisant des bascules D est une solution coûteuse en terme de place dans l’EPLD. Ce verrouillage peut être abandonné si l’acquisition des données par le CPU est suffisamment rapide et tient dans la fenêtre de transfert. Cela dépend fortement du type de PC utilisé.

 

Dans le module transfert, nous avions la possibilité d’optimiser la transmission 16 bits en transférant le nombre de fronts avec le retard et les autres signaux avec la période. Ainsi nous n’avions plus que 2 ports en lecture et une transmission sur 13 bits. Mais étant donné que nous avons la place, il a été décidé d’abandonner cette idée pour une meilleure lisibilité au niveau du programme d’acquisition. Néanmoins les bits de données ont été wrappés afin de tester ultérieurement cette possibilité.

 

Dans le module transfert, on a eu la possibilité de générer les signaux de contrôle IO16 et SRDY par rapport au signal d’horloge du bus BCLK. Mais lors des essais on s’est aperçu que le chronogramme indicatif (Figure 8) n’est pas respecté.En effet, lors du cycle standard, les adresses arrivent trop tôt ou la commande trop tard et ces signaux ne sont pas pris tout le temps en compte. De plus il est possible que le signal BCLK soit instable.

 

III - Signaux analogiques

 

Nous avons besoin de générer 3 signaux analogiques. Nous utilisons pour cela un convertisseur numérique - analogique (CNA).

*   Pour générer le triangle, nous utilisons un DAC 12 bits le 667. Ce dispositif remplace le montage intégrateur précédent. Il convertit les bits venant de l’EPLD. Sa plage de sortie est -5V / +5V.

 

*   Pour l’enregistreur, nous utilisons le double DAC  7247. Les bits d’entrée proviennent du CPU et la sélection des convertisseurs s’effectuent à partir de l’EPLD. La plage de sortie de ce convertisseur est 0V - 10V, or l’enregistreur fonctionne en OV - 1V. sur les 2 sorties nous plaçons un diviseur de tension par 10 avec l’aide de 2 résistances ¼ W de valeurs 1kW et 10 kW afin d’avoir une impédance de sortie de 10kW.

C. WRAPPING ET TESTS DE LA CARTE

 

Une fois l’EPLD programmé, il faut tester le dispositif. Etant donné qu’il ne s’agit d’une maquette, on élabore pas de PCB. Les différents composants sont liés sur la carte de test par des fils qui sont wrappés. Cette solution n’est valable que pour tester le dispositif dans des conditions idéales.

            Parallèlement, la nomenclature des composants est mise en place. Il s’agit de mettre à jour la base de données à laquelle manque certains composants.

 

I - Découplage des alimentations

 

Durant cette étape nous devons nous assurer la correcte alimentation des composants, en particulier de l’EPLD et des CNA. L’alimentation générale de +5V, utilisée par l’EPLD et l’oscillateur de 3.072 Mhz, est découplée avec une capacité de 100µF.

L’EPLD, les CNA et les amplificateurs opérationnels sont des composants délicats. Il est nécessaire de découpler leurs alimentations avec des capacités de 47nF. De plus, il est souhaitable de ne pas câbler les masses de l’EPLD entre elles et de découpler chacune de ces alimentations.

 

II - Zones d’implantation des composants

 

L’implantation des composants sur la maquette peut être décomposée en 3 parties:

*   La zone de transfert comprend le connecteur ISA et la carte PC 104.

*   La zone numérique comprend l’EPLD, les CNA et les protections de ces circuits.

*   La zone analogique comprend la mise en forme du signal de sortie du phototransistor (amplification et comparaison) et l’amplification du signal triangulaire vers le transformateur. Cette partie n’a pas été détaillée dans ce rapport car il n’a pas été l’objet de notre projet.

 

III - Réalisation

 

La technique utilisée est celle du wrapping qui consiste à enrouler un fil dénudé autour de la patte d’un composant. Nous avons respecté certaines règles quand à son utilisation:

*   Les fils ne doivent pas être tendus afin de limiter le frottement sur des pattes d’autres composants avec le risque que le fil soit coupé.

*   Une patte est considérée comme wrappée si le fil en a au moins fait 4 tours.

*   Il est recommandé de fixer un support avec 2 points de soudure à ses extrémités (plus si le composant est plus gros) afin de pouvoir, le cas échéant  le retirer facilement.

 

Il a été décidé pour cette carte de souder un maximum de liaisons afin de limiter le nombre de fils, étant donné que nous considérons la partie analogique comme déjà testée sur la version antérieure du réfractomètre. Néanmoins cette solution n’est pas la plus judicieuse car elle permet une correction assez difficile en cas d’erreur ou de modification et une mise en oeuvre moins aisée.

 

Pour une plus grande clarté, nous avons utilisé des fils de couleurs différentes suivants les signaux.

*   ROUGE         : + 5 Volts.

*   NOIRE           : Masse (0 Volts).

*   VERT             : + 15 Volts.

*   BLEU             : - 15 Volts.

*   BLANC          : Autres liaisons.

 

Il est demandé d’utiliser le minimum de place pour l’implantation des composants.

Pour simplifier l’accès des signaux, il est préférable d’éloigner les circuits intégrés des barbus.

En l’état, le signal PRESENCE SIGNAL est mis à VCC (+5V).

 

IV - Tests

 

Il s’agit de la partie finale du projet. En premier lieu, après la vérification des connections, il faut vérifier le correct fonctionnement de la partie analogique. Ensuite nous testons l’EPLD afin de vérifier la véracité des solutions retenues par rapport au comportement réel du bus ISA. Un programme test est élaboré en ce sens.

 

Le premier constat est la présence de bruit sur la carte. Ceci est la conséquence directe du wrapping.

 

IV.1 - SIGNAL COMPARATEUR

 

La mise en oeuvre de ce module n’a pas posé de problèmes. L’amplification est réglable par le potentiomètre POT1. On entre un signal sinusoïdal de différentes amplitudes et nous constatons que nous avons en sortie un signal carré avec :

*   O Volts quand la sinusoïde est négative.

*   + 5 Volts quand la sinusoïde est positive.

 

IV.2 - LES CNA

 

Pas de problèmes majeurs de mise en route. Pour le DAC 667 qui génère le signal triangulaire nous avons constaté certains pics lors des passages à zéro. Cela est causé par un appel de courant important de la part du DAC car ces valeurs correspondent à une grande permutation des bits d’entrée. La solution est de placer 2 masses distinctes sur la carte: une pour la partie numérique, l’autre pour la partie analogique. Pour atténuer ces pics nous avons placé une capacité de haute précision qui a l’avantage de découpler et de lisser le signal de sortie. Il est nécessaire que ce signal soit le plus propre possible car il attaque l’amplificateur de puissance vers la diode laser. Nous pouvons régler l’amplitude de sortie avec le potentiomètre POT2.

 

Pour le double DAC 7247, nous avons constaté un problème avec le bit de poids fort. Après avoir envisagé une éventuelle saturation du DAC, nous nous sommes rendu compte que le bit 11 des données n’était pas valide sur la maquette d’essai.

 

IV.3 - LA LOGIQUE

 

Afin de tester la logique, nous réalisons un programme test (voir annexe) chargé de lire les données sur les ports. Ce programme devra faire l’acquisition des données sur la carte et les afficher. Cette acquisition se commandera par une interruption IRQ5.

 

Après avoir constaté le correct fonctionnement de chaque module testé séparément, nous avons entrepris de simuler un fonctionnement global du circuit. Nous avons alors constater un défaut causé par le circuit logique. En effet, lors d’un accès à la carte, la génération du triangle se dérègle. La cause est que le circuit a, à un moment donné qui est variable, trop de calcul à effectuer. Ce problème a été réglé par deux méthodes:

 

1.   La première a été de simplifier l’écriture des fonctions dans un but plus « électronique ». Ainsi le multiplexage des données, dans le module transfert, auparavant effectué avec des boucles IF a été modifié. De plus nous avons supprimé certaines conditions inutiles (la remise à zéro des bascules de verrouillage lors d’un RESET). Cette nouvelle philosophie doit permettre au compilateur de simplifier son travail (éviter de cascader des fonctions). Néanmoins il est à noter que cette modification n’entraine pas de réels changements.

 

2.   La deuxième est beaucoup plus efficace. Elle consiste à changer l’assignation des entrées / sorties sur le crabe. Nous avons vu que chaque patte est connectée à un LAB spécifique et que chaque LAB à une taille et une organisation donnée. La méthode consiste à limiter les liaisons entre chaque LAB. Il faut donc que l’on retrouve dans un LAB spécifique les équations qui permettent de générer une sortie se situant dans ce même LAB. Vu le peu de temps qui nous reste, nous avons décidé de lancer une compilation automatique au détriment de l’assignation des pattes. Cette modification a été très efficace et l’EPLD ne sature plus dans ces calculs, mais nécessite de reprendre le wrapping.

 

 

Programme test C (Turbo C sous DOS)

/*Programme acquisition de donnees refracto laser-Bus ISA*/

/*version finale*/

 

#include<stdlib.h>

#include<stdio.h>

#include<conio.h>

#include<dos.h>

 

/*definition des ports*/

#define ADR289 0x21                                            /* initialisation du 8259 en set/clear*/

                                                                       /*interruption DOS, bit masque 1=> disable specific IRQ*/

#define ADRCARTE 0x300                                              /* adresse variable suivant select*/

#define RETARD (ADRCARTE + 0)

#define PERIODE (ADRCARTE + 2)

#define AUTRES (ADRCARTE + 4)

#define CNA1 (ADRCARTE + 0)

#define CNA2 (ADRCARTE + 2)

 

#define MASK5 0xdf                                              /*masquage de l'interruption, demasque a 0, 1101 1111*/

 

#define MASK MASK5                                          /*choix du MASK*/

 

#define IRQ5 0x0d                                                  /*definition des adresses d'interruption*/

#define IRQ9 0x71

#define IRQ10 0x72

#define IRQ11 0x73

#define IRQ12 0x74

#define IRQ15 0x77

 

#define IRQ IRQ5                                                    /*choix du type d'interruption*/

 

 

void init59()

{

            old_IRQ = getvect(IRQ);

            setvect(IRQ,SPint);                          /*programme gestion de l'interruption*/

            outportb(0x21, inport(0x21)&MASK);                   /*masquage de l'interruption*/

}

 

void interrupt Spint()

{

            int d_retard, d_periode, d_nbr_fronts, d_pres_sig, d_1500hz, 3k = 0;

            int donnees = 333;                                       /*test envoie de donnees sur cna*/

            3k++;                                                 /*incrementation du compteur 3kHz*/

 

/*lecture des diff‚rents signaux*/

            d_retard = inportb(RETARD) & (0x3ff);                /*phase sur 10 bits*/

            d_periode = inportb(PERIODE) & (0x3ff);                       /*periode sur 10 bits*/

            d_nbre_fronts = inportb(AUTRES)&(0x07);                     /*nombre de fronts sur 3 bits*/

            d_pres_sig = inportb(AUTRES)&(0x08);             /*presence signal sur 1 bit*/

            d_1500Hz = inportb(AUTRES)&(0x10);               /*1500Hz sur 1 bit*/

 

/*ecriture des donnees traites vers les 2 CNA*/

            outportb(CNA1,donnees);

            outportb(CNA2,donnees);

            outportb(0x20,0x20);

}

 

void main()

{

            init 59();

            while(condition);                                                      /*a definir, boucle d'attente*/

            setvect(IRQ, old_IRQ);                                            /*reinitialisation de l'ancien IRQ*/

}