コンテンツにスキップ

ビット演算#

このトピックでは、VisualAppletsのデザインから生成されるFPGAパイプラインにおいて Bit Width がどのように動作するかについて説明します。このトピックをお読みいただくと、リンクの Bit Width が Arithmetic の結果をどのように制限するか、オーバーフローをどのように処理するか、値の範囲を制御するために Cast、Clip、および Shift オペレーターをどのように使用するかを理解できます。また、符号付きおよび符号なしの値の違い、固定小数点数の仕組み、およびより広いデータワードからビットフィールドを抽出する方法についても理解できます。

主要用語

Bit width は、リンク上の1ピクセルあたりまたは1値あたりのビット数です。Bit widthは value range を定義します。例えば、8ビットの符号なしリンクは0から255までの値を伝送します。Arithmetic overflow とは、演算結果が利用可能なビットに収まらなくなった状態を指します。結果はラップアラウンドするか、上位ビットが失われます。

リンクの Property とパラメータの依存関係については、Parameterization チュートリアルのトピックを参照してください。リンクの背後にある正式なルールについては、ユーザーマニュアルの Rules of Links を参照してください。

各 link 2つのモジュール(つまりインスタンス化されたオペレータ)間は、以下を伝送します Bit Width プロパティを持ちます。このプロパティは、生成されたFPGAパイプラインがその接続上の各ピクセルまたは値に対して何ビットを使用するかを定義します。カラーリンクの場合、Bit Widthはすべての色成分をまとめてカバーします。 ImageProtocol = VALT_SIGNALのリンクでは、Bit Widthは常に1ビットです。

1つのリンクは、データワードあたり最大 64ビット をサポートします。オペレーターがより広い結果を計算する場合、リンク幅がこの制限を超える前に、データをクリップ、キャスト、またはシフトする必要があります。

すべてのオペレーターがすべての Bit Width を受け入れるわけではありません。オペレーターによっては、1〜64ビット、8ビット、12ビット、16ビットなどの特定の範囲のみを許可するものもあります。Operator Reference の Supported Link Format テーブルには、各オペレーターで許可されている値が記載されています。また、デザインペインでモジュールを右クリックして Help を選択するか、F1 キーを押してオペレーターのヘルプを開くこともできます。これは Operator Reference の内容と同じもので、VisualApplets 内のツール内ヘルプとして提供されます。

Bit Widthの競合が発生した場合は、まず上流オペレータの出力リンクを確認してください。編集可能なオペレータで Bit Width リンクプロパティを調整するか、 CastBitWidth, ClipHigh, ClipLow, ShiftLeft、または ConvertPixelFormat などのオペレータを挿入して、パス上のBit Widthを変更します。

リンクプロパティは、オペレーターによって変更されるまでパイプライン伝播します。カメラ出力リンクで幅を設定するか、処理パスに bit width オペレーターを挿入します。Propagation of Link Properties のチュートリアルトピックを参照してください。

Bit Widths for Arithmetic Operations#

