Синтез и программная реализация БИХ-фильтра

Автор работы: Пользователь скрыл имя, 20 Декабря 2011 в 02:32, курсовая работа

Описание

Цель работы: Синтезировать полученные знания и реализовать программный код фильтра с бесконечной импульсной характеристикой для цифрового сигнального процессора компании Texas Instrument (TI) семейства TMS320C6000.

Работа состоит из  1 файл

курсовик.doc

— 633.50 Кб (Скачать документ)

Заголовочный  файл «prjBIX.h» к проекту не подключается. В этом нет необходимости, так как в CCS подключение заголовочных файлов, которые в файлах проекта указаны директивой «#include», происходит автоматически. И последний файл, который подключается к проекту — это файл библиотеки «rts6400.lib». Этот файл необходим для того, что бы CCS смог корректно преобразовать С++ кода к бинарному виду для выбранного типа сигнального процессора. Подключение производиться так же как это было рассмотрено выше. Необходимый файл находиться в директории, где установлена отладочная среда CCS, в папке «Директория установки CCS\C6000\cgtools\lib\». Выберите папку размещения файла библиотеки в поле «Папка», Укажите в поле «Тип файла» — «Object and Library Files (*.o; *.l)», Щелкните по имени «rts6400» (после этого оно должно появиться в поле «Имя файла») и нажмите кнопку «Открыть». Окно «Add Files to Project» для случая подключения библиотеки «rts6400.lib». Вид программы CCS после всех операций по подключению файлов. Обратите внимание на закладку «File View» с правой стороны окна CCS, В ней представлена файловая структура проекта. Для просмотра дерева файлов необходимо нажать на значок «+» напротив выбранного пункта.

Последний этап создания проекта — это уточнение  его настроек. Для выполнения этого  необходимо в главном меню CCS выбрать пункт «Project->Build Options...».

В появившемся  окне настроек проекта «Build Options for prjKIX_CCS.prj (Debug)» перейти на закладку «Compiler» и уточнить настройки пунктов «Basic» и Advanced» в разделе «Category».

В пункте «Basic» обратите внимание на выставление опции «Full Symbolic Debug (-g)» в окне «General Debug Info», а так же на соответствие типа процессора заданному при начальной настройки отладочной среды в окне «Target Version».

В пункте «Advanced» необходимо в окне «Endianness» установить опцию «Little Endian», а в «Memory Models» — значение «Far Aggregate». Настройки категории «Basic». Настройки категории «Advanced» на закладке «Compiler». на закладке «Compiler». Затем перейти на закладку «Linker».

Главное, в разделе «Category» для пункте «Basic» необходимо выставить значение «0х1000» в окнах «Heap Size (-heap)» и «Stack Size (-stack)».

Рис.20. Настройки категории  «Basic» на закладке «Linker». Дальнейшее уточнение настроек проекта связано с настройками памяти процессора. Для этого необходимо в главном меню CCS выбрать пункт «Option->Memory Map»  и появившемся окне «Memory Map» привести настройки. Обратить внимание на наличие записи «0х00000000 - 0хFFFFFFFF : RAM» в области поля «Memory Map List». Если запись не содержит слова «RAM» необходимо попробовать выставить или снять галочку «Enable Memory Mapping». И в завершении этапа уточнения настроек проекта вызываем окно дополнительных настроек «Customize». В появившемся окне «Customize» необходимо установить галочку в пункте «Load Program After Build» на закладке «Load Program» на закладке «Program/Project/CIO.

Процесс настройки  проекта завершен. Можно приступать к компиляции проекта. 

  1. РЕАЛИЗАЦИЯ  ФУНКЦИИ  CVOLUTION НА АССЕМБЛЕРЕ
 

Вначале необходимо создать файл с именем «cnvBIX_asm.asm» и подключить его к проекту. Процедура аналогична той, что была проведена при создании и подключении файла «standard.cmd» (см. в разделе 2). Окна сохранения и подключения файла «cnvBIX_asm.asm» показаны, соответственно.

