0

SystemCを使用したハードウェアベースのモデル設計にC++を使用しています。C ++拡張としてのSystemCは、信号とバイトの記述に役立つ特定のデータ型を導入します。

一般に、次のようにデータ型の最初のビットにアクセスするにはどうすればよいですか。

sc_bv<16> R0;

または、の最初の4ビットにアクセスしますtmp

int my_array[42];
int tmp = my_array[1];

sc_bvはビットベクトルデータ型であり、バイナリシーケンスを格納します。ここで、そのデータ型の最初の4ビットが必要です。私のバックグラウンドはC#とJavaであるため、一般的にOOPとReflexionベースのAPI構造のいくつかが恋しいです。この低レベルのもので変換を実行する必要があります。便利な入門的なものが大いに役立ちます。

ありがとう:)、wishi

4

4 に答える 4

2

の場合sc_bv、インデックス演算子を使用できます[]

intの場合は、定数を使用した通常のビット演算を使用します。たとえば、の最下位ビットtmptmp & 1

于 2010-11-22T14:19:26.870 に答える
1

私はSystemCについて本当に話すことはできません(しかし面白いように聞こえます)。通常のCでは、次のようなマスクを使用して下位4ビットを読み取ります。

temp = R0 & 0xf;

次のように、下位4ビットのみに書き込みます(32ビットレジスタを想定し、temp <16)。

R0 = (R0 & 0xfffffff0) | temp;
于 2010-11-22T14:17:57.053 に答える
1

tmpの最初の4ビット(つまり、上位4ビットを意味すると仮定)にアクセスするには(つまり、それらの値を取得するために)、ビットマスクを使用します。したがって、たとえば2番目のビットが設定されているかどうかを知りたい場合は、次のようにします。

int second_bit = (tmp & 0x4000000) >> 30;

現在second_bit1ビットが設定されている場合で、それ以外の場合はゼロです。この背後にある考え方は次のとおりです。

tmpが(バイナリで)あると想像してください
1101 0000 0000 0000 0000 0000 0000 0000
。ここで、ビット単位のAND(&)を次の値で使用します
0100 0000 0000 0000 0000 0000 0000 0000 // which is 0x40000000 in hex
。ANDingは、1両方のオペランドに対応するビットが設定されている場合にのみ、指定されたビットにを生成します(両方とも1)。したがって、結果は次のようになります。
0100 0000 0000 0000 0000 0000 0000 0000
次に、この30ビットを右にシフトすると、次
0000 0000 0000 0000 0000 0000 0000 0001 \\ which is 1
のようになります。元の値のテスト済みビットがゼロの場合、結果はゼロになることに注意してください。

このようにして、好きなビットをテストできます。正しいマスクを提供するだけです。ここでは、intの幅が32ビットであると想定していることに注意してください。これは、ほとんどの場合に当てはまります。

于 2010-11-22T14:21:17.173 に答える
1

正しい情報を確実に取得するには、sc_bvについてもう少し知る必要があります。また、「最初の4バイト」と言うときは、「最初の4ビット」を意味すると思います。ただし、これも誤解を招く可能性があります。これは、実際には下位ビットと上位ビットを区別する必要があるためです。

いずれにせよ、この種のことにはCビット演算子を使用します。ただし、それを正しく行うには、整数値のサイズとランタイムアーキテクチャの「エンディアン」を知る必要があります。

しかし、本当に最初の4ビットだけが必要な場合は、次のようにします...

inline unsigned char
first_4_bits(void const * ptr)
{
  return (*reinterpret_cast<unsigned char const *>(ptr) & 0xf0) >> 4;
}

そしてそれはそれが指しているものの最初の4ビットをつかむでしょう。したがって、ポイントされた最初のバイトが0x38の場合、この関数は最初の4ビットを返すため、結果は3になります。

于 2010-11-22T14:32:10.220 に答える