我正在维护与 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;