Jednostka mnożąco-sumującą EMAC (Enhanced Multiply-ACcumulate unit) 1
Moduł MAC (1) Jednostka arytmetyczna przeznaczona do operacji wykorzystywanych podczas cyfrowej obróbki sygnałów DSP (Digital Signal Processing). Sygnały wyjściowe Sygnały wejściowe ADC Procesor DSP (MAC) MCF 5250 DAC 2
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... 3
Transformata DCT DTC = rozszerzenie transformaty FFT z dodatkowym przetwarzaniem danych Mnożenie macierzy, Mnożenie i akumulacja wyników, 4
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) 5
Potok modułu EMAK 6
Rejestry modułu EMAC 32 ACC1 ACC0 ACC3 ACC2 16 15 MACSR ACC0 ACC1 ACC2 ACC3 ACCext01 ACCext23 MASK 0 7
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 Z V EV ustawiana, gdy rezultat operacji jest ujemny (MULS, MULU nie ustawiają flagi N) ustawiana, gdy rezultat operacji zerowy (MULS, MULU nie ustawiają flagi Z) ustawiana, gdy nastąpi przepełnienie podczas wykonywania operacji MAC, MSAC (64 bit), ustawiana, gdy nastąpi przepełnienie (32/40 bit) podczas wykonywania operacji MAC, MSAC. 8
Rejestr statusowy MACSR (2) 9
Możliwe formaty danych (1) Liczby ujemne (U2) -2(N-1)... 2(N-1) - 1 Liczby dodatnie 0... 2(N-1) 1 (-N+1) Liczby ułamkowe -1... 1 2 0x8000.0000 = -1 0x7FFF.FFFF = 1-2-31 10
Możliwe formaty danych (2) 11
Mnożenie liczb całkowitych 12
Mnożenie liczb ułamkowych 13
Zapis i odtwarzanie stanu jednostki EMAC EMAC_state_save: %MACSR, %D7 clr.l %D0 %D0, %MACSR wyłącz zaokr. %ACC0, %D0 %ACC1, %D1 %ACC2, %D2 %ACC3, %D3 %ACCEXT01, %D4 %ACCEXT23, %D5 %MASK, %D6 movem.l #0x00FF, (%A7) EMAC_state_restore: movem.l (%A7), #0x00FF #0, %MACSR wyłącz zaokr. %D0, %ACC0 %D1, %ACC1 %D2, %ACC2 %D3, %ACC3 %D4, %ACCEXT01 %D5, %ACCEXT23 %D6, %MASK %D7, %MACSR 14
Rejestr maski (1) MASK 0xFFFF 31 16 15 MOVE.L MOVE.L 0 %D0, %MASK #10, %MASK 15
Rejestr maski (2) 0x0..00 MOVE.L MOVE.L #0x10.0000, %A0 #0x00FF, %MASK MAC.L %D2, %D0, (%A0)+&, %D2, ACC0 if <ea> = (An) if <ea> = (An)+ if <ea> = -(An) if <ea> = (d16,an) oa = An & (0xFFFF, %MASK) oa = (An+4) & (0xFFFF, %MASK) oa = (An-4) & (0xFFFF, %MASK) oa = (An+se_d16) & (0xFFFF, %MASK) oa = (An+4) & (0xFFFF 00FF) 0x10.0000 0x10.0004 0x10.0008...... 0x10.00FC 0x10.0000 Dana 0 & (0xFFFF 00FF) & (0xFFFF 00FF) & (0xFFFF 00FF) +4 +4 +4 & (0xFFFF 00FF) & (0xFFFF 00FF) +4 +4 0x0..BF Dana n-1 0x0..FF 16
Lista instrukcji jednostki EMAC 17
Multiply Accumulate mac.w mac.l mac.w mac.l %a0u, %d1l, %ACC0 %d0, %a1, >>, %ACC2 %a0u, %a1l, <<,%ACC3 %d0, %d1, %ACC4 Error: syntax error -- statement `mac.w %d0u,%d1l,<<,%acc4' ignored 18
Multiply 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++ 19
Multiply Subtract 20
Przykłady użycia MAC/MSAC A0 Sample 0 Coefficient 0 movem.l (%a0), %d0-%d3 Sample 1 Coefficient 1 mac.w mac.w %d0u, %d0l, %ACC0 %d1u, %d1l, %ACC0 Sample n-1 Coefficient n-1 31 A5 movem.l movem.l (%a5), %d0-%d3 (%a6), %a0-%a3 16 15 Sample 1 Sample 0 Sample n-2 Sample n-1 Coefficient 0 Coefficient 1 0 mac.w %d0l, %a0l, >>, %ACC2 msac.w %d0u, %a0u, <<,%ACC3 zwykłe 1 clk mac.l msac.l %d0, %a1, %ACC1 %d0, %a1, %ACC2 zwykłe 3 clk A6 Coefficient n-2 Coefficient n-1 31 16 15 0 21
MOVE from ACC 22
MOVE from ACCext00..23 23
MOVE from MACSR 24
MOVE from MASK 25
MOVE to ACC 26
MOVE MACSR to CCR 27
Przykłady instrukcji MOVE STORE LOAD %D0, %ACC0 #100, %ACC3 %ACC0, %D0 %ACC3, %ACC0 %D0, %ACCext23 #100, %ACCext23 %ACCext23, %D0 %ACCext01, %D7 %D0, %MACSR #100, %MACSR %MACSR, %D0 %MACSR, %CCR %D0, %MASK #100, %MASK %MASK, %D0 %MASK, %D7 movem.l (%A7),%D0-%D7/%A0-%A6 Transfer BURST 60 bajtów 28
Biblioteki DSP http://www.freescale.com/ 29
Filtry 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 30
DTMF (dual-tone multi-frequency) dekoder 31
Normalizacja współczynników filtru Dolnoprzepustowy filtr cyfrowy o skończonej odpowiedzi impulsowej 21 rzędu Obliczone wsp. x32768 data section align 104 coeff: 2x10+1 słów = 24 B.long 0x011D.035D.long 0xFD81.00E9.long 0x01AE.FC61.long 0x02BC.01F2.long 0xF6DF.0FAA.long 0x2AAF.0000 0,008697 0,026267-0,01949 0,007113 0,013134-0,028302 0,021353 0,015199-0,07133 0,122376 0,333457 285 861-639 233 430-927 700 498-2337 4010 10927 0x011D 0x035D 0xFD81 0x00E9 0x01AE 0xFC61 0x02BC 0x01F2 0xF6DF 0x0FAA 0x2AAF } } queue: dane wejściowe 32 słowa na granicy 128 bajtów DS.B 64 h0, h20 h1, h19 h2, h18 h3, h17 h4, h16 h5, h15 h6, h14 h7, h 13 h8, h12 h9, h11 h10 hex h 1 = Σ h(n) h 32768 = Σ h(n) 32
Implementacja filtru cyfrowego FIR (2) main: clr.l %d0... clr.l %d7 #0xFF40, %mask lea coeff, %a1 movem.l (%a1), #0x00FC bsr.b FILTER FILTER: mac.w mac.w mac.w mac.w mac.w bsr #0, ACC0 GET_SAMPLE %d2u, %d0u, (%a0)+&, %d1, %ACC0 %d2l, %d0l, %ACC0 %d3u, %d1u, (%a0)+&, %d0, %ACC0 %d3l, %d1l, %ACC0 %d4u, %d0u, (%a0)+&, %d1, %ACC0... mac.w %d2u, %d0u, %ACC0 %ACC0, %d0 swap %d0 move.w %d0, RESULT rts maska dla bufora danych wej. 64 B adres pamięci z wsp. filtru załadowanie rejestrów d2-d7 pobierz próbkę x(n), {x(n), x(n-1)} w D0, wskaźnik do bufora danych w A0 x(n-2)... h(0) * x(n) => acc0, {x(n-2), x(n-3)} => d1 h(1) * x(n-1) => acc0 h(2) * x(n-2) => acc0, {x(n-4), x(n-5)} => d0 h(3) * x(n-3) => acc0 h(4) * x(n-4) => acc0, {x(n-6), x(n-7)} => d1 h(20) * x(n-20) => acc0 save calculated sample 33
Implementacja filtru cyfrowego FIR (3) maska dla bufora danych wej. 64 słowa mac.w %d2u, %d0u, (%a0)+&, %d1, %ACC0......... <oa> = 0x50000 AND 0xFFBF => 0x50000 0xB = 1011 mac.w...(%a0)+&... <oa> = 0x50002 AND 0xFFBF => 0x50002 mac.w...(%a0)+&... <oa> = 0x5003E AND 0xFFBF => 0x5003E mac.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)+&... A0+0x00 Sample 1 Sample 2 64 słowa A0=0x50000 #0xFFBF, %mask Sample n-1 A0+0x40 15 0 34