メディア

CORDICって何?Q&Aで学ぶマイコン講座(60)(3/4 ページ)

» 2021年04月01日 11時00分 公開

数値フォーマット

 CORDICは、固定小数点符号付き整数フォーマットで動作します。入力値と出力値は、q1.31またはq1.15のいずれかです(図3(a),(b)

図3:数値フォーマット

 ①q1.31形式では、数字は1つの符号ビットと31個の小数ビット(バイナリーの場所) で表されます。
 したがって、数値の範囲は−1(0x80000000)から1−2-31(0x7FFFFFFF)です。精度は2-31(約5×10-10)です。

 ②q1.15形式では、数値の範囲は1(0x8000)から1−2-15(0x7FFF)です。
 この形式では、2つの入力引数を32ビットにパックでき、32ビット読み取りで2つの結果を取得できます。
 ただし、精度は2-15(約3×10-5)に減ります(図3(c)

 角度は、πで割ったラジアンで表されます。したがって、間隔 [-1, +1] のみが使用されます。

 いくつかの関数は、スケールファクターSCALEを指定します。これにより、入力レジスタ、出力レジスタ、または内部レジスタを飽和させることなく、CORDICでサポートされる値の範囲全体をカバーするように関数入力範囲を拡張できます。

 スケーリング係数が必要な場合は、事前にソフトウェアで計算し、CORDIC_CSRレジスタのSCALEフィールドにプログラムする必要があります。また、CORDIC_WDATAレジスタでスケール値をプログラミングする場合には、プログラム前に、入力引数をそれに応じてスケーリングする必要があります。

 スケーリングは、CORDIC_RDATAレジスタから読み取られた結果でも元に戻す必要があります。また、スケール係数は、スケール値の切り捨てにより精度が悪化するため注意が必要です。

実際の関数演算例

①サイン図4(a)

 サイン関数の主引数は、ラジアン単位の角度θです。ARG1に書き込む前に、πで除算する必要があります。2番目の引数は絶対値(モジュラス)mです。M>1の場合、ソフトウェアでスケーリングして、ARG2のq1.31範囲に適合させる必要があります。

 第1の結果RES1がサインで、絶対値(モジュラス)を掛けた値です。第2の結果RES2はコサインで、これは副作用の値です。これも絶対値(モジュラス)を掛けた値です。

図4:実際の関数演算例

②自然対数関数図4(b)

 主引数は、関数変換したい値xです。xは0.107〜+9.35の範囲のみサポートされ、2-n<1-2-nのように、因子2-nでスケーリングする必要があります。スケール値x・2-nはARG1に書き込み、演算項目n=1はSCALEパラメーターに書き込む必要があります。ARG2は使用されません。主結果であるRES1は、自然対数です。最終結果を得るためには、RES1に2(n+1)を掛ける必要があります。RES2は使用されません。

結果レジスタの読み出しアクセス

 演算は、引数を入力することで始まります。DMAを使用しない場合は、CORDIC_WDATAレジスタに引数を書き込むと演算が始まります。一度CORDICに引数を入力し演算を始めれば、演算終了のフラグをポーリングする必要はありません。

 RDATAレジスタの読み取り要求については、単純にバス(AHB)を介して開始します。RDATAレジスタの読み取りアクセスは、演算が終了し、RDATAレジスタが読み取り可能になるまで待機状態になります。RDATAレジスタが読み取り可能になると、その値は自動的にCPUに読み取られ、HREADYをアサートし、トランザクションを完了します。その間、CPUはフリーズします。このアクセスは、読み出しのオーバーヘッドがないため、「ゼロオーバーヘッドモード」と呼ばれます(図5

図5:結果レジスタの読み出しアクセス

Copyright © ITmedia, Inc. All Rights Reserved.

RSSフィード

公式SNS

EDN 海外ネットワーク

All material on this site Copyright © ITmedia, Inc. All Rights Reserved.
This site contains articles under license from AspenCore LLC.