FPGAデバイスに関連する製品コードを維持しています.FPGAの以前のレジスタは32ビットで、これらのレジスタへの読み取り/書き込みは正常に機能しています.しかし、ハードウェアが変更され、FPGAデバイスも変更され、FPGAデバイスの最新バージョンでは問題が発生しています. FPGAレジスタへの読み取りと書き込み。いくつかの研究開発の後、FPGAレジスタは32ビットではなく、現在は31ビットレジスタであり、FPGAデバイスベンダーによって同じことが主張されていることがわかりました。
そのため、小さなコードも変更する必要があります。以前は、レジスタのアドレスが 4 バイト アラインされているかどうかを確認していました (レジスタは 32 ビットであるため)。現在のシナリオでは、アドレスが 31 ビット アラインされていることを確認する必要があります。同様に、アドレスの最上位ビットが設定されているかどうかを確認します (これは、有効な 31 ビットではないことを意味します)。ここは大丈夫だと思います。
2 番目のシナリオは、私にとっては少しトリッキーです。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;