Анализ ядер MIPS32 M4K, Cortex-M3 и C28x как решений для цифровой обработки сигналов
Традиционно для приложений цифровой обработки сигналов (DSP) используются цифровые сигнальные процессоры, построенные на базе специализированной архитектуры, позволяющей добиться высокой производительности системы. В последнее время все чаще производители микроконтроллеров, снабдив свои решения дополнительным функционалом и увеличив тактовые частоты, рекомендуют их для DSP-приложений, хотя изначально микроконтроллеры предназначены для задач управления. В настоящей статье делается попытка проанализировать микроконтроллерные ядра Cortex-M3 и MIPS32 M4K с точки зрения способности их выполнять задачи цифровой обработки сигналов, а также произвести их сравнение с традиционным DSP-ядром C28x компании Texas Instruments.
Ядро MIPS32 M4K
Ядро M4K является представителем 32-разрядного семейства процессорных ядер компании MIPS Technologies. Эти ядра рекомендуются производителем для множества задач, начиная от встраиваемых приложений реального времени и заканчивая высокопроизводительными системами с функциями цифровой обработки. Ядро M4K является самым миниатюрным по занимаемой площади на кристалле и самым экономичным по энергопотреблению ядром компании MIPS. На базе ядра M4K построены, например, микроконтроллеры семейства PIC32 компании Microchip.
Ядро Cortex-M3
Ядро Cortex-M3 разработано компанией ARM, решения которой хорошо известны всем разработчикам. Cortex-M3 представляет собой первое ядро, построенное по архитектуре ARMv7-M и рекомендуется для приложений, в число которых входят промышленные системы управления и беспроводные сети. На базе этого ядра построены микроконтроллеры STM32 компании STMicroelectronics.
Ядро С28x
С28x представляет собой 32-разрядное ядро для недорогих приложений цифровой обработки сигналов. Построено на основе архитектуры с сокращенным набором команд (RISC). На базе этого ядра построены цифровые сигнальные контроллеры TMS320F28xx компании Texas Instruments. Контроллеры, а не процессоры, потому что TMS320F28xx обладают периферийными устройствами, присущими микроконтроллерам.
Методы анализа
Существует огромное количество методов для сравнения и анализа микроконтроллеров и цифровых сигнальных процессоров. Самые простые из них заключаются в простом сравнении тактовых частот, объемов памяти. В более сложных методах анализируется число определенных операций (в нашем случае это может быть умножение, сложение), выполняемых в единицу времени. Самые сложные, и, скорее всего, наиболее корректные, базируются на сравнении скорости выполнения алгоритмов, таких как быстрое преобразование Фурье, КИХ- и БИХ-фильтрация, свертка и т. д. Также существуют стандартные синтезированные алгоритмы для определения производительности ядра, например, Dhrystone. Очень часто возникает ситуация, при которой ядро «выйдет победителем» согласно одному методу и «потерпит поражение» согласно другому.
В этой статье мы не будем придерживаться ни одного из методов, а просто рассмотрим, что есть у каждого из ядер для решения задач цифровой обработки сигналов.
Умножение
Одна из основных задач DSP-приложения состоит в осуществлении большого объема математических вычислений в реальном времени. Основными операциями в этом случае являются: умножение, умножение с накоплением (MAC), сложение и разность, а также операции пересылки операндов и результата между памятью и вычислительными модулями.
Ядро M4K содержит умножитель-делитель с отдельным конвейером (MDU), который функционирует параллельно с основным конвейером и во время останова основного продолжает работать. Умножитель поддерживает операции со знаком и без знака, среди которых умножение, умножение с накоплением (MAC) и деление. Эти операции входят в состав системы команд MIPS32 Release 2 ISA. Когда такая команда попадает в конвейер, она передается в MDU для выполнения, а команда, следующая за ней (не MDU-команда), продолжает перемещаться через конвейер без задержек. Исключение составляют команды, следующие за MDU-командами и использующие результат этих MDU-команд. MDU способен выполнять операции умножения 32×16 бит (с накоплением и без) за один цикл. Ядро Cortex-M3 выполняет операцию 32×32 бит за один цикл, хотя более ранние версии ARM7TDMI этого не могут.
Умножитель ядра C28 может выполнять две операции 16×16 бит с 32-разрядным результатом или одну 32×32 бит с 64-разрядным результатом за один цикл. Две операции 32×32 бит в случае необходимости совмещаются для выполнения операции 64×64 = 128 бит.
При сложении больших массивов данных может произойти переполнение регистра результата, или так называемое насыщение. При этом в результате сложения двух положительных чисел получается отрицательный результат, а двух отрицательных — положительный. Также, при перемножении больших массивов данных, важно организовать округление результата умножения, например, 16×16 бит до шестнадцати бит. Ни в M4K, ни в Cortex-M3 эти функции аппаратно не поддерживаются. Несмотря на то, что существуют программные библиотеки этих функций, облегчающие разработку DSP-алгоритмов, производительность ядра будет ограничена. Ядро C28x поддерживает эти операции аппаратно.
Конвейер
Конвейер позволяет организовать параллельную обработку очереди из нескольких команд. В ходе этой обработки команда проверяется на правильность, генерируются адреса и подкачиваются необходимые операнды для ее выполнения и т. д. Естественно, без конвейера на выполнение этих операций ядру пришлось бы затратить много циклов тактовой частоты. Но организовывать длинный конвейер тоже не всегда правильно, так как в случае команды перехода, возникновения прерывания, содержание конвейера теряет ценность, и все его фазы командам, начинающимся с адреса перехода, нужно проходить заново. Исходя из этого, для приложений управления, характеризующихся большим количеством команд перехода и частыми прерываниями, конвейер не должен быть длинным — обычно он состоит из трех уровней. Для приложений цифровой обработки сигналов, в которых программный код в основном выполняется последовательно, длинный конвейер позволяет увеличить производительность системы.
Самым коротким конвейером из рассматриваемых ядер обладает Cortex-M3. Конвейер ядра Cortex-M3 содержит всего три уровня: выборка, декодирование, выполнение команды. Стоит отметить, что чем короче конвейер, тем меньше энергопотребление и площадь ядра на кристалле, и тем выше эффективность компилятора. Но для приложений цифровой обработки сигналов использование короткого конвейера ограничивает максимальную производительность.
Ядро M4K содержит 5-уровневый конвейер ядра, а также отдельный конвейер умножителя-делителя, о котором шла речь ранее.
Теперь рассмотрим подробнее конвейер специализированного DSP-ядра C28x, состоящий из восьми уровней (табл. 1). Благодаря конвейеру ядро C28x может обрабатывать одновременно восемь команд, в результате чего в момент выполнения вычислительным модулям доступны все необходимые операнды. А после выполнения (при необходимости) результаты вычислений сохраняются в памяти, о чем тоже «заботится» конвейер. Благодаря такому конвейеру становится возможным в каждый момент времени выполнять команды, которые без конвейера обрабатывались бы за несколько тактов ядра.
При реализации DSP-алгоритмов очень часто используются внутренние циклы. Такие циклы содержат относительно небольшое количество команд, которые чаще являются командами ветвления. Для увеличения производительности в DSP-процессорах используются специальные аппаратные функции для реализации внутренних циклов. В M4K и Cortex-M3, как и в большинстве процессоров общего назначения, таких аппаратных функций нет. Каждое ветвление занимает два цикла тактовой частоты, что сказывается на скорости выполнения DSP-алгоритмов.
Система памяти
Приложения цифровой обработки сигналов отличаются тем, что обрабатывают большие массивы данных, для сохранения которых требуется большой объем памяти. Кроме того, при реализации DSP-алгоритмов реального времени требуется высокая вычислительная производительность. Очень часто выполняются математические операции с двумя операндами. В этом случае важна способность процессора передавать операнды и результат операции в память и из памяти с необходимой скоростью. В традиционных DSP-процессорах это достигается за счет раздельных шин команд и данных. В этом случае возможно за один цикл тактовой частоты выполнить передачу команды и операнда. В высокопроизводительных DSP-процессорах может использоваться до двух шин данных и отдельной шины команд.
Все рассматриваемые ядра — Cortex-M3, M4K и C28x — построены на основе гарвардской архитектуры памяти с раздельными шинами команд и данных.
Ядро C28x содержит три шины для работы с памятью: шина чтения из памяти программ, шина чтения из памяти данных ишина записи памяти программ-данных. Благодаря такой архитектуре ядро C28x может одновременно читать из памяти программ, читать из памяти данных и писать в память данных.
Специализированные команды
В приложениях цифровой обработки сигналов чаще всего используются команды умножения (с накоплением или без) и сложения. Многие DSP-ядра аппаратно поддерживают команды подсчета количества старших нулевых битов (CLZ) и единичных битов (CLO) внутри 32-разрядного слова. Эти команды широко используются при реализации кодеков с переменной длиной кодируемого слова. Из рассматриваемых ядер эти команды поддерживают C28x и M4K.
Выводы
Естественно, все аспекты выбора ядра для приложений цифровой обработки охватить очень сложно, особенно если доступны решения на базе разных архитектур. Если приложение представляет собой, по сути, систему управления с элементами цифровой обработки сигналов, естественно, специализированный DSP-процессор будет излишним, приведет к высокому энергопотреблению (за счет разветвленной системы шин памяти) и стоимости системы, а такие его особенности, как длинный конвейер команд, будут, напротив, помехой при компиляции. В этом случае стоит обратить внимание на такие ядра, как Cortex-M3 и M4K (в зависимости от сложности цифровой обработки в приложении). И наоборот, даже при относительно низкой тактовой частоте (150 МГц C28x против 228 МГц M4K), ядро C28x вне конкуренции при реализации чистых DSP-алгоритмов — с большим числом умножений и сложений (32×32 бит C28x против 32×16 бит M4K за один цикл) и использованием специализированных команд (CLO, CLZ).
Литература
- An Independent Analysis of the: MIPS Technologies MIPS32 M4K Synthesizable Processor Core. Berkeley Design Technology, Inc.
- TMS320C28x DSP CPU and Instruction Set Reference Guide (SPRU430D). Texas Instruments, Inc.
- Cortex-M3 Technical Reference Manual. ARM Limited.
- PIC32MX Family Data Sheet. Microchip Technology Inc.
- MIPS32 4K Processor Core Family Integrator’s Manual. MIPS Technologies.