AR# 32021

LogiCORE CORDIC v3.0 - 変換関数の出力が間違っているように見える

説明

キーワード : correct, result, 1.0, 1.1, 2.0, 3.0, Arctan, 正しい, 結果

変換関数の出力が間違っているように見えます。

ソリューション

データ フォーマットに関する例および情報が、CORDIC v4.0 以降のバージョンのデータシートに記載されています。

これは通常、出力フォーマットを誤って解釈していることが原因です。

次に、変換関数の計算例を示します。これらの例は、20 ビット入力および出力の CORDIC コンフィギュレーションに基づいています。

例 1 :

次は、CORDIC のデータシートの 9 ~ 10 ページにあるデザイン例を修正したものです。

B = 0.707+0.25j;
mag = abs(B) % Magnitude
0.7498993265765745
theta = angle(B) % Phase Angle
0.3398843741305139

CORDIC シミュレーション

x_in <= "00101101001111111000" = 00.101101001111111000 = 0.707 (Q1.N
Format)
y_in <= "00010000000000000000" = 00.010000000000000000 = 0.25 (Q1.N
Format)

x_out <= "00101101010000000000" = 00.101101010000000000 =
0.7499275207519531 (Q1.N Format)
P_out <= "00001010111000000100" = 000.01010111000000100 =
0.3398742675781250 (Q2.N Format)


例 2 :

次は、整数の入力値を使用した例です。

C = 10+5j
mag = abs(C) % Magnitude
11.18033988749895
theta = angle(C) % Phase Angle
0.4636476090008061

ここで注意が必要です。フォーマットと範囲によっては、データをコアに入力する前にスケーリングする必要があります。

入力がすべて整数ビットであるとすると、20 ビット入力は次のようになります。

Decimal 10 = 00000000000000001010
Decimal 5 = 00000000000000000101

これを N-2 でスケーリングします。この場合は 20-2 = 18 です。これは、数値を再解釈し、CORDIC から算出された出力が正しいことを示すためだけのものです。

10 / 2^18 = 0.000038146972656250
5 / 2^18 = 0.000019073486328125

スケーリングした計算値

D = 0.000038146972656250+0.000019073486328125j
mag = abs(D) % Magnitude
0.00004264961199760036
theta = angle(D) % Phase Angle
0.4636476090008061

これらの値がそのままコアに入力され、データが再解釈されると、次のようになります。

CORDIC シミュレーション

x_in <= "00000000000000001010" = 00.000000000000001010 =
0.00003814697265625000 (Q1.N Format)
y_in <= "00000000000000000101" = 00.000000000000000101 =
0.00001907348632812500 (Q1.N Format)

x_out <= "00000000000000001100" = 00.000000000000001100 =
0.0000457763671875 (Q1.N Format)
P_out <= "00001110101100110010" = 000.01110101100110010 =
0.4593658447265625 (Q2.N Format)

この後、元のフォーマットで出力を解釈し直す場合は、Magnitude 出力を計算する必要があります。出力値を 2^18 でスケーリングすると (この例の場合は入力)、出力が予測値と同じになります。

0.0000457763671875 * 2^18 = 12

例 3 :

次に、先ほどのれいより大きい整数値を使用した例を示します。

E = 1024+512j
mag = abs(E) % Magnitude
1144.866804479892
theta = angle(E) % Phase Angle
0.4636476090008061

Decimal 1024 = 00000000010000000000
Decimal 512 = 00000000001000000000

これを N-2 でスケーリングします。この場合は 20-2 = 18 です。これは、数値を再解釈し、CORDIC から算出された出力が正しいことを示すためだけのものです。

1024 / 2^18 = 0.003906250
512 / 2^18 = 0.001953125

スケーリングした計算値

F = 0.003906250+0.001953125j
mag = abs(F) % Magnitude
0.004367320268554277
theta = angle(F) % Phase Angle
0.4636476090008061

これらの値がそのままコアに入力され、データが再解釈されると、次のようになります。

CORDIC シミュレーション

x_in <= "00000000010000000000" = 00.000000010000000000 =
0.003906250000000000 (Q1.N Format)
y_in <= "00000000001000000000" = 00.000000001000000000 =
0.001953125000000000 (Q1.N Format)

x_out <= "00000000010001111001" = 00.000000010001111001 =
0.004367828369140625 (Q1.N Format)
P_out <= "00001110110101011010" = 000.01110110101011010 =
0.4635772705078125 (Q2.N Format)

この後、元のフォーマットで出力を解釈し直す場合は、Magnitude 出力を計算する必要があります。出力値を 2^18 でスケーリングすると (この例の場合は入力)、出力が予測値と同じになります。

0.004367828369140625 * 2^18 = 1145

LogiCORE CORDIC リリース ノートと既知の問題は、(Xilinx Answer 29570) を参照してください。


AR# 32021
日付 12/15/2012
ステータス アクティブ
種類 一般