# Autres langages > Autres langages > VHDL >  Utilisation d'un ADC

## Iradrille

Hello,

J'essaie de faire quelque chose de simple : lire les donnes que me fourni un ADC, et balancer les 8 bits de poids fort sur 8 leds pour voir si a marche (et par la suite, je trouverai un moyen de tracer le signal pour faire un oscilloscope).

Mais je suis un peu perdu. Ya quelque chose qui marche pas, et se sais pas vraiment comment debugguer a.

l'ADC en question : http://cds.linear.com/docs/en/datasheet/2308fb.pdf (500ksps / 8 canaux / 12 bits).

Pour la partie intressante de la doc :





Donc, une horloge de 40MHz, une mesure toutes les 2s (80 cycles).
Pour une mesure :
convst est  1 pendant les 2  3 premiers cycles (20  40 ns d'aprs la doc, 2/3 cycles donnent 25 / 37.5ns)
sck fait 12 cycles  partir de 1.6s (12 cycles  partir du 60me / 80)
on envoie les paramtres de la prochaine mesure via sdi durant les 6 premiers cycles de sck
on rcupre la mesure sur sdo pendant les 12 cycles de sck

Les paramtres pour les mesures sont "100010" ou "100000" : Single-ended / canal 0 / unipolar (faut donner un 1 ou 0 pour une mesure unipolaire ?) / le dernier bit est inutile, il n'est pas pris en compte avec un signal convst court.

Ce que j'ai fait :


Une horloge de 50MHz, un PLL pour transformer a en 40MHz.

clk_adc compte jusque 80 et gnre 5 signaux qui sont  1  certains moments prcis :
o_actconvst  1 de 0  3
o_actsck  1 de 60  72
o_actsdi  1 de 60  66
o_actsdo  1 de 60  72
o_sdocpy  1 de 72  73



```

```

(Il y  un retard d'un cycle, mais vu que le retard est le mme partout c'est pas gnant je pense.)

D'aprs une simulation a marche correctement (il se passe rien sur la priode non montre):


Filter copie simplement l'horloge si "i_filter" est  1.

```

```

Le manque de process m'inquite un peu vu que je rajoute un dlai sur le signal d'horloge (?). Est-ce un problme ?

Niveau simulation a semble bon aussi :


Send_data converti des donnes parallle -> srie pour les envoyer  l'ADC.

```

```


Galre  simuler car j'arrive pas  donner la forme que je veux aux signaux d'entres. Du coup j'utilise des horloges avec des frquences diffrentes.
 marche une fois sur deux sur la simulation  cause du fait que i_actconvst et i_actsdi puissent tre tout deux  1 sur la simulation, alors qu'ils ne peuvent normalement pas (ils sortent de clk_adc). Quand ils ne sont pas tous les deux  1, a marche.



Et enfin store_data fait l'inverse : lis les donnes de l'ADC (en srie) et les crit en parallle pour les leds.


```

```


Mme problme pour la simulation, i_actsdo et i_sdocpy ne peuvent normalement pas tre  1 tous les deux en mme temps.
o_data(0) contient le bit de poids fort, o_data(11) le bit de poids faible.



Au niveau de l'assignation des pins, je pense que c'est bon (grande image) : http://i.imgur.com/rIBVtNc.png

Dernier truc, concernant l'utilisation, pour le moment j'essaie simplement avec une pile pour voir si je retrouve bien 1.5 V (ou une mesure proche).



J'ai essay en mettant le - de la pile sur le pin 10, et le + sur le pin 2. Mais je suis vraiment pas sur de a.
Le +5V sur le pin 1 il est fourni ? Ou faut que je le fournisse ?
La masse commune (pin 10) c'est cense tre quoi exactement dans mon cas ? Masse de la carte ? Masse de la pile ?

Normalement avec tout a, les 8 leds m'affichent les 8 bits de poids fort de la mesure, avec led0 = MSB et led7 = LSB.
Avec rien de branch, les leds m'affichent 1111 1111 (1 = allum, je m'attendais au contraire, que tout soit teint oO).
Avec la pile j'ai 0000 1101. (Mesure unipolaire ou dipolaire ne change rien).

Ce qui me donnerait une mesure entre 208 et 223mV (ou entre 3.873 et 3.888V si une led allume veut dire 0) pour ma pile.

Bref ya videment quelque chose qui dconne, mais je sais pas o ni comment chercher  ::aie:: .
Par o je commence ?

----------


## Iradrille

Petit up,

J'ai trouv comment utiliser SignalTap pour dboguer. Je m'attendais vraiment pas  quelques chose d'aussi pouss. Bonne nouvelle donc. (En plus c'est simple  utiliser <3)



J'avais un dcalage d'un cycle au niveau de sdi / sdo (send_data / store_data qui provoquent ces dcalages). C'est corrig, ainsi que 2/3 autres petites modifications.

Mais a marche toujours pas  ::D: 
Maintenant les leds m'affichent toujours 1110 0001.

D'aprs SignalTap, les donnes sont bien envoyes sur sdi (et au bon moment) : "100010";
Je rcupre un rsultat via sdo : 1110 0001 0000; a correspond  l'tat des leds.

Mais cette valeur n'a pas de sens.

Une ide du problme ?

----------


## mith06

Bonjour,

Bravo pour ce post bien dtaill!

Voila comment je ferais.

Utilise la PLL pour gnrer un 80 Mhz  partir du 50Mhz.

Utilise ce 80 Mhz pour faire tourner une machine d'tat.
Pars du principe que l'horloge 40Mhz que tu doit gnrer n'est plus une horloge mais un signal comme un autre synchrone au 80 Mhz.
Tu verras que toute ton interface avec cet ADC tiendra dans une seule entit de moins de 300 Lignes.

Ecrit un model non synthtisable de ton ADC  partir de ce que tu as compris de la DOC. Pour valider ton interface dans un testBench.

Oublie les outils de design en schmatique. Utilise un langage fait pour : VHDL ou Verilog.

Bon courage.

----------


## Iradrille

> Pars du principe que l'horloge 40Mhz que tu doit gnrer n'est plus une horloge mais un signal comme un autre synchrone au 80 Mhz.


J'y ai pens au dbut, mais je pensais pas qu'il tait possible de gnrer une horloge de frquence suprieure.




> Oublie les outils de design en schmatique. Utilise un langage fait pour : VHDL ou Verilog.


Je trouvais a pratique justement : les entits dfinies en VHDL, et relies entre elles via un schma. C'est  viter ? Pour quelle raison ? a gnre du code dgueulasse ?

Merci pour ta rponse en tout cas, je teste a.

----------


## Iradrille

a marche !

J'en profite pour demander, Pour faire une machine  tat, j'ai vu 2 modles

```

```


Et

```

```


L'un est meilleurs que l'autre ? Quand utiliser l'un et l'autre ? (J'tais parti sur le premier, mais j'avais un soucis avec une boucle qui me faisais sortir d'un tat au bout d'un cycle au lieu de 6).

Mon code (assez crade je pense), si vous avez des conseils / commentaires, je prend : 

```

```

----------


## mith06

> via un schma. C'est  viter ? Pour quelle raison ? a gnre du code dgueulasse ?


Oui gnralement on vite, en tout cas cela aurait tendance  montrer que tu ne matrise pas ton sujet.




> L'un est meilleurs que l'autre ?


Oui le deuxime.




> Quand utiliser l'un et l'autre ?


Le premier JAMAIS!!!! ::massacre:: 
Les FPGA permettent de gnrer de la logique SYNCHRONE ( une horloge).
Mettre autre chose dans la liste de sensibilit qu'une horloge, rend le process asynchrone. Donc par dfinition antagoniste  l'utilisation des FPGA.
La seule exception  cette rgle est le RESET (qui sera donc asynchrone).




> Mon code (assez crade je pense)


pas vraiment, j'ai vu bien pire!!!!

----------


## Iradrille

Merci pour ces prcisions.  :;):

----------

