Main Content

ハードウェア効率に優れた双曲線正接の実装

この例では、Simulink® モデルに組み込まれたハードウェア効率に優れた MATLAB® コードを使用して、与えられた一連の実数値データの双曲線正接を計算する方法を示します。この例で使用されるモデルは、固定小数点入力の HDL コード生成に適しています。アルゴリズムは、異なるステップ間で計算単位とメモリ単位を共有するアーキテクチャを採用しています。これは、リソースに制約がある FPGA または ASIC デバイスに展開するときに有利です。そのため、この実装ではスループットが完全にパイプライン化された実装より小さい一方で、オンチップ フットプリントも小さくなるため、リソースに配慮した設計に適しています。

双曲線正接

双曲線正接関数は、循環 tan 関数の双曲線版に相当し、角度 α に対する双曲線正弦関数と双曲線余弦関数の比として定義されます。

tanh(α)=sinh(α)cosh(α)

CORDIC アルゴリズム

CORDIC は、COordinate Rotation DIgital Computer の略語で、多くの三角関数および双曲線関数を効率的に計算するために使用できます。CORDIC アルゴリズムの詳細と、三角関数の計算への応用については、CORDIC 回転モード カーネルを使用した正弦と余弦の計算を参照してください。

ハードウェア効率に優れた固定小数点演算

Hyperbolic Tangent HDL Optimized ブロックは、2 進小数点スケーリングをもつ固定小数点データの HDL コード生成をサポートしています。これはこの適用例に留意して設計されていて、ハードウェア固有のセマンティクスと最適化を採用します。これらの最適化の 1 つにリソース共有があります。

複雑なアルゴリズムを FPGA デバイスや ASIC デバイスに展開する場合、対象の計算のリソースの使用率とその合計スループットの間にトレードオフが発生することがよくあります。完全にパイプライン化され、並列化されたアルゴリズムのスループットは最大となりますが、実際のデバイスで展開するには過度にリソース集約的である場合があります。1 つ以上のコア計算回路にスケジューリング ロジックを実装することで、計算全体でリソースの再利用が可能になります。結果として、合計スループットは低下しますが、実装ではフットプリントがより小さくなります。リソースを共有する設計は全体的なレイテンシ要件を満たすことができるため、これはたいていの場合、許容可能なトレードオフです。

Hyperbolic Tangent HDL Optimized ブロックの主要な計算単位のすべては、計算ライフ サイクル全体で再利用されます。これには、ギブンス回転の実行に使用される CORDIC 回路だけでなく、角度の更新に使用される加算器と乗算器も含まれます。これにより、FPGA デバイスや ASIC デバイスへの展開時に DSP リソースとファブリック リソースの両方を節約できます。

サポートされるデータ型

シミュレーションでは、単精度、倍精度、2 進小数点でスケーリングされた固定小数点、2 進小数点スケーリングされた倍精度のデータ型がサポートされます。ただし、HDL コード生成では、2 進小数点でスケーリングされた固定小数点データ型のみがサポートされます。

Hyperbolic Tangent HDL Optimized ブロックとのインターフェイス

Hyperbolic Tangent HDL Optimized ブロックは、ready 出力が High のとき (ブロックが新しい計算を行う準備ができたことを示す)、データを受け入れます。入力データをブロックに送信するには、validIn 信号をアサートしなければなりません。ブロックに入力値が正常に登録されると、ready 信号はデアサートされます。その後、新しい入力を送るには、信号が再びアサートされるのを待たなければなりません。このプロトコルの概要は、次の波形図にまとめられます。ブロックが入力データを受け入れる準備ができていなかったために、ブロックへの 1 つ目の有効な入力が破棄されたことに注目してください。

validIn.png

ブロックが計算を終え、出力を送信する準備ができると、1 クロック サイクルの間、validOut をアサートします。次に、ready がアサートされ、ブロックが新しい入力値を受け入れる準備ができたことを示します。

validOut.png

モデル例のシミュレーション

コマンド ラインで以下を入力し、モデル例を開きます。

mdl = 'fxpdemo_tanh';
open_system(mdl)

モデルには、データ ソースに接続された Hyperbolic Tangent HDL Optimized ブロックが含まれています。データ ソースは入力の配列を受け取り、Hyperbolic Tangent HDL Optimized ブロックが新しい入力を受け入れるよう準備できると、その配列から入力値を渡します。各値について計算された出力は、ワークスペース変数に格納されます。すべての入力の処理が完了すると、シミュレーションは終了します。

入力の配列 tanhInput を定義します。この例では、入力は double です。

tanhInput = -10:0.05:10;

モデルをシミュレートします。

sim(mdl);

シミュレーションが完了すると、各入力の計算値を保持するために新しいワークスペース変数 tanhOutput が作成されます。

出力のプロット

Hyperbolic Tangent HDL Optimized ブロックの出力と MATLAB® の関数 tanh の出力を比較して、計算の誤差をプロットします。

figure(1);
plot(tanhInput, tanhOutput - tanh(tanhInput'));
xlabel('x');
ylabel('error');

Figure contains an axes object. The axes object with xlabel x, ylabel error contains an object of type line.