Les FPGA actuels ont intégré des blocs DSP, les derniers FPGA ont même intégré des unités à virgule flottante conformes à la norme IEEE-754.
Il est possible de créer une entité / un module DSP à l'aide d'une interface graphique après avoir sélectionné les paramètres requis, puis l'instancier dans la conception.
Quand devons-nous effectuer une telle microgestion dans une conception de blocs DSP instantanés réels et quand devons-nous simplement entrer un opérateur '*' dans le code et laisser l'outil de synthèse gérer les détails de bas niveau? Ce qui est mieux?
Il existe de nombreux types d'algorithmes de multiplication en matière de multiplication binaire. Depuis que nous avons intégré des blocs DSP sur silicium et même des multiplicateurs à virgule flottante, cela signifie-t-il que tous ces algorithmes ne sont pas devenus obsolètes.
Réponses:
Je l'ai fait moi-même plusieurs fois.
Généralement, les outils de conception choisiront entre une implémentation de structure et une tranche DSP en fonction des paramètres de synthèse.
Par exemple, pour Xilinx ISE, dans les paramètres du processus de synthèse, Options HDL, il y a un paramètre "-use_dsp48" avec les options: Auto, AutoMax, Oui, Non. Comme vous pouvez l'imaginer, cela contrôle la force avec laquelle les outils essaient de placer Tranches DSP. J'ai eu une fois un problème où j'ai multiplié un entier par 3, ce qui a déduit une tranche DSP - sauf que je déduisais déjà manuellement chaque tranche DSP de la puce, donc le synthé a échoué! J'ai modifié le paramètre sur Non, car j'utilisais déjà chaque tranche dsp.
C'est probablement une bonne règle de base (je viens de me réconcilier): si votre conception est cadencée à moins de 50 MHz et que vous allez probablement utiliser moins de 50% des tranches DSP de la puce, utilisez simplement le *, + et - opérateurs. cela déduira les tranches DSP sans registre de pipeline. Cela limite vraiment la vitesse de pointe. (Je n'ai aucune idée de ce qui se passe lorsque vous utilisez la division)
Cependant, s'il semble que vous allez exécuter les tranches plus près de la vitesse maximale de la tranche DSP (333 MHz pour la vitesse normale Spartan 6). Si vous allez utiliser toutes les tranches, vous devez les déduire manuellement .
Dans ce cas, vous avez deux options.
Option 1: utilisez manuellement le modèle d'instanciation DSP brut. Option 2: utilisez un bloc IP de Xilinx Core Generator. (J'utiliserais cette option. En même temps, vous apprendrez tout sur la génération de base, ce qui vous aidera à l'avenir)
Avant d'effectuer l'une ou l'autre de ces opérations, lisez les deux premières pages du guide d'utilisation de la tranche DSP. Dans le cas du Spartan 6, (DSP48A1), ce serait le document Xilinx UG389: http://www.xilinx.com/support/documentation/user_guides/ug389.pdf
Considérez d'abord l'option Core Generator. Je crée généralement un projet de test dans Core Generator pour la partie avec laquelle je travaille, où je crée un certain nombre de blocs IP juste pour apprendre le système. Ensuite, lorsque je suis prêt à en ajouter un à ma conception dans ISE, je clique avec le bouton droit dans la hiérarchie de conception, je clique sur une nouvelle source et je sélectionne "IP (Générateur de base et assistant d'architecture)" afin de pouvoir modifier et régénérer le bloc directement de mon projet.
Dans Core gen, jetez un œil aux différents blocs IP parmi lesquels vous pouvez choisir - il y en a quelques dizaines, dont la plupart sont plutôt cool.
Le noyau multiplicateur est ce que vous devez regarder en premier. Consultez chaque page et cliquez sur le bouton de la fiche technique. Les parties importantes sont les largeurs de bits entières, les étages de pipeline (latence) et tous les signaux de contrôle. Cela produit le bloc le plus simple possible en supprimant tous les ports dont vous n'avez pas besoin.
Lorsque je construisais un filtre IIR d'ordre 5 par 3 l'année dernière, j'ai dû utiliser le modèle d'instanciation manuelle car je construisais une implémentation très personnalisée, avec 2 tranches DSP cadencées 4x plus rapidement que la fréquence d'échantillonnage. C'était une douleur totale.
la source
Si vous voulez simplement multiplier deux nombres et qu'ils conviennent au bloc DSP, l'
*
opérateur doit déduire un bloc DSP. Sinon, renvoyez l'outil de synthèse :)Cependant, pour tirer parti des combinaisons plus complexes de la fonctionnalité DSP, il faut souvent instancier directement le bloc et configurer ses paramètres. Exemples de choses qui peuvent ne pas bien correspondre par inférence (en utilisant le Xilinx DSP48E1 comme exemple):
Et surtout des combinaisons de ce qui précède.
Les outils de synthèse ne sont pas encore assez bons pour cartographier des combinaisons complètement arbitraires de logique et d'arithmétique aussi efficacement que vous pourriez l'espérer.
la source
S'il y a des blocs DSP présents, vous devez les utiliser si vous le pouvez, car ce sera plus efficace que d'utiliser des LUT pour faire la même chose. Sauf si vous n'avez pas besoin d'une multiplication haute performance, auquel cas vous devez implémenter, par exemple, un additionneur pipeliné et un registre à décalage pour économiser de l'espace.
Cependant, j'examinerais la possibilité d'inférer des blocs DSP avant d'entrer dans les outils GUI. Le manuel Xilinx XST contient des «recettes» HDL pour savoir comment instancier des blocs DSP avec du verilog / VHDL pur. Fondamentalement, si vous ajoutez suffisamment de registres avant et / ou après les multiplicateurs, XST utilisera un bloc DSP pour implémenter l'opération automatiquement. Vous pouvez vérifier dans les journaux de synthèse pour voir s'il infère correctement les blocs DSP. Je suppose qu'Altera a quelque chose de similaire.
Soit dit en passant, je réfléchissais à cela il y a quelques minutes car je travaille actuellement sur une implémentation de twers Mersenne qui utilise uniquement un multiplicateur pour la graine initiale. Ma mise en œuvre de la première passe ne respecte pas le calendrier, mais la fonctionnalité est correcte. XST a également mis l'opération de multiplication en blocs DSP, mais elle n'est pas optimisée, donc elle s'exécute environ deux fois moins vite que je le souhaiterais. Je vais probablement réimplémenter la multiplication à l'aide d'une technique de décalage et d'ajout qui prendra 32 fois plus de cycles d'horloge, mais ne nécessitera plus de multiplicateur matériel.
la source
Cela dépend de l'optimisation dont vous avez besoin et de la portée de votre conception. C'est un peu comme un logiciel, en optimisant en utilisant un peu d'assemblage ou en laissant le compilateur choisir les instructions. Vous pouvez également avoir des compromis taille / vitesse afin que vous ne puissiez pas vous permettre un multiplicateur combinatoire à double précision.
Je ne savais pas où se trouvaient les multiplicateurs FP câblés dans les FPGA.
Un véritable opérateur de multiplication conforme IEEE P754 adapté à un processeur implique plus qu'un grand multiplicateur: vous devez ajouter les exposants, décaler les dénormals, gérer les infinis et quelques drapeaux pour la plupart inutiles (inexact, sous-dépassement ...)
la source
J'ai lu ce document http://www2.warwick.ac.uk/fac/sci/eng/staff/saf/papers/fpl2014-ronak.pdf :
J'aimerais pouvoir trouver la source de leurs outils pour vérifier leurs résultats.
la source