XILINX Spartan用のConfiguration PROM XCF01Sの読み書きをする仕事をやった。
XCF01Sは、JTAGでIn System Configurationをする標準規格IEEE1532に準拠している。
JTAGを扱うのは初めてだったが、IDCODEなどの読み出しはわりとすぐ出来たので、あと1日ぐらいで出来るだろう、とふんでいたら…
“flow_read(array) ” &
“initialize ” &
“(FADDR 16:$addr=0 wait TCK 1)” &
“(FVFY0 wait 50.0e-6 2048:!:CRC)” &
“Repeat 511 ” &
“(FADDR 16:$addr+32 wait TCK 1)” &
“(FVFY0 wait 50.0e-6 2048:!:CRC),” &
この wait は、RUN-TEST/IDLEステートで入れるのですね。
私は、FVFY0を出したらRUN-TEST/IDLEステートに戻さずすぐCaptureDRステートにして、そこで時間待ちしてからShiftDRしてデータを取り出していた。そしたら(あとから考えたら当然なのだがこれではwaitが足りておらず)、数bit、頭が欠けたデータが取れてきた。
悪いことに?対象システムでは複数デバイスをJTAGチェインにしていたものだから、私のJTAGの扱いそのものに問題があるのだろうか?などと考えだし…ハマりました。
なにしろJTAGはステートマシンを操作しつつ1ビットずつデータをシフトして、それも複数デバイスがチェインしていたら、それらも経由してやりとりする仕組みだから、自分のミスによるビットズレを疑いだすときりがない。
教訓:はじめてJTAGを扱うときは、いきなりJTAGチェインに挑まず、まずはデバイス一個から始めよう。
ああ、つかれた。しかしJTAGというのは頭の良い人が考えた仕組みだなあ。
コメント