FC2カウンター FPGAの部屋 2006年01月

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

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Virtex2proの3.3VのIO電圧

最近こんなのばっかりだが、いろいろ毎日あたふたしながらやっている。またまた、仕様変更でピン割り当てやり直しとなった。
今度はVirtex2proに3.3VのIOを割り当てたのだが、いろいろ振り回されてしまった。
まずはVirtex2proの日本語ユーザーズマニュアルの166ページには”指定されている 3.3V I/O バンクを使用すること。指定されているバンクの位置については、312 ページの表4-1 を参照してください。”と書いてある。
こりゃ大変、もうバンクを割り振ってあるのに。。。
何かおかしい。試しに英語版を見るとそんな事書いていない。
"12/04/02 2.1 Added full support for 3.3V I/O standards PCI-X, LVTTL, and LVCMOS33."と書いてあって、どうやら3.3VI/O大丈夫になったらしい。日本語ユーザーズマニュアル古すぎ。。。日本語ユーザーズマニュアルはVer2.0だった。Ver.2.1から大丈夫になったみたい。
でもアプリケーションノートXAPP659を見ろとある。試しに日本語を見ると、3Vに電源電圧をするか、DCIを使ってインピーダンスマッチングを計れと書いてある。
また英語版を見ると”3Vに電源電圧をする”が削除されて”DCIを使ってインピーダンスマッチング”だけになっていた。
もう空いているピンが無いのでVRP,VRNの抵抗がつけられないので、外にダンピング抵抗をつけることにする。

ともかく日本語のマニュアルだけでは危ない。必ず英語版も見ること。
  1. 2006年01月31日 20:04 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:2

V2, V2proでのDDR SDRAMコントローラ2

最初に私のDDR SDRAMコントローラのタイミング図を示す。このタイミングチャートはアクティベートコマンドでROWアドレスとバンクを指定してアクティベートした後のリード、ライトコマンドの動作の様子だ。CAS LATENCY=2、バースト長=2、動作周波数133MHzの予定だ。
DDR_timing_chart_rw1_060129.png


昨日の続き。
2.のDQSを使う方法だ。DQSはライト時にはDQに対して90度位相がずれているが(上図参照) リードの時にはDQと同位相で出てくる。よってDQSを何らかの方法で遅延させてDQをサンプルしなければいけない。これには2つ方法があるようだ。
1つはDQSを配線遅延でDQがサンプルできるまで遅延させる方法、もう1つはDQSをLUTなどを使って内部で遅延させる方法だ。
配線遅延でDQSを遅延させる方法では動作周波数によって配線遅延の長さが異なる。つまり一度決めた周波数を動かせないということだ。うちとしては基板を何度も作るわけには行かないのでこの方法は取れない。設計動作周波数で動かなかったら基板を作り直さなければいけない。
もう1つの内部遅延ではLUTなどを使うようだ。実際の受信回路はj_xapp802.pdfの4ページの図4に書いてある。遅延回路はj_xapp688.pdfの6ページの図8に載っている。実際に私もmfreemanさんの回路をもとに実験してみた。(Re: FPGAでディレイ >>>保証なし)
LUTプリミティブを使用して可変ディレイを作ることが出来るだろう。
今回の基板のFPGAのピンアサインもDDR使う方向でやっている時点では8つのDQに対して1つのDQSをグルーピングしてピンに割り当てて、DQSを配置固定したLUTで遅延しSRL16でDQをサンプルという予定でいた。
ただし、ここで注意しなければいけないのはDQSの遅延量はDQのデータウインドウの真ん中ではないかもしれない。
検証してみよう。IOBの入力パッドからI出力までの遅延はTiopi=0.87ns(V2pro-6)、IOBの入力FFのセットアップ/ホールド時間TIOPICK/TIOICKP=0.86/-0.63ns(V2proデータシート、ユーザーズマニュアルより) 大体同じなのでこれは考慮しないくても良いようだ。LUTで真ん中まで遅延するとすると1LUT遅延はTilo=0.32ns、仮に配線遅延を0.3nsとすると、7.5nsの半分3.75nsの半分で1.875nsとすると3個遅延素子を入れればよいことになる。
ちなみにDCMの位相シフトを利用したクロックを使用したIOBのセットアップ/ホールド時間はどうかというとj_xapp259.pdfの6ページからにあるようにTpsdcm/TphdcmはXC2VP30では1.81/-0.74と記載されている。データの変化点からクロックエッジまでの遅延を計算すると、クロックの変化点からTac=500ps必要だ。次にDCMのジッタ100ps、そしてセットアップ時間1.81nsを足すと、合計2.41ns。真ん中から0.535nsずれたところにクロックエッジを設定することになる。

次にDQSはリードの時のみDDR SDRAMがドライブして、それ以外の時にはフローティングしている。リード時のみクロックが出て来てそのほかはクロックが入ってこなければいいのだが、どうやらチップスコープでDQSを見ているとフローティングの時にはちらちら波形が出ているようだ。こうなるとDQの受けをSRL16などのシフトレジスタを使ったFIFOで構成した時にどこがデータかを判定しなければならない。CL=2ならばコマンドを送った2クロック後にデータがSDRAMから来るはずであるが、データ受信FIFOにコントローラからイネーブルを与えるのが難しいと思う。
任意の配線長で使える方法ではイネーブル信号を出力して、DDR SDRAM間での行き帰り配線長を通して、イネーブル信号入力に加えてイネーブルする方法か。
配線長が決まっていれば、その分を計算して、LUT遅延で作り出してイネーブルを遅延させるか。こちらのほうは正確な配線遅延の計算が必要なはずである。配線遅延で回路も変わってくるはずだ。
結局、異なるクロック間のデータの受け渡しが面倒くさいし、タイミングもずれる可能性がある。DQSのクロックがマスタクロックに近く、今のクロックでデータを取れるかどうかという状況だとするとどうだろう。間に1つマスタクロックの反転クロックでデータを取って、マスタクロックに受け渡さないといけないかもしれない。(イネーブル信号などを受け渡す場合)という訳で配線遅延に影響されないように回路を作ろうとするとかなり難しいことになると思っている。

これが3.のIOBの可変遅延回路でデータを遅らせるとどうなるだろう。データが遅れるのでマスタクロックでサンプルできる。ということはリード時にコントローラからのリードデータイネーブルがそのまま使用できるということだ。かなりDDR SDRAMコントローラを作るのが楽になる。ここでも遅延をサーチしてちゃんと受かる遅延を見つける回路をつけなければ。
配線遅延からうまく受かる遅延を決定するのが重要になると思う。
スパルタン3Eのデータシートを見ると4nsの遅延が入っているということである。これじゃちょっと少ないが配線遅延で調節すればよいだろう。

何か取りとめがなく、まとまっていないで申し訳ない。このようなことを考えている。
私のDDR SDRAMコントローラはこの辺のことはどうしているかというと、DQSもDQと一緒にサンプルして特徴的なパターンを抽出している。DQSとDQを一緒にFIFOに入れてDQSのパターンを確認して、同時に入ってるDQをデータと認識している。一応これで83MHzだったらちゃんと受けられるようだ。
データシートを見て遅延を調整しても最大値しかわからないので、遅延の実力値は未知数だ。実際は微調整が必要だろう。ロットごとに遅延値が変わって回路を変更しなければならなくなったとしてもおかしくない。それを嫌って、私のDDR SDRAMコントローラは配線遅延に影響されない回路構成を目指している。
DDR SDRAMコントローラ使わなくなったので、ちょっともったいない。スパルタン3Eスタータキットで確かめてみよう。
しかし、DCMのジッタが多くて100MHz以上の周波数でDDR SDRAMコントローラのデータを受けられないならば、Xilinxに頑張ってもらってジッタの少ないDCMを何とか作ってもらえないものか。。。
  1. 2006年01月29日 08:32 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:4

