組み込みプロセッサのターゲット
はじめに
以下の節では、組み込みプロセッサで使用可能な整数サイズや演算についての一般的な前提を含め、組み込みプロセッサ用の固定小数点設計をターゲットとする場合の問題点を説明します。これらの前提は、具体的な固定小数点設計に役立つ設計上の問題点や設計規則へとつながります。
サイズの前提
通常、組み込みプロセッサは特定のビット サイズによって特徴付けられます。たとえば、「8 ビット マイコン」、「32 ビット マイコン」、「16 ビット DSP」などの用語がよく使われます。一般に、プロセッサは指定したビット サイズの整数を処理するように調整されています。指定したビット サイズの整数を "基本データ型" と呼びます。また、プロセッサは通常、基本データ型の 2 倍の幅をもつ整数をサポートしています。2 ビットから成る整数を "アキュムレータ データ型" と呼びます。たとえば、16 ビットのマイコンには 16 ビットの基本データ型と 32 ビットのアキュムレータ データ型があります。
組み込みプロセッサが他のデータ型もサポートしている場合もありますが、この節では基本データ型とアキュムレータ データ型について説明します。
演算の前提
この節で説明する組み込みプロセッサの演算は、基本的なシミュレーション ダイアグラムの必要性に限られています。基本的なシミュレーションは乗算、加算、減算、および遅延を使用します。固定小数点モデルにはスケーリング変換を行うためのシフトも必要です。これらすべての演算について、組み込みプロセッサには、基本データ型を入力値として許可するネイティブの命令がなければなりません。アキュムレータ型の入力値の場合、通常プロセッサは加算、減算、遅延 (メモリへの格納/メモリからの検索) をサポートしていますが、乗算はサポートしていません。
複雑度とサイズの問題により、乗算はアキュムレータ型の入力値では通常サポートされていません。乗算の難しさは、出力値が入力値の 2 倍の大きさでなければ最大精度にならないことです。たとえば、2 つの 16 ビットの数値を最大精度で乗算するには、32 ビットの出力値を必要とします。組み込みプロセッサにアキュムレータ型のサポートが含まれている 1 つの理由は、出力値を乗算演算から処理する必要があるからです。ただし、アキュムレータ型の入力値の乗算もサポートされている場合は、アキュムレータ型の 2 倍の大きさのデータ型をサポートする必要があります。この複雑度を制限するため、通常、アキュムレータ型の入力値には乗算がサポートされていません。
設計規則
以下は、固定小数点演算を備えた動的システムをモデル化する場合に知っておく必要のある重要な設計規則です。
設計規則 1: 基本データ型のみを乗算する
基本データ型の入力値のみを乗算するのがベストです。通常、組み込みプロセッサは基本データ型の入力値の乗算に命令を与え、アキュムレータ型の入力値の乗算には命令を与えません。必要に応じて、複数の命令を結合すると、アキュムレータ型の入力値の乗算も処理できますが、これによって大きくて遅い組み込みコードになることがあります。
必要な場合は、Product または Gain ブロックの前にブロックを挿入して、入力値をアキュムレータ型から基本データ型に変換できます。
設計規則 2: Delays には基本データ型を使用する
Unit Delay が基本データ型の数値のみを使用する一般的な理由には、次の 2 つがあります。
Unit Delay は基本的に変数の値を RAM に格納し、1 タイム ステップ後に RAM からその値を取り出します。値が 1 タイム ステップ間メモリ内に留まる必要があるため、RAM をこの変数専用にしなければならず、共用したり別の目的で使用することができません。基本データ型の代わりにアキュムレータ型の数値を使用すると、RAM の要件が倍になり、組み込みシステムのコストが大幅に増えます。
Unit Delay は通常 Gain ブロックに接続します。乗算の設計規則により、入力 (単位遅延信号) は基本データ型を使用しなければなりません。
設計規則 3: 一時変数にはアキュムレータ データ型を使用できる
単位遅延信号を除いて、ほとんどの信号はタイム ステップ間に不要です。つまり、信号値を共有メモリや再利用メモリに一時格納できます。この共有メモリと再利用メモリは RAM でも、単に CPU のレジスタでもかまいません。どちらの場合も、値をアキュムレータ データ型として格納すると、基本データ型として格納する場合と比べてコストに大差はありません。
設計規則 4: 総和にはアキュムレータ データ型を使用できる
正当な理由がある場合は、加算と減算にアキュムレータ データ型を使用できます。通常、正当な理由とは丸めやオーバーフローによる誤差の蓄積を減らすことです。
たとえば、よく使用されるフィルター演算は複数の変数の重み付き総和です。変数を重みで乗算すると、当然、アキュムレータ型の積が生成されます。総和を求める前に、それぞれの積を元の基本データ型に変換できます。この方法では、加算の各部に丸め誤差が生じます。
または、アキュムレータ データ型を使用して積を合計し、最終的な総和を基本データ型に変換することもできます。丸め誤差は 1 か所のみで発生するため、通常こちらの方が高精度です。アキュムレータ型の数値を使用して加算や減算を行うとコストが若干高くなりますが、正当な理由がある場合はその価値があります。