Vous êtes sur la page 1sur 12

ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

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.

La prochaine section de ce document expose une brève description sur le


fonctionnement de l’algorithme. Vous y trouverez tous les éléments nécessaires à
une bonne compréhension de l’algorithme. Afin de vous aider à structurer la
réalisation du projet, nous vous avons décris, à la section 3, chacune des étapes
de la démarche à suivre. Vous y trouverez toutes les indications, spécifications et
références nécessaires pour le laboratoire.

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.

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 1/1


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

2 Algorithme de CORDIC

2.1 Description de l’algorithme


La résolution de fonction telle que sinus ou cosinus par l’algorithme de CORDIC
s’appuie sur une méthode de rotation de vecteur dans le plan cartésien.
Supposons la rotation du vecteur V(x,y) d’un angle ϕ tel qu’illustré à la figure1.

y'

V'

ϕ
y

X
x' x
Figure 1. Rotation du vecteur V dans le plan cartésien

Les coordonnées du vecteur V’ sont exprimées selon les équations

x’ = x cos(ϕ) - y sin(ϕ)
y’ = y cos(ϕ) + x sin(ϕ)

que l’on peut réorganiser afin d’obtenir les relations suivantes :

x’ = cos(ϕ) [ x - y tan(ϕ) ]
y’ = cos(ϕ) [ y + x tan(ϕ) ]

Si on restreint l’angle de rotation à tan-1(± 2i ) où i = 0,1,2,3,…, on obtient alors ϕ


par une série de rotations élémentaires successives de l’ordre de

ai+1 = ai – di ⋅ tan-1(2-i )

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

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 2/2


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

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 ]

Ki = cos ( tan-1 2-i ) = ( 1 + 2 -2i )-1/2

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

Puisque pour un nombre relativement élevé d’itérations, le produit tend vers un


résultat constant, il nous est possible d’appliquer ce dernier plus loin dans
l’algorithme. Ainsi on obtient un ensemble d’équations simplifiées et effectives au
calcul des opérations mathématiques recherchées :

xi+1 = xi - di ⋅ dyi
yi+1 = yi + di ⋅ dxi
ai+1 = ai – di ⋅ dai

dyi = yi ⋅ 2-i
dxi = xi ⋅ 2-i
dai = tan-1(2-i)

di = ±1

Ces équations servent donc au calcul d’opérations. Le principe générale de


l’algorithme de COORDIC consiste à faire pivoter dans le sens approprié le
vecteur de rotation par un angle de plus en plus petit jusqu’à ce que l’angle a ou
les valeurs x et y, déterminés par l’usager, soient approximativement égales à 0.

2.2 Résolution d’ opérations mathématiques par CORDIC


Les trois équations précédentes permettent, selon leur mode d’utilisation, le calcul
des opérations mathématiques sinus, cosinus, racine carré et arctangente. Il
existe deux modes d’utilisation : rotation et vecteur.

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

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 3/3


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

variables x0, y0 et a0 à 0.6073, 0 et ϕ où ϕ est l’angle dont le sinus et le cosinus


sont recherchés. L’angle pivote jusqu’à ce qu’il ait atteint la valeur 0. Les valeurs xi
et yi résultantes expriment alors le sinus et le cosinus de l’angle. Un test à chaque
itération sur l’angle élémentaire ai détermine le signe di . La figure ci-dessous
illustre, en langage C, le comportement de l’algorithme. Notez que nous avons
choisi ici un angle de 25 degré et un nombre d’itération de 10. Vous trouverez au
tableau suivant l’ensemble des valeurs calculées par l’algorithme pour chaque
itération.

// Initialisation des variables


a = 25; // Angle initiale
x=0.607252951;
y=0;
d2=2; // Diviseur

for(i=0; i<=10; i++)


