Académique Documents
Professionnel Documents
Culture Documents
Projet
Algorithme de CORDIC
Automne 2002
1 INTRODUCTION
L’algorithme de CORDIC (COordinate Rotation Digital Computing) est une
méthode simple et efficace pour le calcul d’une gamme de fonctions complexes.
S’appuyant sur une technique décalage-addition et de rotation vectorielle,
l’algorithme calcul par approximation la plupart des fonctions basées sur la
trigonométrie. Beaucoup de calculatrices commerciales utilisent cet algorithme
pour résoudre des fonctions telles que sinus, cosinus, arctangente et racine carré.
Les systèmes de communication numériques l’utilisent également afin de produire
rapidement des conversions polaires-cartésiennes sur des signaux échantillonnés.
Comme la plupart des algorithmes performants l’efficacité de CORDIC repose sur
sa simplicité et sa flexibilité. Tel qu’il le sera démontré un peu plus loin, l’algorithme
se compose d’opérations mathématiques élémentaires qui, en plus d’offrir une
grande efficacité de calcul, simplifie énormément l’implantation sur des plates-
formes logicielles ou matérielles.
Le projet qui suit propose une brève expérience sur le design-flow complet de
l’implantation matérielle d‘un CORDIC. En plus de réaliser la modélisation VHDL
de l’algorithme vous devrez effectuer la synthèse et le placement et routage afin
d’obtenir le design d’un circuit intégré à toute fin pratique prêt pour la fabrique.
OBJECTIFS SPÉCIFIQUES
• Comprendre le fonctionnement de l’algorithme de CORDIC
• Développer des aptitudes avec les outils de SYNOPSYS afin de modéliser,
synthétiser et simuler l’algorithme.
• Comprendre chacune des étapes de placement et routage d’un modèle
VHDL.
2 Algorithme de CORDIC
y'
V'
ϕ
y
X
x' x
Figure 1. Rotation du vecteur V dans le plan cartésien
x’ = x cos(ϕ) - y sin(ϕ)
y’ = y cos(ϕ) + x sin(ϕ)
x’ = cos(ϕ) [ x - y tan(ϕ) ]
y’ = cos(ϕ) [ y + x tan(ϕ) ]
ai+1 = ai – di ⋅ tan-1(2-i )
où
di = ±1
L’indice di indique le sens de rotation de l’angle pour chaque itération. Cet indice
est déterminé à chaque itération selon le résultat d’une comparaison. Le mode
d’utilisation de l’indice sera expliquer un peu plus loin. Chaque vecteur itératif
Vi+1(xi+1, yi+1) sont représenté par
xi+1 = Ki [ xi - yi ⋅ di ⋅ 2-i ]
yi+1 = Ki [ yi + xi ⋅ di ⋅ 2-i ]
où
Pour une suite d’itération, les facteurs Ki peuvent être mis en évidence et donner
un produit de multiplication. Pour un nombre croissant d’itération le produit tend
vers la valeur de 0.6073. Ainsi le gain de l’algorithme de rotation est
d’approximativement 1.647. Le gain précis est fonction du nombre n d’itérations
que l’on peut exprimer par
An = ∏ ( 1 + 2-2i )1/2
n
xi+1 = xi - di ⋅ dyi
yi+1 = yi + di ⋅ dxi
ai+1 = ai – di ⋅ dai
où
dyi = yi ⋅ 2-i
dxi = xi ⋅ 2-i
dai = tan-1(2-i)
où
di = ±1
Mode rotation
Le mode rotation résout, simultanément, à partir d’un angle initial donné par
l’usager le sinus et le cosinus de ce dernier. On initialise respectivement les
if(a<0)
{
x += dy;
y -= dx;
a += da;
}
else
{
x -= dy;
y += dx;
a -= da;
}
}
Figure 2. Code en langage C de l’algorithme de CORDIC en mode rotation
i X Y A dx dy da
0 0.607253 0.000000 25.000000 0.607253 0.000000 45.000000
1 0.607253 0.607253 -20.000000 0.303626 0.303626 26.565051
2 0.910879 0.303626 6.565051 0.227720 0.075907 14.036243
3 0.834973 0.531346 -7.471192 0.104372 0.066418 7.125016
4 0.901391 0.426975 -0.346176 0.056337 0.026686 3.576334
5 0.928077 0.370638 3.230158 0.029002 0.011582 1.789911
6 0.916495 0.399640 1.440248 0.014320 0.006244 0.895174
7 0.910250 0.413960 0.545074 0.007111 0.003234 0.447614
8 0.907016 0.421072 0.097460 0.003543 0.001645 0.223811
9 0.905371 0.424615 -0.126351 0.001768 0.000829 0.111906
Mode vecteur
De façon antagoniste le mode vecteur résout simultanément, à partir des
coordonnées x et y données par l’usager, les fonctions atan(y/x) et An x 2 + y 2 . On
initialise respectivement les variables x0, y0 et a0 à x, y et 0. Cette fois l’angle
pivote jusqu’à ce la variable y atteigne 0 . Les valeurs xi et ai résultantes expriment
alors l’arctangente et la racine carrée. Notez que pour obtenir la valeur final de la
racine carrée, on doit diviser le résulta par An .Un test sur yi détermine pour chaque
itération le signe di . La figure suivante démontre le comportement en langage C de
l’algorithme. Nous avons choisi les valeurs x0 = 4, y0 = 4 et un nombre d’itérations
de 10. Le tableau suivant démontre, quant à lui, l’ensemble des valeurs calculées
par l’algorithme pour chaque itération.
if(y<0)
{
x -= dy;
y += dx;
a -= da;
}
else
{
x += dy;
y -= dx;
a += da;
}
}
I x y a dx dy da
0 4.000000 4.000000 0.000000 4.000000 4.000000 45.000000
1 8.000000 0.000000 45.000000 4.000000 0.000000 26.565051
2 8.000000 -4.000000 71.565051 2.000000 -1.000000 14.036243
3 9.000000 -2.000000 57.528808 1.125000 -0.250000 7.125016
4 9.250000 -0.875000 50.403791 0.578125 -0.054688 3.576334
5 9.304688 -0.296875 46.827457 0.290771 -0.009277 1.789911
6 9.313965 -0.006104 45.037546 0.145531 -0.000095 0.895174
7 9.314060 0.139427 44.142373 0.072766 0.001089 0.447614
8 9.315149 0.066661 44.589987 0.036387 0.000260 0.223811
9 9.315410 0.030274 44.813797 0.018194 0.000059 0.111906
2.3 Références
Vous trouverez sur le Web une grande quantité d’informations concernant
l’algorithme de CORDIC. « Google » (www.google.com) est un bon moteur de
recherche pour ce genre d’information. Si vous entrez CORDIC à l’invite de
recherche vous verrez apparaître des pages de sites internet portant sur
l’algorithme. En plus d’offrir une gamme d’articles sur le fonctionnement de
l’algorithme, le web contient énormément de renseignements sur l’implantation
matérielle de ce dernier qui vous aiderons à réaliser votre projet. Voici une
référence bibliographique que vous pouvez consulter :
http://www.andraka.com/files/crdcsrvy.pdf
3 Projet
Le projet consiste à réaliser la modélisation VHDL, la synthèse et le placement-
routage d’une structure itérative de l’algorithme de CORDIC. Afin de structurer et
de simplifier la réalisation du projet vous devez suivre les étapes décrites ci-
dessous. Assurez-vous d’inclure dans le rapport toutes les informations
demandées aux sections rapport et questions et de bien identifier chacune de
vos figures.
Avant de commencer la modélisation vous devez, dans votre répertoire principal,
exécuter la commande tar –xvf ~itge1/Place_et_Route/Projet_Cordic.tar. Cette
commande permet de configurer votre compte afin de pouvoir réaliser les étapes
de simulation post-synthèse et placement-routage. Comme vous le remarquerez,
différents répertoire seront créés. Il est impératif que vos codes VHDL soient
disposés dans le répertoire de travail /Porjet_Cordic/Synopsys.
Spécifications
• Le nombre d’itération maximal est de 15 ( 4 bits ).
• L’utilisation des angles en VHDL se fait en degrés.
• Les valeurs X et Y données par l’usager sont restreintes aux intervalles
suivants :
o X et Y∈ [ -15, 16]
• Afin d’alléger le travail des outils de synthèses, on vous suggère d’utiliser
une précision fractionnaire de 9 bits pour l’angle a et de 8 bits pour les
coordonnées x et y. Ainsi, les registres X et Y devraient avoir la dimension
suivante :
signe Partie entière Partie fractionnaire
Bien que les variables x et y sont toujours comprises en -15 et 16, il est
préférable de laisser un bit de partie entière afin de prévenir les cas
d’overflow. Le registre A devrait, quant à lui, avoir la forme suivante :
CLK
X Y
itération
N Comparateur LUT
VALIDE
Décrivez précisément les vecteurs tests utilisés dans votre banc d’essais.
3) Inclure dans le rapport les codes VHDL de tous vos modules ainsi que le test-
bench servant à la simulation final de votre modèle. Des points seront
attribuées à la présentation des codes VHDL.
Rapport et questions
1) Démontrez les résultats de simulation post-synthèse (représentation
HEXADECIMALE) en prenant soin de bien illustrez la notion de délai.
2) Trouvez la fréquence maximal de l’horloge de votre modèle. Pour ce faire, vous
devez établir à l’aide de design analyzer le délai maximal du module
élémentaire. Dans la barre de menu de design analyzer sélectionnez Attribute-
>Clock->Specify, et inscrivez 50 à la case « period ». Dans Analysis->Test
Report sélectionnez « Timing ». Cette manipulation donne le délai du chemin
critique d’un module. Votre fréquence d’horloge doit nécessairement tenir
compte de ce délai.
3) Faites une estimation du temps de calcul logiciel en vous basant sur les
exemples de codes exposés à la section 2.2. Pour ce faire considérez que
chaque opération arithmétiques nécessite, sur un processeur RISC standard,
approximativement 3 instructions assembleur ( load, add et store) alors que
chacune des opérations de contrôle (if et for) en nécessite 2 ( load et branch).
Si un processeur commercial de coût moyen offre un rendement de 1.5
instruction par cycle d’horloge et qu’il fonctionne à un régime de 200 Mhz,
estimez le délai pour le calcul des sinus-cosinus sachant qu’il nécessite 10
Rapport et questions
1) Exécutez successivement le placement et routage de votre design dans Pdp et
Silicon et imprimez le résultat final de chacun de ces outils.
2) Importez le design placé et routé dans IC Cadence et vérifiez les règles de
dessin (DRC). Imprimez le design final.
3) Pensez-vous que le circuit est, à ce stade, prêt pour la fabrique? Donnez une
brève discussion.
4) Si on cherche à réduire les coûts de développement et de production, tout en
maintenant une efficacité de calcul acceptable; Dites en quelques lignes, à
partir de votre expérience sur le design-flow, quelle plate-forme, logicielle ou
matérielle, conviendrait le mieux à votre implantation.
Nous souhaitons avoir vos commentaires sur les difficultés que vous avez
rencontrées durant la réalisation du projet. Nous sommes particulièrement
intéressés par les lacunes pouvant subsister dans la documentation.
Louis-Pierre Lafrance
Mathieu Renaud
4 Barême
1) Discussion et modélisation /4
2) Résultat de simulation /4
2) Délai maximal /1
2) Design final /1
Présentation (des points seront soustraits pour une mauvaise présentation) /-2
Total /20