FPGAの部屋

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

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

2008年04月

アクセスログを見ていると”UCFの書き方”を見ていただいている方が多いようだ。
カテゴリの”UCFの書き方”はあくまでどのようにUCFファイルが書かれているかやConstraints Editorに着目しているのだが、他にもUCFを書き換えるツールはまだある。たとえばPACEやFloorplanner、FPGA EditorでもUCFを書くことができる。将来的にはFloorplan Editorに統一されていくようだ。
UCFを手で書くとすると結構大変だ。パッド位置の指定やIOBのDELAYの指定は手で書いても問題ない。しかし、”UCFの書き方3”のPINの指定はTiming Analyzer のAnalyze against Users Paths by defining Endpoint ダイアログを開いて Pins のところを展開してインスタンスを見ないと正確なパスの指定がよくわからない。
69e236b8.png


それでもPINを指定して制約をかけても無視されることもあるのが、よくわからないところだ。

UCFで配線を固定できるが、それはFPGA Editorを使わないとほとんど不可能だろう。手で配線を固定できる人はXilinx社のツールを作っている人のほかには、たぶんいないんじゃないだろうか? その方法は”FPGA Editorで配置と配線を割り当てる3””FPGA内の配線を固定する”で解説した。

ISE9およびISE8では、PACEとFloorplanner両方でエリア制約やパッド位置の指定ができるが、統一が取れていないので、片方で制約をかけた後にもう片方でもう一度制約すると2重に制約がかかれることがある。このへんが統一が取れていないところだ。ISE10ではまだ良く調べていないが、Floorplannerがあるので多分そうなのだろう。早く統一してもらいたいものだ。

というわけでUCF書きたい方は”UCFの書き方”だけではなく、”PACEの使い方””Floorplannerの使い方””FPGA Editorの使い方”も見てください。

ちょっと古めのものもあるのだが。。。DDR2 SDRAMコントローラが終了したら、ISE10.1iで書き直してみようかな。。。

最近、あまりブログを書いていないが、DDR2 SDRAMコントローラは現在のDQSを使用しないでDQを遅延させてリードする方式を使いながら、最初、データを書き込む。次に、DQの遅延値をダイナミックに変更しながらリードをして、正常に読める位置があるかどうかを探るという方法で書き始めた。だが、娘を高校に送り迎えしているために、朝の時間が短くなってしまってなかなかやっている暇が取れない。ゴールデンウイークにやることにする。

仕事では依然として全体の仕様の定義をしながらVHDLを書いて、細かい仕様も一緒に策定している。それをVHDLにドキュメントとして書き込んでDoxygenでドキュメントも一緒に生成している。そのほかに全体の仕様をWordで書いている。やはり、前も書いたが文章だけだと再度見直したときに良くわからなくなってしまう。
以前にUMLのシーケンス図だけでも描いてみたということをブログで書いたが、そのときはVisioで書いたが、どうも書きにくい。
そこでUMLツールを使ってみることにした。どれがいいかを探ってみたが、”JUDE/Communityはユーザー登録後、無償でご使用いただくことが可能です。”とのことなのでJUDE/Community を使って見ることにした。
これはJAVAベースだったが私のパソコンにはJREをインストールしてあるので問題ない。
早速インストールして、シーケンス図のサンプルを書いてみたが、自動で図形を整形してくれて、やはりVisioよりも書きやすかった。やはり専用ツールだな?
Wordにシーケンス図を張り込んでみたが、画像として張り付いている。当たり前だが、Visioと違って余り縮小しないほうがいいだろうと思う。
なるべくUMLの図を使ってマニュアル化しようと思っている。というか、そうしないと自分で後で見ても良くわからない仕様になってしまう。

JUDE/Communityを使ってシーケンス図もどきを書きかけてみたのがこれ。やはりVisioより簡単。
1eff0201.png


FPGAの部屋のブログ記事”Doxygenを使ってVHDLソースコードをドキュメント化してみました”でVHDLのソースコードを書きながら、ドキュメントを一緒に作っていたが、これはDoxygenが理解できるようなドキュメンテーションをソースに付加する必要があった。
皆さんご存知かもしれないが、Doxygen が理解できるようなドキュメンテーションは一切付いていないVHDLソースファイルをドキュメント化するタグがあったので書いておこうと思う。
それはDoxygenのマニュアルのここに書いてあるEXTRACT_ALL タグだ。このEXTRACT_ALL タグをYESにすると”EXTRACT_ALLタグが YES であれば、ドキュメントが得られなくても、ドキュメント内の要素は すべてドキュメントに出力するものとして扱います。”だそうだ。
実際にやってみた。自分でドキュメントを記述したものに比べれば落ちるが、特にコラボレーション図などは階層がわかってとてもよい。
Windows版でのEXTRACT_ALLタグのチェックの入れ方は、下のようにDoxygen GUI frontend ウインドウでExpert... ボタンをクリックする。出てきたdoxywizard で EXTRACT_ALL をチェックする。
a296b494.png


