Vous êtes sur la page 1sur 28

Chapitre 3: Virgule Fixe et Nombre signé

Sommaire
Nombre signé

Multiplication

Virgule Fixe

Multiplication Fractionnelle

Etude de cas
1
Nombre signé

8 4 2 1

0 0 1 1 0 0 1 1
23 22 21 20

00112 = 10 00112 = 3 10

2
Nombre signé
23 22 21 20 1010

1 0 1 0 1 0 1 0 ou
-23 22 21 20 - 610

00112 = 3 10 00112 = 3 10

10102 = 10 10102 = ? 10

-8 + 0 + 2 + 0 = - 6
◆ Signé (Complément à 2)
MSB bit de signe
3
Nombre signé

23 22 21 20
15 +7

-23 22 21 20
8 0

◆ Signé (Complément à 2)
MSB est négatif
0 -8
◆ Signé % au non signé
Même precision (plage de valeurs) Unsigned Signed
Signé est centré % à zero

4
Exemple d’utilisation ...
Analog Digital
positive rail
+ 5V +7

0 A/D 0 0

- 5V -8
negative rail
A/D Inputs Signed

6
Multiplication

x 2

1 2

Quel chiffre faut-il garder?


Comment résoudre ce problème?

T TO
Technical Training
Organization 7
Multiplication Fractionnelle
.6

x .2

.1 2

?
.1
 Combien de chiffre faut-il garder?
 Résultat admet même precision
que les entrées
T TO
Technical Training
Organization 8
Virgule Fixe

La position de la
virgure peut
0 1 1 0
changer
-23 22 21 20

Si on la déplace?

9
Virgule Fixe

0 1 1 0
1
-230 22-12 22-21 22-30

La virgule est la reference


de la pendération -1

de la puissance Fractions

10
Virgule Fixe
Analog Digital
positive rail
+ 5V 1 +7

0 A/D 0 0 0

- 5V -1 -8
negative rail
A/D Fractions Hex

11
Virgule Fixe : Examples

0 1 1 0
-20 2-1 2-2 2-3

01102 = 10

11102 = 10

12
Virgule Fixe : Examples

0 1 1 0 1 1 1 0
-20 2-1 2-2 2-3 -20 2-1 2-2 2-3

0 + 1/2 + 1/4 + 0 = 3/
4 - 1 + 1/2 + 1/4 + 0 = - 1/4
01102 = 3/4 10 01102 = 3/4 10

11102 = 10 11102 = -1/4 10

13
Valeur fractionnelle codée sur 16-bit (en Hexa)
~1 7FFFh

½ 4000h

0 0000
* 7FFFh
-½ C000h

–1 8000h
Fractions Hex

Example: coder la valeur 0.14 en base 10

value .short 0x7fff * 14/100


or value .short 0x11eb
14
Multiplication Fractionnelle
3/4 0110 3/4 0110
x -1/4 1110 x -1/4 1110
____ 0000
____ 0110
____ 0110
____ 1010
- 3/16 - 3/16 1110100
reg reg

15
Multiplication Fractionnelle
3/4 0110
x -1/4 1110
0000
0110
0110
1010
- 3/16 1110100 Extention du bit de
signe
reg 11110100

16
Multiplication Fractionnelle
3/4 0110
x -1/4 1110
0000 Quelle est la valeur à
0110 charger dans le registre?
0110
1010
- 3/16 1110100

reg 11110100

data
memory
17
Multiplication Fractionnelle
3/4 0110
x -1/4 1110
0000
0110
La valeur chargée en mémoire:
0110
1010
0110 Pourquoi?
- 3/16 1010100 La position de la virgule est
importante!
reg 11010100

data
memory 1 0 1 0
18
Multiplication Fractinnelle (notation de Q)
3/4 0.110 Utilisant la notion du format
x -1/4 1.110 de Q-format pour choisir la
position de la virgule.
0000
Pour cet exemple Q égale à:
0110
◆ entrées: Q3
0110
◆ résultat: Q6 (Q3 + Q3)
1010
- 3/16 1110100 ◆ sortie: Q3

reg 11.110100

data
memory 1.1 1 0
19
Multiplication Fractinnelle
(Exemple 16 bits)

