0

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;
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 は、レジスターのベクトル (1 次元配列) として扱う必要があります。N 個のFPGA レジスタ
のベクトルは、 0x0000 からN-1の範囲で an によってアドレス指定できる必要があります。 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 に答える