V2, V2proでのDDR SDRAMコントローラ1

今度作る基板にはDDR SDRAMが搭載されなくなってしまったが、V2, V2proでのDDR SDRAMコントローラの方式について書こうと思う。
DDR SDRAMの使い方はエルピーダのマニュアルが詳しい。ここにある。
DDR SDRAMはDLLを持っていて供給されたクロックにロックする。よってtDQSCK(DQのクロックからのスキュー時間)はエルピーダのDDR333メモリだと-0.6nsから0.6nsだ。つまりデータの出力時間は入力クロックにほぼ同期している。
データの書き込みの時はDDR SDRAMはFPGAから出したデータ(DQ)をDQSでサンプルしセンスアンプに書き込む。書き込み時にはクロックとデータ(DQ)やDQM、DQSの配線長が一緒だとすると配線での遅延だけ遅れて受け取る。DQやDQMに対してDQSは位相が90度ずれていて、DQやDQMの真ん中でサンプルできるようになっている。DDR SDRAMのセットアップ時間、ホールド時間のマージンやクロックとDQ,DQMの出力時間の誤差、配線遅延の誤差を考慮しなければならない。だがそれらの誤差を押さえ込めれば、133MHzの場合は一様にクロック、データが遅れるので書き込みの時には問題は少ない。当然動作周波数が高くなるとマージンが少なくなって厳しくなってくると思うが。基板屋さんにはマージンを含めて配線遅延について要求をだすだろう。
基板での配線遅延は良くわからないが、例えば1ns配線で遅延するとしよう。DDR SDRAMコントローラから出たクロックは配線で遅延してDDR SDRAMに届くのでDDR SDRAMの動作はFPGA(DDR SDRAMコントローラ)から見ると1ns遅れていることになる。
次にデータ読み出しの場合だが、DDR SDRAMの動作はFPGAから見ると1ns遅れているので、クロックに同期してDDR SDRAMがデータを出力すると、DDR SDRAMコントローラから見ると2ns受け取るデータが遅れていることになる。
133MHz動作とすると周期は7.5ns、DDRなので1データは半分の3.75ns、これでデータの遷移時間を前後0.5nsずつとすると1nsなくなるので2.75nsになる。このデータが2ns遅れているとなると残りは0.75ns。
データ書き込み時のクロックとコマンドやデータの位相を合わせるためにクロックをIOBのDDRレジスタから生成するとさらに基準クロックから5ns程度遅れてしまう。さらにIOBのセットアップ時間も加算される。
これではもうSDR SDRAMのように同じクロックでサンプルすることは無理である。
DDR SDRAMコントローラがデータをリードする場合はDQSがリードクロックとして使用できるが、データと位相が同じである。
以上のことを踏まえると、Xilinxのアプリケーションノートによると以下のリード方法がある。
1.100MHz以下の周波数ではDCMの位相シフトを利用したり、配線による遅延を利用したりして受信クロックをデータがサンプル出来る位置に持ってくる。
2.100~200MHzではDQSをクロックとして使う。DQSはいつもクロックが出ているわけではなく使いづらいし、データと位相が同じなので配線遅延かFPGA内部遅延を使って位相を90度遅らせなければならない。
3.200MHz以上ではV4,S3EのようにIOBの専用遅延回路でデータを遅延させる。

1.では最初100MHz間でしかだめというのを知らなかったので、私はこの方法を取った。私が取った方法はDCMの動的位相シフトを利用して、最初にDDR SDRAMにリードコマンドを連続して送ってDQSを発生させ、だんだんに受信クロックを位相シフトしていってうまく受かる位相シフト量を見つける方法だった。確かに83MHzでの動作は完璧だが、133MHzでは今の所リードできない。やはりDCMのジッタなどで100MHzが限界なのか?
その他、配線を使用してDDR SDRAMへ行く配線の遅延をキャンセルする方法もあるようだ。これはML310というXilinxのV2pro基板のマニュアルに詳しい。ここを見てほしい。
ML310では片道分の配線遅延とIOBのDDRレジスタのクロックからの出力時間をDCMのフィードバックでキャンセルしている。それから配線遅延やIOBのセットアップ時間、Tacを計算して受信クロックのシフト量を計算している。つまり配線遅延もパラメータの内に入っていてここが狂うとデータ読み出せなくなる。

-------------------------------------------
この辺で疲れたので、また続きは次回に。
  1. 2006年01月28日 19:59 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:11

PACEの使い方2

PACEの使い方の続き。
現在WebpackISE8.1i、SP1だが、PACEが少しおかしい。カラーツールバーのアイコンが表示されないようだ。下図で赤で囲んだ所に四角の色のついたアイコンがあるはず。四角の色のついたアイコンは無くともその辺をクリックすれば色が付くようなので、これでやってみる。
信号のグループごとに色をつけてみる。色を付けるグループをDesign Object List - I/O Pinsウインドウから選択する。そうして、下図で赤で囲んだ所を適当にクリックすると色が付く。
pace_9_060128.png

これで信号をピンに配置してみよう。現在はArchitecture ViewだがPackage Viewで行っても良い。しかし、Architecture Viewの方がFPGAチップの形状が見えるので私は良いと思う。関連する信号はなるべく集めておいたほうが良いと思うし、データパスはなるべくチップの左右に配置したい。Architecture Viewで信号を割り当てPackage Viewで確認というのが私の好きなスタイルだ。
Design Object List - I/O PinsウインドウからA_nをArchitecture ViewのDevice Architecture for xc3s200-4-ft256ウインドウのB1にドラックアンドドロップする。
pace_10_060128.png

今度はブロックでドラックアンドドロップしてみよう。
Design Object List - I/O PinsウインドウからAN_n<0>からAN_n<3>までを選択してArchitecture ViewのDevice Architecture for xc3s200-4-ft256ウインドウのC1からのピンにドラックアンドドロップする。ドラックアンドドロップの途中では白抜き三角が下向きに4つ縦に並んでいると思うが一番下の白抜き三角をC1にあわせると下向きに信号がピンに配置される。
これはメニューIOBsのDistribute ActionがDistribute Downになっているからだが上向きに配置する場合にはDistribute Upにすれば逆向きになる。
pace_11_060128.png

信号をピンに配置するとDesign Object List - I/O Pinsウインドウの左端の箱が無くなる。全て配置して、今度はI/O Std.を設定しよう。ISE6.3ではDesign Object List - I/O Pinsウインドウは2分割されて下にGroupを表示するペインが出ていたのだが、今使っているISE8.1ではディフォルトで出ていないみたい。何か設定があるのだろうがわからない。手動でグループ化してみよう。グループにする信号をまとめて選択して右クリックでメニューを出す。Groupがあるので選択。(下図)
pace_12_060128.png

そうするとDesign Object List - I/O Pinsウインドウが1本ずつ表示するペイン(上)とグループを表示するペイン(下)に分かれる。グループの信号にI/O Std.を一括して設定するにはグループペインから行うのが便利だ。I/O Std.からSSTL2_IIを選んでみた。上のペインを見るとグループのすべての信号に同じI/O Std.が設定されているが見える。
pace_13_060128.png


PACEも結構便利だった。現在PACEでピンを割り振っている。しかし、SSTL2はVREF必要なので、結構ピンを使ってしまう。ピンが足りなくなったのでDDR SDRAMは止めてSDRAMでいくことになりそうだ。DDR SDRAMのモジュールが出来ているので残念だが、DCMの位相シフト方式では100MHz以下対応とXilinxのアプリノートに書いてある。実際83MHzでは動いても133MHzでは動かなかった。133MHzで動くためにはDQSをクロックとして使うかDDR SDRAMに行く配線の行き返りの長さの配線にクロックを通して遅延を付加したクロックでデータを受信しなければいけないようだ。
スパルタン3Eスタータキットが発売されたらDDR SDRAMコントローラを作ってみたい。スパルタン3EはIOBに調整できるディレイが入っているのでより簡単に組めると思う。
  1. 2006年01月28日 07:40 |
  2. PACEの使い方
  3. | トラックバック:0
  4. | コメント:0