Следующий шаг  — скопировать содержимое файла «cnvBIX.cpp» в открывшееся окно редактирования файла «cnvBIX_ asm.asm» и закомментировать каждую строчку знаком «;»: Сохраните изменения в файле «cnvBIX_ asm.asm», нажав кнопку. Вид CCS после создания, подключения, модификации и сохранения файла «cnvBIX_ asm.asm».Так как окно настроек свойств точек тестирования пока не нужно, можно его закрыть. Для этого нужно щелкнуть правой кнопкой мыши в области этого окна и в появившемся контекстном меню выбрать пункт «Hide». После этого окно CCS примет вид, показанный. Для написания ассемблерного кода функции «cnvBIX()» необходимо знать ее ассемблерное имя. Подсмотреть это имя можно в промежуточном ассемблерном файле, который создает сама отладочная среда CCS. Однако, этот файл уничтожается после завершения процесса компиляции. Что бы этого не происходило, необходимо щелкнуть правой кнопкой мыши на имени файла «cnvBIX.cpp» в закладке «File View» и появившемся контекстном меню вызываем окно настройки параметров компиляции щелкнув по пункту «File Specific Options». Появиться окно настройки параметров компиляции файла.В этом окне переходим на закладку «Compiler», выбираем категорию «Assembly», ставим галочку «Keep Generated .asm Files (-k)» и подтверждаем изменение параметров компиляции выбранного файла, нажав кнопку «OK». После этого компилируем выбранный файл независимо от всего проекта нажав кнопку.В папке проекта появиться еще один файл с именем «cnvBIX.asm». Открываем его в любом текстовом редакторе. Находим строчки вида:

.sect ".text"

.global _cnvBIX__FPsT1si

_cnvBIX__FPsT1si:

Первая строчка  определяет секцию, где будет располагаться  код функции cnvBIX(). Вторая — ассемблерное имя функции, а последняя — точку входа в функцию. Копируем эти строчки и вставляем в файл «cnvBIX_ asm.asm». Кроме этого, необходимо назначить имена регистрам общего назначения в соответствии с параметрами функции и локальными переменными. Это можно сделать при помощи директивы «.asg».

При выходе из функции  необходимо записать результат вычислений в регистр A4 (согласно регистровым соглашениям) и перейти по адресу возврата, хранящемуся в регистре B3 (так же в соответствии с регистровыми соглашениями).

Прежде чем  приступить к написанию ассемблерного  кода непосредственно соответствующего С-коду, необходимо сделать еще одно подготовительное действие — запретить прерывания на время выполнения ассемблерного кода функции в начале: Обратите внимание, что определен еще один регистр (B7) для хранения значения управляющего регистра «CSR» — «CSROLD_B». В конце ассемблерного кода функции нужно восстановить значение управляющего регистра «CSR»: Запрет прерываний обеспечивает корректную работу функции при оптимизации кода с использованием программного конвейера. Отметим, что в конце кода не разрешаются прерывания, а восстанавливается то значение управляющего регистра «CSR», которое было в момент вызова функции cnvKIX().

Теперь можно  приступить к написанию ассемблерного  кода тела функции. В силу того, что  С-код был написан с учетом его преобразования к ассемблерному  виду, каждому С-оператору легко можно поставить в соответствие его ассемблерный аналог.

 Функция cnvBIX_CCS.asm

;#include "prjBIX.h" 

;word16 cnvBIX(word16* pCoeff,word16* pShift,word16 namberCoeff, word32 constA) 

  .asg   A3,  coeff_A      

  .asg   A4,  pCoeff_A    

  .asg  A5,  coeffB_A     

  .asg   A6,  namberCoeff_A 

  .asg   A7,  rezult_A                    

                        

  .asg   B0,  count_B      

  .asg   B3,  adrReturn_B  

  .asg   B4,  pShift_B      

  .asg   B5,  coeffX_B            

  .asg   B6,  constA_B                      

  .asg   B7,  CSROLD_B           

  .asg   B15, SP  

 

.sect ".text"

  .global _cnvBIX__FPsT1si 

_cnvBIX__FPsT1si 

                  MVC       .S2       CSR, CSROLD_B

                  AND       .S2       CSROLD_B, -2, B1

                  MVC       .S2       B1, CSR 

                  SUB       .L1       namberCoeff_A, 1, namberCoeff_A           

  
 

   

                 ADD       .S2X       pShift_B, namberCoeff_A, pShift_B        

                 ADD       .S2X       pShift_B, namberCoeff_A, pShift_B        

                 ADD       .S1        pCoeff_A, namberCoeff_A, pCoeff_A         

                 ADD       .S1        pCoeff_A, namberCoeff_A, pCoeff_A         

       LDH .D2T2 *pShift_B--, coeffX_B                     

       LDH .D1T1 *pCoeff_A--, coeffB_A                     

        NOP 4 

       MPY .M1X coeffX_B, coeffB_A, rezult_A               

         NOP 

                 SUB        .L2X      namberCoeff_A, 1, count_B 

