Projet électronique FPGA #9 : Calcul de la factorielle de n: Implémentation sur carte FPGA

Projet FPGA Calcul de Factorielle n logarithme de factorielle - factorielle de 0

Objectifs du projet :

  • Savoir comment calculer la factorielle de 0 ?
  • Savoir comment maintenir les données en mémoire dans le bus de sortie ?
  • Savoir comment synchroniser les données à l’entrée ?
  • Savoir implémenter la fonction de saturation en VHDL
  • Implémentation sur carte du projet

Analyse de fonctionnement

Comment calculer la factorielle de 0 ?

Dans ce projet on va s’intéresser aux aspects pratiques du code VHDL illustrés dans le projet 7. Comme vous constatez dans le projet 7, la factorielle de 0 n’est pas implémentée ! Je m’en suis rendu compte durant les tests sur carte du composant. Souvent en électronique, on fait des allers-retours entre l’étape de développement et implémentation pour but d’obtenir un fonctionnement optimal. En pratique, c’est rare que notre code marche au premier coup 🙂

Revenant à notre question, une solution possible est de tester la valeur de la donnée à l’entrer : Si elle est nulle on remplace la valeur nulle par 1 et on maintient la valeur dans le cas contraire.

if D_in=b"00000" then
        D_in_tmp <= b"00001";
else
        D_in_tmp<= D_in;
end if;

La donnée dans le bus de sortie D_out dure un coup d’horloge, la sortie passe à 1 dans le prochain coup d’horloge. D’une autre façon, le résultat dans le bus de sortie D_out bascule entre ‘1’ et D_in! (voir image ci-dessous) Ce fonctionnement peut être indésirable si on cherche une donnée stable tant que la donnée à l’entrée reste inchangée. L’avantage du fonctionnement mémoire est d’assurer que la donnée soit lisible et acquise correctement par le composant en amant.

Projet FPGA Calcul de Factorielle n logarithme de factorielle - simulation 6

L’implémentation de la fonction mémoire peut être réalisée à l’instant de la détection du front montant du signal D_outReady, dalleur ce dernier passe à 1 au même temps que la donnée soit présente dans le bus de sortie.  L’approche consiste la mise à jour de la donnée de sortie uniquement durant le front montant du signal D_outReady.

Comme vous l’avez constaté, le bus de sortie est sur 123 bits pour une entrée sur 5 bits. Dans la partie implémentation on va s’intéresser uniquement par les 8 premiers bits du bus de sortie à cause de limitation de notre des LED dans notre kit de développement. Ce choix impose que la sortie D_out ne puisse prendre que des valeurs inférieures ou égales à 255 (1111 1111). D’une autre manière on ne peut calculer que les factorielles des valeurs suivantes : 0, 1, 2, 3 et 4. La factorielle de 6 != 720 >255. La fonction de saturation sera active pour des valeurs en entrée allant de 6 à 31. On a choisi 255 (FF) comme valeur de saturation. La figure ci-dessous illustre la fonction du transfert du composant menu de la fonction de saturation et le code Matlab correspondant:

Implémentation FPGA Calcul de Factorielle n logarithme de factorielle - saturation

Code matlab
clear all; close all; clc

% D_in
N=5;
D_in=0:2^N-1;

% D_out
D_out_tmp=factorial(D_in);
D_out=zeros(1,length(D_in));

for i=1:length(D_in)
    if D_out_tmp(i)>=255
        D_out(i)=255;
    else
        D_out(i)=D_out_tmp(i);
    end;
end

% Affichage
figure(1);
plot(D_in,D_out); grid on; hold on
xlim([D_in(1) D_in(end)]);
ylim([D_out(1) D_out(end)+10]);
xlabel('D_{in}(1..31)');
ylabel('D_{out}(1..255)');

Articles

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Anti-Robot *