mercredi 18 juillet 2007

Réalisation d'un transcodeur binaire-BCD 8 bit :

Afin d'exploiter pleinement les deux afficheurs 7-segments de la carte de développement FPGA, j'ai besoin d'un décodeur binaire-BCD 8 bit. Couplé à un convertisseur "BCD to 7seg" du type 74248, il me permettra d'afficher des nombres décimaux allant de 00 à 99 en utilisant les deux digits.

Dans un premier temps j'ai cherché bloc tout-fait mais la bibliothèque max-plus d'Altera n'offre que des convertisseurs acceptant des binaires sur 5 bit (par exemple le 74185).

L'idéal était donc de le créer mon propre bloc et l'ajouter dans le design. En BCD les 4 bits de poids faible codent les unitées etque les 4 bits de poids fort codent les unités. L'algorithme à suivre pour réaliser la conversion est donc assez simple :

- convertir le nombre binaire entrant en entier,
- faire la division euclidienne par 10,
- convertir le reste et le résultat en binaire sur 4 bits,
- sortir le résultat d'un coté et le reste de l'autre.

En fait pour simplifier le code VHDL du bloc, on va réaliser une table de comparaison à l'aide d'une structure du type "case" :

case (nb_binaire) is
when "00000000"=>
nb_BCD1 <= "0000"; nb_BCD2 <= "0000"; when "00000001"=>
nb_BCD1 <= "0001"; nb_BCD2 <= "0000";

.....

Le code est très répétitif il peut donc être généré en partie par Matlab à l'aide du script suivant :

FileID = fopen('transcodeur.vhdl','w');
x=0;
for i=0:100
resultat=floor(x./10);
reste=mod(x,10);
fprintf(FileID, 'when "%s"=> \n\t nb_BCD1 <= "%s"; \n',dec2bin(x,8), dec2bin(reste,4));
fprintf(FileID, '\t nb_BCD2 <= "%s"; \n\n',dec2bin(resultat,4));
x=x+1;
end

fclose(FileID);





Une fois le code généré on crée un nouveau bloc (.bsf) dans Quartus et on l'ajoute au design existant (ici le bloc transcodeur.vhdl est ajouté dans le bloc dédié à l'affichage).

Aucun commentaire: