У вас вопросы?
У нас ответы:) SamZan.net

тематическими операциями

Работа добавлена на сайт samzan.net: 2015-07-10

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 2.2.2025

Глава 28 – Цифровой Сигнальный Процессор                                          26

Цифровой Сигнальный Процессор

Цифровая сигнальная обработка выполняется математическими операциями. В сравнении, текстовые редакторы и простейшие программы просто пересортировывают запасенные данные. Это означает, что компьютеры, созданные для бизнеса и других основных приложений не оптимальны для алгоритмов цифровой фильтрации и анализа Фурье. Цифровой сигнальный процессор есть микропроцессор, специально созданный для управления задачами Цифровой Сигнальной Обработки. Эти устройства представляются грандиозно выросшими в последнее десятилетие, и находят использование от сотового телефона до сложных научных приборов. Фактически, инженеры по оборудованию используют термин ЦСП для обозначения Цифрового Сигнального Процессора, также как программисты используют термин ЦСП для обозначения Цифрового Сигнального Процесса (цифровой обработки сигналов). Эта глава рассматривает, чем ЦСП отличается от других микропроцессоров, как решить, подходит ли ЦСП для ваших приложений, и как начать работать в этой захватывающей новой области.

Чем ЦСП отличается от других микропроцессоров

В 1960-х годах предсказывали, что искусственный интеллект вызовет революцию благодаря взаимодействию человека с компьютерами и другими машинами. Верили, что к концу столетия мы будем иметь роботов, убирающих наши дома, компьютеры, управляющие нашими автомобилями, и голосовое управление хранением и извлечением информации. Этого не случилось; эти абстрактные задачи оказались сложнее, чем ожидалось, и очень трудными для пошагового логического выполнения цифровыми компьютерами.

Однако последние сорок лет показали, что компьютеры очень эффективны в двух широких областях: (1) манипуляциями данными, такими как обработка текстов и управлении базами данных, и (2) математических вычислений, используемых в науке, технике и цифровой обработки сигналов. Все микропроцессоры могут выполнять эти две задачи, однако трудно (дорого) сделать устройство оптимальное под обе задачи. Имеется технический компромисс в создании оборудования, такой как размер набора инструкций и управление прерываниями. Но что, может быть, более важно, имеется рынок, который вынуждает учитывать: цену оборудования, конкуренцию, время жизни продукта и т.д. Как широкое обобщение, эти факторы обеспечиваются традиционными микропроцессорами, такими как Pentium®, первоначально направленными на манипуляцию данными. Аналогично, ЦСП создаются для выполнения математических вычислений, необходимых в Цифровых Сигнальных Процессах.

Манипуляция данными

Математические вычисления

Типичные приложения

Текстовые редакторы, базы данных, распространение списков, операционные системы и т.д.

Цифровая обработка сигналов, управление движением, научные и технические задачи и т.д.

Главные операции

Перемещение данных (АВ), логические операции (If A=B then ...)

Сложение (A + B = C), умножение (A  B = C)

РИСУНОК 28-1

Сравнение манипуляции данными и математических вычислений. Цифровой компьютер полезен как для манипуляции данными, так и для математических вычислений. Управление данными базируется на перемещениях и сравнении величин, математические вычисления используют сложение и умножение.

Рисунок 28-1 отображает список наиболее важных различий меду этими двумя категориями. Манипуляция данными использует хранение и сортировку информации. Например, представим программу текстовой обработки. Ее основная задача заключается в хранении информации (вводимой оператором), в организации этой информации (вырезка, вставка, проверка, расположение страниц и т.д.) и, затем, в извлечении информации (запоминание информации на диске или печатание на лазерном принтере). Эти задачи выполняются перемещением данных из одного положения в другое и проверкой неравенств (A=B, A<B и т.д.). Как пример, представим сортировку слов в алфавитном порядке. Каждое слово представлено 8-битовым числом (ASCII значением первой буквы в слове). Сортировка по алфавиту требует перестановки слов, до тех пор, пока ASCII значение не будет увеличиваться от начала к концу списка. Это может быть выполнено повторением снова и снова двух шагов до завершения сортировки. Первый шаг – проверка соседних членов на алфавитный порядок (IF A>B THEN ...). Второй (если две величины идут не по порядку) - их переброска (A=B). Когда эти два шага повторятся много раз со всеми соседними парами, список, в конечном счете, будет отсортирован по алфавиту.

Как другой пример, рассмотрим печатать документа текстовым редактором. Компьютер постоянно проверяет входное оборудование (мышь или клавиатуру) на бинарный код, который означает «печатать документ». Когда этот код обнаружен, программа перемещает данные из памяти компьютера на принтер. Здесь мы имеем те же самые базовые операции: перемещение данных и проверка неравенств. Поскольку математика редко используется в приложениях такого типа, она не оказывает существенного значения на скорость вычислений.

Для сравнения, скорость вычисления в большинстве алгоритмов ЦСП, практически полностью, ограничивается требуемым числом операций умножения и сложения. Например, Рисунок 28-2 показывает, как выполнен цифровой FIR фильтр, наиболее распространенное устройство в технике ЦСП. Используя стандартное обозначение, входной сигнал представлен как x[ ], выходной как y[ ]. Наша задача – вычислить в выходном сигнале величину отсчета с номером n. FIR фильтр выполняет это вычисление перемножением соответствующих отсчетов из входного сигнала на группу коэффициентов, обозначенных a0, a1, a2, a3,…, и затем сложением результатов. В формульном виде y[n] определяется:

y[n] = a0 x[n] + a1 x[n-1] + a2 x[n-2] + a3 x[n-3] + a4 x[n-4] + ….

Проще говоря, входной сигнал свертывается с ядром фильтра (т.е. импульсным откликом) состоящим из a0, a1, a2, a3,…. В зависимости от приложения, в ядре фильтра может быть или несколько коэффициентов или многие тысячи. В то время как здесь тоже имеется передача данных и вычисление неравенств (для хранения промежуточных результатов и контроля циклов), математические операции определяют время выполнения.

РИСУНОК 28-2

Цифровой FIR фильтр. При FIR фильтрации каждый отсчет выходного сигнала находится перемножением входных отсчетов на коэффициенты ядра фильтра и суммированием результатов.

Кроме очень быстрого выполнения математических операций, ЦСП должен иметь предсказуемое время вычислений. Предположим, вы запустили на вашем компьютере некую задачу, скажем, преобразование текстового документа из одной формы в другую. В этом случае, не важно займет ли процесс десять миллисекунд или десять секунд; вы просто подождете завершение этого действия до запуска следующей задачи.

Для сравнения, большинство ЦСП используются в приложениях, где процесс непрерывен, не имеет определенного начала и конца. Например, предположим, создается схема ЦСП для аудио сигнала такого, как слуховой аппарат. Если цифровой сигнал получается 20 000 отсчетов в секунду, то и ЦСП должен поддерживать производительность в 20 000 отсчетов в секунду. Однако имеются важные причины не делать это более быстро, чем необходимо. С возрастанием скорости, возрастают цена, потребление мощности, схемные трудности и т.д. Это требует точного знания критического времени вычисления для выбора подходящего оборудования и применяемых алгоритмов.

Кольцевой Буфер

Цифровой сигнальный процессор создается для быстрого выполнения FIR фильтров и подобных устройств. Для понимания «железа» мы должны вначале понять алгоритмы. В этом разделе мы рассмотрим детальный перечень шагов, необходимых для создания FIR фильтра. В следующем разделе мы рассмотрим разработку ЦСП, который обеспечивает наиболее эффективное выполнение этих шагов.

Для начала нам необходимо разобраться между автономным (off-line) процессом и процессом реального времени (real-time processing). При автономном процессе входной сигнал целиком находится в компьютере. Например, геофизик должен использовать сейсмограф для записи движений поверхности земли во время землетрясения. Позже информация может быть считана в компьютер и как-либо проанализирована. Другой пример автономного процесса из медицинской области, такой как компьютерная томография и MRI. Набор сигналов записывается пока пациент в аппаратуре, но их обработка может быть отложена на более позднее время. Смысл в том, что вся информация одновременно доступна вычислительной программе. Это общепринято в научных исследованиях и технике, но не в потребительских изделиях. Автономный процесс есть царство персональных компьютеров и универсальных ЭВМ.

В процессах реального времени выходной сигнал вырабатывается в то же время, в какое поступает и входной сигнал. Например, это необходимо в телефонной связи, слуховых аппаратах и радарах. Эти приложения должны немедленно воспроизводить информацию, хотя и допускается небольшая задержка. Например, 10 миллисекундная задержка в телефонном вызове не может быть обнаружена говорящим или слушающим. Задержка в несколько секунд в отображении радарного сигнала на дисплее также не играет роли. В приложениях реального времени входные и выходные отсчеты выполняются алгоритмом снова и снова. Либо, как альтернатива, они могут быть составлены в группы входных и выходных отсчетов. Эти группы в Цифровой Обработке Сигналов называются «словом».

РИСУНОК 28-3

Управление кольцевым буфером. Кольцевой буфер используется для хранения самых последних сигналов и их непрерывного обновления. Это иллюстрация показывает 8 отсчетов в кольцевом буфере в какой-то момент времени (а) и после появления следующего отсчета (b)

Теперь вернемся назад к рисунку. 28-2 и представим, что это есть FIR фильтр, выполненный в реальном времени. Для вычисления выходного отсчета мы должны иметь доступ к определенным номерам самых последних входных отсчетов. Например, предположим, что мы используем восемь коэффициентов в этом фильтре, a0, a1,… a7. Это означает, что мы должны знать величину восьми самых последних отсчетов из входного сигнала x[n], x[n-1], . x[n-7]. Эти восемь отсчетов должны быть запасены в памяти, и постоянно обновляться по мере поступления новых отсчетов. Как лучше хранить эти отсчеты? Ответ – их надо хранить в кольцевом буфере.

Рисунок 28-3 иллюстрирует кольцевой буфер на восемь отсчетов. Мы помещаем этот кольцевой буфер в восьми последовательных ячейках памяти от 20041 до 20048. Рисунок (а) показывает, как восемь входных отсчетов могут храниться в некоторый момент времени, в то время как (б) показывает изменения после появления следующего отсчета. Идея кольцевого буфера заключается в том, что конец линейной области подсоединен к началу; область памяти 20041 рассматривается как следующая за 20048, также как 20045 следует за 20044. Вы следите за областью памяти с помощью указателя [pointer] (переменная, величина которой есть адрес), который отмечает, где будет находиться самый последний отсчет. Например, в (а) указатель содержит адрес 20044, в то время как в (b) – 20045. Когда новый отсчет появляется, он располагается в области самого старого отсчета, и указатель перемещается на один адрес вперед. Кольцевой буфер эффективен, потому что только одну величину необходимо изменить, когда появляется новый отсчет.

Четыре параметра необходимы для управления кольцевым буфером. Во-первых, должен быть указатель, который указывает на начало кольцевого буфера в памяти (в этом примере 20041). Во-вторых, должен быть указатель, указывающий на конец области (т.е. 20048), или на  переменную, в которой содержится его длина (т.е. 8). В-третьих, размер шага в области памяти должен быть определен. На рисунке. 28-3 размер шага равен единице, например: адрес 20043 содержит один отсчет, адрес 20044 содержит следующий отсчет и так далее. Может быть и другой случай. Например, адрес может записываться в битах, и каждый отсчет может требовать два или четыре бита для хранения величины. В этом случае размер шага будет два или четыре, соответственно.

Эти три величины определяют размер и конфигурацию кольцевого буфера, и не изменяются в процессе выполнения программы. Четвертая величина, указатель на самый последний отсчет, должен модифицироваться с появлением каждого нового отсчета. Другими словами, должна иметься программная логика, которая контролирует, как эта четвертая величина обновляется, базируясь на первых трех величинах. Хоть эта логика вполне проста, она должна быть очень быстрой. В этом главный смысл этого обсуждения; ЦСП должен быть оптимизирован с точки зрения управления кольцевым буфером для достижения возможно высокой скорости вычисления.

С другой стороны, кольцевой буфер также используется в автономных процессах. Предположим, имеется программа, где входные и выходные сигналы полностью находятся в памяти. Кольцевой буфер не требуется для вычисления свертки, поскольку каждый отсчет может быть немедленно доступен. Однако многие алгоритмы выполнены в виде каскадов с промежуточными сигналами, вычисляемыми между каскадами. Например, рекурсивный фильтр выполняется как ряд биквадратных операций. Грубый силовой метод заключается в хранении в памяти целиком всех промежуточных сигналов. Кольцевой буфер предлагает другой подход: хранить только те промежуточные сигналы, которые необходимы для вычислений. Это уменьшает требуемый объем памяти ценой усложнения алгоритма. Важная идея заключается в том, что кольцевой буфер полезен для автономных процессов, но критичен для приложений реального времени.

Теперь мы можем рассмотреть шаги необходимые для выполнения FIR фильтра, использующего кольцевой буфер, как для входных сигналов, так и для коэффициентов. Этот список может показаться тривиальным и чрезмерно подробным. Нет! Эффективность управления этими частными задачами заключается в том, что ЦОС выделен из традиционных микропроцессоров. Для каждого нового отсчета должны быть выполнены следующие шаги:

1. Получение отсчетов от АЦП; генерация прерываний

2. Обнаружение и управление прерываниями

3. Передача отсчетов в кольцевой буфер входных сигналов

4. Обновление указателя для кольцевого буфера входного сигнала

5. Обнуление аккумулятора

6. Контроль цикла для каждого коэффициента

7. Извлечение коэффициента из кольцевого буфера коэффициентов

8. Обновление указателя для кольцевого буфера коэффициентов

9. Извлечение отсчета из кольцевого буфера входного сигнала

10. Обновление указателя для кольцевого буфера входного сигнала

11. Перемножение коэффициента на отсчет

12. Суммирование результатов в аккумулятор

13. Перемещение выходного отсчета (из аккумулятора) в буфер хранения

14. Перемещение выходного отсчета из буфера хранения на ЦАП

ТАБЛИЦА 28-1

Пошаговое выполнение FIR фильтра

Цель – сделать вычисление этих шагов быстрым. Так как шаги 6-12 должны повторяться много раз (один раз для каждого коэффициента в фильтре), им должно быть уделено специальное внимание. Традиционные микропроцессоры должны, в основном, выполнять эти 14 шагов последовательно (один после другого), в то время как ЦОС создаются для их параллельного выполнения. В этом случае, все операции внутри цикла (шаги 6-12) могут быть выполнены за один период тактовых импульсов. Давайте посмотрим на внутреннюю архитектуру, которая позволяет это великолепно выполнить.

Архитектура Цифрового Сигнального Процессора

Одно из самых узких мест в выполнении алгоритмов ЦСП есть пересылка информации в памяти. Эта информация включает в себя данные, такие как отсчеты входного сигнала и коэффициенты фильтра, и программные инструкции, т. е. бинарный код, определяющий последовательность выполнения программы. Например, предположим, что нам надо перемножить два числа, которые находятся где-то в памяти. Для этого мы должны извлечь из памяти три бинарные величины: два перемножаемых числа и программную инструкцию, которая определяет, что надо сделать.

Рисунок 28-4а показывает, как эта простая на вид задача выполняется в традиционном микропроцессоре. Такое выполнение часто называется Ван - Неймановской архитектурой (Von Neumann architecture), по имени выдающегося американского математика Джона Ван Неймана (1937-1957). Ван Нейман руководил математическим разработками многих важных открытий на заре двадцатого столетия. Его достижения включают: развитие концепции компьютерной памяти, математическая формализация квантовой механики и работы по атомной бомбе. Если где-то было что-то новое и интересное, Ван Нейман был там!

Как показано в (а) Ван - Неймановская архитектура содержит одну память и одну шину для передачи данных в центральный процессор (CPU). Перемножение двух чисел требует, как минимум, трех тактов по одному на каждое число для передачи по шине из памяти в CPU. Мы не учитываем время передачи результатов назад в память, так как предполагаем, что они хранятся в CPU для дальнейших манипуляций (таких как суммирование результатов умножения). Ван - Неймановская схема вполне достаточна, когда вы удовлетворены тем, что вычисление всех задач осуществляется последовательно. Действительно, сегодня архитектура большинства компьютеров выполнена по Ван - Неймановской схеме. Нам необходима другая архитектура только, когда требуется очень быстрая обработка, и мы готовы идти на усложнение аппаратуры.

Это приводит нас к Гарвардской архитектуре (Harvard Architecture), показанной в (b). Она названа по работе Гарвардского Университета в 1940-х годах под руководством Ховарда Айкина (1900-1937). Как показано на этой иллюстрации, Айкин настоял на разделении памяти для данных и программных инструкций с отдельными шинами для каждой. Так как шины работают нзависимо, то программные инструкции и данные могут извлекаться одновременно, увеличивая скорость по сравнению с одиночной шиной. Большинство ЦСП сегодня используют эту двухшинную архитектуру.

Рисунок (с) иллюстрирует следующий уровень усовершенствования, Супер Гарвардскую Архитектуру (Super Harvard Architecture). Этот термин был введен Analog Devices для описания внутренних операций своего семейства ADSP-2106x и новых ADSP-211хх ЦСП. Они называются SHARC® DSPs, сокращенное обозначение термина Super Harvard ARChitecture. Идея заключается в добавлении к Гарвардской архитектуре характеристик увеличивающих производительность. Хотя SHARC DSPs оптимизированы дюжиной способов, только два важнейших показаны на рисунке 28-4с: кэш для инструкций и контроллер входа-выхода (I/O).

РИСУНОК 28-4

Архитектура микропроцессоров. Ван - Неймановская архитектура использует одну память для хранения данных и инструкций. Гарвардская архитектура использует отдельную память для данных и инструкций, обеспечивая более высокую скорость. Супер Гарвардская архитектура улучшена за счет КЭШа инструкций и выделенного контроллера входа-выхода (I/O).

Вначале давайте посмотрим, как кэш для инструкций улучшает характеристики Гарвардской архитектуры. Недостаток основной Гарвардской схемы заключается в том, что шина памяти данных занята больше, чем шина памяти инструкций. Когда перемножаются два числа, две бинарные величины (числа) должны быть переданы по шине данных, в то время как только одна бинарная величина (программная инструкция) передается по шине программной памяти. Для улучшения этой ситуации мы начнем перераспределять часть «данных» в программную память. Например, мы можем поместить фильтровые коэффициенты в память программы, сохраняя входные сигналы в памяти данных. (Эти перемещенные данные названы «вторичные (secondary) данные» на иллюстрации). На первый взгляд это не улучшает ситуацию; теперь мы должны передать одну величину по шине данных (отсчет входного сигнала), но две величины по программной шине (программную инструкцию и коэффициент). Действительно, если мы проводим вычисления по случайным инструкциям, то это не улучшает положение дел.

Однако, ЦСП алгоритмы в основном выполняют свои вычисления в цикле, как инструкции 6-12 из таблицы 28-1. Это означает, что тот же самый набор программных инструкций будет постоянно поступать из программной памяти в CPU. Супер Гарвардская архитектура улучшает эту ситуацию включением КЭШа для инструкций в CPU. Это маленькая память, содержащая около 32 или больше последних инструкций. Первый раз в цикле программная инструкция проходит через шину инструкций. Это увеличивает время выполнения операции, так как по этой же шине поступают коэффициенты. Однако, при последующих вычислениях инструкция извлекается из КЭШа. Это означает, что вся передача информации в CPU выполняется в одном цикле: отсчеты входного сигнала поступают по шине данных, коэффициенты – по программной шине, инструкции – из КЭШа. На жаргоне этой области эта передача данных называется высокий и широкий доступ к памяти (high memori-acces bandwidth).

Рисунок 28-5 детализирует SHARC архитектуру, показывая контроллер вх/вых (I/O), подключенный к памяти данных. Здесь показано как сигнал входит и выходит из системы. SHARC ЦСП обеспечивают как последовательный, так и параллельный порт связи. Обеспечивается предельно высокая скорость связи. Например, при 40 МГц тактовой частоты обеспечивается скорость передачи информации 40 Мбит/сек по каждому из двух последовательных портов и по каждому из шести параллельных портов. Когда все шесть параллельных портов используются вместе, скорость передачи данных составляет 240 Мбайт/сек!

Эта скорость достаточна для передачи всего текста из этой книги только за 2 миллисекунды! Также важно, что бы специализированная аппаратура позволяла передавать поток данных непосредственно в память (прямой доступ к памяти - Direct Memory Access, или DMA) без прохождения через регистры CPU. Главные шины (шина инструкций и шина данных) также доступны помимо чипа, обеспечивая добавочный интерфейс между памятью (не памятью чипа) и периферией. Это позволяет SHARC ЦСП использовать четыре Гига слов памяти (16 Гбайт) со скоростью доступа 40 миллионов слов в секунду (160 мегабайт в секунду) для 32 битных данных. Вот это да!

Этот тип высокой скорости входа-выхода (I/O) есть ключевая характеристика ЦСП. Основная цель – получение данных, выполнение математических операций и выдача данных перед обращением к следующему отсчету. Все другое вторично. Некоторые ЦСП имеют встроенные АЦП и ЦАП, такая характеристика называется смешанный сигнал. Однако все ЦСП могут иметь связь с внешними преобразователями через последовательные или параллельные порты.

Теперь давайте заглянем внутрь CPU. Наверху диаграммы имеются два блока обозначенные Генератор Данных Адреса (Data Address Generator - DAG), по одному на каждую память. Они контролируют набор адресов программных инструкций и данных, определяя, откуда информацию считывать или куда записывать. В простейших микропроцессорах эта задача выполняется, как присущая частью программной последовательности, и вполне ясна из самой программы. Однако, ЦСП разрабатываются для работы с кольцевыми буферами, и выгода от дополнительного оборудования определяет их эффективность. Это позволяет избежать необходимости использования дорогих тактовых генераторов (CPU clock cecles) для соблюдения последовательности хранения данных. Для примера, в SHARC ЦСП, каждый из двух DAG контролирует восемь кольцевых буферов. Это означает, что каждый DAG хранит 32 величины (по 4 на буфер), плюс необходимая логика.

Почему так много кольцевых буферов? Некоторые ЦСП алгоритмы лучше всего выполняются в каскадном исполнении. Например, IIR фильтр более стабилен, если он выполнен в виде последовательности биквадратных (содержащий два полюса и два нуля) каскадов. Каскадное построение требует набора кольцевых буферов для быстрейшей обработки. DAGs в SHARC ЦСП также эффективно выполняет Быстрое Преобразование Фурье. Для этого DAG выполнен так, что бы обеспечивать побитовый реверс адреса в кольцевом буфере – необходимая часть алгоритма БПФ. Кроме того, изобилие кольцевых буферов сильно упрощает ЦСП как с точки зрения программирования, так и с точки зрения возможности использования языков высокого уровня, таких как С.

Секции регистров данных в ЦСП используются так же, как в традиционных микропроцессорах. В ADSP-2106x SHARC имеется 16 главных целевых регистров по 40 бит каждый. Здесь могут храниться результаты промежуточных вычислений, подготовленные для математического процессора данные, подготовленные для передачи данные, флаги программы и т.д. При необходимости эти регистры могут так же использоваться для контроля циклов и как счетчики; однако, SHARC ЦСП имеют наружные регистры для многих из этих функций.

Математический процессор разбит на три секции, умножитель, арифметическое логическое устройство (АЛУ - ALU) и многорегистровое циклическое сдвиговое устройство (barrel shifter). Умножитель берет две величины из двух регистров, перемножает их и помещает результат в другой регистр. АЛУ выполняет операции сложения, вычитания, взятие абсолютного значения, логические операции (AND, OR, XOR, NOT), преобразование величин с фиксированной точкой в плавающую точку и т.д. Элементарные бинарные операции выполняются barrel shifter, такие как сдвиг, чередование, назначение сегмента и т.д. Мощность SHARC семейства заключается в том, что к умножителю и АЛУ можно обращаться параллельно. В одном цикле данные из регистров 0-7 могут поступать на умножитель, а данные из регистров 8-15 – на АЛУ, а затем два результата возвращаются на какой-либо из 16 регистров.

Имеется также много важных характеристик семейства SHARC архитектуры, которые не показаны на этой простой иллюстрации. На пример, 80 битовый аккумулятор встроен в умножитель для уменьшения ошибки округления, связанной с перемножением чисел с фиксированной точкой. Другая интересная характеристика заключается в  использовании теневого регистра для всех ключевых регистров чипа. Эти дублированные регистры могут переключаться между собой в одном цикле. Это используется для быстрого контекстного переключения, что позволяет быстро управлять прерываниями. Когда возникает прерывание в традиционном микропроцессоре, все внутренние данные должны запомнится перед выполнением прерывания. Это обычно вызывает необходимость проталкивание данных из всех регистров в стек. Для сравнения, в SHARC семействе внутренние данные перемещаются в теневые регистры за один такт. Когда прерывание выполнено, регистры также быстро перезагружаются. Эта характеристика позволяет 4 шага в нашем списке (управление прерыванием отсчет-чтение) выполнить очень быстро и эффективно.

РИСУНОК 28-5

Типичная архитектура ЦСП. Задачи выполняются в параллель. Это простейшая схема SHARC ЦСП фирмы Analog Devices. Сравните эту архитектуру с задачами, необходимыми для выполнения FIR фильтра в таблице 28-1. Все шаги внутри цикла могут быть выполнены за один такт.

Теперь мы подошли к критической характеристике данной архитектуры – как несколько операций внутри программного цикла (шаги 6-12 из таблицы 28-1) могут быть выполнены в одно и тоже время. Благодаря параллельной структуре SHARC ЦСП может одновременно выполнить все эти задачи. Внутри одного такта может быть произведено умножение (шаг 11), сложение (шаг 12), два перемещения данных (шаги 7 и 9), обновление буферов двух указателей (шаги 8 и 10) и контроль цикла (шаг 6). Дополнительный такт будет связан с началом и концом программного цикла (шаги 3, 4, 5 и 13, плюс перемещение начальных величин); однако, эти задачи также управляются очень эффективно. Если программный цикл вычисляется более чем за несколько раз, это превышение незначительно. Как пример, предположим, что вы написали программу для эффективного FIR фильтра со 100 коэффициентами. Вы можете ожидать, что потребуется около 105-110 циклов для вычисления (т.е. 100 для коэффициентов плюс добавочные). Это очень быстро; традиционный микропроцессор потребует несколько тысяч тактов для этого алгоритма.

Сравнение фиксированной точки с плавающей точкой

Цифровые сигнальные процессоры могут быть разделены на две категории: с фиксированной точкой и с плавающей точкой. Это означает используемый формат для хранения и манипуляции чисел внутри устройства. ЦСП с фиксированной точкой обычно представляют число минимум в 16 бит или больше. Например, семейство ЦСП с фиксированной точкой фирмы MOTOROLA используют 24 бита. Имеется четыре общих способа представления чисел в 16 битовом виде (216 = 65 536). Целое без знака, может хранить величину только от 0 до 65 536. Аналогично, целое со знаком может хранить и отрицательные числа, т.е. от -32 768 до 32 767. При записи дроби без знака уровень в 65 536 равномерно перекрывает значения от 0 до 1. Наконец, формат знаковая дробь представляет числа, равномерно расположенные от -1 до 1.

Для сравнения, ЦСП с плавающей точкой обычно используют минимум 32 бита для хранения величин. Результат – повышение точности (232 = 4 294 967 296). Ключевая характеристика представления чисел в формате с плавающей точкой заключается в том, что числа располагаются не единообразно. В наиболее распространенном формате (ANSI/IEEE Std. 754-1985) наибольшее и наименьшее число есть, соответственно, 3.4  1038 и 1.2  10-38. Представляемые величины не равно располагаются между этими двумя экстремумами, поэтому интервал между двумя любыми числами может быть в десять миллионов раз меньше чем сами числа. Это важно потому, что обеспечивает большой интервал между большими числами, но маленький между маленькими числами. Запись чисел с плавающей точкой более подробно обсуждается в главе 4.

Все ЦСП с плавающей точкой могут также работать с числами с фиксированной точкой в случае необходимости организовать счетчик, программный цикл, прием сигналов с АЦП и передачу их на ЦАП. Однако это не означает, что математика с фиксированной точкой  будет выполняться также быстро, как и операции с плавающей точкой; это зависит от внутренней архитектуры. Например, SHARC ЦСП оптимизированы как под операции с плавающей точкой, так и с фиксированной, и вычисляют их с одинаковой эффективностью. Пот этой причине SHARC процессоры чаще обозначаются как «32 битные ЦСП», чем как «ЦСП с плавающей точкой».

Рисунок 28-6 иллюстрирует первое сравнение между ЦСП с плавающей и фиксированной точками. В главе 3 мы подчеркнули, что арифметика с фиксированной точкой много быстрее чем с плавающей точкой в основных универсальных компьютерах. Однако, в ЦСП скорость примерно та же самая в результате оптимизации оборудования под математические операции. Внутренняя архитектура ЦСП с плавающей точкой более совершенна, чем с фиксированной точкой. Все регистры и шины данных должны иметь разрядность 32 бита вместо 16, умножитель и АЛУ должны быстро выполнять операции с плавающей точкой, набор инструкций должен быть больше (что бы можно было работать с числами и с плавающей точкой и с фиксированной точкой) и т.д. Плавающая точка (32 бита) обеспечивает большую точность и больший динамический диапазон, чем фиксированная точка (16 бит). Кроме того, программа с плавающей точкой часто имеет более короткий цикл отработки, так как программисту нет нужды заботиться о таких вещах, как выход за верхнюю и нижнюю границу и ошибке округления.

РИСУНОК 28-6

Сравнение фиксированной и фиксированной точек. ЦСП с фиксированной точкой, в основном, дешевле; с плавающей точкой – выше точность, больше динамический диапазон, короче цикл программной отработки.

С другой стороны, ЦСП с фиксированной точкой дешевле. Ни что так быстро не изменяется, как цена электроники; что-нибудь вы найдете в этой книге устарелым еще до выхода ее из печати. Тем не менее, цена есть ключевой фактор в понимании, как ЦСП развивается, и мы должны дать вам основную идею. Когда эта книга была завершена в 1999 году, стоимость ЦСП с фиксированной точкой была от 5 до 100 долларов, в то время как стоимость ЦСП с плавающей точкой – от 10 до 300 долларов. Эта разница в цене может рассматриваться как относительная сложность оборудования. Если вы хотите определить сегодняшнюю цену, вам надо и смотреть сегодня.

Теперь давайте, обратим наше внимание на качество функционирования; что может сделать 32 битовое число с плавающей точкой, что не может сделать 16 битовое число с фиксированной точкой? Ответ на этот вопрос заключается в отношении сигнала к шуму. Предположим, мы храним число в 32 битовом формате с плавающей точкой. Как упоминалось раньше, интервал между этим числом и примыкающим к нему соседним числом составляет десяти миллионную величину от числа. Сохраняя число, мы вынуждены округлять его с максимальной ошибкой в одну вторую интервала между числами. Иными словами, каждый раз помещая число в память, мы добавляем шум к сигналу.

То же самое случается, когда число хранится в 16 битовом формате с фиксированной точкой, за исключением того, что добавляемый шум много больше. Это из-за того, что интервал между соседними числами много больше. На пример, предположим, что мы храним в памяти число 10 000 как знаковое целое (от -32 768 до 32 767). Интервал между соседними числами одна десятитысячная от величины числа, которое мы храним. Если мы захотим сохранить число 1 000, то интервал будет только одна тысячная от величины.

Шум в сигнале обычно представляется стандартным отклонением. Это обсуждалось в деталях в главе 2. Здесь отметим, что стандартное отклонение шума квантования – примерно одна треть размера интервала между числами. Это означает, что отношение сигнала к шуму при хранении чисел в формате с плавающей точкой составляет около 30 миллионов к одному, в то время как для чисел в формате с фиксированной точкой только около десяти тысяч к одному. Другими словами, для чисел в формате с плавающей точкой шум квантования примерно в 3 000 раз меньше, чем для чисел в формате с фиксированной точкой.

Это дает важное отличие ЦСП от обычных микропроцессоров. Предположим, мы делаем FIR фильтр в формате с фиксированной точкой. Для этого мы организуем программный цикл для каждого коэффициента, перемножая на соответствующий отсчет входного сигнала и складывая результат в аккумулятор. Здесь возникает проблема. В обычных микропроцессорах этот аккумулятор 16 битовый для чисел с фиксированной точкой. Что бы избежать переполнения нам необходимо отмасштабировать складываемые величины, и соответственно будет складываться шум квантования на каждом шаге. В худшем случае, это шум квантования будет просто складываться, сильно уменьшая отношение сигнал/шум в системе. Например, при 500 коэффициентах в фильтре в каждом отсчет выходного сигнала шум может быть в 500 раз больше чем в каждом отсчете входного сигнала. Отношение сигнал/шум 10 тысяч к одному падает до ужасной величины двадцать к одному. Хотя это предельный случай, но он иллюстрирует важный вывод: когда делается много операций с каждым отсчетом это плохо, действительно плохо. Подробности смотрите в главе 3.

ЦСП решает эту проблему, используя расширенную точность аккумулятора. Это специальный регистр, имеющий в 2-3 раза большую разрядность, чем остальные виды памяти. На пример, в 16 битовом ЦСП он может иметь 32 или 40 бит, в то время как SHARC ЦСП он содержит 80 бит для использования чисел с фиксированной точкой. Это расширение уровня фактически устраняет шум из-за округления в процессе аккумуляции результатов. Шум округления сказывается только, когда аккумулятор располагается в 16 битовой памяти. Эта стратегия хорошо работает, хотя, она лимитирует некоторые алгоритмы. Для сравнения, числа в формате с плавающей точкой имеют такой низкий шум квантования, что этот подход обычно не требуется использовать.

В добавление к низкому уровню шума квантованию, в системах с плавающей точкой легче отрабатывать алгоритмы. Техника ЦСП, в основном, базируется на повторении умножения и сложения. При фиксированной точке необходимо учитывать возможность выхода за верхнюю или нижнюю границу после каждой операции. Программисту необходимо учитывать амплитуду чисел, накопление ошибки квантования, масштабирование. Для сравнения, эти проблемы не возникают с использованием плавающей точки, все обеспечивается само (за исключением редких случаев).

Для лучшего понимания этого вывода, на рисунке 28-7 представлена таблица из руководства пользователя для SHARC процессора. Здесь показано, как осуществляется перемножение чисел в формате с фиксированной и плавающей точками. Посмотрите, как могут перемножаться числа в формате с плавающей точкой, здесь только один шаг! Т.е. Fn Fx *  Fy , где Fn, Fx, Fy есть любой из 16 регистров. Не может быть проще. Для сравнения посмотрите на все возможные команды для перемножения чисел с фиксированной точкой. Здесь многое надо учитывать: округление, масштабирование и формат.

РИСУНОК 28-7

Сравнение программных инструкций для фиксированной и плавающей точек. Представлена инструкция перемножения в SHARC ЦСП. Для чисел с плавающей точкой требуется только одна команда, для чисел с фиксированной точкой – несколько опций. Объяснения смотрите в тексте.

На рисунке 28-7 Rn, Rx, Ry обозначают любой из 16 регистров, MRF и MRB есть 80 битовый аккумулятор. Вертикальная линия обозначает опцию. Для примера, левая часть таблицы означает, что все эти команды должны быть выполнены Rn = Rx * Ry, MRF = Rx * Ry, и MRB = Rx * Ry. Другими словами, величины из любых двух регистров могут быть перемножены и помещены в другой регистр или в один из аккумуляторов с расширенной точностью. Эта таблица также показывает, что числа могут быть со знаком или без (S или U), могут быть дробными или целыми (F или I). Опции RND и SAT контролируют округление и переполнение.

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

После этого сравнения, какой вариант вы выберете? Здесь надо учесть некоторые вещи. Во-первых, посмотрите, сколько бит использует АЦП и ЦАП. Во многих приложениях 12-14 бит на отсчет есть граница выбора между фиксированной и плавающей точкой. На пример,  аудио и телевизионные сигналы обычно используют 8-битовые АЦП и ЦАП, и точность, которую обеспечивают числа с фиксированной точкой, приемлема. Для сравнения, профессиональные аудио приложения имеют отсчеты в 20 или 24 бита, и в этом случае, почти определенно, требуется использовать числа в формате с плавающей точкой для обеспечения большого динамического диапазона.

Следующая вещь, которую надо рассмотреть, – сложность выполняемого алгоритма. Если он относительно прост, то выбирайте числа с фиксированной точкой, если он сложен, то – с плавающей точкой. Например, FIR фильтр и другие виды обработки сигналов во временной области требуют всего несколько дюжин линий программного кода, что делает для них походящими числа с фиксированной точкой. В противоположность этому, алгоритмы в частотной области, такие как спектральный анализ и свертки БПФ, очень детализированы и более трудны при программировании. Они могут использовать и числа с фиксированной точкой, но использование чисел с плавающей точкой сильно уменьшит время отработки программы.

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

Рисунок 28-8 показывает некоторые главные тенденции в ЦСП. Рисунок (а) иллюстрирует распределение ЦСП на освоенном рынке. Здесь показаны приложения, которые используют микропроцессоры для прямого управления и контроля больших систем, таких как сотовая телефония, микроволновые печи и автомобильные инструментальные панели. Термин «микроконтроллер» часто используется для обозначения этих устройств, что бы отличить их от микропроцессоров, используемых в персональных компьютерах. Как показано в (а), около 38% освоенных устройств уже начали использовать ЦСП, и еще 49% полагают перейти на них. Высокая производительность и вычислительная мощь ЦСП делают их идеальным выбором для использования при создании устройств.

Как показано в (б), на сегодняшний день ЦСП с фиксированной точкой примерно в два раза больше используются, чем с плавающей точкой. Однако это сильно зависит от их применения. Фиксированная точка более популярна в конкурирующих пользовательских продуктах, где цена электроники должна сохраняться низкой. Хороший пример этому сотовые телефоны. Когда вы в условиях конкуренции продаете миллионы ваших изделий, разница в цене всего несколько долларов есть разница между успехом и провалом. Для сравнения, плавающая точка чаще используется тогда, когда важны более совершенные характеристики, чем цена. Для сравнения, предположим, что вы создаете медицинскую аппаратуру такую, как томограф. Едва ли только несколько сотен моделей могут быть проданы по цене несколько сотен тысяч долларов за каждую. Для этого приложения цена ЦСП не существенна, но его характеристики критичны. Несмотря на большое число ЦСП с фиксированной точкой, рынок ЦСП с плавающей точкой быстро увеличивает свою часть. Как показано в (с), более половины инженеров, использующих 16 битовые разработки, собираются перейти на плавающую точку в ближайшем будущем.

РИСУНОК 28-8

Главные тенденции в ЦСП. Как показано в (а), около 38% внедренных устройств уже перешло на с обычных микропроцессоров на ЦСП, и еще 49% собираются. В (b), примерно в два раза больше инженеров используют в ЦСП фиксированную точку, чем плавающую точку. Это, в основном, определяется продукцией, которая должна иметь небольшую цену. Однако, как показано в (c), использование плавающей точки быстро расширяется; более половины инженеров, постоянно использующих 16 битное оборудование, планируют использовать в ЦСП плавающую точку.

Перед тем, как покинуть этот раздел мы должны еще раз подчеркнуть, что числа с плавающей точкой и фиксированной точкой обычно используют 32 и 16 бит, соответственно, но не всегда. Например, семейство SHARC может представлять числа в формате с фиксированной точкой в 32 битовом виде, что принято в современных цифровых аудио приложениях. Это обеспечивает 232 уровней квантования, равномерно расположенных на промежутке относительно малой величины, скажем, от -1 до 1. Для сравнения, запись числа в формате с плавающей точкой расположит эти  уровни квантования (232) логарифмически на громадной величине - 3,41038. Поэтому 32 битовое число в формате с фиксированной точкой обеспечит лучшую точность, т.е. ошибка квантования для одного отсчета будет меньше. Однако, 32 битовое число в формате с плавающей точкой имеет более высокий динамический диапазон, т.е. больший уровень между самым маленьким и самым большим числом, которые могут быть представлены.

Сравнение языков программирования, С и ассемблера

При программировании ЦСП используются те же самые языки, что и в других научных и технических приложениях, обычно ассемблер или С. Программы, написанные на ассемблере, могут быстрее выполняться, но программы, написанные на С, легче в отработке и обслуживании. В обычных приложениях для универсальных и персональных компьютеров почти всегда выбирается С. Если и используется ассемблер, то его применение ограничивается короткими подпрограммами, которые должны выполняться как можно быстрее. Это показано на графике рисунка 28-9а; на каждого программиста, работающего с ассемблером, приходится примерно десяток, работающих в С.

Однако программы для ЦСП отличаются от обычных программных задач двумя важными аспектами. Первое, обычно программы должны быть короче, скажем сотня линий против десятков тысяч линий. Второе, скорость вычисления зачастую критична для этих приложений. Поэтому и предпочитают ЦСП из-за их очень высокой скорости. Эти два фактора и определяют выбор между С и ассемблером для программирования ЦСП. Как показано в (б) примерно равное число программистов ЦСП используют ассемблер и С.

Рисунок (с) показывает затраты. На каждый доллар, затраченный на программирование ЦСП в С, приходится два доллара, затраченных на программирование в ассемблере. Причина этого проста – деньги делаются победителем в конкурентной борьбе. С точки зрения чистых характеристик, таких как скорость вычисления и производственная цена, ассемблер почти всегда имеет преимущество перед С. Например, С код обычно требует больше памяти, чем ассемблер, что удорожает оборудование. Однако рынок ЦСП постоянно изменяется. С ростом рынка производители начинают оптимизировать ЦСП под С. Например, С более эффективен, когда в общей памяти имеется большой набор регистров для общих целей. В этом случае уменьшается разница во времени вычислений между С и ассемблером, и С может использоваться в большем числе приложений.

Для лучшего понимания этой дискуссии, давайте взглянем на типичную задачу программирования ЦСП на каждом языке. В качестве примера мы будем вычислять крошечный  результат (dot product) из двух областей x[ ] и y[ ]. Это будет простая математическая операция, мы будем перемножать каждый коэффициент из одной массива на соответствующий коэффициент из другого массива и суммировать результаты, т.е. x[0] .y[0] + x[1] y[1] + x[2]. y[2] + .... Это выглядит очень знакомо, это основные операции для FIR фильтра. Т.е., каждый отсчет выходного сигнала находится перемножением входного отсчета (одна область) на коэффициент фильтра (другая область) и суммированием результатов.

РИСУНОК 28-9

Сравнение языка С и ассемблера. Как показано в (а), только 10% программистов, работающих на персональных компьютерах и универсальных ЭВМ, используют ассемблер. Однако, как показано в (b), ассемблер более распространен в ЦСП, так как программы на нем выполняются быстрее и, обычно, короткие. Рисунок (с) показывает, что ассемблер больше распространен в более доходных изделиях.

Таблица 28-2 показывает, как этот результат вычисляется в программе, написанной на С. В линиях 001-004 мы определяем два массива x[ ] и y[ ] по 20 элементов. Мы также определяем result, переменную, в которой хранится единичный результат по завершению программы. Линия 011 контролирует 20 циклов вычислений, использую переменную n для контроля числа циклов. Внутри цикла имеется единственное выражение в линии 012, в котором перемножаются коэффициенты из двух массивов и результат аккумулируется в переменной s. (Если вы не сильны в С, то выражение + = x[n] * y[n]  означает тоже самое, что и = s + x[n] * y[n]). После цикла, величина s из аккумулятора передается в выходную величину result в линии 013.

ТАБЛИЦА 28-2

Крошечная программа на С. Перемножение и сохранение результата.

Основное преимущество использования языков высокого уровня (таких как С, Фортран, Бейсик) заключается в том, что программисту не требуется понимать архитектуру микропроцессора, знание архитектуры скрывается в компиляторе. Например, эта короткая программа на С использует несколько переменных: n, s, result и два массива x[ ] и y[ ]. Все эти величины должны где-то хранится в оборудовании. В зависимости от микропроцессора они могут храниться либо в регистрах общего назначения, либо в главной памяти, либо в специальных регистрах для частных операций. Однако человек, пишущий программу, знает мало или вовсе ничего не знает об управлении памятью; эта задача передается разработчику компилятора. Проблема в том, что эти два человека никогда не встречаются, они связаны только через набор заранее определенных правил. Языки высокого уровня легче, чем ассемблер потому, что вы половину работы передаете кому-то еще. Однако, они менее эффективны, так как вы не вполне уверены, как выполняется эта переданная работа.

Для сравнения, таблица 28-3 показывает, как эта крошечная программа записывается на ассемблере для SHARC ЦСП. Ассемблер для Analog Devices ЦСП (как для 16-битовой с фиксированной точкой, так и для 32-битовой архитектуры) известен своим простым алгебраическим синтаксисом. Заметьте, все соотнесено с аппаратурой; здесь нет абстрактных величин в коде, только данные регистров и области памяти.

Каждая точка с запятой представляет такт. Массивы x[ ] и y[ ] хранятся в кольцевых буферах главной памяти. В линиях 001 и 002 регистры i4 и i12 являются указателями на начало этих массивов. Далее мы вычисляем 20 циклов, контролируемых линией 004. Формат для этого выражения имеет преимущества в SYARC ЦСП благодаря возможности организации цикла с нулевым переполнением (zero-overhead looping). Другими словами, все переменные, необходимые для контроля цикла, содержатся в специальном регистре, который параллельно управляет другими операциями, идущими внутри микропроцессора. В этом случае, в регистр lcntr (контроль цикла) загружается вначале величина 20 и уменьшается на единицу каждый раз, когда цикл выполняется. Цикл завершается, когда lcntr  достигает нуля (определяется выражением: lce – “loop counter expired” – счетчик цикла обнулился). Цикл содержится в линиях от 004 до 008. контролируемых выражением (pc,4). Т.е. цикл заканчивается через четыре линии после текущего программного счета.

001           i12 = _y;                                         /* i12 указатель на начало массива y[ ] */

002           i4 = _x;                                           /* i4 указатель на начало массива x[ ] */

003

004           lcntr = 20, do (pc,4) until lce;        /* 20 циклов по входному массиву */

005              f2 = dm(i4,m6);                           /* загрузка x[ ] в регистр f2 */

006              f4 = pm(i12,m14);                       /* загрузка y[ ] в регистр f4 */

007              f8 = f2*f4;                                   /* перемножение, хранение в f8 */

008              f12 = f8 + f12;                             /* суммирование в аккумулятор f12 */

009

010          dm(_result) = f12;                           /* запись аккумулятора в память */

ТАБЛИЦА 28-3

Крошечная программа на ассемблере (не оптимизированная). Код ассемблера соответствует SHARC ЦСП Analog Devices. Объяснения смотрите в тексте.

Внутри цикла в линии 005 загружается величина из x[ ] в регистр данных f2, в то время, как в линии 006 загружается величина y[ ] в регистр данных f4. Символы “dm’ “pm” означают, что величины поступают по шине «данных памяти» (data memory) и шине «программной памяти» (program memory), соответственно. Переменные i4, m6, i12 и m14 являются регистрами генерирующие адреса, которые управляют кольцевыми буферами с массивами x[ ] и y[ ]. Две величины в f2 и f4 перемножаются (линия 007) и результат сохраняется в регистре f8. В линии 008 результат из f8 суммируется в аккумуляторе, регистре данных f12. После завершения цикла, значение из аккумулятора f12 передается в память.

001         i12 = _y;                                                           /* i12 указатель на начало массива y[ ] */

002         i4 = _x;                                                             /* i4 указатель на начало массиваx[ ] */

003

004         f2 = dm(i4,m6), f4 = pm(i12,m14)                   /* первичные регистры */

005         f8 = f2*f4, f2 = dm(i4,m6), f4 = pm(i12,m14);

006

007         lcntr = 18, do (pc,1) until lce;                           /* высокоэффективный главный цикл */

008         f12 = f8 + f12, f8 = f2*f4, f2 = dm(i4,m6), f4 = pm(i12,m14);

009

010         f12 = f8 + f12, f8 = f2*f4;                                /* завершение цикла */

011         f12 = f8 + f12;

012

013        dm(_result) = f12;                                              /* хранение результатов в памяти */

ТАБЛИЦА 28-4

Крошечная программа на ассемблере (оптимизирована). Это оптимизированная версия программы из таблицы 28-2, использующая высокую параллельность SHARC архитектуры

Эта программа правильно вычисляет этот крошечный результат, но не обладает преимуществом параллельной SHARC архитектуры. Таблица 28-4 показывает эту же программу, но написанную в оптимизированной форме, где многие операции выполняются в параллель. Во-первых, заметим, что линия 007 вычисляет только 18 циклов вместо 20. Также заметим, что этот цикл содержит только одну линию (008), но эта линия содержит составную инструкцию. Смысл заключается в том, что для достижения наибольшей эффективности эта линия выполняется за один такт. Что бы это выполнить, нам необходимо иметь маленькую сумму кода в «главных» регистрах на первом цикле (линии 004 и 005) и другую маленькую секцию кода для завершения последнего цикла (линии 010 и 011).

Что бы понять, как это работает, изучите линии 008, в которой только одно предложение внутри цикла. В этом одном предложении четыре операции выполняются параллельно: (1) величина из x[ ] перемещается из кольцевого буфера в программную память и располагается в f2; (2) величина из y[ ] перемещается из кольцевого буфера память данных и располагается в f4; (3) предыдущие величины из f2 и f4 перемножаются и располагаются в f8; и (4) предыдущая величина из f8 складывается в аккумулятор f12.

Например, при пятом вычислении линии 008 x[7] и y[8] извлекаются из памяти и запасаются в f2 и f4. В то же самое время величины x[6] и y[6] (которые были в f2 и f4 в начале этого цикла) перемножаются и размещаются в f8. В добавление, величина x[5]  y[5] (которая была в f8 в начале этого цикла) суммируется с величиной f12.

Давайте сравним число тактов, необходимое для неоптимизированной и оптимизированной программы. Имейте в виду, что имеется 20 циклов с четырьмя операциями в каждом цикле. Неоптимизированная программа требует 80 тактов для выполнения действий внутри всех циклов плюс 5 сверх того, всего 85 тактов. Оптимизированная программа выполняет 18 циклов за 18 тактов, но требует дополнительно 11 тактов для первого регистра и последнего цикла. Всего 29 тактов, или в три раза быстрее, чем грубый силовой метод.

Здесь возникает большой вопрос. Насколько быстро выполняется программа, написанная на С, относительно программы, написанной на ассемблере? Когда программа из таблицы 28-2 откомпилирована, ее исполнимый код соответствует по своей эффективности коду на ассемблере? Да, компиляция создает эффективный код. Однако важно понимать, что этот кусок программы очень простой пример. Компиляция с большим трудом создает оптимизированный код для более сложной программы, когда имеется несколько циклических операторов или осуществляется случайное (эрратическое) подключение подпрограмм. Если вы делаете что-нибудь простое, то компиляция, скорее всего, создаст код близкий к оптимальному. Если вы делаете что-нибудь изощренное и сложное, то ожидайте, что программа, написанная на ассемблере, будет выполняться значительно быстрее, чем программа, написанная на С. В самом худшем случае в 2-3 раза. Как отмечалось выше, эффективность С по сравнению с ассемблером определяется, в основном, на практике используемым типом ЦСП. Архитектура ЦСП с плавающей точкой  позволяет, в основном, программировать на языках высокого уровня, таких как С, более эффективно, чем архитектура ЦСП с фиксированной точкой. Конечно, большое значение имеют инструментальные средства по отладке программы, которые помогают вам понять, как разница в длине кодового сегмента влияет на вычисления.

Вы можете также воспользоваться наилучшим решением: написать программу на С, а на ассемблере только критические части этой программы, которые должны наиболее быстро вычисляться. Это одна причина, почему С так популярен среди ученых и инженеров. С используется как язык высокого уровня, но, при желании, позволяет также непосредственно манипулировать с оборудованием. Даже если вы намереваетесь программировать только на С, вам, возможно, понадобятся некоторые знания архитектуры ЦСП и набор инструкций на ассемблере. Например, взгляните на линии 002 и 003 в таблице 28-2, программы на С. “dm” означает, что x[ ] хранится в памяти данных, “pm” свидетельствует, что y[ ] – в программной памяти. Даже хотя, программа написана на языке высокого уровня, еще требуются базовые знания «железа» для его лучшего использования.

ТАБЛИЦА 28-10

Сравнение С и ассемблера. Программы на С более гибкие и быстрее отрабатываются. Программы на ассемблере часто имеют более высокое качество функционирования: быстрее выполняются и используют меньше памяти, что уменьшает цену.

Какой язык лучше для вашего приложения? Это зависит от того, что для вас наиболее важно. Если вам необходима гибкость и быстрая разработка, выбирайте С. С другой стороны, используйте ассемблер, когда вам нужны наилучшие характеристики. Рисунок 28-10 иллюстрирует этот выбор. Приведем некоторые моменты, которые вам необходимо учитывать.

  •  Насколько сложна программа? Если она большая и запутанная, вы, возможно, захотите использовать С. Если она маленькая и простая, ассемблер может быть хорошим выбором.
  •  Вы добиваетесь максимальной скорости от ЦСП? Если да, то ассемблер – последняя точка в характеристике проекта. При меньших запросах приложения, ассемблер имеет меньшие преимущества, и вы должны считаться с возможностью использования С.
  •  Как много программистов будут работать вместе? Если проект достаточно велик для одного программиста, то склоняйте свой выбор к С, используя ассемблер только для критических сегментов программы.
  •  Что более важно, цена готового продукта или цена отработки? Если цена готового продукта, то выбирайте ассемблер. Если цена отработки – С.
  •  Какова ваша подготовка? Если вы имеете опыт в ассемблере (на другом микропроцессоре) выбирайте ассемблер. Если вы до этого работали с С, выбирайте С для вашего ЦСП.
  •  Что советует производитель ЦСП?

Это последнее замечание очень важно. Предположим, вы спросите производителя ЦСП, какой язык использовать, и он вам скажет: «СИ или ассемблер, но мы вам рекомендуем СИ». Вам лучше последовать их совету! То, что он сказал, реально звучит так: «Наш ЦСП так труден для программирования на ассемблере, что Вам понадобится 6 месяцев, чтобы научиться использовать его». С другой стороны, некоторые ЦСП легче программировать на ассемблере. На пример, Продукция Analog Devices относится к этой категории. Как говорят их инженеры, они очень горды этим.

Наиболее полезная дискуссия о ЦСП и их программировании – разговор с инженерами, использующих их. Расспросите производителей о компаниях, использующих их продукцию, или поищите в сети. Не смущайтесь, инженеры любят высказывать свое мнение о продукции, которую они используют. Они будут польщены, что вы их спрашиваете.

Насколько быстры ЦСП?

Первая причина использования ЦСП вместо обычных микропроцессоров есть скорость, способность передать отсчет в оборудование, выполнить необходимые математические операции и выдать полученные данные. Это ставит вопрос: как быстры ЦСП? Обычный ответ на этот вопрос – эталонное тестирование (benchmarks), метод выражающий скорость микропроцессора в виде числа. Например, системы с фиксированной точкой часто дают скорость в MIPS (миллион целочисленных операций в секунду – million integer operations per second). Подобно этому системы с плавающей точкой могут быть характеризованы MFLOPS (million floating point operations per second – миллион операций с плавающей точкой в секунду).

Сто пятьдесят лет назад премьер-министр Великобритании Бенджамин Дизраэли заявил, что имеется три вида лжи: ложь, клевета (damn lies) и статистика. Если бы он жил сегодня и работал с микропроцессорами, то он добавил бы четвертую категорию – эталонное тестирование. Идея эталонного тестирование - сравнение одного устройства с другим. К несчастью, это не удается на практике, так как микропроцессоры имеют преимущества в различных областях. Представьте вопрос, какой автомобиль лучше Кадиллак или Феррари? Ответ зависти оттого, что вы от него хотите.

Конфуз с эталонным тестированием отягчается конкуренцией в электронной промышленности. Производители хотят показать свою продукцию в лучшем свете, и они будут использовать любую двусмысленность в тестировании, чтобы показать свои преимущества. Есть старая шутка в электронике: «тот, кто пишет спецификацию, может получить от прибора в два раза лучшие характеристики, чем инженер». Эти люди не лгут, им платят за создание хорошего образа. Эталонное тестирование должно рассматриваться как инструмент для сложных задач. Если у вас нет опыта в использовании этого инструмента, вы можете прийти к ошибочному заключению. Наилучший подход – рассматривать специально скорость вычисления для тех алгоритмов, которые вы планируете использовать. На пример, если ваше приложение есть FIR  фильтр, принимайте во внимание точное число тактов, которое необходимо для выполнения этой частной задачи.

Используя этот подход, давайте рассмотрим время, необходимое для вычисления различных алгоритмов в ЦСП семейства SHARC фирмы Analog Devices. Имейте  в виду, что скорость микропроцессоров удваивается каждые три года. Это означает, что вы должны уделить особое внимание методу, который мы будем использовать в этом примере. Реальные числа всегда изменяются, и вам необходимо повторять вычисления каждый раз, когда вы начинаете новый проект. В мире технологий двадцать первого века достаточно одного мига чтобы устареть.

РИСУНОК  28-11.

Скорость ЦСП. Производительность частного алгоритма ЦСП может быть найдена делением тактовой частоты на требуемое число тактов на отсчет. Эта иллюстрация показывает уровень производительности для четырех распространенных алгоритмов, вычисляемых SHARC ЦСП с тактовой частотой 40 МГц.

Когда приходит понимание времени вычислений, то ЦСП семейства SHARC оказываются самыми подходящими для работы. Это потому, что они выполняют операцию перемножение-сложение за один такт. Большинство FIR фильтров используют от 25 до 400 коэффициентов, соответственно, понадобится от 25 до 400 тактов на каждый отсчет процесса. Как описывалось выше, требуется еще добавочное количество тактов для организации циклов (начало первого цикла и завершение последнего), но эта добавка незначительна, когда количество циклов велико. Для определения производительности этого алгоритма, мы должны разделить тактовую частоту (40 МГц для нашего примера) на количество тактов, необходимых для вычисления одного отсчета. Мы получим максимальный уровень этого FIR алгоритма от 100 000 до 1 600 000 отсчетов в секунду. Не может быть вычислений проще этого! Производительность этого алгоритма (FIR фильтра) показана на рисунке 28-11.

Также легки вычисления для рекурсивных фильтров. Типичный IIR фильтр использует от 5 до 17 коэффициентов. Хотя цикл относительно короток, мы будем добавлять некоторое количество тактов, скажем 3 на отсчет. В результате понадобится от 8 до 20 тактов для вычисления отсчета. При 40 МГц тактовой частоты максимальная производительность составит от 1 800 000 до 3 100 000 отсчетов/секунду. Эта величина для IIR фильтра также показана на рисунке 28-11.

Теперь мы займемся частотной областью, базирующейся на быстром преобразовании Фурье. Подпрограммы БПФ почти всегда предусматриваются производителями ЦСП. Они пишутся на ассемблере и хорошо оптимизированы. В спецификации на ADSP-21062 (SHARC архитектуры) указано, что 1024 комплексных отсчетов БПФ требуют 18 221 тактов или 0,46 миллисекунд при тактовой частоте 40 МГц. Эту производительность лучше всего рассматривать как 17,8 тактов на отсчет. Эта величина «на отсчет» незначительно меняется с удлинением или укорочением БПФ. Например, БПФ с 256 отсчетами требует около 14,2 такта на отсчет, а БПФ с 4096 отсчетами – 21,4 такта на отсчет. БПФ с действительными числами вычисляется на 40 % быстрее, чем БПФ с комплексными числами. Таким образом, все виды БПФ требуют, примерно, от 10 до 20 тактов на отсчет, соответственно производительность составляет от 1 800 000 до 3 300 000 отсчетов в секунду.

Самый быстрый путь создания FIR фильтра – использовать свертку БПФ. В типичном случае берется сегмент из 512 входных отсчетов, добавляются 512 нулей и свертываются в частотный спектр, используя 1024 точечное БПФ. После перемножения этого спектра на желательный частотный отклик, используется 1024 точечное инверсное БПФ для возвращения во временную область. Полученные 1024 точки комбинируются с соседними сегментами методом наложения. Это производит 512 точек в выходном сигнале.

Как много тактов требуется для этого? Каждый сегмент в 512 отсчетов требует два БПФ по 1024 точки, плюс небольшая добавка. Округленно, это в пять раз больше, чем простое БПФ с 512 точками. В то время, как БПФ с действительными числами требует около 12 тактов на отсчет, БПФ свертка может быть выполнена, примерно, за 60 тактов на отсчет. Для 2106х SHARC ЦСП с тактовой частотой 40 МГц, это будет соответствовать производительности, приблизительно, 660 000 отсчетов в секунду.

Заметим, что это примерно то же самое, как и выполнение FIR фильтра с 60 коэффициентами с помощью соответствующей свертки. Другими словами, если FIR фильтр имеет меньше 60 коэффициентов, он будет быстрее работать при использовании стандартной свертки. Если он имеет больше 60 коэффициентов – при использовании БПФ свертки. Основное преимущество БПФ свертки заключается в том, что время вычисления возрастает пропорционально, всего лишь, логарифму от числа коэффициентов. Например, 4096 точечное фильтровое ядро требует только на 30 % больше вычислений, чем 512 точечное.

БПФ свертка может применяться в двухмерных случаях, таких как обработка изображений. Например, мы хотим обработать картинку 800600 пикселей в частотной области. Сначала добавим к картинке нули, сделав ее 10241024. Двумерный спектр вычисляется затем применением БПФ для каждой строки с последующим применением БПФ для каждой результирующий колонки. После перемножения этого 10241024 спектра на соответствующий частотный отклик используется двумерное обратное БПФ. Оно выполняется для каждой строки, а затем для каждой результирующей колонки. Сложив количество тактов, и разделив их на число отсчетов, мы найдем, что процедура приближенно требует 150 тактов на пиксель. Для 40 МГц ADSP-2106 это соответствует производительности около 260 000 отсчетов в секунду.

Сравнивая эти различные технические решения, показанные на рисунке 28-11, мы можем сделать важное наблюдение. Примерно все ЦСП требуют от 4 до 400 инструкций (тактов для семейства  SHARC) на вычисление. Для семейства ЦСП SHARC-архитектуры с тактовой частотой 40 МГц мы можем немедленно сделать заключение, что их производительность лежит от 100 000 до 10 000 000 отсчетов в секунду в зависимости от сложности алгоритма.

Теперь, когда мы поняли, как быстро ЦСП может обрабатывать цифровой сигнал, давайте посмотрим на проблему с другой стороны, какая нам требуется скорость обработки? Конечно, это зависит от конкретного приложения. Мы будем рассматривать два наиболее распространенных случая: обработку аудио и видео сигналов.

Производительность, необходимая для аудио сигналов, зависит от требований к качеству воспроизведения звука. Наиболее низкие требования в телефонии, где для передачи речи требуется полоса частот от100 Гц до 3,2 КГц, что определяет темп отсчетов около 8 отсчетов в секунду. Для сравнения, высокоточное воспроизведение музыки (high fidelity) должно использовать весь диапазон частот чувствительности человеческого уха – от 20 Гц до 20 КГц.  В обоих звуковых каналов Hi-Fi звуковой аппаратуры часто используется отсчетный уровень 44,1 КГц, что требует 88 200 отсчетов в секунду. Может ли SHARC семейство обеспечить эти требования? Как показано на рисунке 28-11, это может быть легко выполнено или для Hi-Fi аудио, или для одновременной обработки дюжины голосовых сигналов.

Видеосигналы – другая история; они требует в тысячу раз выше производительность. Хороший пример низкого качества видео - стандарт CIF (Common Interface Format) для телевидения. Он использует 352288 пикселей с тремя цветами на пиксель и 30 кадрами в секунду, что соответствует 9,1 миллиону отсчетов в секунду. Высокое качество требует HDTV (high-definition television), которое использует 19201080 пикселей с тремя цветами на пиксель и 30 кадров в секунду. Это требует производительность около 186 миллионов отсчетов в секунду. Эта производительность выше возможностей ЦСП с SHARC-архитектурой, как показано на рисунке 28-11. Имеются и другие приложения, которые также требуют очень высокую производительность, например, радары, сонары и военная техника такая, как управление ракетами.

Для решения этих высоко производительных задач несколько ЦСП могут составить сигнальную систему. Такая система называется многопроцессорной или система с параллельной обработкой. SHARC семейство ЦСП обеспечивает такую возможность. Например, нет правил подключения к шине нескольких SHARC ЦСП, так как все шины заняты логикой разрешения внутренних конфликтов. В качестве альтернативы используются линк порты (4 бита в параллель) для подключения различными способами нескольких ЦСП. Рисунок 28-12 показывает типичные схемы микропроцессорных систем. В (а) последовательное включение, каждый процессор является одним каскадом в «агрегатной линии». В (б) процессоры взаимодействуют через одну, совместно используемую, общую память с доступом к ней через параллельную шину (т.е. внешний порт). Рисунок 28-13 показывает другую возможность подключения большого числа процессоров в сигнальную систему – через двумерную (2D) или трехмерную (3D) «решетку». Каждая эта конфигурация обладает относительными преимуществами и недостатками с точки зрения конкретных задач.

РИСУНОК 28-12

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

(а) – многопроцессорный поток данных

(б) – кластер (многопроцессорная группа)

BULK  MEMORY – массивная память

Что бы облегчить жизнь программистов, SHARC семейство использует объединенное адресное пространство. Это означает, что 4 000 000 слов адресного пространства, доступного через 32 битную адресную шину, разделено между различными процессорами, работающими вместе. Передача данных от одного процессора к другому заключается просто в считывании или записи из соответствующего места памяти. Внутренняя логика SHARC процессоров обеспечивает во время покоя передачу данных между процессорами с такой высокой скоростью, как 240 мегабит в секунду (при тактовой частоте 40 МГц).

РИСУНОК 28-13

Многопроцессорная «решетчатая» конфигурация. Применяется в радарах, эффективно объединяет большое число процессоров в двумерный или трехмерный массив.

Рынок цифровых сигнальных процессоров

Рынок ЦСП очень большой и быстро растет. Как показано на рисунке 28-14 он достигнет около 8-10 биллионов долларов в год к концу столетия и растет на 30-40 % каждый год. Это обеспечивается непрерывными запросами по улучшению и удешевлению потребительских товаров таких, как сотовые телефоны, мультимедийные компьютеры, и высококачественное воспроизведение музыки. Эти высокодоходные приложения формируют рынок, в то время как менее доходная область, как научное оборудование, всего лишь оседлала волну технологий.

РИСУНОК 28-14

Рынок ЦСП. К концу столетия рынок ЦСП достигнет оборота в 80 биллион долларов, и он расширяется каждый год на 30-40%.

ЦСП могут покупаться в трех формах, как ядро, как процессор, и как плата. В ЦСП термин «ядро» означает секцию вычислителя, где выполняются ключевые операции, включая регистры данных, умножитель, АЛУ, генератор адреса и программной последовательности. Процессор требует ядра с памятью и интерфейс для обмена с внешними устройствами. Хотя ядро и периферия разрабатываются отдельно, они выполняются на одном куске кремния, как процессор одной интегральной схемы.

Предположим, вы разрабатываете сотовые телефоны и хотите включить в схему ЦСП. Вы, возможно, захотите использовать ЦСП как процессор («чип»), содержащий ядро, память и другие внутренние устройства. Например, ADSP-21060 имеет размер 35354 мм. Включая эту интегральную схему в ваш продукт, вы разрабатываете печатную плату, которая будет использоваться в ваших последующих разработках. Это наиболее общепринятый путь использования ЦСП.

Теперь предположим, что вы работаете в компании, которая занимается разработкой собственных интегральных схем. В этом случае вы можете захотеть использовать не целый процессор, но только ядро. После завершения соответствующего лицензионного соглашения, вы можете приступить к разработке чипа наиболее подходящего к вашему конкретному приложению. Это дает вам гибкость в выборе количества памяти, передачи данных, упаковки и т.д. Пользовательские устройства такого типа составляют все больший и больший сегмент рынка ЦСП.

Наконец, имеется несколько дюжин компаний, которые будут продавать вам ЦСП уже установленными на печатную плату. Эти платы имеют такие характеристики, как очень большую память, преобразователи переменного тока в постоянный (A/D) и наоборот (D/A), EPROM разъемы, несколько процессоров на одной плате и т.д. Некоторые из этих плат используются как автономные одиночные компьютеры, но большинство вставляются в персональные компьютеры. Компании, которые выпускают такого типа платы, называются производителями третьей части (Third Party Developers). Лучшая возможность их найти – обратиться к производителю ЦСП, который вы хотите использовать. Посмотрите его веб-страничку; если вы не найдете там перечня, сделайте запрос по электронной почте. Они будут более чем счастливы рассказать вам, кто использует их продукцию и как с ним связаться.

На сегодняшний день (1998) на рынке ЦСП доминируют четыре компании. Здесь приведен их список и обозначение их продукции.

Analog Devices (www.analog.com/dsp)

ADSP-21xx 16 bit, fixed point

ADSP-21xxx 32 bit, floating and fixed point

Lucent Technologies (www.lucent.com)

DSP16xxx 16 bit fixed point

DSP32xx 32 bit floating point

Motorola (www.mot.com)

DSP561xx 16 bit fixed point

DSP560xx 24 bit, fixed point

DSP96002 32 bit, floating point

Texas Instruments (www.ti.com)

TMS320Cxx 16 bit fixed point

TMS320Cxx 32 bit floating point

Имейте в виду, что нет четкой границы между ЦСП и другими микропроцессорами. Например, посмотрите, как Intel описывает MMX технологию, которая включена в процессор Pentium:

Инженеры Intel добавили 57 мощных новых инструкций, специально созданных для эффективной работы с аудио и графическими данными. Эти инструкции ориентированы на высокую параллельность, повторяющуюся последовательность, часто требующуюся для мультимедийных приложений.

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

Как удержаться в этой быстро меняющейся области? Наилучший путь – читать торговые журналы, в которых представлен рынок ЦСП, такие как EDN (Electronic Design News, www.ednmag.com) и  ECN (Electronic Component News, www.ecnmag.com). Они свободно распространяются и содержат обновляющуюся информацию, где и что делается. Торговые журналы «обязательное чтение» для тех, кто серьезно изучает эту область. Вам желательно также побывать на страничках электронной почты нескольких производителей ЦСП. Это позволит вам ознакомится с новыми сообщениями, ценами и другими предложениями, такими как свободно распространяемыми программами, вычислительным оборудованием с низкой ценой. Некоторые производители также рассылают последнюю информацию о своей продукции. Например, Analog Devices публикует журнал Analog Dialogue четыре раза в год, в котором содержатся статьи и информация по текущим темам в мире сигнальных процессоров. Ко всем этим источникам и ко многим другим можно получить доступ через Интернет. Начните с исследования сайтов производителей, а затем пошлите им по электронной почте запрос об интересующей вас информации.


Глава

28




1. ТЕМА 1 пот пт 2 пот ср Вводная
2. Участок для разборки, дефектоскопирования и сборк
3. Тема- Антивирусная защита Цель- Изучить методы обнаружения компьютерных вирусов и способы защиты от них
4. 30 Морозов Иван Сергеевич 132283132 Афонасов Никита Николаевич 132263132 Миньков Максим Сергеевич 1322635 Воробьё
5. А~ылой м~денитарихи процесті ал~а жылжытады деп ~арастыр~ан метафизикалы~ рационалды~ т~жырым жасаушы
6. Возрастные особенности подготовки в избранном виде спорта для группы специальностей 050108 Физическая к
7. Тема- Стилістичні можливості простого речення
8. Высшие органы управления РФ
9.  ТЕОРЕТИЧЕСКИЕ ОСНОВЫ НЕВЕРБАЛЬНОГО ОБЩЕНИЯ 1
10. Помпей Магн - римский полководец