Q15 s. x x x x x x x x x x x x x x x CPU
x Q15 s. y y y y y y y y y y y y y y y

Q30 s s. z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z

20
Resultat: Q30 → Store: Q15

Q15 s. x x x x x x x x x x x x x x x CPU
x Q15 s. y y y y y y y y y y y y y y y

Q30 s s. z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z

Q15 s. z z z z z z z z z z z z z z z
Data Memory

21
Multiplication Fractinnelle
(Exemple 16 bits)

Q15 s. x x x x x x x x x x x x x x x CPU
MPY A3,A4,A6
x Q15 s. y y y y y y y y y y y y y y y NOP

Q30 s s. z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z

Q15 s. z z z z z z z z z z z z z z z Store to
Data Memory
A6, ,A6
A6,*A7

22
Multiplication Fractinnelle
(Exemple de code)
Q15 s. x x x x x x x x x x x x x x x CPU
MPY A3,A4,A6
x Q15 s. y y y y y y y y y y y y y y y NOP

Q30 s s. z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z

Q15 s. z z z z z z z z z z z z z z z Store to
Data Memory
SHR A6,15,A6
STH A6,*A7

23
Multiplication Fractinnelle
(Saturation)
-1 x -1 = ?
La solution: 1 7FFF

+1
-1 x -1 = ____
0 0
◆ +1 n’est pas dans l’échelle
◆… et il n’y a pas de
valeur héxa pour -1 8000
réprésenter +1 Fractions Hex

Supposant que les valeurs sont sur 16-bit


24
Multiplication Fractinnelle
(-1 x -1 Solution)
◆ La solution est Saturer et Multiplier:
 SMPY
 SMPYH

◆ Dans un seul cycle, ces instructions:


 Multiply
 Shift left by 1-bit
 Saturate if sign bits are “01”
Results MPY(H) SMPY(H)
Positive Result 00.xxxxxx 0.xxxxxx
Negative Result 11.xxxxxx 1.xxxxxx
-1 x -1 Result 01.xxxxxx 0.111111
25
Multiplication Fractinnelle
(Exemple de code en C)
short x16, y16, z16;
int z32;

xxxx xxxx xxxx xxxx x16


* yyyy yyyy yyyy yyyy y16

32-bit
zzzz zzzz zzzz zzzz zzzz zzzz zzzz zzzz product
z16 = x16 * y16; Q0

26
Multiplication Fractinnelle
(Exemple de code en C)
short x16, y16, z16;
int z32;

sxxx xxxx xxxx xxxx x16


* syyy yyyy yyyy yyyy y16

32-bit
sszz zzzz zzzz zzzz zzzz zzzz zzzz zzzz product
z16 = x16 * y16; Q0

z32 = x16 * y16; Q30

z32 = (int)x16 * (int)y16; Q30

z16 = (short)((int)x16 * (int)y16)>>15; Q15

27
Multiplication Fractinnelle
(Exemple de code en C)
short x16, y16, z16;
int z32;
sxxx xxxx xxxx xxxx x16
* syyy yyyy yyyy yyyy y16

sszz zzzz zzzz zzzz zzzz zzzz zzzz zzzz 32-bit


product
z16 = x16 * y16; Q0

z32 = x16 * y16; Q30

z32 = (int)x16 * (int)y16; Q30

z16 = (short)((int)x16 * (int)y16)>>15; Q15

z16 = (short)(_mpy((int)x16, (int)y16))>>15); Q15

28
Multiplication Fractinnelle
(Exemple de code en C)
short x16, y16, z16;
int z32;

sxxx xxxx xxxx xxxx x16


* syyy yyyy yyyy yyyy y16

32-bit
szzz zzzz zzzz zzzz zzzz zzzz zzzz zzz0 product
z16 = x16 * y16; Q0

z32 = x16 * y16; Q30

z32 = (int)x16 * (int)y16; Q30

z16 = (short)((int)x16 * (int)y16)>>15; Q15

z16 = (short)(_mpy((int)x16, (int)y16))>>15); Q15

z16 = (short)(_smpy((int)x16, (int)y16))>>16); Q15

29

Vous aimerez peut-être aussi