Arithmeticライブラリのオペレータは、出力の Bit Width 自動的に。この サポートされているリンクフォーマット の表( オペレーターリファレンス は、これらの出力を次のようにマークします auto。通常、リンク上でこれらの出力 bit width リンクプロパティを直接編集することはできません。算術演算後に手動で bit width を変更する場合は、次のような追加のオペレーターを使用します CastBitWidth を ClipHigh, ClipLow、または両方です。次の Arithmetic 演算子も Bit Width を変更します。

Addition and Subtraction#

イメージ ADD オペレータは、すべての入力リンク上のピクセル値を加算します。 SUB オペレータは、最初の入力から2番目の入力のピクセル値を減算します。

VisualAppletsは、入力のBit Widthから出力のBit Widthを設定します。結果は、その最大値よりも1ビット広くなります。 ADDで符号なし入力と符号付き入力を混在させる場合、出力に追加の1ビットが必要になることがあります。

ピクセル値を加算する Add オペレーター

出力のBit Widthは64ビットを超えてはなりません。 ADD または SUBの後に、下流の接続で伝播されたリンク幅を確認してください。

Multiplication#

イメージ MULT オペレータは、2つの入力におけるピクセル値を乗算します。1つのリンクにおける最大許容入力Bit Widthは32ビットです。出力のBit Widthは、2つの入力のBit Widthの合計に等しくなります。8ビットの値に8ビットの値を乗算すると、16ビットの結果が生成されます。

MULT オペレーターによる Bit Width の変更

情報

MULT は多くのFPGAリソースを使用します。定数によるScalingを行うには、Baslerは SCALE または ShiftLeft コマンドを使用してください。

Division#

イメージ DIV オペレータが入力リンク上の値を除算することを推奨しています I1 入力リンクの値で除算します。 I2。出力リンク O は整数商を持ちます。出力リンク R は余りを持ちます。ゼロによる除算は、両方の出力において定義されません。

入力リンクにおけるBit Width I2 は、入力リンクにおけるBit Width未満または等しくなければなりません I1。符号なし入力の場合、出力リンクにおける出力Bit Width O は、入力リンクにおけるBit Widthと等しくなります I1。符号付き入力の場合、出力リンクにおける出力Bit Width O は、入力Bit Widthに1を加算した値と等しくなります I1 。

符号なし入力リンクを持つ DIV オペレーターの Bit Width

DIV は整数除算を実行します。それ自体では小数部分は保持されません。固定小数点除算を行うには、除算の前に ShiftLeft オペレーターを使用してください。

小数値の詳細については、このトピックの Fixed-Point Arithmetic セクションを参照してください。

情報

DIV は多くのFPGAリソースを使用します。2のべき乗で除算する場合は、 ShiftRight コマンドを使用してください。

Clip および Cast オペレータによる算術オーバーフローの処理#

Arithmetic overflow は、結果が現在の bit width で表現できる範囲を超えたときに発生します。8ビットの符号なしリンクでは、範囲は 0 から 255 です。200 + 100 の合計は 300 になります。出力ビットが十分でない場合、保存される値は不正になります。オーバーフローは、次のように不正なピクセル値として視覚化されます。

ビットオーバーフロー

Arithmetic overflow は、以下の処理によって処理されるオーバーフロー状態と混同してはなりません Overflow ライブラリ内の 同期化 ライブラリ: Overflow オペレーターは、停止不可能なソースでのフロー制御に使用されます。 Overflow オペレーター(参照: 停止可能および停止不可能なデータストリーム チュートトリアルのトピック。

Arithmetic overflowは、次のオペレーターを使用して修正できます:

ClipHigh と ClipLow#

イメージ ClipHigh オペレーターは、値を設定可能な最大値に制限します。最大値を超える入力値は、最大値に置き換えられます。 ClipLow オペレーターは、設定可能な最小値に対しても同様に機能します。

使用 ClipHigh および ClipLow )を使用すると、 bit width を削減することなく、値をターゲット範囲内に維持できます。モジュールパラメータを使用してクリップ制限を設定します。有効な範囲は以下によって異なります 以下の前で ビット幅を減らすこと。モジュールパラメータを使用してクリップ制限を設定します。有効な範囲は以下に依存します Bit Width 入力リンクProperty、および入力リンクが符号付きArithmeticと符号なしArithmeticのどちらを使用するかによって異なります。

スクリーンショットは以下を示しています。 ClipHigh 255より大きいすべてのピクセル値を255に設定します。

範囲に収まるようにすべてのピクセル値を計算する ClipHigh オペレーター

CastBitWidth#

イメージ CastBitWidth オペレーターはリンクの Bit Width を変更します。リンクの Property を設定します。 Bit Width オペレーターの出力リンク上で。

出力の Bit Width が入力の Bit Width より大きい場合、オペレーターは値を保持し、最上位ビット(MSB)の位置にビットを追加します。符号付きの値の場合、 CastBitWidth 符号拡張を実行します。

出力の Bit Width が入力の Bit Width より小さい場合、 CastBitWidth 最上位ビット(MSB)を破棄します。その結果、出力の Bit Width 内で表現できない値は変更されます。この操作によってビットが恒久的に削除されるため、後続の処理に必要な情報が失われる可能性があります。

リンクの Bit Width を縮小する場合、Basler ではこの順序で次のステップを実行することをお勧めします。

  1. 挿入します ClipHigh および ClipLow Bit Width の値をターゲット範囲に制限するために。
  2. 挿入します CastBitWidth Bit Width を縮小するために。

Parameterization のチュートリアルトピックも参照してください。

例: ピクセルの加算と結果の狭小化#

この例では、2つの8ビット符号なしピクセルストリームを追加し、後続の処理のために8ビットの結果を返します。

  1. 2つの8ビット画像パスを接続します ADD オペレータ。
  2. 出力リンクを確認します。 ADD 9ビットの結果を生成します。
  3. 挿入します ClipHigh を ADD最大値を255に設定します。
  4. 挿入します CastBitWidth を ClipHigh出力を設定します Bit Width 8にします。
  5. Design Rules Check Level 1 を実行し、すべてのリンクが有効であることを確認します。

なしの場合 ClipHigh, CastBitWidth 9番目のビットを破棄するだけであるため、大きな合計値では誤ったピクセル値が生成されます。

ClipHigh と CastBitWidth の組み合わせによる不正な結果データの防止

符号付きおよび符号なしの値#

リンクの Property Arithmetic 生成されたFPGAパイプラインが値をどのように処理するかを定義します。 Signed または Unsigned。ハードウェアでは、符号付きの場合 Signedは2の補数表現が使用されます。このPropertyは、デザイン時にVisualAppletsで設定します。

符号ビットは、設定されたBit Widthの一部です。

9ビット値、1ビットは符号情報用に予約済み

イメージ CastType オペレーターは、出力リンク上の Arithmetic リンクPropertyを変更します。ビットパターンはそのまま維持されます。生成されたFPGAロジックは保存されたビットパターンを変更しないため、オペレーターはFPGAリソースを消費しません。

Arithmeticの設定に応じて、同じビットパターンが異なる十進数を表すことができます。値 1010 は、4ビットの符号なしリンク上では10になります。同じパターンが4ビットの符号付きリンク上では\u22126になります。

設定するピクセルのカラーコンポーネントを指定するには、 CastType オペレーターは、後続のオペレーターが異なるArithmeticを必要とし、なおかつ値の範囲が収まる場合に使用します。

CastType による Arithmetic 値の符号付きから符号なしへの変更

値がビット範囲に収まっているかどうかの確認#

VisualAppletsでは、パラメータ値(例えば、 CONST オペレーターのモジュールパラメータなど)は十進数として入力および表示されます。ただし、オペレーターに接続されたリンクは、特定のビット範囲内の値しか保存できません。そのため、パラメータ値が接続されたリンクのBit Widthに収まることを確認してください。

符号なしリンク

nビットの符号なしリンクは、正の値とゼロのみを表すことができます。有効な範囲は次のとおりです。

0 ~ 2^n \u2212 1

たとえば、8ビットの符号なしリンクは0から255までの値を保存できます。

8ビット符号なしの最大値

リンクでは、 ImageProtocol = VALT_SIGNAL、Arithmeticは常に Unsigned.

符号付きリンク

nビットの符号付きリンクは、正の値と負の両方の値を表すことができます。有効な範囲は次のとおりです。

\u22122^(n-1) ~ 2^(n-1) \u2212 1

たとえば、8ビットの符号付きリンクは\u2212128から127までの値を保存できます。

8ビット符号付きの最大値

最上位ビットは符号ビットとして使用され、値が正か負かを示します。

固定小数点演算#

VisualAppletsは、FPGAに実装される画像処理デザインを作成するために使用されます。PC上で実行されるソフトウェアとは異なり、FPGAハードウェアは通常、浮動小数点数( 0.5 または 1.25など)を処理しません。その代わりに、計算は通常整数を使用して実行されます。

整数演算を使用しながら小数の値を表現するために、VisualAppletsでは固定小数点表現を使用します。これにより、スケーリングファクター、ゲイン、サブピクセル座標などの値をハードウェアで効率的に保存および処理できるようになります。

このセクションでは、以下について説明します。

  • 固定小数点表現が必要な理由について
  • 整数ビットパターンに小数値を格納する方法について
  • Qフォーマットで小数点位置を定義する方法について
  • ビット幅が利用可能な値の範囲と精度に与える影響について
  • オペレーターの選択が計算精度に与える影響について

リンクを介して送信されるすべての値は、ビットのシーケンスとして格納されます。ハードウェアはこれらのビットを整数値として解釈します。

たとえば、以下のビットパターンは整数値 5 を表します。

00000101 = 5

しかし、画像処理アプリケーションでは、多くの場合、次のような小数値が必要になります。 0.5, 1.25、または 12.75.

FPGAは浮動小数点数を格納しないため、これらの値は固定小数点形式を使用して表現されます。固定小数点表現では、ビットパターンは整数として格納されたままですが、小数点の位置を固定で定義します。

格納されている整数値は引き続き 5 ですが、次のように解釈されます。

5 / 2^2 = 1.25

これは、2つのビットが小数部に割り当てられているためです。

これは次のように考えることができます。 仮想的な小数点 それは事前に定義された位置に固定されます。二進算術において、この分割はビットウェイト間のバイナリポイントとなります。 2^0 および 2^-1。このチュートリアルでは、おなじみの用語を維持します 仮想的な小数点。FPGAはすべての計算を整数を使用して実行し、選択した固定小数点フォーマットに従って結果を解釈します。

Q フォーマットとビット割り当て#

固定小数点数は、一部のビットを整数部に、一部のビットを小数部に割り当てることで小数値を表します。仮想小数点の位置は、Q formatを使用して記述されます。

Qフォーマットの記述方法は次のとおりです。

Qm.n

ここで、

  • m は整数部のビット数です
  • n は小数部のビット数です

符号付き値の場合、符号ビットは整数部に含まれます。

例:

Q4.4

の意味:

  • 整数部の 4 ビット
  • 小数部の 4 ビット
  • 合計 8 ビット

小数部のビット数によって、表現される値の精度が決まります。

表現可能な最小のステップサイズは次のとおりです。

1 / 2^n

ここで、 n は小数部のビット数です。

例:

Format 小数ビット 最小ステップサイズ
Q6.2 2 0.25
Q4.4 4 0.0625
Q2.6 6 0.015625

小数部のビット数が多いほど、隣接する値の差が小さくなり、精度が向上します。

全体の Bit Width は固定されています。その結果、小数部に使用されるビットは整数部には使用できなくなります。

したがって、次のことが言えます:

  • 小数部が多いほど精度は向上しますが、利用可能な整数範囲は狭くなります。
  • 小数部が少ないほど整数範囲は広くなりますが、精度は低下します。

Qフォーマットを選択する際は、必要な値の範囲と必要な精度のバランスを考慮してください。

固定小数点数では、各ビットが2の累乗を表します。

仮想小数点より左側のビットは整数を表します:

..., 2^3, 2^2, 2^1, 2^0

右側のビットは小数を表します:

2^-1, 2^-2, 2^-3, ...

たとえば、Q4.4 フォーマットの場合:

Bit position:  7   6   5   4   3    2     1      0
Weight:      2^3  2^2  2^1  2^0  2^-1  2^-2  2^-3  2^-4

の場所 2^0 ビットは仮想小数点の位置を定義します。この位置はハードウェアには保存されず、選択された Qフォーマットによって定義され、設計全体で一貫して解釈される必要があります。

例: Q4.4#

Q4.4 フォーマットでは、4ビットが整数部に、4ビットが小数部に使用されます。

ビットパターン

0 0 0 0 . 1 0 0 0

が含まれています 1 最初の小数位置にあります。この位置は次の値を示します 2^-1これは以下に等しいです 0.5.

したがって、このビットパターンが表すのは次のとおりです:

0 * 2^0 + 1 * 2^-1 + 0 * 2^-2 + 0 * 2^-3 + 0 * 2^-4 = 0.5

表される値は 0.5ですが、FPGA は対応する整数値のみを保存します:

Stored integer value: 8
Represented real value: 0.5

これが機能するのは、Q4.4 が4つの小数ビットを使用するためです。保存された整数値は次のように解釈されます:

Real value = Stored integer / 2^4
           = 8 / 16
           = 0.5

Let F は小数部のビット数です。

実数値を固定小数点表現に変換するには:

FixedPoint = round(RealValue * 2^F)

例:

FixedPoint = round(0.5 * 2^4)
           = round(8)
           = 8

結果のビットパターン:

0000.1000

固定小数点値を再び実数値に変換するには:

RealValue = FixedPoint / 2^F

例:

RealValue = 8 / 2^4
          = 8 / 16
          = 0.5

オペレータと設計ルール#

オペレーターは整数ビットパターンのみを処理します。固定小数点演算では、仮想小数点の位置はQフォーマットによって決定され、設計全体を通じて追跡する必要があります。

Scalingの調整や意図したQフォーマットの維持には、通常、以下のオペレーターが使用されます:

  • イメージ ShiftLeft および ShiftRight オペレーターは、入力ビットパターンを設定可能なビット数だけ左または右にシフトします。左シフトは値を2^Shift倍し、右シフトは2^Shiftで割ります。これらのオペレーターは、演算後に目的のQフォーマットを復元するためによく使用されます。
  • SCALE または ShiftLeft: 代わりにこれらのオペレーターを使用します MULT 値を2の定数乗で乗算する場合。これらは同じScaling操作を実行しますが、通常はより少ないFPGAリソースしか必要としません。
  • イメージ MULT オペレーターは2つの入力値を乗算します。出力のBit Widthは、入力のBit Widthの合計と等しくなります。固定小数点演算では、結果の小数部のビット数も、両方のオペランドの小数部のビット数の合計になります。

例#

Q4.4値に別のQ4.4値を乗算すると、Q8.8の結果が生成されます:

Q4.4 * Q4.4 -> Q8.8

結果はより高い精度を提供しますが、設計でQ4.4値が想定されている場合、後続の ShiftRight 操作またはBit Widthの削減が必要になる場合があります。

一部のオペレーターは特定の固定小数点フォーマットを前提としています。例えば、次のような三角関数オペレーター SIN, COS, TANおよびその逆関数は、入力と出力に対して事前に定義された数の小数ビットを想定しています。

このようなオペレーターにリンクを接続する前に、オペレーターリファレンスのArithmetics Libraryで必要なフォーマットを確認してください。

設計ガイドライン

各段階でQフォーマットを文書化します。乗算または除算の後、使用します ShiftRight または、必要に応じてBit Widthの調整を行い、意図したフォーマットを復元します。

シミュレーションでの固定小数点値の表示#

VisualAppletsのシミュレーション機能を使用すると、アプレットをビルドする前に、固定小数点値が意図どおりに解釈、Scaling、およびデザイン全体に伝播されることを確認できます。Simulation Probe Viewerでは、リンク値は整数のままですが、fractional bitsの設定、符号付き/符号なし十進数の選択、およびオプションでscaling factorの適用を行うことで、固定小数点として表示できます。これは表示のみに影響し、ハードウェアには影響しません。VisualAppletsでシミュレーションを介して固定小数点値を確認するには:

  1. 処理パイプラインの先頭にSimulation Sourceを追加します。
  2. オペレーターの出力リンクにSimulation Probeを追加します。
  3. Analysis → Start Simulationからシミュレーションを開始します。
  4. ステップ2で追加したプローブのSimulation Probe Viewerを開きます。
  5. Simulation Probe Viewerで、符号付きまたは符号なし十進数表示を選択します。
  6. Q formatに合わせてfractional bitsの数を設定します。
  7. オプションで、ラジアンから度への変換などの単位変換のための Scaling 係数を設定します。

その結果、Simulation Probesがどのように小数ビットを考慮に入れるかが確認できます:

Simulation Probe: 小数ビットを考慮に入れた結果を表示します。

VisualAppletsでのシミュレーションの詳細については、ユーザーマニュアルのSimulationを参照してください。

SelectBitField を使用したビットフィールドの抽出#

イメージ SelectBitField operator は、入力値から連続するビット範囲を抽出し、出力にコピーします。より広いデータワードから特定の特定部分のみが必要な場合に、この operator を使用します。

operator を次のように設定します:

  • 出力を設定します Bit Width を出力リンク上で指定します。これにより、抽出されるビット数が決定されます。
  • パラメーターを BitOffset parameter。これは、出力にコピーされる選択されたフィールドの最下位ビット (LSB) の位置を指定します。選択されたビットは、出力値のビット 0(最下位ビット)になります。

グレースケール画像の場合、 BitOffset は次の範囲内である必要があります:

0 ... Input Bit Width - Output Bit Width

入力で signed Arithmetic が使用されている場合、抽出されたビットは常に unsigned 値として出力されます。

SelectBitField:Input および Output Link Bit Width と BitOffset モジュールパラメータの依存関係

後続ソフトウェアのための Bit Width の拡張#

多くのカメラは、1 画素あたり 10 ビットや 12 ビットなどの Bit Width でピクセルデータを生成します。しかし、画像処理ソフトウェアや画像ファイル形式は、通常 8、16、または 32 ビットなどの標準的なデータ幅で処理を行います。

そのため、ホスト PC に転送する前にカメラデータを 16 ビットピクセルに変換することが一般的です。これを行うには、次の方法があります:

ConvertPixelFormat の使用#

Bit Width を広げるには、イメージソースまたはバッファと ConvertPixelFormat の間におよび operator を挿入できます。 DmaToPC.

を挿入した後、 ConvertPixelFormat 演算子の出力リンクの Property を開き、次のように設定します。 Bit Width を 16.

たとえば、9ビットのピクセルデータを16ビットに変換する場合、演算子は各ピクセル値を左に7ビットシフトし、新しく作成された最下位ビットの位置に0を挿入します。これにより、データを16ビット形式に適応させながら、相対的な輝度範囲が保持されます。

ConvertPixelFormatオペレーターによるBit Widthの拡張

ShiftLeft の使用#

代替として、次の操作を行うこともできます: ShiftLeft 演算子を追加し、 Shift parameterを7に設定します。

7ビットの左シフトは、9ビットの値を16ビットの値に変換するのと同様の Scaling 効果を生み出します:

9-bit value << 7

これにより、出力リンクには16ビットのピクセル値が流れます。

ShiftLeftオペレーターによるBit Widthの拡張

CastBitWidth の使用#

数値を変えずに Bit Width を大きくしたい場合は、次の演算子を挿入します: CastBitWidth operator. Choose this option if downstream software requires a wider Bit Width, but no Scaling of the pixel values is desired.

演算子を使用して Bit Width を変更するには、 CastBitWidth 演算子の出力リンク上で Bit Width を変更します: CastBitWidth オペレーター:

CastBitWidthオペレーターによるBit Widthの拡張

とは異なり、 ConvertPixelFormat または ShiftLeft, CastBitWidth はピクセルデータをシフトしません。その代わりに、元の値を保持しながら上位ビットを追加します。

DRCによるデザインの検証#

Bit Widthを変更したり、算術オペレーターを挿入したりした後は、Analysis → Design Rules Check Level 1を実行してください。Level 1は、DRC logでBit Widthの不一致やパラメータの競合を報告します。影響を受けるモジュールとリンクは、デザインペインでハイライト表示されます。

[Run]をクリックします Design Rules Check Level 2 ビルドする前に、レベル 2 は FPGA リソースの使用量を予測します。幅の広い中間結果や、次のようなオペレーターがあります。 MULT および DIV などの演算子はリソース消費を増加させます。

DRC ログをハイライト表示されたモジュールおよびリンクと一緒に確認します。完全なワークフローについては、空のデザインから実行中のアップレットまで (From Empty Design to Running Applet)チュートリアルのトピックを参照してください。

主要用語

Baslerでは、Bit Width を扱う際に以下のプラクティスを推奨しています:

  • すべての算術演算子の後で、後続リンク伝播される Bit Width を確認します。
  • より狭い幅にキャストする前に値をクリップします。
  • ホストソフトウェア向けの Bit Width の変更(DMA前の1ピクセルあたり16ビットなど)は早期に計画します。
  • 使用 ShiftLeft および ShiftRight 可能な場合は、 MULT および DIV の代わりに2のべき乗の Scaling を使用します。
  • パラメータ値が反映されない場合は、オペレーターリファレンス (Operator Reference)を参照してください。