これがDDR SDRAMコントローラVHDL版のDDRtest.vhdのDoxygenによるコラボレーション図 (EXTRACT_ALL = YES)
9f80b12b.png


ちなみに、コラボレーション図のファイル名の書いてある四角をクリックすると、そのファイルのドキュメントが開く。

今日は仕事用のPCI-Xモジュールについて、ちょっとだけ書こうと思う。(あまり書くとまずいので。。。)
最初にホストのパーソナル・コンピュータ(PC)からPCI-Xボードのリソースにアクセスする機能をターゲット機能、逆にPCI-Xボードがパーソナル・コンピュータ(PC)のリソースにアクセスする機能をマスタ機能と呼ぶことにする。
PCI-Xの規格ではターゲット機能を使用して、ホストPCからPCI-XボードのSDRAMのデータをリードしようとするときに、PCI-Xボードがデータを用意できるならば、トランザクションが始まってから16クロック以内にデータを出力する必要がある。なお、すぐにリードするデータを返せない場合は8クロック以内に応答を返す必要がある。これはリトライやスプリット応答などが相当する。

ここでリトライとスプリット応答について説明すると、リトライはPCIの時代からあるもので、”後でもう一度アクセスしてね。。。”とマスタ(PCI-Xではイニシエータ)にお願いするもの、スプリット応答は”今はリード・データが用意できないけど、データが用意できたら、こちらからそちらにデータを送ります。(書き込みます、これがスプリット完了)”というものだ。

133MHz動作で16クロック以内にデータを用意できる (PCI-Xの仕様) 確証が無いため、トランザクションが始まってから8クロック以内にスプリット応答を返して(これもPCI-Xの仕様)、後からスプリット完了でリードするはずのデータをホストPCに送ることにした。ただし、コンフィギュレーション・アクセスは間に合うので通常にリードする。
そうなると、スプリット応答したトランザクションのテーブルが必要になる。後で、データが用意できたら、ターゲット・リードではあるが、マスタ機能を使用して、リード・データをホストPCに送る(これはいわばマスタ・ライト)。つまり、ターゲットのアクセスではあるが、マスタの機能を使用する。
PCI-Xボードがマスタ機能を使用して、ホストPCのリソースをリードする場合も、ホストPCからスプリット応答を返されることが多い。その場合は、ホストPCのリード・データはスプリット完了として、PCI-Xボードへのターゲット・ライトとして実行される。
スプリット完了の場合は、コマンドやアドレス、アトリビュートがスプリット完了専用になる。このように、PCIで機能わけされたモジュール(ターゲット、マスタ)はたすきがけで使用される。
下にPCI-Xモジュールのブロック図を示す。こんな感じになっている。PCI-Xモジュールの外部へはクロックが異なるので、非同期FIFOを使用する。
924992d6.png


結構、PCI-Xも大変なものだ。スプリット応答したテーブルを参照しなくちゃいけないし。。。

このところ日記が続いてしまったが、それだけでもなんなので仕事の話を。。。
今のところ、以前やっていたPCI-Xテストモジュールを下敷きにPCI-Xモジュールを書いている。
いざ書き始めると、いろいろな疑問や仕様策定上の迷いが生じる。主なものは下のような疑問だ。

・未解決のスプリット転送用バッファのエントリをいくつにしようか?
・PCI-Xのターゲット・リードに対して、どのデバイスの応答をスプリット転送にするのか?
・PCI-Xのターゲット・ライトのときに、アトリビュート・フェーズでターゲットに通知される転送数分の空きバッファが無いときにはどうするか?(結局これは128byte単位のアドレス(Allowable Disconnect Boundary)でバッファの空きに応じてディスコネクトすることにした。)
・前のADBでディスコネクトする場合、ターゲットはADBの前で4クロック以上STOP#をアサートする必要があるが、4クロック以上ならば何クロックでも良いのか?


これらを解決しながら、書き進めている。
でも、他の仕事もあるので、なかなか進まない。気力も充実してきたので、がんばって書き進めようと思っている。
書き進めているVHDLコードには、このブログの”アサーション事始め”で練習したような簡単なアサーションを組み込んでみたりしている。
さらに、VHDLなので”Doxygenを使ってVHDLソースコードをドキュメント化してみました”を例にDoxygenでソースコードをドキュメント化しながら書きすすめている。Visioで書いたブロック図などもPNGに変換してドキュメントに加えることができるし、リファレンスとして重宝している。

皆さんも、ソースをVHDLで書いているならば、DoxygenでVHDLソースをドキュメント化してはいかがだろうか? 少し面倒だが、素敵なドキュメントが一緒に出来上がると思う。

↑このページのトップヘ