2024年6月24日月曜日

spartan3をCPUから「slave serial mode」でconfigする(5)

XC3S50-4VQ100Cのconfigを自分でやる件です.(config ROMを使わずに)

今回は、FLASH→FPGAの流れについてです.

FPGA XC3S50 の回路図はこちらです.
config信号を配線したコネクタがこれです.
M[2:0]=0b111、SWAP=0にハンダで固定しました.DOUTは使いません.
それ以外の信号をArduino側回路図に接続して回路は出来上がりです.
↓config信号の概念図はこれです.

2回目でも書きましたが、config信号の意味を再掲します.
HSWAP  in     config中は0にする、あらゆるpinを内部pullupする役割
M[2:0] in     slave serial modeにするには111にする
CCLK   in     serial clock
DIN    in     serial data、LSB 1stで入れる
PROG_B in     config開始のゴング、0でconfig開始.すぐ1に戻す
DOUT   out    serial data出力、ここでは使わない
INIT_B inout  PROG_B直後は0、config準備が整ったら1になる
DONE   inout  config中0、config終了したら1

CPUが制御するのはCCLK,DIN,PROG_B,INIT_B,DONEの5本です.

CPU制御をポエム風に語りますとこんな感じ.

①半田付けで固定してしまうpin
 M[2:0]=0b111
 HSWAP=0

②CPU起動時初期設定
 PROG_B=1
 CCLK=1

③開始のゴング
 PROG_B=0 → 1mSec wait → PROG_B=1

④INIT_B=1になるまでpoling wait

⑤FLASHの先頭から順にbit serialで1byteずつLSB 1stで出す(DIN,CCLKへ)
 ただし、FLASH上のconfig data(54kB)よりも256byte多めに出す
 (この理由は、FPGAがconfig後に余分なCCLKを要するため)

⑥ ⑤のbyte送出毎にDONEをpolingする.DONE=0なら⑤へ

⑦ DONE=1につき終了

ーーーー
以下はsourceの説明です.

Arduino sourceを置きます(zip)

おなじみのsetup()で、こんなことをやっています.
  searchBin();
  dispStatus();
  FPGAWrite();

searchBin()はFLASHのbottom addressからゼロ番地へ向かって非FFhが現れるaddressを探します.消去済FLASHはFFhになります.この操作の理由は、.binのサイズが正確にはわからないので、現物のサイズを調査するため.
変数dataLenに.binサイズを代入しますが、サイズを+256しておきます..binを全部FPGAに与えた後に追加のclockが必要なのでその対応です.

dispStatus()は、addressなどの表示です.表示するだけ.

FPGAWrite()がconfigの本体.やってる事は上に書いたポエム風そのものです.注意すべきはLSB 1stってとこぐらいかな.FPGAへ流し込む量は変数dataLenが所持しています.

詳しくはsourceを見てちょ

追記:ArduinoからSTM32C011に移植します.プリント基板を作ります.


かしこ

0 件のコメント:

コメントを投稿