FPGAの部屋

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

2006年08月

今度の基板はSDRAM2系統、PowerPC1系統のクロックをFPGAから供給している。最近のお仕事でも書いたがそのクロックを計測してみるとかなりずれていることがわかった。回路的には下の図のような回路になっている。
3a20ccc5.png


これはSDRAMの1系統だがもうSDRAM1系統とPowerPCのクロック系統がある。これらのクロック出力が予定のクロック位相よりもずれてしまったので、各クロックの位相をDCMでシフトして合わせた。(最近のお仕事参照
これは何でかと考えるとPLL専用ICと違ってクロック入力パッドからDCMまでの遅延とフィードバック入力パッドからDCMまでの遅延がかなり違っているようだ。その辺も考えて入力クロックと出力クロックが0ディレイになるように、または、規定の遅延になるようにDCMの位相シフト量を調整しないといけないようだ。この場合は当然ながらDCMとBUFGMUXの位置(出来れば配線も?)固定しておかないと出力クロックの位相が正確に決定できないと思う。ただいま解析中だ。
なかなか子供の付き添いがあってブログも書く暇がないのがもどかしいが、自分の備忘録でもあるので書いてみたい。

やっとPowerPCが動作したようだ。以前書いたようにSDRAMやPowerPCのクロックの位相を調整した。(これが効いているかどうかはわからないが。。。)
もう1つはアドレス転送のパイプライニングで最大2エントリから最大16エントリに変更したが、そこの回路が間違っていた。
さらにブートコードにも一部誤りがあったようだ。
それにしても7447AはFFF00100のスタートアップからキャッシュもOFFなのにバーストアクセスだった。びっくりした。603eはシングル転送だったので、当然そうだと思っていた。しかも64ビット幅で4ビートアクセスでキャッシュフィルと同様に見えるのだが、どうやらそのうちの2ビートしか使っていないようだ。アドレスで言うと000002020番地からの4ビートアクセス(インストラクションフェッチ)の後に000002030番地の4ビートアクセスが出ている。キャッシュフィルならば000002020番地からの4ビートアクセスすると000002030番地からの4ワード分もフェッチしているはずなのに、その分は捨てているのだろうか?
当然000002030番地の4ビートアクセスの場合に、うちの回路で3,4ビート目は000002020番地にラップアラウンドしている。

まだPowerPCを動かそうとやっているがなかなかうまく動いてくれない。
FPGAから出力しているクロックの位相がおかしいのかと思ってテストしてみることにした。やり方はFPGA Editorを使って、各クロックのフィードバック入力ピンをテストポイントにつないでオシロスコープでPCIXの入力クロック(これもテストポイントに出力している)に対する各クロックの位相と比較してみた。
このままではテストポイントの各クロックのテストピンに行くまでの配線遅延が違っていて比較が難しいので次の手順で行った。

1.各クロックの入力パッドから出力パッドまでの遅延量をTiminig Analyzerで出した。
2.1.の値を実測値から求めた係数をかけて実力値にした。
3.PCIXクロックの出力との差分をとった。
4.実際の位相ダイアグラムに従って補正した。


4.の値をオシロスコープで測ったPCIXクロック出力との差分と比べるとかなり違っていたので、DCMの位相シフトをFPGA Editorで変更して予定していたクロックの位相ダイアグラムに合わせてみた。でもまだおかしい。PowerPCのアドレス転送のキューを2深度から16深度に変更するために新たにFIFOを付け足したのでそこがおかしいのかもしれない。Chipscopeの波形を解析することにした。
それでもDCMの位相シフトをFPGA Editorで変更したときの位相シフト量(PHASE_SHIFT)がおかしいような気がする。テストピンの波形をオシロスコープで見ていると、普通はクロック1周期を256で割った数をPHASE_SHIFTにセットするはずが、128で割った数をセットするとぴったりになるようだ。なんでだろうか?周波数が高くてタップの遅延値を越えているからだろうか? PHASE_SHIFTの1ごとに59psなのでもしかしたら無理なのか? たかが66MHzで1周期分遅延素子もないのに。。。アンサーを見てみよう。

最後に実際の遅延量は以前ブログで紹介したFPGAの性能に基づいて計ってみた。ディレイは3段だが。。。結果は0.82だった。

なかなか病院に息子の付き添いに行かなくちゃいけないのでなかなかデバックが進まない。この経過も後で詳しくやり方をブログに書こうと思う。

(2006.08.28追記)
やはりPHASE_SHIFTはミスってました。PCI66MHzにしたつもりが極性を間違ってPCI33MHzになっていました。つまり33MHzだったので移送シフト量が2倍になっていたようです。ということはDCMはクロック周期を自分で確認できて位相シフト量を決めていることになると思います。そうなんだ!!!

今回はFPGA EditorでDCMの位相シフト量を変更してみよう。
DCMではFPGAの中および外に出力するクロックを生成している。その位相関係の都合が悪い場合に位相シフト量を変更したいということがある。今まではもう一度論理合成、インプリメント、BitgenをしていたがFPGA Editorで変更するとお手軽である。
まずはISEのProcessesペインからFPGA Editorを起動する。
FE_DCM_PS_change_1_080813.png

最初にFPGA EditorをRead/Writeモードに設定しよう。
"File" - "Main Properties..."を選択する。
dbe79676.png



Main Propertiesダイアログが立ち上がる。
FPGA_Editor_11_060318.png


"General"タブが選択されていて、その中の"Edit Mode"が"No Logic Changes"が選択されていると思うが、ここのプルダウンメニューから"Read Write"を選ぶ。これでFPGA Editorで編集が出来るようになった。
FPGA_Editor_12_060318.png

次にList1ウインドウで位相シフト量を変更したいDCMを選択する。
FE_DCM_PS_change_2_080813.png

FunctionボタンのうちF11を押すとそのDCMがハイライトされる。
FE_DCM_PS_change_3_080813.png

その状態で右端のeditblockボタンをクリックする。
FE_DCM_PS_change_4_080813.png

DCMのBlockウインドウが立ち上がるのでピンクの四角で囲んだ"Show/Hide Attribute"ボタンをクリックする。下に属性が示されるので位相シフト量が変えたければPHASE_SHIFTの値を変更する。変更したら青の四角で囲んだ"Save Changes and Close Window"ボタンをクリックする。そうすると変更内容がセーブされる。
143cab61.png


上のウインドウではDCMのすべて属性が設定変更できるので便利なのだ。
これでDCMの変更が出来たので"File"メニューから"Save"を選択してセーブしてFPGA Editorを終了する。
ISEのProcessesペインを見てみると"Generate Programming File"の項目がになっていると思う。
FE_DCM_PS_change_6_080813.png

"Generate Programming File"をダブルクリックして起動するとパラメータを修正したDCMになったビットファイルが出来る。
FPGA EditorからもBitGenでビットファイルを作れるが、いろいろオプションを入れるのが面倒なのでISEからビットファイルを作ったほうが簡単なようだ。事実うちのプロジェクトではFPGA EditorからもBitGenでビットファイルを作ったのだが、オプションが足りないのかうまく行かなかった。
後は以前紹介したプローブをテストピンに接続する方法でテストピンに信号を出してオシロで波形観察している。配線遅延は換算しないといけないがBGAの信号をお手軽に観察できてとても便利だ。

PowerPCプロセッサのTT(Transfer Type)の話をしてきたがTT="00011"の状態が出たのでChipscopeの画面を示します。JTAG ICEでRUNしたときの波形です。
2b6cf2cd.png


でも今良く見てみると怪しいかも、FPGA Editorでみるとネットからつながっていないように見える。要調査。
原因がわかったようです。TT[3],TT[4]にピンアサインを忘れていてどっか他のピンに行っていて1固定だったようです。修正しました。お騒がせしました。いつもどたばたで面目ない。デバックの模様を載せると信用失墜につながるかしら?でもいつもこんなもんだし。。。

それとは別に回路のバグもわかってきた。EC603eはアドレス転送が2つのアドレス転送しかキューにためなくて良いが7447Aは16個キューにためられるようにしなければならないということだ。今までキューのエントリは2だったが16にしなければ行けない。
回路を修正する。これで動くと良いな。。。

↑このページのトップヘ