非回復平方根 System object からの HDL コード生成

この例では、非回復平方根 System object™ をインスタンス化する MATLAB® コードをチェックし、そのコードから HDL コードを生成して検証する方法を示します。

MATLAB 設計

この例で使用する MATLAB コードは、FPGA または ASIC での実装に適した非回復平方根エンジンです。エンジンは、System object として実装される、[1] 判定畳み込み復号化に基づいた、乗算器なしの最小面積実装を使用します。この例では、エンジンをテストする MATLAB テスト ベンチも示します。

```design_name = 'mlhdlc_sysobj_nonrestsqrt.m'; testbench_name = 'mlhdlc_sysobj_nonrestsqrt_tb.m'; sysobj_name = 'mlhdlc_msysobj_nonrestsqrt.m'; ```

MATLAB 設計を確認します。

```type(design_name); ```
```%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % MATLAB design: Non-restoring Square Root % % Key Design pattern covered in this example: % (1) Using a user-defined system object % (2) Call the object only once per design iteration %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [Q_o,Vld_o] = mlhdlc_sysobj_nonrestsqrt(D_i, Init_i) % Copyright 2014-2015 The MathWorks, Inc. persistent hSqrt; if isempty(hSqrt) hSqrt = mlhdlc_msysobj_nonrestsqrt(); end [Q_o,Vld_o] = hSqrt(D_i,Init_i); end ```
```type(testbench_name); ```
```% Nonrestoring Squareroot Testbench % Copyright 2014-2015 The MathWorks, Inc. % Generate some random data rng('default'); % set the random number generator to a consistent state nsamp = 100; %number of samples nbits = 32; % fixed-point word length nfrac = 31; % fixed-point fraction length data_i = fi(rand(1,nsamp), numerictype(0,nbits,nfrac)); % clear any persistent variables in the HDL function clear mlhdlc_sysobj_nonrestsqrt % Determine the "golden" sqrt results data_go = sqrt(data_i); % Commands for the sqrt engine LOAD_DATA = true; CALC_DATA = false; % Pre-allocate the result array data_o = zeros(1,nsamp, 'like', data_go); % Load in a sample, then iterate until the results are ready cyc_cnt = 0; for i = 1:nsamp % Load the new sample into the sqrt engine [~, vld] = mlhdlc_sysobj_nonrestsqrt(data_i(i),LOAD_DATA); cyc_cnt = cyc_cnt + 1; while(vld == false) % Iterate until the result has been found [data_o(i), vld] = mlhdlc_sysobj_nonrestsqrt(data_i(i),CALC_DATA); cyc_cnt = cyc_cnt + 1; end end % find the integer representation of the result data idt = numerictype(0,ceil(nbits/2),0); % find the error in terms of integer bits ierr = abs(double(reinterpretcast(data_o,idt))-double(reinterpretcast(data_go,idt))); % find the error in terms of real-world values derr = abs(double(data_o)- double(data_go)); pct_err = 100*derr ./ double(data_go); fprintf('Maximum Error: %d (%0.3f %%)\n', max(derr), max(pct_err)); fprintf('Maximum Error (as unsigned integer): %d\n', max(ierr)); fprintf('Number of cycles: %d ( %d per sample)\n', cyc_cnt, cyc_cnt / nsamp); %EOF ```

設計のシミュレーション

コードの生成前にテストベンチを使用して設計をシミュレートし、実行時エラーが発生しないことを確認します。

```mlhdlc_sysobj_nonrestsqrt_tb ```
```Maximum Error: 3.051758e-05 (0.028 %) Maximum Error (as unsigned integer): 1 Number of cycles: 2000 ( 20 per sample) ```

非回復平方根アルゴリズムのハードウェア実装

このアルゴリズムでは、(mux を必要とする回復アルゴリズムとは異なり) mux なしで単一の加算器/減算器を使用して最小面積の平方根演算を実装します。平方根は、一連のシフトと加算/減算を使用して計算されるため、(乗算器を必要とする他の実装とは異なり) 乗算器は使用されません。

このアルゴリズムの全体的なアーキテクチャを以下に示します。詳細については、[1] を参照してください。

このアルゴリズムの実装では、各結果を計算するために複数のサイクルを必要とする最小面積法を使用しています。全体的な計算時間は、[入力語長 / 2] として近似できます。入力データを読み込むために数サイクルのオーバーヘッドがあります。

HDL Coder プロジェクトの新規作成

```coder -hdlcoder -new mlhdlc_nonrestsqrt ```

MATLAB HDL Coder プロジェクトの作成と入力に関する詳細なチュートリアルについては、MATLAB から HDL へのワークフロー入門を参照してください。

固定小数点変換のスキップ

HDL アドバイザーを起動し、オプション [固定小数点の変換]`[元の型を保持]` を選択します。

HDL コード生成の実行

ワークフロー アドバイザーを起動します。ワークフロー アドバイザーで、[コード生成] のステップを右クリックして [選択したタスクまで実行] オプションを選択し、最初から HDL コード生成までのすべてのステップを実行します。

ログ ウィンドウにあるリンクをクリックして、生成された HDL コードを確認します。

サポートされている System object

HDL コード生成でサポートされている System object のリストについては、HDL コード生成に使用できる事前定義済みの System Objectsを参照してください。

参照

[1] Li, Y. and Chu, W. (1996) "A New Non-Restoring Square Root Algorithm and Its VLSI Implementations".IEEE International Conference on Computer Design: VLSI in Computers and Processors, ICCD '96 Austin, Texas USA (7-9 October, 1996), pp. 538-544. doi: 10.1109/ICCD.1996.563604