PACEの使い方1

今日はPACEでのピンの割り振り方を書き留めておこうと思う。
おなじみのdynadisp_testプロジェクトを使うがDDR SDRAMを接続すると思ってみてほしい。
最初にHDLのソースを書く。そしてISEのProcessesウインドウのUser Constraintsを展開してAssgin Package Pinsをダブルクリック。
pace_1_060126.png

PACEが開く。まずはIOBのDDRレジスタのクロックの制限を大体見るためにDifferential Pairを表示してみよう。メニューバーのIOBsからShow Differential Pairsを選択する。
pace_3_060126.png

Differential Pairが赤い糸で表示される。(#けして離れられないかもしれない)
pace_3_060126.png

Architecture ViewからPackage Viewに変更するため、右のウインドウの下のPackage ViewタブをクリックするとPackage Viewになる。ここでも赤い線でDifferential Pairが表示される。
pace_4_060126.png

BANK7のみSSTL2レベルのIOに対応するためにVREFピンをPROHIBITする。メニューバーのIOBsからProhibit Special Pins...を選択する。下図のようなダイアログが開くので、BANK7にチェックを入れる。次にProhibit Pin TypesのVREFにチェックを入れ、OKボタンをクリック。
pace_5_060126.png

BANK7のVREFピンが灰色で示されて(下図)、UCFファイルにPROHIBIT制約が追加される。
pace_6_060126.png

次にコンフィギュレーションで使用するピンを予約しておこう。セレクトマップでコンフィギュレーションするということにする。同様にメニューバーのIOBsからProhibit Special Pins...を選択する。ダイアログが開くので、Configuration Mode Pinsタブをクリック。Prohibit forの区画でSelectMAPボタンをクリックするとセレクトマップで使うピンがチェックされる。
pace_7_060126.png

OKボタンをクリックするとセレクトマップで使うピンが灰色で示され予約される。VREFと同様にUCFファイルにPROHIBIT制約が追加される。
pace_8_060126.png

  1. 2006年01月27日 20:37 |
  2. PACEの使い方
  3. | トラックバック:0
  4. | コメント:0

技術発表会

3月15日の14時から15時まで総合研究棟Bでポスター発表します。
学内の方は見に来てください。Webサイトに予稿集がアップされています。今回はVirtex2-3000を使ったスイッチボックスについて発表します。
参加登録すれば企業の方も見に来ていただけますが、同僚で私しかFPGA関係やっている者がいないので田舎にまで来る価値は無いと思います。(まだ参加登録開始していませんが)


  1. 2006年01月26日 19:20 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

プリント基板の設計

Virtex2proのRocketIOやDDR SDRAMを使うと、電源が沢山必要になるようだ。
RocketIOのVccはロジックと別電源にしなくちゃいけないし、ACカップリングだとVTRX受信用のリファレンス電源が別に必要。
DDR SDRAMのリファレンス電源は消費電力が結構大きいし。。。
FPGAコアも電力を食いそうである。プロセッサコアは強烈に電力を食いそうだ。
大きい基板は十数電源になりそうだ。
それに、2.5V動作の水晶発信器が見つからない。LVCMOS2.5Vは見つからずLVPECLのエプソンの水晶発信器しか見つからなかった。
"Virtex,Virtex2proのIOBのクロック配線の制約"でも書いたが、思いもかけない制約もある。
間違えないように配線しないと。回路図を作る段階はいつも緊張する。1本間違えたら基板パーかもしれないから。使用するいろいろなデバイスのデータシートやユーザーズマニュアル、アプリケーションノートを読まなくちゃ。相当読まないとだめだ。でも必要な所のみ拾い読み。とても時間が足りないし。。。
なるべく安全なように配線することにする。
  1. 2006年01月25日 20:42 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:4

Virtex2, Virtex2proのIOBのクロック配線の制約

Virtex2, Virtex2proのIOBにはIO_L19N_4, IO_L19P_4というような名前がついている。これはLVDSなどの差動信号を入出力する際のペアとなる信号だ。
これらのIOBではIOBのクロック入力に制限があるので、注意が必要だ。
IOBには入力用DDRレジスタ、出力用DDRレジスタ2個があるが、それぞれに入力DDR用のクロック2本、出力DDR用のクロック2本が入力できるようになっている。
FPGA_Editor_5_060118.png

差動入出力ペアのIOB間では入力DDR用のクロックが共通になっていて、出力DDR用のクロックも共通になっている。
IOB_clock_060119.png

上の図で赤く囲んだところが入力クロック、出力クロックをマルチしているところだ。

FPGAの回路が出来ていない状態で基板を作ろうとすると、このような事柄に注意しなければいけない。
DDR SDRAMコントローラ回路でDQとDQSなどは出力するクロックが違っている。それらのIOはIOB内のDDRレジスタを使用しないとどうにもならないので、使わなくちゃいけないのだが、IOBクロックの制約を見逃すと使用できなくなる可能性がある。
例えば、IO_L19N_4にDQ0、IO_L19P_4にDQS0割り当てたらアウトだ。
FPGAの回路が出来ていればエラーが出るのでわかるけど。。。
危ないところだ。もう一度ピン割り当てを見直さないと。。。

2006/01/25 注:基本的にはLVDSペアのパッド同士のDDR入出力クロックがマルチされているが、No_Pairのパッドが混ざっている時にはその限りではない。やはりFPGA Editorで必ず確認すること。
  1. 2006年01月25日 10:34 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:2

PCIボードの起動時間

PCIボードのFPGAのコンフィギュレーションは汎用8ビットのFLASH ROMに入れておいたコンフィギュレーションデータをCPLDで制御してFPGAへ書き込むようになっている。
パワーオンリセットICを搭載するのを忘れたため、FPGAのコンフィギュレーションの初めはPCIのRST#がディアサートしたときである。RST#ディアサート後、スレーブセレクトマップでコンフィグしているので、8ビットを120nsごとにFPGAにコンフィグしている。
XC2V1000のビットストリームの長さは4,082,592ビットなので、バイトに直すと、510,324バイト。これを1バイト120nsかかるので全部では61ms。
FPGAのDCMをリセットするのに十数ms、PowerPCのPLLをロックさせるために安定するまで十数ms、合計ここで30ms位待つので、RST#のディアサートからFPGAがPCIアクセスに応答できるようになるまで90ms位かかっている。
これでも、今までのマザーボードでは問題なくPCIコンフィギュレーションが成功している。
結構大丈夫なもんだ。
うちのPCIボードの起動時間はこんなもんである。
---------------------------------------
PCI仕様書リビジョン2.2でのRST#がディアサートされてから最初のPCIコンフィギュレーションアクセスまでに2の25乗クロックだそうだ。これは33,554,432クロックなので15nsをかけると約500ms。
なので、PCIボードは規格を満たしているようだ。
  1. 2006年01月23日 21:33 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0

雪の朝(かまくら作り)

今日朝起きてみたら雪がやんでいたので、朝食後雪かきをした。
息子がかまくらを作るといって頑張っていたので、手伝ってやった。
雪を運んできて積み上げ、穴を掘った。雪が足りなくて小さいのし出来なかったため息子はなかなか入れなかった。それじゃというので、もっと小さい一番下の娘をいれてみたら、ちょうど良いというか、やっと入れるくらいだった。
kamakura_060122.jpg

今日の庭の様子。昨日作ったゆきだるまとかまくら。
snow_garden_060122.jpg

一面雪の原だが、今日天気が良かったのでだいぶ溶けたが北側はだいぶ雪が残っている。明日も凍結することだろう。道は一部分以外は大丈夫そうだ。
  1. 2006年01月22日 17:40 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

次世代ワールドホビーフェアに行ってきた

今日は雪のふる中を息子の付き合いで幕張メッセで開催されている次世代ワールドホビーフェアに行ってきました。Webサイトのアドレスはここ
朝、凄い雪の中を車で研究学園駅まで行く。私の車はスタッドレス付いているので大丈夫だ。しかし他の車が遅い。数台抜いたがスピードが出ないのはしょうがない。
駅に着いたらやはり電車に行かれてしまった。仕方ないから次の電車で行く。TXに乗って南流山で武蔵野線で海浜幕張へ。
駅を降りたらやはり雪。案内人の誘導に従って行くが、凄い並んでいる。
World_hobby_1_060121.jpg

2時間ほど待ってやっと建物の中に入った。
目当てのアームリング(イベント専用)を購入。アイスドアース(スノウバージョン)とバッポ(ファントムバーション)だそうだ。
Armring_060121.jpg

次に会場の中に入って、アームファイトドリーム(PS2のゲーム)ファントムのキャラクタをゲット。(メモリカードを持って行って書き込んでもらったのだった)
World_hobby_2_060121.jpg

World_hobby_3_060121.jpg

今遊んでいるが、ファントムのキャラクタが出てきたようだ。
もう会場には用は無いので、マクドナルドで腹ごしらえをしてから、電車で帰ってきたが、武蔵野線は遅れていたようだ。
帰ってきたら下の娘が外で遊んでいたので、息子も一緒になって遊んでた。ゆきだるまを作っていた。
World_hobby_4_060121.jpg

それにしても今日はセンター試験だが、受験生も試験官もご苦労様である。毎年雪になるのはなぜだろう。
  1. 2006年01月21日 16:04 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

FPGA Editorの使い方2

今日はスライスやIOBの中身を見ることにしようと思う。
以前クロックパスを見てみたInst_ssgdisp_FreqDivi_lcnt_12とswl_3が同様に論理素子に割り当てられているかを見てみよう。
最初にInst_ssgdisp_FreqDivi_lcnt_12を見てみる。右上のList1ウインドウからInst_ssgdisp_FreqDivi_lcnt_13を選択する。List1ウインドウはスライス単位なので1つのスライス単位にInst_ssgdisp_FreqDivi_lcnt_12とInst_ssgdisp_FreqDivi_lcnt_13がいっしょにはいってるためInst_ssgdisp_FreqDivi_lcnt_13としか表示しないようだ。
そうすると、右下のWorld1ウインドウにInst_ssgdisp_FreqDivi_lcnt_13の位置に赤い点が表示される。
FPGA_Editor_1_060118.png

下図の赤で囲んだZoom Selection(F11)をクリックするとInst_ssgdisp_FreqDivi_lcnt_13の入っているスライスが赤い色で表示される。
FPGA_Editor_2_060118.png

これをダブルクリックするとこのスライスの中がどう配線されているかがわかる。(下図参照)
FPGA_Editor_3_060118.png

次にsw<3>をList1ウインドウでクリックして、Zoom Selection(F11)をクリックする。
FPGA_Editor_4_060118.png

IOBが赤く選択される。赤く選択されたIOBをダブルクリックするとIOBの中の配線が見える。
FPGA_Editor_5_060118.png

sw<3>ではIOB内右下の入力FFを使用している。左のほうにはDDR出力レジスタが見える。出力だけではなく出力イネーブルもDDRレジスタになっている。
ちなみにList1ウインドウはAll Componentsで選択している。一番上のリストボックスをプルダウンすると、All Netsなどで選択できる。
後、Array1ウインドウで見えるスライスとIOBは四角いがBRAMは細長い四角だ。

FPGA Editorは使い始めると便利なツールだと思う。特に自分意に沿わない結果になった時にどうしてだろうということでFPGA内を見るときには効果を発揮する。
また、配線のしなおしもできる。まだ説明していないがRead/Wirteモードにして配線しなおすことが出来る。これは特にパッドに見たい配線を持って行ってロジアナで見るとか、こっちのほうが私には重要だが、Chipscopeの配線をインプリメントせずにつなぎかえるとかに使えるらしい。
Chipscopeのどんな名前の配線をつなぎかえるかはまだ試していないので、そのうちに試してみたい。
  1. 2006年01月18日 19:59 |
  2. FPGA Editorの使い方
  3. | トラックバック:0
  4. | コメント:4

FPGA Editorの使い方1

ISE8.1でFPGA EditorとCORE Generatorが使えるようになった。
一般的にはCORE Generatorが使えるほうが大きいと思うが、同期FIFO、非同期FIFOが使えるのは良い。しかし、リード・イネーブルを入れてから次のクロックでデータが出るのが困ることがあるので、自分でFIFOを作ったりしている。
今日はFPGA Editorについて使い方を書いてみようと思う。
”ISEで任意のパスのディレイを見る方法”を参照してほしい。
サンプル回路は7セグメントLEDのダイナミック点灯の回路。サンプルはここにあります。
ファイルをダウンロードするとdynadisp_test_1ms.ZIPというファイルが出てくる。これをWindows XPだったらダブルクリックで、それ以外だったらソフト(Winzip等)を使って解凍する。
解凍すると、dynadisp_testというフォルダが出てくる。それを開けるとVHDLファイルとまたdynadisp_testというフォルダが出てくる。そのフォルダをまたダブルクリックすると、ISEのプロジェクトファイルdynadisp_test.iseがあるので、それをダブルクリックしてISEを起動すると、ISE8.1に変換するかどうかを聞いてくるダイアログが出てくるのでOKを選択してプロジェクトを変換する。
ISE8.1が立ち上がる。とてもかっこよくなったし、summaryが見やすくなって、いろんな所のログが一望できて便利になった。エラーも見やすくなった。
ISE81_060116.png

Processesウインドウから"Implement Design"を展開して"Place & Route"を展開し、"View/Edit Routed Design (FPGA Editor)"をダブルクリック。
そうすると論理合成、インプリメントをしてFPGA Editorが起動する。下のような画面が表示できる。
FPGA_Editor_1_060116.png

同じような画面が見えないときは、上図の赤で囲ったボタンを同じにしてほしいそうすれば、同じ画面が見えるはず。ここはいろんなリソースを表示するかどうかを選べる。余り表示しすぎると邪魔だし、適当に表示させるが良いと思う。サイトやローカルライン、ロングライン、これはやってみると良くわかるだろう。
まずはクロックラインを表示させてみよう。List1ウインドウからTypeの項目をクリックすると、Typeの項目でソートされる。一番上にclk_BUFGP/BUFGがきていると思う。そこをクリックして色を変えると下のWorld1ウインドウにBUFGPが赤で表示される。(下図参照)
それから下図の赤で囲んだZoom Selection(F11)をクリックするとclk_BUFGP/BUFGが大きくArray1ウインドウに表示される。
FPGA_Editor_2_060116.png

三角の赤い素子がclk_BUFGP/BUFGだ。上の三角の頂点から出ている線がグローバルクロックラインなので、その線をクリックする。そうするとグローバルクロックラインが選択され、World1ウインドウを見ると赤く表示される。
次にグローバルクロックラインのディレイを見てみよう。右端からdelayボタン(下図で赤く囲まれている)を押すと、選択されたグローバルクロックラインがつながっている論理素子までのディレイを下のウインドウに全て表示する。
FPGA_Editor_3_060116.png

  1. 2006年01月16日 21:40 |
  2. FPGA Editorの使い方
  3. | トラックバック:0
  4. | コメント:4

基板を設計するのは大変

今基板を作っているが設計するのは大変な作業だ。
まずメインディッシュのチップを元にそれを使うための電源はどれが良いかとか、いろんな部品を使おうとする。例えば、オンボード電源を使おうとすると入力、出力につけるコンデンサは?とかいろいろ考えることがある。
チップがちゃんと動くためには何usから何十msの間に電源を立ち上げなくてはいけないとか、いろいろ制限を満たさなくてはいけないと思うと頭がこんがらかってくることもある。
その部品を使えるかどうかはデータシートを数十ページも読んだあとにわかることもある。データシートを読んだは良いが、一点がだめで使えなくて、最初から探しなおしということも良くある。
またこの部品が非常に良くて使いたいけど、その付随する部品をどうしても手に入れられずに泣く泣くあきらめるということもある。
そうやって、使うことが出来る部品を探していくのだが、それをやっているとかなり疲れる。いつも仕事でやっている人は大変だと思った。それとも慣れているので大丈夫なのか?
データシートを見て使える部品が簡単に手に入るのならばだいぶ楽になるとは思うのだが。。。でも、企業の方もコストの問題などで使える部品が制限されるのだろう。
  1. 2006年01月14日 16:09 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:6

Xilinx 社製FPGA を搭載したPCI ボードのシミュレーション2

4.NI FPGA回路全体のシミュレーション
 機能シミュレーションが終了したら、今度は全体の機能モジュールを接続して、NI FPGA回路を完成させる。今度はNI FPGA回路全体のシミュレーションをすることになる。ここでの全体のシミュレーションは、すべてシミュレーション・ツール(ModelSim)上で仮想的に行い、実際の電気的な回路は全く使用しない。
 全体シミュレーションの最初の段階では、HDL Bencherを使用して、基本的な機能を確認する。シミュレーションが進んでいくと、機能を確認する際に比較的長いシークエンスを必要とするものが出てくる。例えば、PCIバスの初期化処理などである。その初期化処理をしないとNI FPGA回路の機能を確認することが出来ない。よって、HDL Bencherで確認するのは困難である。そこで、各周辺デバイスのモデルを作製して、シミュレーションすることにした。
 2つのNIをLVDSチップを省いたLVDSインターフェース同士で対向接続して、全体シミュレーションをする。そのために、各デバイスの動作をシミュレーションするモデルをNI FPGA回路に接続した。各モデルはVHDLで書かれている。FLASH ROMモデルは、チップの製造会社である富士通(株)のモデルを使用した。SDRAMモデルは自分で作製したが、64Mbyteの容量では、シミュレータが異常終了してしまったので、256byteまで容量を減らした。PowerPCモデルとPCIバスモデルは、それぞれ複雑なシーケンスを必要とするので、どう実装するか迷ったが、実行させる1動作をテキスト1行で指定する方式にした。それぞれのモデルはテキストに書かれたコマンドを順次実行する。CPLDは余り全体の動作に関係ないので省いた。ブロック図を図4に示す。
sim_zu4_060113.png

図4 2つのNIを対向接続したシミュレーション

 4.1 PCIバスモデル
 PCIバスモデルは、PCIバスをシミュレートするPCIバス・プロトコルモデルと、PCIターゲット・コマンドプロセッサに分けられる。PCIバスモデルのブロック図を図5に示す。
sim_zu5_060113.png

図 5 PCIバスモデル ブロック図

PCIバス・プロトコルモデルにはPCIのプロトコルが記述してある。また、簡単なPCIバス・アービタを持っている。そのPCIバス・アービタはNI FPGA回路のPCIマスタアクセスとホストパーソナルコンピュータ(ホストPC)からのPCIバスアクセス(NI FPGA回路からはPCIターゲットアクセス)を切り分ける。通常は、ホストPCのグラント(バスの使用許可)がアサートされていて、ホストPCからのPCIターゲットアクセスにPCIバス・プロトコルモデルがすぐに応答できる状態にある。NI FPGA回路のPCIマスタアクセスの場合は、PCIバス・アービタに要求を送り、許可された場合にPCIマスタアクセスを行う。PCIターゲット・コマンドプロセッサは、ホストPCのPCIターゲットアクセス用のモデルである。それは、テキストファイルのコマンドをVHDLのTEXTIOライブラリのルーチンで読み込んで、PCIターゲットアクセスを発生させる。コマンドの一例を下に示す。

0 ns 00000010 0 11 3000000020000000 1 0 # SDRAM - 0x20000000, NB – 0x30000000

 最初のフィールドの0 nsは遅延時間を表す。このコマンドを実行する時間間隔を表す。2番目の00000010は16進数で表されたアドレスを表す。3番目の0はデータの書き込みを表す。1のときは読み込みである。4番目の11はデータ幅を表し、この値はロングワード(64bitデータ)を表す。その他に、バイト(8bit)、ショートワード(16bit)、ワード(32bit)の指定が出来る。5番目の3000000020000000は書き込むデータを表す。データの読み込みの場合はこのフィールドは無視される。6番目の1はPCIのコンフィギュレーション・アクセスである。0の場合は通常のメモリアクセスとなる。尚、NIはIOアクセスをサポートしないので、IOアクセスに関するフィールドは無い。7番目の0は、STOP信号のアサートに関するフィールドで、1にすると、次のクロックでSTOP信号をアサートして、PCIバスのトランザクションが停止する。なぜこのようなフィールドを設けたかというと、実際のホストコンピュータは頻繁にSTOP信号をアサートして、PCIバストランザクションを停止している。そのシミュレーションのためにSTOP信号アサート用のフィールドを設けている。
このようにコマンドを順次実行することで、ホストコンピュータとNI間のやり取りをシミュレーションすることが出来る。

 4.2 PowerPCプロセッサモデル
PowerPCプロセッサは、アドレス転送とデータ転送が分かれている。データ転送にかかわらずにアドレス転送は2つの転送を完了できる。データ転送はアドレス転送の順番を守って、転送を行う。例えば、アドレス4への読み込みのアドレスを送ってデータを読みだす前に、次のアドレス転送、アドレス8への書き込みのアドレスを転送できる。その後、データ転送はアドレス4への読み込み、アドレス8への書き込みを順序を守って実行される。
 PowerPCプロセッサモデルのブロック図を図6に示す。
sim_zu6_060113.png

図 6 PowerPCプロセッサモデル ブロック図

PCIバスモデルと同様に、テキストファイルのコマンドを1行ずつPowerPCコマンドプロセッサが解析し、PowerPCバスコマンドとして、2つのPowerPCバス・プロトコルモデルに送る。2つのPowerPCバス・プロトコルモデルは、あらかじめマスタデバイスとスレーブデバイスが決められている。PowerPCバス・プロトコルモデルは1つのアドレス転送とそれに続くデータ転送を担当する。実際の動作は、読み込みの場合はデータ転送のアクノリッジを返すだけだが、書き込みの場合はデータ転送時にコマンドで指定されたデータを用意する。マスタのPowerPCバス・プロトコルモデルが動作中の時は、スレーブが動作を開始する。下にPowerPCのコマンドの例を示す。

0 ns 40000050 0 8 1000000000000000

最初の0 nsはPCIバスの場合と同様に、遅延時間を表す。2番目の40000050は16進数で表された番地を示す。3番目の0は書き込みを表す。1の時は読み込みとなる。4番目の8はデータ転送のサイズを表し、ロングワード(64bit)を示す。9はバイト、Aはショートワード(16bit)、Cはワード(32bit)、2はバースト転送(4beat)を表す。最後の5番目は書き込むときのデータを表す。このデータは読み込みの時には無視される。

5.まとめ
 私の場合、回路を作製しただけで、動作することは100%ありえない。よって、回路のシミュレーションは欠かせない。比較的大規模な回路を作成する場合には、機能モジュール単位でシミュレーションし動作を確認してから、機能モジュールを相互に接続し全体シミュレーションを行う。
 Xilinx社のデバイスを使用して機能モジュール単位でシミュレーションする場合には、HDL Bencherを使用してVHDLのテストベンチを作製し、ModelSimでコンパイル後シミュレーションを行う。HDL Bencherを使用した全体シミュレーションでは、出力信号と入力信号に依存関係のある場合は、HDL Bencherで入力波形を作成するのが難しい。よって、各デバイスのモデルを使用して全体シミュレーションを行うことにした。モデルのうち、マスタとなるデバイスはテキストファイルに書かれたコマンドで動作を記述する方式にした。これが、一番複雑な動作を表現するのが容易であると考えたからである。現在、実機の動作を解析しておかしいタイミングを発見した時に、今回作製した全体シミュレーションを使用し、バグの発見に役立てている。
 欠点としては、PCIバスモデル、つまりホストコンピュータのモデルが簡単すぎる点である。実際のホストコンピュータは、都合によって頻繁にPCIバスの転送を止めたり、NIの転送要求に対して応答が遅い時がある。実際の回路動作のすべてをシミュレーションでモデル化できないので、すべてのバグをシミュレーションによって発見することはできない。

参考文献
[1]Xilinx Inc. , "Xilinx ISE 6 Software Manuals", 2003
[2]Model Tecnology Inc. , "ModelSim 5.6リファレンスマニュアル", 1999-2002

---------------------------
2部作になりました。
そういえばISE8.1が出てましたね。なんかかっこよくなってました。それにFPGA Editorが付くようになりました。これでIOBとかの解析やディレイも一発で見えますね。本当に良かったと思います。
  1. 2006年01月13日 20:30 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:2

Xilinx 社製FPGA を搭載したPCI ボードのシミュレーション1

2年ほど前に書いた技術報告があるので載せます。シミュレーションについて書いてますが、独りよがりな所も目立つ気がします。4部作くらいかな?です。
ーーーーーーーーーーーーーーーーーーーーーーーー

1. はじめに
 私はXilinx 社のFPGA(Field Programmable Gate Array)を使用して、論理回路を作製している。規模の比較的大きい回路を開発する際、まず機能モジュールに回路を分割し、機能モジュールごとに回路を作成する。次に機能モジュールを組み合わせて全体の回路を完成させるという手順を取る。仕様通りに動作する回路を作製するためには、各手順ごとに回路が動くかどうかをテストする工程が必要となる。まずは、分割された機能モジュール単位でシミュレーションを行う。このような、機能モジュール単位のシミュレーションは、簡単な入力信号に対して、仕様どおりに出力が出てくるかを確認する。この時に、入出力信号を規定するのがテストベンチと呼ばれるファイルである。テストベンチは通常ハードウェア記述言語(HDL)で書かれている。直接HDL でテストベンチを書くのは難しいので、グラフィカルにテストベンチを生成するツールが存在する。後でそのツールの1 つであるXilinx 社のHDL Bencher を紹介する。
 次に機能検証の終わった機能モジュールを組み合わせて、目的の回路を作り上げる。その回路に対してシミュレーションで動作を確認する。これを全体シミュレーションと呼ぶことにする。全体シミュレーションでも先ほどのツールを使用することは出来るが、複雑な手順を必要とするシミュレーションには不適である。
 複雑なシミュレーションを実現する場合には、シミュレーション用モデルを作りこんで、検証すると便利である。その場合、シミュレーション用モデルの複雑さのレベルが問題になる。余り複雑なモデルであると、検証する回路よりも複雑になってしまうことがある。検証スピードは、複雑なモデルの方が簡単なモデルよりも遅くなる。本稿では、比較的実行スピードの速い簡単なモデルを用いた回路のシミュレーションについて述べる。

2. 対象回路
 今回検証に使用するのは、ネットワークカード(NI)のFPGA に実装した回路である。これを以降NI FPGA 回路と呼ぶことにする。NI はホストコンピュータの64 ビット66MHzPCI バスに挿して使用するPCI カードである。NI はホストコンピュータのデータをPCI バス越しに吸い上げて、LVDS(Low Voltage Differential Interface)信号で、他のコンピュータに転送する。NI はPowerPC プロセッサ、LVDS、64 ビット66MHzPCI バス、FLASH ROM、SDRAM、NI FPGA 回路、CPLD で構成されている。図1にNI のブロック図を示す。NI FPGA 回路は、ほとんどすべてのデバイスを制御している。よって、NI FPGA 回路をシミュレーションする場合には、それらのモデルを接続しなければならない。今回は回路、モデルともVHDL(VHSIC Hardware Description Language) で実装した。
sim_zu1_060113.png

図 1 NIのブロック図

3. HDL Bencher を使用した機能モジュールの回路シミュレーション
 Xilinx のツールISE6.1i に統合されているHDL Bencher を使用したSDRAM制御回路の回路検証例を示す。
SDRAM制御回路はすべてVHDL で書かれている。HDL Bencher は入力信号をグラフィカルに編集して、VHDL のテストベンチを生成するツールである。このツールを使用すると、簡単にテストベンチを生成することが出来る。HDL Bencher の起動時にクロックがどの信号なのかを指定する。指定したクロックに対して入力信号のセットアップ時間と、出力信号の出力時間を設定する。次に入出力波形がタイミングチャートで表示され、波形入力モードとなる。図2 にHDL Bencher の画面を示す。
sim_zu2_060113.png

図 2 HDL Bencher表示

図2 で上から4 つまでの右向きの青色の箱は入力、下から4 つまでの左向きの黄色の箱は出力を表す。図2 のように、入力波形をタイミングチャートでグラフィカルに編集して、VHDL のテストベンチ記述を生成する。図2では、405000psec でglobal_cmd に00800001、cmd に1 を入力している。その後、420000psec でcmd を0 に戻している。これはSDRAM制御回路に対する1 ロングワードのリード要求である。
 テストベンチは入力波形を記述したVHDL ファイルである。HDL Bencher から出力されたテストベンチは、入力の1 から0、0 から1 の変位が時間を追って書かれている。テストベンチと実際の回路(ここではSDRAM制御回路)を波形シミュレータModelSim でコンパイル、シミュレーションして、入力波形に対する出力波形の様子を確認する。出力波形を図3 に示す。HDL Bencher で入力した入力信号に対する出力信号をタイミングチャートで見ることが出来る。
sim_zu3_060113.png

図 3 ModelSimによるシミュレーション波形

図3 の時刻405nsec のときにcmd が1になって、SDRAM 制御回路へのコマンド入力となる。global_cmdとlocal_cmd はSDRAM制御回路へアドレスや動作モードを通知するために使用される。その後、SDRAM制御回路は415nsec でACTIVATE コマンド、445nsec でREAD コマンドをSDRAM に対して出力し、SDRAMリードを行う。その後、プリチャージコマンドを475nsec に発行して、SDRAMリードサイクルを終了する。
 このように、実際にFPGA に回路をダウンロードして、ロジックアナライザで確認することなく、回路の動作状況を確認できる。図3 の段階でのシミュレーションは論理シミュレーションと呼ばれる。
 FPGA の開発手順は、VHDL などのHDL ファイルや回路図を元に、論理合成、配置配線を行ってFPGAの構造に合わせた回路に変換し、それをFPGA にダウンロードする。その際に、HDL ファイルや回路図の回路がそのまま最終回路になるわけではない。ツールがFPGA 独自の回路方式に合わせるために、中間の論理を変更する。そのために、自分で定義したノードが消されていることがある。論理合成後にシミュレーションを行うと、前述した理由でノードが消されている場合があるため回路の動作の解析が難しい。
 論理シミュレーションでは、論理合成する前のソースファイルに対してシミュレーションを行うので、論理合成によって消されたノードはなく、自分で定義したすべての信号を見ることができる。これは、バグの発見をより容易にする。
  1. 2006年01月12日 23:49 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:4

SystemVerilogの本を買った

SystemVerilogのこの本を買った。日本語では唯一のSystemVerilogの本のようだ。
インプリメントするHDLは今までの資産もあってVHDLなので、テストベンチだけでもSystemVerilogで書こうと目論んでいる。
ModelSimSEは確かVHDL,Verilog混在環境でも大丈夫だと思ったし、できればテストベンチだけでもSystemVerilogの機能を使ってみたい。それともSystemCもModelSimSE使えるはずなのでそっちの方がいいのかな?
  1. 2006年01月11日 20:34 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:10

PCIモジュール3

今度はPCIマスタモジュールだ。
PCIマスタのアクセスはPCIモジュール2で大体説明してあるが、PCIマスタ書き込みの場合、マスタ(パソコンのCPU)が/REQをアサートする。アービタが/GNTをアサートするとマスタはバスを使えるので、/FRAMEと/IRDYが両方デアサートされるのを待って(バスが空くのを待って)、/FRAMEをアサートしながらアドレスを出力する。マスタは/FRAMEをアサートした後にデータの準備が出来たら/IRDYをアサートする。ターゲット(PCIボード)は/FRAMEがアサートされるときのアドレスを確認して、自分のアドレスだったら/DEVSELをアサートする。その後データを受け取る準備が出来たら/TRDYをアサートする。
/IRDYと/TRDYの両方がアサートされたときがデータが書き込まれたタイミングである。
私のPCIマスタはバーストアクセスができるので、PCIマスタのFIFOにデータがある限り最後のデータ転送の1つ前まで/FRAMEをアサートし続ける。当然/IRDYはアサートし続ける。/IRDYを制御しないほうがロジックが少なくなるし、他のPCIアクセスを阻害しなくなるので、転送効率的に有利になる。
バーストアクセスを続けて行える条件は/GNTがずっとアサートされているか、もしくはレイテンシタイマがタイムアウトするまでだ。パソコンの起動時にBIOSがこちらのコンフィギュレーションスペースのレジスタの値を元にレイテンシタイマの値をセットする。PCIマスタモジュールは最初にPCIデータアクセスを始める時にレイテンシタイマの値をカウンタにコピーする。PCIマスタモジュールは1データ転送するごとにレイテンシタイマのコピーを-1する。そして0になったらタイムアウトする。タイムアウトした状態で/GNTがデアサートされているとPCIマスタはPCIデータ転送を止めなければならない。
PCIマスタアクセスのメインステートマシンはPCI2.2仕様書のステートマシンに大体同じなので書かないことにする。興味のある方はPCI Local Bus Specification Revision 2.2の245ページを見てほしい。
PCIのデータの出力はクロックからの出力時間が厳しいこともあり、なるべくならばIOB内のフリップフロップから出力したい。ので、データ出力用FIFOの後にIOBのFF、その後パッドに出力する。だがそうするとPCIターゲットがデータ転送なしに/STOPをアサートして終了(データ転送なしのディスコネクトでした)した時などにIOBのFFにデータが残ってしまう。その後に他のPCIマスタアクセスがあると最初のアドレスが狂ってしまう。そのためデータ出力用FIFOにはリワインドを設けてある。
IOB付近のデータパスを下に示す。
PCI_module_block_060110.png

今見ても、結構複雑だ。
ちなみにこれは最初のブロック図ですのでバグがあるかもしれません。ご了承ください。基本的なコンセプトは一緒ですが。。。
  1. 2006年01月10日 21:20 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:5

Virtex2Proの電源

RocketIOのユーザーズマニュアルを見ると、RocketIOの電源はロジックの電源とは別に電圧レギュレータをつけないとだめなそうである。
しかもRocketIOの受信側をACカップリングにすると、VTRXの電圧を1.6~1.8Vにしないといけないようだ。もう1つ電圧レギュレータが必要のようだ。
さらにRocketIOの電源にはフェライトビーズを入れなければいけないようである。いろいろRocketIOを使うのも大変そうだ。
それにVirtex2ProのJTAG端子のTDOはオープンドレインになっているそうだ。Virtex2は通常の出力だったのだが、複数のVirtex2Proをつなぐ場合にカスケードにつながないで、並列につなぐようになっているのだろうか?
  1. 2006年01月10日 20:45 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:3

PSPとTALKMANを買いました

PSP_060109.jpg

昨日PSPギカパックとゲームソフトのTALKMANが届きました。
PSPが届いて電源を入れたら液晶がとてもきれい。評判通りだった。写真はTALKMAN用のマイクがUSBポートに装着されている様子。
IDと時間などを設定して、早速TALKMANのUMDを入れて起動してみた。
実はTALKMAN(外国語会話ゲームソフト)がほしくてPSPを買ったのだった。どうせ買うならば、PSXもあるし動画も見たいということで1GBのメモリステックDUOがついているギガパックにした。英会話スクールに行くには恥ずかしいし、個人的に練習できるのを探しいたのだ。パソコンでそういうソフトでやったことがあるが認識率が低かった。TALKMANは結構認識が良いというのを聞いてぜひやってみたかったのである。
ちなみに私の英語のレベルはぜんぜんだめだ。技術文章なら多少読めるが、会話はどうしていいかわからない。前ポルトガルに行った時に海でswim suitあるかと聞かれて、swim suitが聞き取れずに何回も聞きなおしてしまった。
TALKMANやってみたが、なかなか言葉の認識がいいみたい。それなりに認識してくれているようである。2つモードがあって、シーンごとに日本語で言うと、英語、韓国語、中国語に翻訳してくれるモードとゲームモードがある。もう少しゲームモードが充実しているといいな。中学生のお姉ちゃんも楽しそうにやっているので、親子で楽しめてよかった。
さて、PSPは無線LANが付いているので、ブラウザを立ち上げてインターネットに接続してみることにする。
家の無線LANはWEPで暗号化しているし、SSIDもステルスしているのでつながるか心配だった。PSPのインターネットの設定をする。無線LANのアクセスポイントを検出してSSIDを入力。WEPのキーを入れるとつながりました。結構スムーズに接続できた。
WWWブラウザを立ち上げYahooを見てみるとほとんどパソコンと変わりなく表示されてます。これはいいかも。ただし、表示するのには遅い感じ。自分のブログも見てみたが問題なく表示。
次にCDをメデアプレーヤーでMP3に変換してPSP(メモリステックDUO)に入れてみたら、問題なく音楽も聴けた。
最後にPSXで動画を変換と思ってメモリステックスロットに入れようと思ったら、すかすか。え。入らないの?と思ってPSXのマニュアルを見るとメモリステックDUOを入れるのにはアダプタが必要?そうなんだ。
もう一度、購入したアマゾンに行って検索すると、ありましたアダプタ。でも品物490円に対して送料300円。だけどいいやということで注文。とりあえず動画はおあずけとなった。
PSPでロケーションフリープレーヤーも見られるようだ。これもほしくなったが、見るところがない。家でテレビは子供に占有されるので、自分でテレビ見るのにいいかも?でも余りテレビは見ないか。。。物欲に負けないように注意しなければ。。。
  1. 2006年01月09日 09:26 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:4

FPGAの話題のカテゴリーを分けました

私のブログを呼んでくれている皆様へ。
FPGAの話題のカテゴリーを分けました。自分でもどんなジャンルが書いてあるのか良くわからなくなったので、分けてみました。
これからもカテゴリーを細分化するかもわかりませんが、よろしくお願いします。
  1. 2006年01月07日 18:32 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

PCIモジュール2

PCIモジュール1でPCIのコンフィギュレーションを説明したが、今度はPCIターゲットアクセスについて書こうと思う。
PCIターゲットアクセスはパソコンのCPUからボード上のメモリを読み書きする時のアクセスだ。つまり自分から行動を起こすのではなく従属的に来た命令に応答するアクセスなのだ。
PCIモジュール1で説明した様にパソコンが電源ONしたときの初期化でPCIカードの機能ブロックごとにユニークな物理アドレスが割り振られている。パソコンのCPUがその物理アドレスにアクセスするとPCIターゲットアクセスが発生する。
例えば、PCIモジュール1のSDRAMメモリに書き込む時にはパソコンのCPUは物理アドレス0xF8000000に書き込むアクセスをチップセットに出す。チップセットはアドレスがPCIボードを指すことを認識するとPCIマスタアクセスを発生させる。そのPCIマスタアクセスは、PCIボードの立場から見るとPCIターゲットアクセスになるわけだ。
データ書き込みアクセスの手順はまずはマスタ(パソコンのCPU)が/REQをアサートする。アービタが/GNTをアサートするとマスタはバスを使えるので、/FRAMEと/IRDYが両方デアサートされるのを待って(バスが空くのを待って)、/FRAMEをアサートしながらアドレスを出力する。マスタは/FRAMEをアサートした後にデータの準備が出来たら/IRDYをアサートする。ターゲット(PCIボード)は/FRAMEがアサートされるときのアドレスを確認して、自分のアドレスだったら/DEVSELをアサートする。その後データを受け取る準備が出来たら/TRDYをアサートする。
/IRDYと/TRDYの両方がアサートされたときがデータが書き込まれたタイミングである。
シングル転送の場合は、/FRAMEは1クロック後にデアサートされる。データが書き込まれたら/IRDYと/TRDYの両方ともデアサートされてPCIターゲットアクセスが終了する。
私の作ったPCIターゲットモジュールはシングル転送のみ対応している。PCIターゲットアクセスのメインステートマシンを下に示す。
PCI_traget_access_060106.png

始めはidleから始まる。frame_bが0(アサート)されるとDecode_checkに遷移して、自分のアドレスがアクセスされているかを調べる。自分のアドレスでない時はbus_busyに遷移してPCIアクセスが終わるのを待つ。自分のアドレス(mydev='1')だったらリードからライトかを判断し、ライトの場合で次段のFIFOがいっぱいの時(tgt_write_busy='1')はtgt_discon_retryに遷移しリトライする。FIFOが空いている時はwrite_dataに遷移しデータをライトする。その後、turn_aroundに遷移してバスを放した後でidleに遷移してアクセス終了となる。
実際にPCIターゲットアクセス時のタイミングチャートを下に示す。
PCI_traget_access_2_060106.png

sregがステートマシンのステート。ladnodeがPCIバスのADに当たる。ADはアドレスとデータがマルチプレックスしているバスで、/FRAMEアサートされているときはアドレス、/IRDYがアサートされているときはデータが出力(リードの時は入力)される。64bit,66MHzPCIなのでADは64ビットである。
  1. 2006年01月07日 06:34 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0

スイッチのチャタリング

今日はスイッチのチャタリングを確かめてみようという企画だ。
どんなスイッチにもチャタリングがある。チャタリングは可動する接点が静止する接点にぶつかってバウンドする現象だ。スイッチによってチャタリングの度合いが変わる。
スパルタン3スタータボードのスイッチでどのくらいチャタリングが出るか確かめてみた。
まずはここにあるプロジェクトをダウンロードして、スパルタン3スタータボードのFPGAをコンフィグする。
回路は16ビットのバイナリカウンタのクロックにSW0が入力されている。バイナリカウンタの出力は7セグメントLEDダイナミック点灯回路に入力され、バイナリカウンタの出力が7セグメントLEDで確認できるようになっている。
やってみるとSW0のレバーを上に上げたときだけ1カウントアップするはずが、1以上カウントアップしてしまうのがわかると思う。
このようにチャタリングが発生し、カウンタを狂わしてしまう。
それじゃどうしたらチャタリングの影響を除けるかだが、いろいろ方法はあるが、手っ取り早いのは、チャタリングが持続する間隔より長い周期でサンプリングすることである。
対策を施したプロジェクトをここにおく。やってみるとSW0のレバーを上に上げたときだけ1カウントアップするのがわかると思う。
swdiv.vhdは5ms間隔でイネーブルを出し、そのイネーブルでSW0を入力するフリップフロップをラッチする。
こうすれば、最初のクロックの立ち上がりでチャタリングが発生しているときにSW0の値をサンプルしても、次のクロックの立ち上がりのときにはチャタリングが収束しているので、チャタリングが除去できる。
ちなみにBTN3がリセットである。BTN3を押すと7セグメントLEDをリセットできる。
スイッチ入力をBTN0などにすると押しボタンスイッチのチャタリングを確かめられるが、どうやらSW0などのスライドスイッチよりもチャタリングが少ないようである。
  1. 2006年01月05日 18:51 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:2

私のブログ

私のブログのアクセスログを見ていると大企業と思われるサイトから、カテゴリー0(FPGAの話題)を集中的に見ていると思われるアクセスがあるようだ。
見ていただくのは一向に構わないし、アクセスがあるのはうれしく思う。でも、有名企業は社内でFPGA使う人も多く、研修制度が整っていて、私が書いていることなどお見通しだろうと思っていたので、いささかびっくりしている。
それともFPGAは歯牙にもかけなかったけど、だんだん勉強する必要が出てきたのだろうか?
なぞである。

現在は基板作成のために電源などを調査中。DC-DC電源ICを買って作るのもコイルとかの購入で部品点数が増えて大変なので、DC-DCモジュールを探しているが、なかなかいいのがない。1.1V,15Aで電源ONからのVoutの立ち上がりが20ms以内のDC-DC電源モジュールがあればよいのだが。

(2006/01/06追記) C&DテクノロジーズのLSM-16A W3 シリーズがよさそうだ。
  1. 2006年01月05日 17:02 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:8

筑波山神社に初詣

今日は筑波山神社に初詣に行ってきた。
家を午前9時30分過ぎころ出て、10時ころ着いたが、神社前の無料駐車場は満車で15分くらい待っていた。車を止めて、神社まで歩いていった。風があって少し寒かったが、それほどでもない。
石段をあがって本殿に行って賽銭を上げたが、待ち行列が出来ていた、今まで3日に行って並んだことが無いので、混んでいたんだと思う。これもTX効果なんだろう。
Tsukuba_san_jinja_060103_1.jpg

絵馬等を見ながら、私以外は甘酒をもらって飲んだ。(私は甘いので甘酒が嫌い。でも、ここのは本格的にお米で造ったおいしい甘酒だと思う。私は甘いので嫌いだが。。。)
Tsukuba_san_jinja_060103_2.jpg

帰りにケイバブを食べた。シシカバブの親戚で、鶏肉をまわしながら焼いて、焼けた所を削ぎ切りにして、ピタパンにキャベツと一緒にはさんで、ドレッシングをかけて食べる。これがおいしい。
帰りには、下りはすいていたが、上りは筑波山を登る道の下のほうまで渋滞していた。やはり、早い時間に行ったほうが良いようだ。
  1. 2006年01月03日 19:01 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

あけましておめでとうございます

あけましておめでとうございます。
今、箱根駅伝見ながら書いてます。今年は途中でオタク駅伝見るかもしれませんが。
やっと、技術発表会の原稿も書き終わりました。休み中はVerilogのお勉強でもしようと思っていたんですが、新しいボードの電源とかの下調べをしないといけないようです。
それでは、今年もよろしくお願いいたします。
  1. 2006年01月02日 08:37 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2