Jednostka mnożąco-sumującą EMAC (Enhanced Multiply ...

34
1 Jednostka mnożąco-sumującą EMAC (Enhanced Multiply-ACcumulate unit)

Transcript of Jednostka mnożąco-sumującą EMAC (Enhanced Multiply ...

1

Jednostka mnożąco-sumującą EMAC

(Enhanced Multiply-ACcumulate unit)

2

Moduł MAC (1)Moduł MAC (1)

Jednostka arytmetyczna przeznaczona do operacji wykorzystywanych podczas cyfrowej

obróbki sygnałów DSP (Digital Signal Processing).

Sygnały wejściowe

Sygnały wyjściowe

ADC DACProcesor DSP (MAC)

MCF 5250

3

Zastosowanie jednostki EMAC Zastosowanie jednostki EMAC

● Cyfrowe przetwarzanie sygnałów ● Transformaty:

– Fast Fourier transform FFT, – Discrete Cosine Transform (DCT), – Fast Hadamard Transform (FHT), – Discrete Hartley Transform (DHT), itd...

● Filtry cyfrowe:– Finite impulse response filter (FIR), – Infinite impulse response filter (IIR),– Kompresja obrazów, selektywne filtrowanie

sygnałów, sterowniki PID, itd...

4

Transformata DCTTransformata DCT

● DTC = rozszerzenie transformaty FFT z dodatkowym przetwarzaniem danych● Mnożenie macierzy,● Mnożenie i akumulacja wyników,

5

Moduł MAC (2)Moduł MAC (2)

Wykonywane operacje:● Szybkie mnożenie liczb ze

znakiem oraz bez znaku,● Operacje MAC (ze znakiem oraz

bez), liczby całkowite oraz ułamkowe,

● Dedykowane operacje na rejestrach oraz macierzach.

MAC: operacje 16-bitowe, pojedynczy 32-bitowy akumulator, trójstopniowy potok

EMAC: operacje 32-bitowe, cztery 48-bitowe akumulatory, czterostopniowy potok, liczby ułamkowe (Frac32)

6

Potok modułu EMAKPotok modułu EMAK

7

Rejestry modułu EMACRejestry modułu EMAC

MACSRACC0ACC1ACC2ACC3ACCext01ACCext23MASK

032 16 15

ACC0ACC1

ACC2ACC3

8

Rejestr statusowy MACSR (1)Rejestr statusowy MACSR (1)

PAVx – flaga przepełnienia, ustawiana podczas akumulacyjnego dodawania, czyszczona podczas kasowania flagi V, zapisu MACSR lub załadowania akumulatora,

OMC – przepełnienie (OMC=0) / nasycenie (OMC=1),

S/U – Operacje ze znakiem lub bez,F/I – Tryb pracy: całkowity (F/I=0), ułamkowy (F/I=1) -1...1-2-15 lub 1...1-2-31

R/T – Zaokrąglanie (R/T=1) / Obcinanie (R/T=0) (podczas kopiowania zawartości 48-bitowego akumulatora do rejestru danych),

N – ustawiana, gdy rezultat operacji jest ujemny (MULS, MULU – nie ustawiają flagi N)Z – ustawiana, gdy rezultat operacji zerowy (MULS, MULU – nie ustawiają flagi Z) V – ustawiana, gdy nastąpi przepełnienie podczas wykonywania operacji MAC, MSAC

(64 bit),EV – ustawiana, gdy nastąpi przepełnienie (32/40 bit) podczas wykonywania operacji

MAC, MSAC.

9

Rejestr statusowy MACSR (2)Rejestr statusowy MACSR (2)

10

Możliwe formaty danych (1)Możliwe formaty danych (1)

● Liczby ujemne (U2) – -2(N-1) ... 2(N-1) - 1● Liczby dodatnie – 0 ... 2(N-1) – 1● Liczby ułamkowe – -1 ... 1 – 2(-N+1)

0x8000.0000 = -10x7FFF.FFFF = 1 - 2-31

11

Możliwe formaty danych (2)Możliwe formaty danych (2)

12

Mnożenie liczb całkowitychMnożenie liczb całkowitych

13

Mnożenie liczb ułamkowychMnożenie liczb ułamkowych

14

Zapis i odtwarzanie Zapis i odtwarzanie stanu jednostki EMACstanu jednostki EMAC

EMAC_state_save:move.l %MACSR, %D7clr.l %D0move.l %D0, %MACSR | wyłącz zaokr.move.l %ACC0, %D0move.l %ACC1, %D1move.l %ACC2, %D2move.l %ACC3, %D3move.l %ACCEXT01, %D4move.l %ACCEXT23, %D5move.l %MASK, %D6movem.l #0x00FF, (%A7)

EMAC_state_restore:movem.l (%A7), #0x00FFmove.l #0, %MACSR | wyłącz zaokr.move.l %D0, %ACC0move.l %D1, %ACC1move.l %D2, %ACC2move.l %D3, %ACC3move.l %D4, %ACCEXT01move.l %D5, %ACCEXT23move.l %D6, %MASKmove.l %D7, %MACSR

15

Rejestr maski (1)Rejestr maski (1)

MASK

031 16 15

0xFFFF

MOVE.L %D0, %MASKMOVE.L #10, %MASK

16

Rejestr maski (2)Rejestr maski (2)

0x0..00

0x0..BF0x0..FF

MOVE.L #0x10.0000, %A0MOVE.L #0x00FF, %MASK

MAC.L %D2, %D0, (%A0)+&, %D2, ACC0

if <ea> = (An) oa = An & (0xFFFF, %MASK) if <ea> = (An)+ oa = (An+4) & (0xFFFF, %MASK) if <ea> = -(An) oa = (An-4) & (0xFFFF, %MASK) if <ea> = (d16,An) oa = (An+se_d16) & (0xFFFF, %MASK)

oa = (An+4) & (0xFFFF 00FF)

0x10.0000 & (0xFFFF 00FF) +40x10.0004 & (0xFFFF 00FF) +40x10.0008 & (0xFFFF 00FF) +4

...

...0x10.00FC & (0xFFFF 00FF) +40x10.0000 & (0xFFFF 00FF) +4

Dana 0

Dana n-1

17

Lista instrukcji jednostki EMACLista instrukcji jednostki EMAC

18

Multiply Accumulate Multiply Accumulate

mac.w %a0u, %d1l, %ACC0mac.l %d0, %a1, >>, %ACC2mac.w %a0u, %a1l, <<,%ACC3mac.l %d0, %d1, %ACC4 Error: syntax error -- statement `mac.w

%d0u,%d1l,<<,%ACC4' ignored

19

Multiply Accumulate with LoadMultiply Accumulate with Load

Tryby adresowania argumentu źródłowego (Word) <ea>y: (Ay), (Ay)+, -(Ay), (d16,Ay)

mac.w %d2u, %d0u, (%a0)+&, %d1, %ACC0 | D2u * D0u -> ACC0, (A0)=> D1, A0++

20

Multiply SubtractMultiply Subtract

21

Przykłady użycia MAC/MSACPrzykłady użycia MAC/MSACSample 0Sample 1

Sample n-1

Coefficient 0Coefficient 1

Coefficient n-1

Sample 0Sample 1

Sample n-1

Coefficient 0

Coefficient n-1Coefficient n-2

Sample n-2

A5

A6

A0movem.l (%a0), %d0-%d3

mac.w %d0u, %d0l, %ACC0mac.w %d1u, %d1l, %ACC0

movem.l (%a5), %d0-%d3movem.l (%a6), %a0-%a3

mac.w %d0l, %a0l, >>, %ACC2msac.w %d0u, %a0u, <<,%ACC3

mac.l %d0, %a1, %ACC1msac.l %d0, %a1, %ACC2

Coefficient 1

31 16 15 0

31 16 15 0

zwykłe 1 clk

zwykłe 3 clk

22

MOVE from ACCMOVE from ACC

23

MOVE from ACCext00..23MOVE from ACCext00..23

24

MOVE from MACSRMOVE from MACSR

25

MOVE from MASKMOVE from MASK

26

MOVE to ACCMOVE to ACC

27

MOVE MACSR to CCRMOVE MACSR to CCR

28

Przykłady instrukcji MOVEPrzykłady instrukcji MOVE

LOAD

move.l %D0, %ACC0move.l #100, %ACC3

move.l %D0, %ACCext23move.l #100, %ACCext23

move.l %D0, %MACSRmove.l #100, %MACSR

move.l %D0, %MASKmove.l #100, %MASK

STORE

move.l %ACC0, %D0move.l %ACC3, %ACC0

move.l %ACCext23, %D0 move.l %ACCext01, %D7

move.l %MACSR, %D0move.l %MACSR, %CCR

move.l %MASK, %D0move.l %MASK, %D7

movem.l (%A7),%D0-%D7/%A0-%A6 Transfer BURST 60 bajtów

29

Biblioteki DSPBiblioteki DSP

http://www.freescale.com/

30

Filtry cyfroweFiltry cyfrowe

Filtr o nieskończonej odpowiedzi impulsowej (IIR).Filtr o skończonej odpowiedzi impulsowej (FIR) => a(k) = 0.

Równanie opisujący przykładowy filtr FIR czwartego rzędu

31

DTMF (DTMF (dual-tone multi-frequencydual-tone multi-frequency) dekoder) dekoder

32

Normalizacja współczynników filtru Normalizacja współczynników filtru

| data sectionalign 104coeff: | 2x10+1 słów = 24 B

.long 0x011D.035D

.long 0xFD81.00E9

.long 0x01AE.FC61

.long 0x02BC.01F2

.long 0xF6DF.0FAA

.long 0x2AAF.0000

queue: | dane wejściowe 32 słowa na granicy 128 bajtów

DS.B 64

Obliczone wsp. x32768 hex

h0, h20 0,008697 285 0x011Dh1, h19 0,026267 861 0x035Dh2, h18 -0,01949 -639 0xFD81h3, h17 0,007113 233 0x00E9h4, h16 0,013134 430 0x01AEh5, h15 -0,028302 -927 0xFC61h6, h14 0,021353 700 0x02BCh7, h 13 0,015199 498 0x01F2h8, h12 -0,07133 -2337 0xF6DFh9, h11 0,122376 4010 0x0FAAh10 0,333457 10927 0x2AAF

||h||1 = Σ |h(n)| ||h||

32768 = Σ |h(n)|

} }Dolnoprzepustowy filtr cyfrowy o skończonej

odpowiedzi impulsowej 21 rzędu

33

Implementacja filtru cyfrowego FIR (2)Implementacja filtru cyfrowego FIR (2)main:

clr.l %d0...clr.l %d7move.l #0xFF40, %mask | maska dla bufora danych wej. 64 Blea coeff, %a1 | adres pamięci z wsp. filtrumovem.l (%a1), #0x00FC | załadowanie rejestrów d2-d7bsr.b FILTER

FILTER: move.l #0, ACC0bsr GET_SAMPLE | pobierz próbkę x(n), {x(n), x(n-1)} w D0,

| wskaźnik do bufora danych w A0 x(n-2)...

mac.w %d2u, %d0u, (%a0)+&, %d1, %ACC0 | h(0) * x(n) => acc0, {x(n-2), x(n-3)} => d1mac.w %d2l, %d0l, %ACC0 | h(1) * x(n-1) => acc0mac.w %d3u, %d1u, (%a0)+&, %d0, %ACC0 | h(2) * x(n-2) => acc0, {x(n-4), x(n-5)} => d0mac.w %d3l, %d1l, %ACC0 | h(3) * x(n-3) => acc0mac.w %d4u, %d0u, (%a0)+&, %d1, %ACC0 | h(4) * x(n-4) => acc0, {x(n-6), x(n-7)} => d1

...mac.w %d2u, %d0u, %ACC0 | h(20) * x(n-20) => acc0move.l %ACC0, %d0swap %d0move.w %d0, RESULT | save calculated samplerts

34

Implementacja filtru cyfrowego FIR (3)Implementacja filtru cyfrowego FIR (3)

A0+0x00

A0+0x40

A0=0x50000

15 0

Sample 1Sample 2

Sample n-1

mac.w %d2u, %d0u, (%a0)+&, %d1, %ACC0.........

<oa> = 0x50000 AND 0xFFBF => 0x50000 0xB = 1011mac.w .........(%a0)+&..........

<oa> = 0x50002 AND 0xFFBF => 0x50002mac.w .........(%a0)+&..........

<oa> = 0x5003E AND 0xFFBF => 0x5003Emac.w .........(%a0)+&..........

zapis nowej próbki pod adres 0x3E <oa> = 0x50040 AND 0xFFBF => 0x50000

mac.w .........(%a0)+&..........<oa> = 0x50002 AND 0xFFBF => 0x50002

mac.w .........(%a0)+&..........

move.l #0xFFBF, %mask | maska dla bufora danych wej. 64 słowa

64 s

łow

a