{
-i
d2/=2; // Multiple de 2
dx=x*d2;
dy=y*d2;
da=atan(d2);
da= 180*da/PI; // Pour une valeur en degré

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

Tableau 1. résultat des valeurs calculées par l’algorithme à chaque itération

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

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 4/4


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

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.

// Initialisation des variables


I = 0;
x = 4; // Coordonnée x initiale
y = 4; // Coordonnée y initiale
a = 0;
d2 = 2; // Diviseur

for(i=0; i<15; i++)


{
d2/= 2; // Multiple de 2-i
dx=x*d2;
dy=y*d2;
da=atan(d2);
da=180*da/PI; // Pour une valeur en degré

if(y<0)
{
x -= dy;
y += dx;
a -= da;
}
else
{
x += dy;
y -= dx;
a += da;
}
}

Figure 3. Code en langage C de l’algorithme de CORDIC en mode rotation

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 5/5


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

Tableau 2. résultat des valeurs calculées par l’algorithme à chaque itération

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

Le tableau 3 résume les modes d’utilisation et les solutions correspondantes.


L’algorithme de CORDIC peut également traiter d’autres types de fonctions telles
que les fonctions hyperboliques. Les lecteurs pourront trouver des références
intéressantes sur le sujet à la prochaine section. L’efficacité de l’algorithme tant sur
une plate forme logicielle que matérielle réside, d’une part, dans la simplicité des
opérations composant ce dernier. En matériel, les divisions par deux se traduisent
par un décalage de 1 bit sur la droite ( 0100 -> 0010 ) alors que les opérations tan-
1 -i
(2 ) peuvent être préalablement calculées et disposées en mémoire. Ainsi
l’algorithme se compose uniquement d’opérations élémentaires telles qu’additions,
décalages et comparaisons. Cet ensemble d’équations donne un algorithme
rapide et de faible complexité .

Tableau 3. Résumé des modes d’utilisations de l’algorithme de CORDIC

Fonction Méthode Variable x Variable y Variable a Test Réponse


Π( 1 + 2 )
-2i 1/2 Angle
Sin Rotation 0 a<0 y
voulu
-2i 1/2 Angle
Cos Rotation Π( 1 + 2 ) 0 a<0 x
Voulu
Atan (Y/X) Vecteur X Y 0 y<0 a
An X 2 +Y 2 Vecteur X Y 0 y<0 x⋅ An

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 6/6


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

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

Abruzzo, J., 1985; Applicability of CORDIC Algorithm to Arithmetic Processing,


CH2200-4/85/0000/0079IEEE
Considine, V., 1989; CORDIC Trigonometric Function Generator for DSP, CH2673-
2/89/0000-2381 IEEE
Cowan, C.F.N., and P.M. Grant, eds. 1985; Adaptive Filters, Prentice-Hall, Englewood
Cliffs New Jersey, 308 pages
Daggett, D.H., 1959; Decimal-Binary Conversions in CORDIC, IRE Transactions on
Electronic Computers, V. EC-8, No. 3, pp. 335 - 339
Yu Hen Hu, 1992; CORDIC Based VLSI Architectures for DSP 1053-5888/92/$3.00
IEEE
Jarvis, P., 1990; Implementing CORDIC Algorithms , Dr. Dobb's Journal, Oct
Volder, J.E., 1959; The CORDIC Trigonometric Computing Technique , IRE
Transactions on Electronic Computers, V. EC-8, No. 3, pp. 330-334
Zoran Corp., 1986; Magnitude and Phase Computation with the VSP-161, Zoran Corp
Technical Note, 12 pages

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 7/7


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

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.

3.1 Modélisation VHDL


Écrire un code VHDL, fonctionnel et synthétisable, de l’algorithme de CORDIC qui
réalise de façon itérative les fonctions arc tangente et racine carrée telle que
décrites à la section 2 (mode vecteur). Une architecture possible d’un CORDIC de
type itératif est illustrée à la figure 4. Le module Cordic reçoit en entrée les valeurs
X et Y à calculer, le signal <LOAD> ainsi que et le nombre N d’itérations. Le
module présente en sortie l’arc tangente et la racine carrée (les coordonnées x et
a) résultant ainsi qu’un signal <VALIDE>. Les signaux <LOAD> et <VALIDE>
indiquent respectivement l’arrivée d’un nouveau couple x et y et la validité des
résultats sortant. L’architecture du CORDIC se compose d’un module élémentaire,
d’un compteur, d’un comparateur et d’une LUT ( Look-Up Table). Le module
élémentaire exécute les opérations du CORDIC telles que décrit par le code C de
la figure 2. Le compteur et le comparateur assure le contrôle du nombre d’itération
à exécuter. La LUT agit comme ROM contenant les valeurs d’angles <da>. Pour
chaque itération i la valeur <da> correspond à tan-1(2-i ). Ces valeurs sont
préalablement calculée et insérée dans la LUT. La meilleur méthode pour
implanter cette LUT consiste à utiliser la fonction <case> qui retourne pour chaque
itération la bonne valeur de <da>. On vous suggère d’utiliser, pour chacun des
modules, un type de description comportementale. L’intégration des modules se
fait de façon structurelle. Notez qu’à la première itération (LOAD) la variable a est
initialisé à 0.
La description VHDL doit respecter les règles de codage pour la réutilisation. Vous
devez vous référer au document <design reuse> disponible sur le site Internet du
cours. Les règles à respecter sont marqué des symboles * et **. Votre modélisation
du CORDIC doit, également répondre aux spécifications décrites aux pages
suivantes. Vous pouvez consulter les références indiquées à la section précédente
pour plus d’information sur l’algorithme de CORDIC et son architecture matérielle.

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 8/8


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

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

1 bit 5 bit 8 bits

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 :

signe Partie entière Partie fractionnaire

1 bit 7 bit 9 bits


• Notez qu’en matériel les opérations de division par 2 sont traduites par des
décalages de 1 vers la droite.
• Le LOAD doit être synchrone alors que le RESET doit être asynchrone.
RESET
LOAD

CLK

X Y

CORDIC Atan (Y/X)


Compteur
élémentaire
An X 2 +Y 2
da

itération

N Comparateur LUT

VALIDE

Figure 4. Architecture itérative de l’algorithme de CORDIC


Rapport et questions

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 9/9


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

1) Donnez une brève discussion sur les méthodes utilisées et la configuration