loop01:     

                 LDH        .D2T2     *pShift_B--, coeffX_B     

                 NOP 4

                 STH        .D2T2 coeffX_B, *pShift_B[2]                  

                 LDH        .D1T1     *pCoeff_A--, coeffB_A

                 NOP 4

                 MPY         .M1X     coeffX_B, coeffB_A, coeff_A 

                 NOP

                 ADD         .S1      rezult_A, coeff_A, rezult_A

     [count_B]   BDEC        .S2      loop01, count_B

                 NOP 5

                 MV          .S1X       constA_B,A2 
 
 

            CMPGT .L1    rezult_A,0,A1 

            [A1] SHR          .S1     rezult_A,A2,A4 

            [!A1] SUB    .L1 0,rezult_A, rezult_A

            [!A1]  SHR          .S1    rezult_A,A2,A4

        [!A1] SUB    .L1 0,A4, A4  

          

                

                 MVC    .S2     CSROLD_B, CSR 

                       B      .S2     adrReturn_B

                 NOP 5 
 

Так как к  настоящему моменту в проект включены две функции cnvBIX() — одна написанная на С, а вторая — на ассемблере, необходимо исключить из процесса компиляции файл с С- кодом функции. Для этого необходимо щелкнуть правой кнопкой мыши на имени файла «cnvBIX.cpp» в закладке «File View» и через появившееся контекстное меню вызывать окно настройки параметров компиляции щелкнув по пункту «File Specific Options. В появившемся окне перейти на закладку «General»  и поставить галочку в пункте «Exclude file from build» . Заметим на будущее, что повторив описанную процедуру, но сняв галочку в пункте «Exclude file from build», можно подключить файл к проекту, то есть снова включить его в процесс компиляции. Исключения файла из процесса компиляции проекта. Закладка «File View» после отключения файла «cnvBIX.cpp».

Обратите внимание, что в окне «File View» изменилось отображение файла «cnvBIX.cpp». Файл может быть вызван в окно редактирования, его можно изменять, сохранять и т.д., но в процессе компиляции он не участвует.

Откомпилировать проект заново, нажав кнопку полной компиляции проекта , и

запустить проект на выполнение, нажав кнопку анимированного запуска. Если все набрано верно, то компиляция должна пройти без ошибок, а после исполнения кода полученный выходной файл будет идентичен файлу полученному в случае подключения к проекту С-кода функции cnvBIX().

    Основные правила и последовательность действий по оптимизации ассемблерного кода в CCS.

  1. Оптимизация цикла обработки линии задержки

Заменяем операторы NOPn на n последовательных операций NOP. Пытаемся  выполнить как можно больше операций параллельно. В нашем случае параллельно можно выполнить только две операции считывания данных. Затем — переносим операцию условного перехода на 5 тактов вверх. Так как в моём варианте задания каждое звено из 3-х элементов задержки для рекурсивной и нерекурсивной части, то число прохождений цикла будет тоже 3, учитывая это обстоятельство, цикл организовывать не нужно, а нужно вынести три такта цикла и оптимизировать их, путём склеивания. При этом следует учитывать конфликт одинаковых модулей.

Обратим внимание на следующие моменты:

оператор «[count_B] BDEC .S2 loop01, count_B», в оптимизированном коде не нужен, так как цикл повторяться больше 3-х раз не будет 

                    

Функция оптимизированная:   cnvBIX_CCSopt.asm

;#include "prjBIX.h" 

;word16 cnvBIX(word16* pCoeff,word16* pShift,word16 namberCoeff, word32 constA)

;    //объявление  локальных переменных

      .asg A3, coeff_A   ;   word32 coeff;

      .asg A4, pCoeff_A  ; 1-й прм функции word16* pCoeff

      .asg A5, coeffB_A  ; word16 coeffB;

      .asg A6, namberCoeff_A ; 3-й прм фнк word16 namberCoeff

      .asg A7, rezult_A  ;   word32 reяult;

      .asg A9, halfConstA_A ; для хранения constA разделенного на 2 

      .asg B0, count_B   ;   word32 count;

      .asg B3, adrReturn_B  ; адрес возврата

      .asg B4, pShift_B  ; 2-й прм фнк word16* pShift

      .asg B5, coeffX_B  ;   word16 coeffX;

Информация о работе Синтез и программная реализация БИХ-фильтра