В следующих разделах описываются проблемы, которые часто возникают при нацеливании на проект с фиксированной точкой для использования на встраиваемом процессоре, такие как некоторые общие допущения о целочисленных размерах и операциях, доступных на встраиваемых процессорах. Эти допущения приводят к проблемам проекта и правилам проектирования, которые могут быть полезны для определенного проекта с фиксированной точкой.
Встраиваемые процессоры обычно характеризуются определенным размером бита. Для примера распространены термины «8-битный микро», «32-битный микро» или «16-битный DSP». Обычно безопасно предположить, что процессор преимущественно предназначен для обработки целых чисел заданного размера бита. Целые числа заданного размера битов называются базовым типом данных. Кроме того, процессор обычно обеспечивает некоторую поддержку целых чисел, которые в два раза шире, чем базовый тип данных. Целые числа, состоящие из двойных бит, называются типом данных аккумулятора. Для примера 16-битный микро имеет 16-битный базовый тип данных и 32-битный тип данных аккумулятора.
Хотя другие типы данных могут поддерживаться встраиваемым процессором, этот раздел описывает только типы данных основ и аккумулятора.
Операции встраиваемого процессора, обсуждаемые в этом разделе, ограничены потребностями базовой схемы симуляции. В базовых симуляциях используются умножение, сложение, вычитание и задержки. Модели с фиксированной точкой также нуждаются в сдвигах, чтобы выполнить масштабирование преобразований. Для всех этих операций встраиваемый процессор должен иметь нативные инструкции, которые позволяют использовать базовый тип данных в качестве входов. Для входов типа аккумулятора процессор обычно поддерживает сложение, вычитание и задержку (хранение/извлечение из памяти), но не умножение.
Умножение обычно не поддерживается для входов типа аккумулятора из-за сложности и проблем с размером. Трудность умножения заключается в том, что выход должен быть в два раза больше, чем входы для полной точности. Для примера умножение двух 16-битных чисел требует 32-битного выхода для полной точности. Необходимость обработки выходов от операции умножения является одной из причин, по которой встраиваемые процессоры включают поддержку типа аккумулятора. Однако, если также поддерживается умножение входов типа аккумулятора, то существует необходимость поддержать тип данных, который в два раза больше, чем тип аккумулятора. Чтобы ограничить эту дополнительную сложность, умножение обычно не поддерживается для входов типа аккумулятора.
Важные правила проекта, о которых вы должны знать при моделировании динамических систем с математикой с фиксированной точкой, следуют.
Лучше всего умножать только входы базового типа данных. Встраиваемые процессоры обычно обеспечивают команду для умножения входов базового типа, но не для умножения входов аккумуляторного типа. При необходимости можно объединить несколько команд, чтобы обработать умножение входов типа аккумулятора. Однако это может привести к большому, медленному встраиваемому коду.
Можно вставить блоки, чтобы преобразовать входы из типа аккумулятора в базовый тип перед блоками Product или Gain, при необходимости.
Существуют две общие причины, по которым Unit Delay должно использовать только номера базового типа:
По существу Unit Delay сохраняет значение переменной в ОЗУ и, один временной шаг позже, извлекает это значение из ОЗУ. Поскольку значение должно быть в памяти от одного временного шага до следующего, ОЗУ должно быть выделено исключительно для переменной и не может использоваться для других целей. Использование чисел типа аккумулятора вместо базового типа данных удваивает требования к ОЗУ, что может значительно увеличить стоимость встраиваемой системы.
Обычно Unit Delay поступает в блок Gain. Правило проекта умножения требует, чтобы вход (сигнал единичной задержки) использовал базовый тип данных.
За исключением модуля сигналов задержки, большинство сигналов не требуются от одного временного шага до следующего. Это означает, что значения сигналов могут временно храниться в общей и повторно используемой памяти. Эта общая и повторно используемая память может быть ОЗУ или может быть просто регистрами в центральный процессор. В любом случае хранение значения в качестве типа данных аккумулятора не намного дороже, чем хранение его в качестве базового типа данных.
Сложение и вычитание могут использовать тип данных аккумулятора, если есть обоснование. Типичное обоснование - уменьшение накопления ошибок из-за округления или переполнения.
Для примера операция общего фильтра является взвешенной суммой нескольких переменных. Умножение переменной на вес естественно производит продукт типа аккумулятора. Перед суммированием каждый продукт может быть преобразован обратно в базовый тип данных. Этот подход вводит округлую ошибку в каждую часть суммы.
Альтернативно, продукты могут быть суммированы с использованием типа данных аккумулятора, и конечная сумма может быть преобразована в базовый тип данных. Округление вводится всего в одном точке, и точность в целом лучше. Стоимость выполнения сложения или вычитания с помощью чисел типа аккумулятора немного дороже, но если есть обоснование, оно обычно стоит стоимости.