matérielle choisie pour l’implantation de l’algorithme. Un dessin de l’architecture
représentant votre modèle VHDL doit soutenir votre discussion.
2) Illustrez les résultats de simulations fonctionnelles (avant synthèse)
(représentation HEXADECIMALE). Vos simulations doivent illustrer le
fonctionnement de l’ensemble de l’algorithme pour les vecteurs de tests
suivant :

Coordonnées (X, Y) Nombre d’itération


(4, 4) 7
(4, 4) 15
(3, 7) 9
(3, 7) 13

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.

3.2 Synthèse et simulation post-synthèse


Procédez à la synthèse ( et optimisation ) tel que décrit dans le guide de
laboratoire. À partir du résultat de synthèse extraire le code VHDL et faites les
simulations post-synthèse en utilisant les mêmes bancs d’essais que ceux
utilisés lors des simulations fonctionnelles. Avant de procéder à la simulation,
assurez-vous d’avoir bien configuré votre compte par la commande décrite au
début de la présente section.

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

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 10/10


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

itérations. En considérant que l’objectif recherché est uniquement l’efficacité de


calcul, décrivez brièvement quel méthode, logiciel ou matériel, est la plus
efficace.

3.3 Placement et routage


Faites le placement et routage de votre modélisation de l’algorithme en vous
référant au guide disponible sur le site internet du cours. Suivez attentivement
chacune des étapes décrites dans ce document.

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.

3.4 Autres directives


Vous devez remettre votre rapport le VENDREDI 6 décembre 2002 avant 15h00,
au local 6236. Chaque jour ouvrable de retard pour le rapport coûte 10%.

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

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 11/11


ELE4304 – Principe des Circuits Intégrés à Très Grande Échelle

4 Barême

Modélisation VHDL (9)

1) Discussion et modélisation /4

2) Résultat de simulation /4

3) Présentation des codes VHDL /1

Synthèse et simulation post-synthèse (6)

1) Simulation et mise en relief de la notion de délai /4

2) Délai maximal /1

3) Comparaison logiciel / matériel /1

Placement et routage (5)

1) Impression des résultats finaux de chaque outils /3

2) Design final /1

3) Réponses aux questions /1

Présentation (des points seront soustraits pour une mauvaise présentation) /-2

Total /20

Laboratoire 1 LANGAGE VHDL ET SYNTHÈSE NUMÉRIQUE 12/12

Vous aimerez peut-être aussi