3

我正在编写一个在 Altera NIOS II 处理器上运行的 C 程序。该程序必须通过特定的内存位置连接到 FPGA 测试板上的 VHDL 模块。我的接口是通过一个宏提供的,它指定了一个基本内存地址。VHDL 程序员已从该基地址分配了 32 位内存,我将用二进制数据填充该基地址,这些数据分为四个“元素”,即 [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

二进制数据分成四个“元素”,即[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 回答