0

我正在维护与 FPGA 设备相关的生产代码。FPGA 上的早期电阻器是 32 位的,对这些寄存器的读/写工作正常。但是硬件发生了变化,FPGA 设备也发生了变化,使用最新版本的 FPGA 设备我们遇到了麻烦在读取和写入 FPGA 寄存器。经过一些研发,我们知道 FPGA 寄存器不再是 32 位,现在是 31 位寄存器,FPGA 设备供应商也声称。

所以也需要更改小代码。之前我们检查寄存器的地址是否是 4 字节对齐的(因为寄存器是 32 位的)现在在当前情况下我们必须检查地址是 31 位对齐的。所以对于同样,我们将检查地址的最高有效位是否已设置(这意味着它不是有效的 31 位)。我想我们在这里没问题。

现在第二种情况对我来说有点棘手。如果多个寄存器的读/写将超过 0x7fff-fffc(这是 31 位方案中的最大地址)边界,则必须小心处理请求。

读取和写入多个寄存器以长度作为参数,它只是要读取或写入的寄存器数。

例如,如果读取从 0x7fff-fff8 开始,读取的长度为 5。那么实际上,我们只能读取 2 个寄存器(即 0x7fff-fff8 和 0x7fff-fffc)。

现在有人可以建议我一些伪代码来处理这种情况

有些人认为如下

while(lenght>1)
{
  if(!(address<<(lenght*31) <= 0x7fff-fffc))
   {
     length--;
   }
}

我知道这还不够好,但我可以使用同一行中的东西。

编辑

我想出了一段可以满足我要求的代码

 int count;

 Index_addr=addr;

 while(Index_add <= 7ffffffc)
 {   
  /*Wanted to move register address to next register address,each register is 31 bit   wide and are at consecutive location. like 0x0,0x4 and 0x8 etc.*/

  Index_add=addr<<1; // Guess I am doing wrong here ,would anyone correct it.

  count++;

 }

 length=count;
4

2 回答 2

1

我不确定我是否正确解释了给定的场景。但这里有一个镜头:

// Assuming "address" starts 4-byte aligned and is just defined as an integer
unsigned uint32_t address; // (Assuming 32-bit unsigned longs)

while ( length > 0 )    // length is in bytes
{
    // READ 4-byte value at "address"
    // Mask the read value with 0x7FFFFFFF since there are 31 valid bits

    // 32 bits (4 bytes) have been read
    if ( (--length > 0) && (address < 0x7ffffffc) )
        address += 4;
}
于 2013-10-05T22:13:53.770 回答
1

根本问题似乎是程序没有正确处理 FPGA 寄存器。
数据封装会有所帮助,并且不应将 31 位 FPGA 寄存器视为内存位置,而应将它们抽象化。

FPGA 应被视为寄存器的向量(一维数组)。N
个 FPGA 寄存器 的向量应该可以在 0x0000 到N-1的范围内进行寻址。 FPGA 寄存器内存映射在. 所以= 4 * + 。register index
base addr
memory addressFPGA register indexbase addr

对 FPGA 寄存器的访问应该通过读写程序封装:

int read_fpga_reg(int reg_index, uint32_t *reg_valp)
{

    if (reg_index < 0 || reg_index >= MAX_REG_INDEX)
        return -1;  /*  error return */

    *reg_valp = *(uint32_t *)(reg_index << 2 + fpga_base_addr);
    return 0;
}

只要正确定义了 MAX_REG_INDEX 和 fpga_base_addr,那么此代码将永远不会生成无效的内存访问。

于 2013-10-05T23:03:56.127 回答