この例では、単純な算術演算と型変換を示します。xlSimpleArith
M 関数を定義する xlSimpleArith.m ファイルの内容は、次のとおりです。
function [z1, z2, z3, z4] = xlSimpleArith(a, b)
% xlSimpleArith demonstrates some of the arithmetic operations
% supported by the Xilinx MCode block. The function uses xfix()
% to create Xilinx fixed-point numbers with appropriate
% container types.%
% You must use a xfix() to specify type, number of bits, and
% binary point position to convert floating point values to
% Xilinx fixed-point constants or variables.
% By default, the xfix call uses xlTruncate
% and xlWrap for quantization and overflow modes.
% const1 is Ufix_8_3
const1 = xfix({xlUnsigned, 8, 3}, 1.53);
% const2 is Fix_10_4
const2 = xfix({xlSigned, 10, 4, xlRound, xlWrap}, 5.687);
z1 = a + const1;
z2 = -b - const2;
z3 = z1 - z2;
% convert z3 to Fix_12_8 with saturation for overflow
z3 = xfix({xlSigned, 12, 8, xlTruncate, xlSaturate}, z3);
% z4 is true if both inputs are positive
z4 = a>const1 & b>-1;
この M 関数では、加算演算子と減算演算子を使用しています。MCode ブロックは、これらの演算子を完全精度で計算します。つまり、出力の精度は、これらの演算を情報を失わずに実行するのに十分であるということです。
ここで、xfix
という関数の呼び出しに注目してください。この関数には、固定小数点型の精度と値の 2 つの引数が必要です。精度は、セル配列で指定します。精度のセル配列の最初の要素はデータ型で、xlUnsigned
、xlSigned
、xlBoolean
のいずれかです。2 番目の要素は固定小数点値のビット数、3 番目の要素は 2 進小数点の位置です。データ型が xlBoolean
の場合は、ビット数および 2 進小数点の位置を指定する必要はありません。ビット数と 2 進小数点の位置は、対にして指定する必要があります。4 番目の要素は量子化モード、5 番目の要素はオーバーフロー モードです。量子化モードは、xlTruncate
、xlRound
、または xlRoundBanker
のいずれかに指定します。オーバーフロー モードは、xlWrap
、xlSaturate
、または xlThrowOverflow
のいずれかに指定します。量子化モードとオーバーフロー モードは、対にして指定する必要があります。量子化モードとオーバーフロー モードを指定しない場合は、xfix
関数で符号付きおよび符号なしの値に対して xlTruncate
と xlWrap
が使用されます。xfix
関数の 2 番目の引数は、倍精度または AMD 固定小数点値で指定します。定数が整数値である場合は、xfix
関数を使用する必要はありません。MCode ブロックで、自動的に適切な固定小数点値に変換されます。
MCode ブロックのパラメーター ダイアログ ボックスで MATLAB function に「xlSimpleArith
」を入力した場合は、ブロックに 2 つの入力ポート a および b と、4 つの出力ポート z1、z2、z3、および z4 が表示されます。
AMD のデータ型および関数を使用する M 関数は、MATLAB のコマンド ウィンドウでテストできます。たとえば、MATLAB のコマンド ウィンドウに「[z1, z2, z3, z4] =
xlSimpleArith(2, 3)
」と入力すると、次の行が表示されます。
UFix(9, 3): 3.500000
Fix(12, 4): -8.687500
Fix(12, 8): 7.996094
Bool: true
xfix
関数呼び出しが必要です。