3

Altera NIOS II プロセッサ上で動作する C プログラムを書いています。プログラムは、特定のメモリ ロケーションを介して FPGA テスト ボード上の VHDL モジュールに接続する必要があります。私のインターフェイスは、ベース メモリ アドレスを指定するマクロを通じて提供されます。VHDL プログラマーは、そのベース アドレスから 32 ビットのメモリを割り当てました。これは、4 つの「要素」に分割されたバイナリ データ、つまり [0-11|12-15|16-23|24-31] で埋められます。 .

私の質問は、これらの配列の「要素」を個別のデータ型として処理する最良の方法は何ですか。データを処理する構造体として配列全体を宣言し、ビットフィールドを使用してさまざまなフィールドを宣言したいのですが、これにより 32 ビット配列にパディングが導入されることを理解しています。

4

2 に答える 2

5

[ビット フィールドの使用] が 32 ビット配列にパディングを導入することは、私の理解です

ビットフィールドを使用しても、明示的に要求しない限り、パディングは導入されません: 言語標準では、コンパイラがビットフィールド間にパディングすることを禁止しています:

C99 標準、セクション 6.7.2.1.10:十分なスペースが残っている場合、構造内の別のビット フィールドの直後にあるビット フィールドは、同じユニットの隣接するビットにパックされます。十分なスペースが残っていない場合、収まらないビットフィールドが次のユニットに配置されるか、隣接するユニットとオーバーラップするかは実装定義です。ユニット内のビットフィールドの割り当て順序 (上位から下位、または下位から上位) は実装定義です。

次のように、幅がゼロのビット フィールドを指定することで、強制的にパディングを行うことができます。

struct hw_reg {
    int a:10;
    int :0; // Yes, this is legal.
    int b:6;
};

あなたの場合、最初の 12 ビットの後に次の 4 ビットを割り当てるのに十分なスペースが残っているため、パディングはありません。レジスタを別の方法で分割する必要がある場合 (たとえば、12-5-7-8)、パディングの使用は実装定義になります。

于 2013-04-25T15:06:19.153 に答える
1

4 つの「要素」、つまり [0-11|12-15|16-23|24-31] に分割されたバイナリ データ。

私は

struct vhdl_data {
    uint32_t a : 12;   // bits  0-11
    uint32_t b :  4;   // bits 12-15
    uint32_t c :  8;   // bits 16-23
    uint32_t d :  8;   // bits 24-31
};
于 2013-04-25T14:59:04.397 に答える