ЛР5(б) > Реалізація КІХ – фільтру: на базі пристрою MAC

Тема: Реалізація КІХ-фільтру з використанням подвійного пристрою множення та додавання (МАС) процесора С55х

Завдання Б

Архітектурною особливістю процесору TMS320С55х є те, що він має два пристрої МАС та чотири акумулятори. В даному завданні використовуються переваги архітектури процесору (наявність подвійного МАС) для підвищення швидкості виконання алгоритму роботи КІХ-фільтру. Основна ідея використання подвійного МАС – це підвищення швидкості обробки даних шляхом виконання двох паралельних обчислень вихідних значень. Тобто, одночасно використовується один пристрій МАС для обчислення значення y(n), а інший для обчислення значення y(n+1). Наприклад: наступний фрагмент програми на мові асемблер використовує паралельні команди які виконуються одночасно подвійними блоками МАС:


В даному прикладі, ARx та ARy – це регістри-вказівники адресу даних для x(n) та x(n+1) відповідно, а регістр CDP – вказівник адресу коефіцієнтів фільтру. При виконанні оператору циклу створються два потоки вихідних даних – y(n) та y(n+1). Після виконання однієї операції, зміст регістрів-вказівників даних ARx та ARy збільшуються на одиницю. Зміст регістра-вказівника коефіцієнтів CDP також збільшується на одиницю, режим автоматичного збільшення значення для цього регістра встановлюється для обох команд. Це тому, що при використанні регістра-вказівника в паралельних командах його зміст може збільшуватися лише один раз. Архітектура подвійного блоку МАС процесора С55х зображена на Рис.2.


Рис.2. Архітектура подвійного блоку МАС процесора TMS320C55х

 

Регістр CDP використовує шину В для вибірки коефіцієнтів фільтру, а регістри ARx та ARy використовують шини С та D, відповідно, для зчитування даних із масиву відліків сигналу. Результати виконання операцій в подвійному блоці МАС тимчасово зберігаються в акумуляторах АСx та ACy.

Наступний приклад програми на мові асемблер (firs2macs.asm) показує реалізацію процесором С55х КІХ-фільтра з використанням подвійного блоку МАС та операторів циклу:

;

; fir2macs.asm – Dual-MAC Block FIR filter

;

; prototype: unsigned int fir2macs(int *, unsigned int, int *,

; unsigned int, int *, int *, unsigned int);    

;

; Entry: arg0: AR0 – filter input buffer pointer

; arg1: T0 – number of samples in the input buffer

; arg2: AR1 – FIR coefficients array pointer

; arg3: T1 – FIR filter order

; arg4: AR2 – filter output buffer pointer

; arg5: AR3 – signal buffer pointer

; arg6: AR4 – signal buffer index

;

; Return: T0 = signal buffer index

;

 

.def _fir2macs

.sect “fir_code”

    

_fir2macs

pshm ST1_55 ; Save ST1, ST2, and ST3

pshm ST2_55

pshm ST3_55

 

or #0x340,mmap(ST1_55); Set FRCT,SXMD,SATD

bset SMUL ; Set SMUL

mov XAR1,XCDP ; CDP as coefficient pointer

mov mmap(AR1),BSAC ; Set up base address for CDP

mov #0,CDP ; Start from the 1st coefficient

mov mmap(T1),BKC ; Set the coefficient array size

mov XAR3,XAR1 ; AR1 & AR3 as signal buffer pointers

mov mmap(AR3),BSA01 ; Set base address for AR1

mov mmap(AR3),BSA23 ; Set base address for AR3

add #1,T1

mov mmap(T1),BK03 ; Set signal buffer x[] size as L+1

mov AR4,AR3 ; AR3 signal buffer index

mov AR4,AR1     

or #0x10A,mmap(ST2_55); CDP, AR1, AR3 circular pointers

amar *AR1+ ; AR1 delayline index+1

|| sfts T0,#-1 ; Use half of data samples

sub #1,T0 ; as outer repeat counter

mov T0,BRC0 ; Outer loop couter    

sub #4,T1,T0

mov T0,CSR ; Inner loop counter as L/2-2

|| rptblocal sample_loop-1

mov *AR0+,*AR1 ; Put new sample to signal buffer x[n]

mov *AR0+,*AR3 ; Put next new sample to location x[n+1]

mpy *AR1+,*CDP+,AC0 ; The first operation

:: mpy *AR3+,*CDP+,AC1

|| rpt CSR

mac *AR1+,*CDP+,AC0 ; The rest MAC iterations

:: mac *AR3+,*CDP+,AC1

macr *AR1,*CDP+,AC0

:: macr *AR3,*CDP+,AC1 ; The last MAC operation

mov pair(hi(AC0)),dbl(*AR2+); Store two output data

sample_loop

    
 

popm ST3_55 ; Restore ST1, ST2, and ST3

popm ST2_55

popm ST1_55

mov AR3,T0 ; Return signal buffer index

|| ret

.end

Для того, щоб використовувати подвійний блок МАС необхідно збільшити довжину масиву сигналу, щоб забезпечити додаткові комірки пам’яті, необхідні для обчислення двох вихідних значень. Це дасть можливість формувати дві послідовні вибірки з масиву сигналу, одна з яких формується регістром-вказівником AR1, а інша – AR3. Використання подвійного блоку МАС для реалізації КІХ-фільтру також вимагає одночасного зчитування трьох комірок пам’яті. Два зчитування з пам’яті потрібні для отримання вхідних даних з масиву сигналу в блоки МАС, а третє зчитування – для вибірки коефіцієнта фільтру. Щоб уникнути одночасного звернення до однієї шини даних пам’яті, необхідно розмістити значення у різних блоках пам’яті. При використанні подвійних блоків МАС, отриманий результат розміщується в двох акумуляторах. Для зберігання обох результатів необхідно виконати команди запису даних до пам’яті. Якщо можна використати команду одночасного запису двох значень до пам’яті, movpair(hi(AC0)),db1(*AR2+), це було б найбільш ефективним варіантом для зберігання вихідних даних y(n) та y(n+1) у пам’яті даних за один цикл. Хоча, це вимагає щоб пам’ять даних була вирівняна по довжині слова. Таке вирівнювання може бути зроблено за допомогою директив командного файлу компоновника.

 

Виконайте наступні кроки досліду Б:

1. Створіть новий проект у середовищі CCS; назвіть його expС та збережіть його у відповідній директорії. Скопіюйте програми exp5с.с,
firs2macs.asm та командний файл лінкера exp5.cmd з директорії вхідних даних до завдання. Додайте до проекту ці файли. Підключить бібліотеку засобів динамічної підтримки rst55.lib (розташована у директорії C:\ti\c5500\cgtools\lib). Запустіть програму на компіляцію. Використайте згенерований файл input5.dat (розміщений в директорії вхідних даних до завдання), як вхідний сигнал для обробки.

2. Завантажте програму до процесора. Відкрийте чотири графічних вікна для перегляду вхідного сигналу, його спектру, вихідного сигналу та його спектру. Параметри налагодження графічних вікон наведені в попередньому завданні.

3. Встановіть точку переривання в передостанньому рядку головної програми exp5с.с. Запустіть програму на виконання в режимі анімації. Проаналізуйте отриманий результат.

 

 Завдання для самостійної роботи

 

А. Доопрацюйте вхідні дані таким чином, щоб в них були присутні інші частотні складові. Перевірте результат фільтрації даних за допомогою наведеної програми.

Б. У середовищі MATLAB розрахуйте власний КІХ-фільтр та реалізуйте його на ЦСП. Перевірте його працеспроможність на тестовому сигналі.