EPCSインターフェース

Embedded Peripheral IPマニュアルでは詳細が記述されておらず、HALドライバを使ってね、とある。

気になるではないか。中身はどうなっているのだ?

基本はSPIインターフェース

EPCSのデータシート(http://www.altera.co.jp/literature/hb/cfg/cyc_c51014.pdf)や生成されたHALドライバのソースを見れば、 SPIであることが容易に分かる。

実際、説明無しレジスタのうち(Read Data~Slave Enable)は、SPI Coreのレジスタと同一になっている。

オフセット1)レジスタR/W説明
0x000 .. 0x0FFBoot ROM MemoryR先頭256bytesのデータを直接読めるエリア。
ブート領域に使うため。
0x100rxdata (Read Data)RSPI Coreのレジスタ(0~5)と同じ
0x101txdata (Write Data)W
0x102status (Status)R/W
0x103control (Control)R/W
0x104reserved
0x105slaveselect (Slave Enable)R/W
0x106End of PacketR/W

デバイスの識別

Read Silicon IDコマンド(0xab)を送信2)すると、1byteのIDが返ってくる。IDにより、容量等を判断可能。

ID型番容量ブロック数ブロック長
0x10EPCS11Mb432768
0x12EPCS44Mb865536
0x13EPCS88Mb1665536
0x14EPCS1616Mb3265536
0x16EPCS6464Mb12865536
0x183)EPCS128128Mb64262144

コンフィグレーションデータ長の読み方

FPGAのコンフィグレーションはEPCSの先頭(オフセット0x0)に置かなければならない。従って、EPCS上にNiosIIのコード等を格納する場合は、 コンフィグレーションデータより後ろに配置する必要がある。もし、コンフィグレーションデータの直後に置く場合には コンフィグレーションデータの長さが知りたくなるが、どうやって読み取るか。

CycloneIII/CycloneIVの場合

  1. 0x27~0x21バイト目のbit3を繋げる→長さ情報のbit31~25の値。
    0020: 6A F7 F7 F7 F7 F7 F7 F3 FB F2 F9 FA F9 F1 F8 F8
    (bit3)    ^0 ^0 ^0 ^0 ^0 ^0 ^0
    (位置)    25 26 27 28 29 30 31
  2. 0x48~0x30バイト目のbit2を繋げる→長さ情報のbit24~0の値
    0030: FC F8 F9 FA FF F9 FC F8 FB FB FF FF F9 FD FD FC
    (bit2) ^1 ^0 ^0 ^0 ^1 ^0 ^1 ^0 ^0 ^0 ^1 ^1 ^0 ^1 ^1 ^1
    (位置) 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
    
    0040: F8 F8 FC FC FA FE FA FA FA 2B 88 FF FF FF FF FF
    (bit2) ^0 ^0 ^1 ^1 ^0 ^1 ^0 ^0 ^0
    (位置) 16 17 18 19 20 21 22 23 24
  3. 繋げると、0b00000000_00101100_11101100_01010001 → 0x002cec51
  4. この値はビット単位なので、8で割ってバイト単位にする。→ 368010.125
  5. 切り上げたら完成。→ 368011
  6. ためしに、ツールで読み取ったサイズと比較してみる。
    $ sof2flash --input=mruby.sof --output=mruby.flash --offset=0
    $ nios2-elf-size mruby.flash
    text    data     bss     dec     hex filename
          0  368011       0  368011   59d8b mruby.flash
                               ↑合ってる!
  7. なお、rbfのファイルサイズともぴったり一致する。

圧縮時の注意

Compressionを有効にすると、上記のルールで読み取ったサイズよりも1バイト大きくなる模様。 最終サイズが偶数のときも奇数のときもあるので、バウンダリの関係でもないようだ。 ヘッダから圧縮の有無を判別する方法が分からないので、コンフィグレーションデータの末端数十バイトが0xFFであることを利用して判別するしかなさそう。

1)
Cy1とCy2除く
2)
後ろに3byteのダミーwriteも必要
3)
これはRead Silicon IDではなく、Read Device IDコマンド(0x9f)で読み取れる
altera/qsys/epcsインターフェース.txt · 最終更新: 2014/09/20 02:10 by kimu_shu
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0