Techniques numériques incontournables dans les produits électroniques
Raisons ?
Traitement en temps réel:
Comparaison des puissances de calcul
Multiplication et accumulation rapides
Question de contrôle: Calcul d'un filtre
Filtrage adaptatif : modification des coeficients (Context Sensitive)
DSP doivent faire rapidement:
Deux types de DSP:
Le choix dépend des contraintes d'application.
Le contraire est également possible, mais ne possède pas de réel cas concret.
Représentation avec module + signe
Réprésentation en complément vrai
MOVW DP,#VarA ; Load DP with page value containing VarA
ADD AL,@VarA ; Add memory location VarA to register AL
MOV @VarB,AL ; Store AL into memory location VarB
; VarA and VarB located in the same 64 word page location
MOVW DP,#VarC ; Location DP with page value containing VarC
ADD AL,@VarC ; Add memory location VarC to register AL
MOV @VarD,AL ; VarC and VarD located in the same 64 word page location
ADD AL,*-SP[5] ; Add 16 bits content from stack location -5 words from the top of stack to AL register
MOV *-SP[8],AL ; Store 16 bits AL register to stack location -8 words
ADDL ACC,*-SP[12] ; Store 32 bits ACC register to stack location -12 words
MOVL *-SP[34],ACC ; Add 32 bits content from ACC register to stack location -34 words
MOV *SP++,AL ; Push content of 16 bits AL register onto the top of stack
MOVL *SP++,P ; Push content of 32 bits P register on to the top of stack
ADD AL,*--SP ; Pop content from top of the stack and add to 16 bits AL register
MOVL ACC,*--SP ; Récupère un mot de 32 bits depuis le haut de la pile et le stock dans l'accumulateur
ADD DEST,SRC
La destination est avant la sourceCopie de Array1 vers Array2 avec une boucle :
MOVL XAR2,#Array1 ; Load XAR2 with start address of Array1
MOVL XAR3,#Array2 ; Load XAR3 with start address of Array2
MOV @AR0,#N-1 ; Load AR0 with loop count N
Loop: ; Etiquette Loop pour le jump
MOVL ACC,*XAR2++ ; Load ACC with location pointed to by XAR2, post-increment XAR2
MOVL *XAR3++,ACC ; Store ACC with location pointed to by XAR3, post-increment XAR3
BANZ Loop,AR0-- ; Loop until AR0 = 0, post-decrement AR0
++
dépend de la taille du mot
MOVL XAR2,#Array1+N*2
MOVL XAR3,#Array2+N*2
MOV @AR0,#N-1 ; @ facultatif
Loop:
MOVL ACC,*--XAR2
MOVL *--XAR3,ACC
BANZ Loop,AR0--
MOVW DP,#Array1Ptr ; Point to Array1 pointer location
; On récupère le pointeur de page qui pointe sur le tableau
MOVL XAR2,@Array1Ptr ; Load XAR2 with pointer to Array1
; On assigne XAR2 vers l'adresse du tableau Array1
MOVB XAR0,#16 ; AR0L = 16, AR0H = 0
MOVB XAR1,#68 ; AR1L = 68, AR1H = 0
MOVL ACC,*+XAR2[AR0] ; Swap content of location Array1[16] with Array1[68]
MOVL P,*+XAR2[AR1]
MOVL *+XAR2[AR1],ACC ; On échange les valeurs entre Array1[16] et Array1[68]
MOVL *+XAR2[AR0],P
Suffice B signifie qu'on travaille sur un octet (soit le poids fort, soit le poids faible)
XAR0,#16 << #16
pour décaler sur le poids fort
MOVW DP,#Array1Ptr
MOVL XAR2,Array1Ptr
MOVL ACC,*+XAR2[2]
MOVL P,*+XAR2[5]
MOVL *+XAR2[5],ACC
MOVL *+XAR2[2],P
On permute les valeurs des cases 2 et 5.
Calcul du filtre FIR
MOVW DP,#XPointer ; Récupération du pointer de page
MOVL XAR6,XPointer ; XAR6 pointe sur les données
MOVL XAR7,#C ; XAR7 pointe sur les coeficients (espace programme)
MOVL AR1,#N ; AR1 est le compteur (taille du tableau de données)
SPM -4 ; Set Shift Product Mode
ZAPPA ; Zero ACC,P,O,V,C (Mise à zero des registres et flags)
RPT N-1 ; Répète N fois l'instruction suivante
QMACL P,*AR6%++,*XAR7++ ; ACC = ACC + P >> 4
; P = ((*AR6%++)*(*XAR7++)) >> 32
ADDL ACC,P<<PM ; final accumulate
MOVL XPointer,ARG ; Stockage de XAR6 dans XPointer
MOVL SUM,ACC ; Stockage du résultat dans SUM
Horloge CPU : 100 MHz
Quartz : 8 MHz
struct ADCMAXCONV_BITS
{
uint16 MAX_CONV1: 4; // 3:0 Max number of conversions
uint16 MAX_CONV2: 3; // 6:4 Max number of conversions
uint16 rsvd1: 9; // 15:7 reserved
};
union ADCMAXCONV_REG
{
uint16 all;
struct ADCMAXCONV_BITS bit;
};
struct ADC_REGS
{
union ADCTRL1_REF ADCTRL1;
union ADCTRL2_REF ADCTRL2;
union ADCMAXCONV_REG ADCMAXCONV;
};
ADCregs.ADCMAXCONV.bit.MAX_CONV1 = 7;