Spartan-6 FPGA SP605評価キットでGTPトランシーバを使ってみたい。最初にはサンプルにあるIBRETをやってみて、次にAuroraをインプリメントしてテストしてみたい。シミュレーションもやってみた。
最初に、”
Spartan-6 FPGA GTP トランシーバ ユーザー ガイド v2.0 (日本語版) ”でSpartan-6のGTPトランシーバを勉強してみることにした。
概要はというと下に引用させていただく。(日本語版はコピペ禁止なので、
この英語版 の13ページから引用)
• Current Mode Logic (CML) serial drivers/buffers with configurable termination and voltage swing • Programmable TX pre-emphasis, linear continuous-time RX equalization • Support for multiple industry standards with the following line rates: • 614 Mb/s to 810 Mb/s • 1.22 Gb/s to 1.62 Gb/s • 2.45 Gb/ to 3.125 Gb/s • Optional built-in PCS features, such as 8B/10B encoding, comma alignment, channel bonding, and clock correction • Fixed latency modes for minimized, deterministic datapath latency • Beacon signaling for PCI Express® designs and Out-of-Band signaling including COM signal support for SATA designs • Receiver eye scan: Horizontal eye scan in the time domain for testing purposes
14ページのFigure 1-1: Simplified Spartan-6 FPGA GTP Transceiver Block Diagramを見ると、TX側にはPattern Generator、8B10B Encoderなどが入っているのがわかる。RX側には、Pattern Checker, Comma Dectect and Align, Elastic Buffer, 8B10B Decoderなどが入っていて、RXの方が複雑な感じがする。
”Figure 1-2: GTP Transceiver within the Spartan-6 LX45T FPGA”によると、Spartan-6 LX45Tには、2つのGTPA1_DUAL
Tileがあって、2つのGTPトランシーバが入っているそうだ。ということは合計4つのGTPトランシーバがあることになる。下に、15ページのFigure 1-2を引用する。
後は、複雑なポート及び属性について書いてあるが、これは読み切れない。ただ、LOOPBACKポートによって近端2種類、遠端2種類のループバックができる。今回は自分のところで折り返しなので、近端の2種類のみしか使えない。(日本語版の67ページ、英語版の63ページ)
色々、TX, RXについて詳しい情報が書いてあるが、あとは、Auroraのマニュアルを読んで、Auroraマニュアルでわからないところを、このマニュアルで調べることにする。読んでいると大変。。。でもクロックをどう回すか?という部分は読む必要があるか?それともAurora IPをつくるとそれも入っているのだろうか?
(2010/06/30:追加)
クロックは、外部入力端子やGCLKなどから入れることができるようだ。2つのGTP1_DUALタイルに同じクロックリソースからも入れられるみたいだし、Virtex-2Proのときよりもクロックの自由度が確実に上がっていると思う。その中でも推奨があるかもしれないから注意が必要だ。
SP605ではPCIeのクロックはカードエッジからのクロック (100MHz?) を
ICS874001 でジッタを低減して、250MHzにして、MGTREFCLK0に入れている。
2010年06月29日 05:19 |
Virtex-6, Spartan-6
| トラックバック:0
| コメント:0
”
4つ引き出しがある桧の収納家具作り3(引き出し) ”の続き。
引き出しは4つ全部作った。次に、表面板を付けるのだが、今回は掘り込み引手にしたかったので、トリマーで溝を掘って掘り込み引手にしてみた。大体は家具作り教室の先生にやってもらったのだが、自分でも1つやってみた。
教訓としては、段々とトリマーで深さを深くしながら、溝を掘っていくのだが、ガイドを1度合わせたら、全部やらないとだめだということだ。一度ガイドの位置を変えたら、合っているつもりでも微妙にずれていて、内側にずれれば刃ごと走ってしまって、材料がだめになってしまう。1つだめにしてやり直した。
現状でこのように出来ている。
裏は、何も貼ってなかったので、4mmのシナベニヤを木工用ボンドで貼った。止めるために、
隠し釘 を打ってある。
隠し釘の部分を拡大するとこうなる。
この青い頭の部分を、木工用ボンドが乾いてから、トンカチで横に払うと頭だけ取れて、目立たなくなる。
この後は、ウレタンニスで塗装する。
(注)メインの材料は桧です。
2010年06月27日 18:05 |
木工
| トラックバック:0
| コメント:0
FPGAの部屋のまとめサイト を更新しました。
ISim と
Spartan-6 FPGA SP605評価キット 、
PCI Express の項目を追加しました。
他のカテゴリにも、2010/06/27までの項目を追加しました。
2010年06月27日 07:22 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
”
SP605でキャラクタ・ディスプレイ・コントローラ2(シミュレーション) ”で、SP605用のキャラクタ・ディスプレイ・コントローラのシミュレーションが終わったので、今度は実機でインプリメントして実機でテストしみた。
SP605は200MHzのLVDS出力のオシレータを使っているので、それをClocking WizardのIPで25MHzに落としているのだが、PLLと2種類のDCMのうちのどれを使っているかがわからない?
そこでインプリメント後にどれを使っているのかを調べてみた。
PLL_ADVが使われているようだ。
できたビットファイルをiMPACTでSP605にダウンロードし、液晶ディスプレイをVGAポートで接続した。
しかし、真っ暗で同期も取れていない。つまり信号が出ていないみたい。
がっくりしたが、どうなっているかを見るためにChipScopeをいれた。ChipScopeをみたところ、HSYNCもVSYNCもvga_red, vga_green, vga_blueもしっかり出ている。おかしいと思って、液晶ディスプレイを見てみるとキャラクタが表示されていた。どういうこと?
同じビットファイルをiMPACTでもう一度やってみると、真っ暗。ということはiMPACTでだめでChipScopeからダウンロードするとOK???
念のため、ChipScopeのILAコアを抜いてやってみたが、やはりiMPACTでだめでChipScopeからダウンロードするとOK。。。
なぜ~???ということで色々やってみた。ある時、リセットボタンを押すと画面が真っ暗になることがわかった。でもChipScopeでみると映像用の信号は出ている。ということは、CH7301Cへのリセットが怪しい?
早速、CH7301Cへのリセット記述を、
assign dvi_reset_b = locked;
から、
assign dvi_reset_b = 1'b1;
に変更して、リセットを止めた。すると、iMPACTでダウンロードしてもキャラクタが表示されるようになった。
図に示すと下のようになる。
最初はPLL_BASEのLOCKED端子からDVI_RESET_B(CH7301CのRESET*)に出力していたが、それをやめて、DVI_RESET_Bは1レベルに固定した。
データシートには、リセットの詳しい記述が無かったが、リセットの掛け具合が問題なんだろうか?もしかするとI2Cでリセットする必要があるんだろうか?取り敢えずリセットを外したらOKなので、これで行くことにする。
これでCH7301Cも今まで同様な信号をDDRで入れれば良いことがわかった。これからの展開が楽になった。
次は、SMAケーブルを秋月から購入したので、MGTトランシーバをテストしてみたい。
(2010/07/07:追記)
アナログVGA信号接続でキャラクタが表示されたが、デジタルのDVIでも問題なくキャラクタが表示できた。
これで、VGA信号を入れれば、アナログVGAポート、デジタルのDVIポート両方共、問題なく表示できることがわかった。
2010年06月25日 04:39 |
Spartan-6 FPGA SP605 評価キット
| トラックバック:0
| コメント:0
”
SP605でキャラクタ・ディスプレイ・コントローラ1 ”で試みていたシミュレーションができて、動作が確認できた。
やはり、キャラクタ・ディスプレイ・コントローラの文字を書いていくスピードは、人間が目で追えるくらいにしているので、そのままでシミュレーションすると20msecシミュレーションしてもデータがほんの少ししか見えない。そこで、文字を書いていくスピードを早くすることにした。
CharDispCtrlerTest.vでは、
parameter ENABLE_COUNT = 23'd250000; // インプリメント
としているが、一番上のテストベンチからdefparamで小さい値に書き換えている。
defparam uut.CharDispCtrlerTest_inst.ENABLE_COUNT = 23'd000004; // シミュレーション
これでシミュレーションを実行した。(Verilogは上の階層からdefparamで書き換えられるのが便利だが、書き換えたのを忘れてしまうと、どうしてそうなるのかが分かりにくくなるのが欠点か?)
dvi_xclk_p, dvi_xclk_nから90度位相がずれて、dvi_d[11:0]が出力されているのが見える。
これでシミュレーションは取り敢えず完了ということにして、実機で確認してみることにする。
2010年06月24日 05:14 |
Spartan-6 FPGA SP605 評価キット
| トラックバック:0
| コメント:4
SP605でCH7301Cを使用してキャラクタ・ディスプレイ・コントローラを作ろうとしている。
以前、
Spartan-3 Starter Kit用に作ったキャラクタ・ディスプレイ・コントローラ をSP605のCH7301Cを使用するように改造した。
一応、Verilogの構文エラーは修正して、ISEでインプリメントすることができた。
いきなりSP605にダウンロードして試すのは不安なので、シミュレーションをすることにした。シミュレータはSecureIPでないので、久しぶりにVeritakを使用することにした。最新のBasic版、Ver.3.80Aをダウンロードして、起動し、プロジェクトを生成した。コンパイルしてみたが、今のところglbl.vがトップになってしまう。
現在、原因を調査中だ。久しぶりにVeritakを使ったので、使い方を忘れてしまった。自分の過去ブログ記事を参照しながらトラブルシュートすることにする。
(追加)
今、眺めていたら気がつきました。
テストベンチのファイルを入れていなかった。。。大失敗。 家に帰ったら入れてやってみます。
(もう一度追記)
テストベンチを入れて、プロジェクトからunisimsとXilinxcoreLibを抜いて、Xilinx Lib SettingでXilinxCoreLibにチェックを入れたら、うまく行きました。
2010年06月23日 05:49 |
Spartan-6 FPGA SP605 評価キット
| トラックバック:0
| コメント:0
さて、SP605のDVIを使ってキャラクタ表示する前に、久しぶりにVeritakを使おうと思っている。
近頃、Veritakを立ち上げると、どうも起動するのに時間がかかっていた。変だと思ってタスクマネージャーを見ると、MsMpEng.exeの負荷が50%(デュアルコアなので、実質100%)になっていた。(私のパソコンのアンチウイルスソフトは、MicrosoftのMicrosoft Security Essentialsを入れている。以前は違うアンチウイルスソフトだった)どうやら、Veritak起動のたびにチェックされているようだった。とても煩わしいので、MSEにVeritakを除外させることにした。MSEの設定タブの除外されたファイルと場所の設定項目にVeritakを追加した。
これで、Veritak起動時に時間がかかること無しにすんなり起動するようになった。
2010年06月23日 05:16 |
シミュレーション
| トラックバック:0
| コメント:0
Twitterで知ったのだが、
Virtex-7のプレスリリース が出ていた。
今度は、SpartanファミリがArtix-7にファミリ名が変更されている。それとVirtex-7との間に、Kintex-7ファミリが追加されている。28nmプロセスを使っているそうだ。
7シリーズFPGA ファミリの情報はここにある 。
注目したのは、Virtex-7でも、3.3V LVCMOS IOに対応するパッケージがあることだ。Virtex-6は3.3V IOに対応していない。要望があったのかな?他の Kintex-7, Artix-7ファミリは3.3V LVCMOS IOに対応しているようだ。
Virtex-6、Spartan-6もようやく普及してきた頃だと思うのに、次のファミリの発表が早い。。。
#またセミナに行く必要がある?
(追加)
PC WatchにXilinx、新世代のXilinx 7ファミリーを発表 という記事が書いてありました。
図21 と
図22 にPlanAheadの画面が表示されていますが、そのバージョンは12.2になっていました。UIがかなり変わっているような気がします。
2010年06月22日 09:47 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
昨日は息子の高校の学園祭だった。高校に車は止められないということで、駅に車を止めて、デーゼル汽車で高校のある駅まで行って、そこから歩いていった(奥さんと行ってきました。下の娘にはふられました)。高校に着くと、やはりお祭りの雰囲気が。。。中に入ると、テントがあって、カレーややきとり、うどんなどを売っていた。やはり、娘の高校と違って、ケバイ娘さんがちらほら見られる。つけまつ毛をしているみたい。
校舎に入るときに、ペットボトルのキャップで作った看板があった。凄い、よく作ったもんだ。
息子のクラスに行くと、お化け屋敷をやっていた。名前は戦慄迷宮。入場料50円だった。息子から売上に協力してくれと強く言われていたので、結構並んでいたが、後に並んで、お化け屋敷に入ってきた。
中は真っ暗で、入るときにカラーセロファンを貼って減光したライトを渡された。いよいよ中へ。暗いライトは本当に暗くて、まったくわからない。でも行く方向は見える。それが、お化け屋敷としての雰囲気を作っていた。中では足首を触られたり、突然段ボール(段ボールで通路を作ってあります。定番ですね)を叩かれたり、恐怖の画像(パソコン)が突然ついたり、なかなか雰囲気が出ていた。一緒に行った奥さんは、相当怖がっていた。(怖がりなんです)最後に、脅かしに出てきたクラスメートに、”とてもお化け屋敷っぽくて良かったよ”と声を掛けて出てきた。
#上の写真は顔をぼかしたんだけど、あまりぼかすとお化けがいるようになってしまう。。。
さて、次は美術部の展示を見てきた。この高校は県立なんだけど、なんか私立っぽい高校で、とても雰囲気の良いホールに絵が展示してあって、とても良い。。。
これで、目的は果たしたので、学園祭を後にした。最後に校舎の写真。
さて、お昼近いので、近くのココスで食事。ココスはドリンクバーの紅茶が茶葉をテーポットに入れる方式。気に入っている。最初、野いちご茶を飲んだが、かなり酸っぱい。ベークドアップルティーにしたが、ちょっとイマイチだった。好きなカモミールティが切れていたのが残念。ハンバーグを食べ、食後にはめったに飲まないコヒー、カフェラテを飲んだ。久しぶりのコーヒー、とても美味。
午後は、娘の勉強机の制作を頼まれているので、グランステージに材料を買いに行った。1820x910x20のパイン集成材が4,980円で売っていたので、700x910に切ってもらって購入。板の模様が縦に入ってしまっているが、材料効率を考えて、そこはあえて無視。足用に2x4x6Fも5本買ってきた。
パイン集成材はウレタンニス塗装をして乾燥。2x4x6Fは足用にスライドのこぎりでカットした。今日組み立てなんだけど、その前にもう一度、ウレタンニス塗装をしたほうが良いかな?
2010/06/20 追加
娘用の机が完成しました。下が写真です。なかなか良く出来ました。まだ、片付け途中だそうです。(いつも散らかっています)
2010年06月20日 05:46 |
日記
| トラックバック:0
| コメント:0
Spartan-6 FPGA SP605評価キットに搭載されている
CH7301C DVI Transmitter Device の使い方をマニュアルで調べてみた。SP605にCMOSカメラをつないで、DVIかVGAからディスプレイに出力してみたい。また、DVI、VGAに出力できると、SP605をパーソナルコンピュータ・システムとすることが出来そうだ。CH7301CはRGBやYCrCbデータをDVIやVGA信号に変換するICだ。
はじめは何が何だかわからなかったが、読み進めていくうちに、大体わかったような気になってきた。CH7301CはCMOSカメラと同様にI2Cで設定をするようになっている。データバスはD[11:0]の12ビット、H (Horizontal Sync), V (Vertical Sync), DE (Data Enable) の入力がある。データバスが12ビットでRGB、8ビット×3 = 24ビットの半分であるため、データはDDRで入れるか、クロックを2倍にする。
RGBのデータは24ビットのモードもあるが、16ビット、15ビット、更にはYCrCbで入れるモードもある。データシートの8ページから引用する。
IDF Description 0 12-bit multiplexed RGB input (24-bit color), (multiplex scheme 1) 1 12-bit multiplexed RGB2 input (24-bit color), (multiplex scheme 2) 2 8-bit multiplexed RGB input (16-bit color, 565) 3 8-bit multiplexed RGB input (15-bit color, 555) 4 8-bit multiplexed YCrCb input (24-bit color), (Y, Cr and Cb are multiplexed)
デフォルトのIDF=0でOK。他も見た限りはデフォルトでOKのようだ。
ちなみにレジスタの設定方法は
アプリケーション・ノート がある。
だいたいプロトコルは、基本的なプロトコルは
前回のCMOSカメラのSCCBプロトコル と同様かな?と思う。デバイスアドレスを変更すれば良いような気がする。まあ~、取り敢えずデフォルトで行って、まずかったらレジスタの値を変更することにする。
キャラクタ・ディスプレイ・コントローラ回路を改造して、SP605に載せてみて、ディスプレイに表示出来るかを試してみることにする。
2010年06月19日 20:28 |
Spartan-6 FPGA SP605 評価キット
| トラックバック:0
| コメント:0
私は、Windows7の純正電卓ソフトが気に入らない。そこで、良さそうなフリーの電卓ソフトを探してインストールした。
1つは
簡単電卓 、式が表示できるのが良い。関数電卓として使うつもり。下図参照(下図のOSはWindows XPです)
もう1つは、
PCalc 754 。こちらは、2進数、10進数、16進数の変換に使用する。signed intが表示できる電卓は少ない。下図は-6を表示させたところ。更に、10進数で表示していても、2進数も16進数も表示している。
(追加)
上山完さんにコメントで、
「C電卓」 を教えていただきました。ありがとうございました。この電卓は、2進数のビットフィールドがわかって便利です。何ビット目が立っているか一目でわかります。これも使わせていただこうと思います。
2010年06月17日 19:33 |
パソコン関連
| トラックバック:0
| コメント:0
Xilinx社から送られてきた、最新号のXellジャーナル日本語版を読んでいたが、色々面白い記事があった。
今手元にないんだが、確か 69,70合併号
だと思う 。Virtex-6のリオーダーできるDDR? SDRAMコントローラとか(リオーダー方式のコントローラによるDDR SDRAMの効率化、18ページ~21ページ)。。中でもEDKを使わないMicroBlazeの記事(シンプルMicroBlazeマイロ コントローラ (SMM) のコンセプト、26ページ~29ページ)に興味を持った。これって、出来合いのMicroBlazeで、色々コンフィグしなくても使えるMicroBlaze?もしかしてWebPACKでもMicroBlazeが使えるのだろうか?
詳しい情報は
XAPP1141 にあるとのこと。
XAPP1141のデザインファイルはここ (登録とライセンスの承認が必要)。簡単に説明すると、決まった機能のMicroBlazeを予め論理合成して、IPとして配布されていて、そのIP (smm.ngc) をISEで使えるということ。bmmファイルも同時に配布されているので、Data2MEMでソフトウェアもロードできるという寸法。ソフトウェアはSDKで作り、SDKからFPGAにコンフィギュレーションするようにアプリケーションノートでは書かれている。
早速、色々やってみたのだが、結局WebPACK11.5では、EDKがインストールされないで、SDKもインストールされなくて使えなかった。WebPACK12.1ではSDKはインストールされていたが、ライセンスがなくて使えなかった。残念だ。
でもISE11.5のEDK付きの購入バージョンだったら、サンプルを実行することができた。
8KB of internal RAM/ROMで、外部アドレスは16ビットだが、ちょっとしたコントローラには使うことができると思う。EDKを動かして、主従が逆転することなしに、メインはISEでちょっと手軽なコントローラを使いたいという用途には良いと思う。
下に、XAPP1141の21ページの Figure 17: XPS Project Diagram を引用させていただきます。
LMBバスに8KBのBRAMがつながっていて、DPLBにUARTやUser Interfaceがつながっている。
XAPP1141 の12ページからのStep by Step SMM Design Example をやってみた。下がbitファイルを生成できたあとのProject Navigatorの様子。
下が、ビルドが終了したSDKの様子だ。
SDKからTools > Program FPGA... を選んで、コンフィギュレーションをすると、押しボタンスイッチを押すと、LD0~LD3のどれかが点灯する。
はじめから入っているサンプルのSMM_Refは動作させることができなかった。
The Simple MicroBlaze Microcontrollerが、WebPACKで使えれば画期的と思ったんだけど、残念。でも通常版ISEで使えるだけでも便利だ。LCDの制御などは、このSimple MicroBlazeに任せてしまえば良い。遅くても良いインターフェースの部分なども、これが使えそう。なんといっても、アセンブラではなくC言語が使える。
# 寝ながら思いついたのだが、プログラム用のBRAMは0番地から8KB(0x0000_1FFFまで)だろうし、UARTもデバッカも付けなければ、アドレスをリバースエンジニアリングすること無しに、MicroBlaze用のGCCを使えば、MicroBlazeを使えるような気がする。MicroBlaze用のGCCは、EDKフォルダの下にインストールされていて、使うことができるようだ。”
カスタム設計の MicroBlaze ”に詳しく書いてある。これを使えば、もしかするとWebPACKでもMicroBlazeを使うことができるのではないか?と思う。
2010年06月16日 21:12 |
SMM
| トラックバック:0
| コメント:4
学生実験用にISim単体でシミュレーションためのバッチファイルを書いてみた。使用言語はVHDLで、使用するバージョンは11.5。
ISimは、コマンドラインからVHDLコンパイラ(vhpcomp)やVerilogコンパイラ(vlogcomp)でコンパイルして、HDLリンカ(fuse)でリンクするとシミュレーション実行ファイルが生成される。そのシミュレーション実行ファイルを実行すると、ISimが立ち上がり、シミュレーションをすることができる。この辺の情報は、
ISimユーザーズマニュアル の123ページ、シミュレーション実行コマンドに書いてある。
使用しているプロジェクトは、”
キャラクタ・ディスプレイ・コントローラのシミュレーション(VHDL) ”で紹介した、PS/2キーボード・インターフェースとキャラクタ・ディスプレイ・コントローラをつないで、キーボードで1文字打ったら、その文字が直接ディスプレイに表示できるようになっている回路だ。以前はModelSimでシミュレーションを実行したが、今回はISimでシミュレーションを行う。VHDLソースコードやシミュレーション用VHDLコードはそのままで、シミュレーターだけをISimに変更している。
さて、最初にISimを起動して、シミュレーションを行うバッチファイル(keyboard_chardisp_25MHz_tb.bat)の中身を下に示す。
REM コンパイルを実行する vhpcomp -work work -incremental -f keyboard_chardisp_25MHz_tb.f REM リンクを実行する fuse work.keyboard_chardisp_25MHz_tb -L unisims -o keyboard_chardisp_25MHz_tb.exe REM シュミレーター起動、GUIモード keyboard_chardisp_25MHz_tb.exe -gui -view keyboard_chardisp_25MHz_tb.wcfg -tclbatch isim_cmd.tcl
最初にvhpcompコマンドでVHDLコードをコンパイルする。workライブラリに結果を保存して、keyboard_chardisp_25MHz_tb.fというファイルに書かれたコンパイルするVHDLファイルのリストを使ってコンパイルする。
keyboard_chardisp_25MHz_tb.fの中身を下に示す。
../../disp_timing_pack.vhd ../../keymap2ascii.vhd ../../keyboard_module.vhd ../../gen_input.vhd ../../char_gen_rom.vhd ../../disp_addr_counter.vhd ../../disp_timing.vhd ../../frame_buffer.vhd ../../CharDispCtrler.vhd keyboard_chardisp_25MHz.vhd ../PS2_SigGen_pack.vhd keyboard_chardisp_25MHz_tb.vhd
次にfuseコマンドでリンクを行う。work.keyboard_chardisp_25MHz_tbをunisimsライブラリを参照して、keyboard_chardisp_25MHz_tb.exeというシミュレーション実行ファイルを生成する。
最後に、keyboard_chardisp_25MHz_tb.exeを実行して、ISimを立ち上げ、シミュレーションを実行する。その際に、keyboard_chardisp_25MHz_tb.wcfgという信号名をシミュレーションの波形ファイルに加えて、isim_cmd.tclというtclコマンドを実行する。
keyboard_chardisp_25MHz_tb.wcfgは、ISimのFileメニューからSaveした波形ファイルになる。これもブログに貼ろうと思ったが、XMLファイルで長いのでやめた。
isim_cmd.tclの内容は、”run all”だけとなっている。
よって、このバッチファイルを実行すると、VHDLソースをコンパイル、リンクしてISimがGUIモードで起動し、指定された信号をロードして、シミュレーションをスタートする。
Consoleに”ABC”が表示されているが、例によってプロポーショナル・フォントなので、表示が崩れている。EditメニューからPreference...を選択して、ISim SimulatorのConsole text fontをChageボタンをクリックして、MSゴシックに変更した。
そうすると、Consoleパネルに、きちんと”ABC”が表示された。
(追加)そういえば、テストベンチのキーボード入力のプロセス文をシミュレーションが終了するように、以下のように修正しています。
process begin -- PS/2キーボード入力 wait for 80 ns; -- 1クロック分リセット reset <= '0'; -- リセット解除 PS2_SigGen(x"1C", ps2clk, ps2data); -- 'A' PS2_SigGen(x"F0", ps2clk, ps2data); PS2_SigGen(x"1C", ps2clk, ps2data); PS2_SigGen(x"32", ps2clk, ps2data); -- 'B' PS2_SigGen(x"F0", ps2clk, ps2data); PS2_SigGen(x"32", ps2clk, ps2data); PS2_SigGen(x"21", ps2clk, ps2data); -- 'C' PS2_SigGen(x"F0", ps2clk, ps2data); PS2_SigGen(x"21", ps2clk, ps2data); wait for 10 ms; assert (false) report "Simulation End!" severity failure; end process;
なお、VerilogでもVerilogコンパイラ(vlogcomp) を使用し、glbl.vもコンパイルして、リンクの時に付加すれば、同様にシミュレーションすることができる。
2010年06月15日 04:52 |
ISim
| トラックバック:0
| コメント:0
6月10日に、画像センシングシンポジウムに行って、ポスター発表の説明をして来ました。先生の素敵なプレゼン(90秒です)で、沢山のお客さんが来てくれました。中には、FPGAの部屋を見ていただいているという方も1人ですが、来ていただきました。ありがとうございました。
私は、2次元のマックスプラス代数によるウェーブレット変換をFPGAに実装したので、その説明をしました。また、変換-閾値処理-逆変換による画像の劣化具合についても見ていただきました。”
CMOSカメラから画像を入力してディスプレイへ出力15(できた!!!) ”で作ったCMOSカメラ画像出力回路をベースにしています。
2010年06月12日 19:14 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
筑波大学の武内さんからコメントでとても良い情報をいただいた。ありがとうございます。
それは
ChipScope Pro 11.1 で(* KEEP_HIERARCHY = "TRUE" *)をmoduleの前に宣言して、Verilogのmoduleごとに階層をキープして、Chipscopeで観察する信号を見つけやすく、しかも信号がなくならないようにしていた。しかし、Synthesis のオプションの -netlist_hierarchy を Rebuildにしたら選択できるようにならないか?というコメントを頂いた。やってみたら、empty信号は無くなってしまったが、Core Inserterから階層が見えて、とても信号にプローブをかけやすくなった。
XSTのプロパティの -netlist_hierarchyのデフォルト値は、As Optimizedになっている。
async_fifo_rise, async_fifo_fallモジュールの(* KEEP_HIERARCHY = "TRUE" *)を削除して階層をキープを外す。その状態で、Core Inserterを起動し、Select Netダイアログを表示すると、Structure/Netsには、モジュールで階層をキープしたモジュールが並んでいて、async_fifo_rise, async_fifo_fallモジュールの階層は無くなっている。その結果として、Data Signals のNet Selecionsには、赤い表示が現れている。
ここで、XSTのプロパティの -netlist_hierarchyの値をAs OptimizedからRebuiltに変更した。これで、Core Inserterを起動し、Select Netダイアログを表示すると、Structure/Netsには、階層をキープしていないモジュールも階層化されていて、とても見やすい。 async_fifo_fallモジュールにemptyの信号名は論理合成されてなくなっていたが、とても見やすくなった。(注:(* KEEP_HIERARCHY = "TRUE" *)でモジュールで階層をキープした時とネット名は同じに見えてもSelect Netダイアログでは赤い表示になっています。再度、ネット名を指定する必要があるようです)
Chipscopeをかけない状態で、インプリメントの品質を比べてみたが、わずかにRebuiltの方が良かったくらいで、どちらも遜色はなかった。全部の階層をキープしてしまうとインプリメントの品質が落ちてしまうことが多いので、Rebuiltにしておくのはとても良いと思った。
最後の元ネタの筑波大学の武内さんの”
Synthesis オプションの設定 ”をご紹介しておく。
#本当になんで、このオプションがデフォルトじゃないんだろうか?
ここまで、書いてきてなんだが?HELPを読んでいるうちにKeep Hierarchy = Softとどこな違うのかな?と疑問になってきた。どちらもネットリストのNGCファイルに階層的なネットリストを出力するんじゃないか?と思ってきた。なにか情報をお持ちの方は教えてください。 (結局、階層的なネットリストが出力されるのだったら、一緒じゃないか?とその時は思ったのですが、下の結果でも、よくわからない結果が出ているので、削除します)
DDR2_burst_testプロジェクトで、XSTプロパティのKeep Hierarchyとnetlist_hierarchyをいろいろ変更した際のTS_ddr2_sdram_cont_inst_dcm_module_inst_clk_node_0のminimum periodの変化をAnalyze Post-Place & Route Static Timingで測定してみたので、下に結果を示す。(async_fifo_rise, async_fifo_fallモジュールの(* KEEP_HIERARCHY = "TRUE" *)は削除してある)
Keep Hierarchy netlist_hierarchy minimum period
NO As Optimaized 6.960 nsec
NO Rebuilt 7.175, 6.666, 6.746 nsec(値が一定しない?)
SOFT As Optimaized 6.744 nsec
SOFT Rebuilt 6.673 nsec
YES As Optimaized 6.597 nsec
YES Rebuilt 6.624 nsec
それぞれ結果が違うようだ?もっと詳しく調査する必要があると思う。
Keep Hierarchy=NO, netlist_hierarchy=Rebuitは他の値に切り替えた後で、もう一度この値に戻したときのTS_ddr2_sdram_cont_inst_dcm_module_inst_clk_node_0のminimum periodの値が一定しない。ISEのバージョンは11.5を使用している。
(2010/06/12:追記) いろいろ、”XST netlist_hierarchy Rebuilt”のキーワードで調べてみました。-netlist_hierarchy=Rebuiltはやはり、XSTで階層をフラットにして論理合成してから、階層を元のように構築するようです。ここからは私の意見ですが、ネットリストに階層を再構築しているので、完全にフラットになったネットリストとはインプリメント段階での入力されるネットリストが違うため、インプリメント結果が異なっているのだと思います。
いずれにせよ。少し結果のminimum periodが安定しない不思議はありますが、合成結果はnetlist_hierarchy=Rebuitにした方が概ね良いようですし、デフォルトでKeep Hierarchy=NO, netlist_hierarchy=Rebuitにした方が良い気がします。考えてみると、論理合成で、合成結果が良くなるように階層をまたいで最適化してから、階層を再構築するんですから、後でのフロアプランもしやすいし(PlanAheadのマニュアルにもこのオプションの記述が出てきます)、MAPもP&Rもやりやすいんじゃないでしょうか?それでインプリメント結果が良いのかもしれません(私の推測です)。
2010年06月11日 13:14 |
Chipscope
| トラックバック:0
| コメント:5
”
Spartan-6のPCIe Endpoint Block IPの勉強6(pio_writeReadBack_test1その4) ”の続き。
9. 送信TLP。コンフィギュレーション・ライト・リクエスト。5番レジスタへのWrite。5番目のレジスタはベースアドレス1なので、オール1を書いて、どのくらいの領域を要求しているかを見ている部分だろう?
10. 送信TLP。5番レジスタに対するコンフィギュレーション・リード・リクエスト。これは、どのくらいの領域を要求しているかをリードする。5番目のレジスタはベースアドレス・レジスタ1だ。
11. 受信TLP。タグ番号0x02なので、9. のコンフィギュレーション・ライト・リクエスト対するコンプリーションだ。コンフィギュレーション・ライト・リクエストが成功しているというお知らせ。
12. 受信TLP。10.のコンフィギュレーション・リード・リクエストに対するコンプリーション。値は0x00000000。すべてが0なので、ベースアドレスレジスタ1はディスエーブルとなる。
13. その後、レジスタ番号6~9(ベースアドレス・レジスタ2~5)に0xffffffffをWriteして、Readしたら0x00000000が帰ってきて、ディスエーブルされていることがわかった。その後、レジスタ番号0x0C(拡張ROMベースアドレス)を同様に調査して、0x00000000が帰ってきてディスエーブルされていることがわかった。これでベースアドレス関連のレジスタはすべて調べたことになる。これは
PCIのコンフィギュレーションのやり方 と同じだ。
14. 送信TLP。コンフィギュレーション・ライト・リクエスト。4番レジスタへのWrite。ベースアドレス0のみ有効なので、そこにアドレスを書いていると思われる。オール0を書いているので、0番地から1Mバイトマップされる。
15. 送信TLP。5番レジスタ(ベースアドレス1)へオール0を書いている。ディスエーブルとわかっていてもオール0を書くんだ?その後、残りのベースアドレス全部と拡張ROMベース・アドレスにオール0を書き込んでいる(多分、途中は確かめてないけど)。その間にもコンフィギュレーション・ライト・リクエストのコンプリーションは帰ってきている。
16. 送信TLP。コンフィギュレーション・ライト・リクエスト。レジスタ番号1番への書き込み。レジスタ番号1番はステータス・レジスタとコマンド・レジスタだ。コマンド・レジスタへ0x0003を書き込んでいる。これは、メモリ空間とI/O空間に対するアクセスを有効化するビットを1にしている。
17. 送信TLP。コンフィギュレーション・ライト・リクエスト。レジスタ番号0x18番への書き込み。つまりコンフィギュレーション・レジスタ0x60番地への書き込み。最下位のバイトに0x5Fを書き込んでいる。これはなんだろう?要調査。
18. その後は、コンフィギュレーション・ライト・リクエストへのコンプリーションが次々着ている。
19. 送信TLP。65.25 usecあたりに0x00000000番地へのメモリ・ライト・リクエストが、データは1バイトずつのリトルエンディアンで0x04030201。これは、
”Spartan-6のPCIe Endpoint Block IPの勉強4(pio_writeReadBack_test1その2) ”でEndPoint側で観測されたパケットでもある。Root Portでメモリ・ライト・リクエストを送ってから、EndPointで受信されるまでに約1usec経過している。
20. 送信TLP。0x00000000番地へのメモリ・リード・リクエスト。
21. 受信TLP。20.の0x00000000番地へのメモリ・リード・リクエストのコンプリーション。受信したデータは、データは1バイトずつのリトルエンディアンで0x04030201で、19.で送ったデータと同一。EndPoint側の記事は、”
Spartan-6のPCIe Endpoint Block IPの勉強5(pio_writeReadBack_test1その3) ”。
これで、pio_writeReadBack_test1は終了。一般的なPCIe EndPointの初期化手順を見てきた気がする。
2010年06月11日 05:26 |
PCI Express
| トラックバック:0
| コメント:0
”Spartan-6のPCIe Endpoint Block IPの勉強4(pio_writeReadBack_test1その2) ”と”
Spartan-6のPCIe Endpoint Block IPの勉強5(pio_writeReadBack_test1その3) ”で、EndPointのトランザクション・パケットを見てきたが、Root Portのトランザクション・パケット(TLP)を見て行こう。
下に、Root PortのTLPの波形を示す。
1. 最初のRoot Portの送信TLPは、コンフィギュレーション・リード・リクエスト。レジスタ番号0番地のリード。
2. 次は、受信TLP。1.のコンフィギュレーション・リード・リクエストに対応するコンプリーション。レジスタ番号0のデータ。データはee100700。デバイスIDが0x0007、ベンダIDが0x10EE。ここではコンプリータIDは0000。
3. 送信TLP。コンフィギュレーション・リード・リクエスト。レジスタ番号0x17のリード。0x17と言うと0x5C番地のはず。これは、PCIe機能レジスタ?
4. 2.62 usec後に、受信TLP。当然ながら、3.のコンフィギュレーション・リード・リクエストに対応するコンプリーション。レジスタ番号0x17のデータ。データはc28f0000。となると、ルートコントロールが0x8fc2で、ルート機能が0x0000?
5. 送信TLP。コンフィギュレーション・ライト・リクエスト。4番レジスタへのWrite。4番目のレジスタはベースアドレス0なので、オール1を書いて、どのくらいの領域を要求しているかを見ている部分だろう?
コンフィギュレーション・ライト・リクエストのバス番号とデバイス番号をEndPointは記憶するそうだ。
I.Kさん、やはり、コンフィギュレーション・ライト・リクエストのバス番号とデバイス番号は、Root Portと同じでした。このパケットをRoot Portが出力してから、1.14 usec後に、EndPointのcfg_bus_number出力が0x00から0x01に、cfg_function_number出力が0x00から0x14に変化しました。ありがとうございました。
6. また送信TLP。当然ながら、4番レジスタに対するコンフィギュレーション・リード・リクエスト。これは、どのくらいの領域を要求しているかをリードする。
7. 受信TLP。タグ番号0x00なので、5. のコンフィギュレーション・ライト・リクエスト対するコンプリーションだ。5. から2.67 usecかかている。
8. 受信TLP。6. の4番レジスタに対するコンフィギュレーション・リード・リクエストに対応するコンプリーション。送られてきたデータは0x0000f0ff。これを左のビットがMSBに直すと、0xfff00000。つまり、20ビットのアドレス空間があるので、ベースアドレス0は1Mバイトメモリ。
次の記事 に続く。
2010年06月10日 05:33 |
PCI Express
| トラックバック:0
| コメント:0
PCI Express(PCIe)のトランザクション・パケット解析ソフトができて、PICeのパケットを解析しようと思っているが、素朴な疑問が出てきた。
1. PCIeの初期化はどうやっているのだろうか?PCIバスでは、IDSEL信号があって、FRAME#がアサートされた時にIDSELが1だと、自分へのコンフィギュレーション・アクセスだということが識別できたが、PCIeでは、スイッチを通っているので、スイッチが自分に投げたパケットは自分宛のパケットとして処理して良いということだろうか? 2. 1が言えるということは、自分に投げられた最初のコンフィギュレーション・パケットのバス番号とデバイス番号を自分の物と認識しても良いということだろうか?
今のところ、2冊のPCIeの日本語の本を見ても書いてないようだ。英語の本を読まないとだめかな?それとも当たり前のだろうか?
さて、疑問は置いといて、”
Spartan-6のPCIe Endpoint Block IPの勉強4(pio_writeReadBack_test1その2) ”で、メモリ・リード・リクエストのパケットがあったので、コンプリーション・パケットがあるはずだ。それを見てみよう。下に、その波形を示す。
このパケットの値は、4a000001 01a00004 01a00a00 04030201 となっている。これをトランザクション・パケット解析ソフトに入れて、解析する。
コンプリーション(データあり)となっている。これはメモリ・リード・リクエストに対するコンプリーションなのでデータはありとなる。タグもメモリ・リード・リクエストと同じ0Aだ。腑に落ちないのは、リクエスタIDとコンプリータIDが01A0で同一ということだ。これは、おかしい気がする。
第4DWはデータで、以前Writeしたデータがそのまま読み出されている。
ちなみに、”
Spartan-6のPCIe Endpoint Block IPの勉強1(シミュレーションでRoot Portの動作を確認) ”では、アクセス先のトランザクションID(バス番号&デバイス番号&機能番号)は 01A0だったが、”
Spartan-6のPCIe Endpoint Block IPの勉強2(シミュレーションでRoot Portの動作を確認2) ”では、コンプリータIDが 0000 になっていた。これは同一でないとおかしいと思うのだが、まだコンフィギュレーションの途中ということでトランザクションIDが入っていなかったのだろうか?
次は、pio_writeReadBack_test1でのコンフィギュレーションの様子を観察することにする。
2010年06月09日 05:21 |
PCI Express
| トラックバック:0
| コメント:2
現在、PCI Expressのトランザクション・パケット解析ソフトをOpenOffice.orgのCalcで作っている。
OpenOffice.orgのCalcの関数は大体EXCELの関数と同じだが、区切りの記号は,から;に変更する必要がある。例えば、IF(A1="";"";"A")となる。
はじめはよく分からないで苦労したが、色々なサイトを参考に大分できてきた。
まずはパケットを解析するにあたってシフトはどうするのか?と思ったが、左シフトは2のn乗を掛け、右シフトは2のn乗で割っている。その際にINT関数をつけておかないと、浮動小数点演算の丸めの影響で+1されてしまう場合があるようだ。例、INT($A$5/2^20)
マスクはどうやってやるか戸惑ったが、”
Excel で bit演算 ”のサイトを参考にして、マクロで関数を実装することにした。ビット演算を行う関数については、”
OpenOffice.org Basic ”を参考にした。
OpenOffice.orgのCalcのツールメニュー -> マクロ -> マクロの管理 -> OpenOffice.org Basicを選ぶとOpenOffice.org Basicマクロダイアログが出てくる。そのマイマクロに登録してある。
これで、BitANDが使えるのでマスクができる。あまり体裁は良くないが、下のような感じで作っている。現在はコンプリーション・パケット解析を作っている。だいたいこれで、お終いにして、今度はRoot Portの送っているパケットを解析してみよう。
2010年06月08日 05:27 |
PCI Express
| トラックバック:0
| コメント:0
今回は、pio_writeReadBack_test1でEndPointのTRNインターフェースまで行って、受信したパケットを解析してみる。
TRNインターフェースの送信と受信のインターフェースの波形を下に示す。”
Spartan-6のPCIe Endpoint Block IPの勉強3(pio_writeReadBack_test1その1) ”の波形の黄色い四角で囲った部分の受信側を拡大した。
上の図でtrn_rsof_n, trn_reof_n, trn_rsrc_rdy_n, trn_rdst_rdy_nなどを見るとわかるように、最初にtrn_rsof_nが0にアサートされて、3つデータが来た後に、trn_reof_nがアサートされて、現在のデータで終了となる。都合4つのデータを持つパケットを受信した。そのデータは、
40000001 01a009ff 00000000 04030201 だった。もう1つパケットを受信している。最初はtrn_rsof_nが0にアサートされても、trn_rdst_rdy_nが0にアサートされていないため、EndPointはアサートされるまでtrn_rsof_nを0にして待っている。trn_rdst_rdy_nはユーザーアプリ側がアサートする信号で、受信パケットの受け入れ準備ができていないことを示している。trn_rsrc_rdy_nはEndPoint側の準備ができていないことを示し、trn_rsrc_rdy_nとtrn_rdst_rdy_nが同時にアサートされた時が、データをユーザーアプリ側に転送できた時だ。説明が長くなったが、2回目に受信したパケットは、
00000001 01a00aff 00000000 だった。
最初の
40000001 01a009ff 00000000 04030201 から解析してみる。
最初のフレームの
0x40000001 から解析する。
最初のバイト、バイト0は
0x40 となっている。このバイトの6,5番目のビットがTLPのフォーマット(Fmt)を表す。
10 なので、3DWデータありを表す。ビット4~0がTLPの種類(Type)を表す。Fmtが
10 、Typeが
00000 なので、メモリ・ライト・リクエストという事になる。
バイト1は、ビット6~4がトラフィック・クラス(TC)を表す。TCは
000 。後はリザーブ。
バイト2のビット7がECRCの有無、
0 なので無し。ビット6がエラー・フォワーディングかな?
0 なので無し?ビット5~4は属性。値は
00 。ビット5はRelaxed Ordering Bitで、ビット4は、No Snoop Bitなので、どちらも
0 。
バイト2のビット1~0とバイト3の全部がデータのペイロード長。
0000000001 なので、データは1DW。
次のフレームの
0x01a009ff を解析してみる。
次のバイト4とバイト5はリクエスタID。
0x01a0 。
バイト6がタグ。これは
0x09 、これは今までで10個目のパケットなのかな?
バイト7のビット7~4が最後のDWのバイトイネーブル。これは
1111 。ビット3~0が最初のDWのバイトイネーブルで
1111 。どちらのバイトイネーブルもオール1だった。最初と最後のバイトイネーブルをパケットに含めることで、バイト単位(のアドレス)でバースト転送をすることができる。でもPCIバスの様に個別に、常時バイトイネーブルが付くわけではないので、1バイト置きに書くということは出来ない。
3番目のフレームの
0x00000000 を解析する。
ビット32~ビット2はアドレスを表す。つまり
0番地 ということ、ビット1~ビット0はリザーブなのは、バイト単位ではなく、32ビットのダブルワード単位のアドレスだから。
4番目のフレーム、
0x04030201 はデータということになる。
前回の解析結果から行くと、最初のバイトはバイト0となっているはずなので、32ビット幅のデータとして表示すると、順序が逆になって
0x01020304 になる。
最初のパケットをまとめると、1DWを0番地に書き込むメモリ・ライト・リクエストで、書き込む32ビット幅のデータは
0x01020304 。
次のパケット、
00000001 01a00aff 00000000 の解析してみよう。
最初のバイト、バイト0は
0x00 となっている。このバイトの6,5番目のビットがTLPのフォーマット(Fmt)を表す。
00 なので、3DWデータ無しを表す。ビット4~0がTLPの種類(Type)を表す。Fmtが
00 、Typeが
00000 なので、メモリ・リード・リクエストという事になる。
バイト1は、ビット6~4がトラフィック・クラス(TC)を表す。TCは
000 。後はリザーブ。
バイト2のビット7がECRCの有無、
0 なので無し。ビット6がエラー・フォワーディングかな?
0 なので無し?ビット5~4は属性。値は
00 。ビット5はRelaxed Ordering Bitで、ビット4は、No Snoop Bitなので、どちらも
0 。
バイト2のビット1~0とバイト3の全部がデータのペイロード長。
0000000001 なので、データは1DW。
次のフレームの
0x01a00aff を解析してみる。
次のバイト4とバイト5はリクエスタID。
0x01a0 。
バイト6がタグ。これは
0x0a 、これは今までで11個目のパケット?
バイト7のビット7~4が最後のDWのバイトイネーブル。これは
1111 。ビット3~0が最初のDWのバイトイネーブルで
1111 。どちらのバイトイネーブルもオール1だった。
3番目のフレームの
0x00000000 を解析する。
ビット32~ビット2はアドレスを表す。つまり
0番地 。
このパケットは、0番地から1DWを読むメモリ・リード・リクエスト。
つまり0番地へ4バイトをWriteして、また0番地からReadする。
パケット解析するのが面倒なので、パケット解析プログラムを作ることにする。ExcelかRubyかそれともOpenOffice.orgのCalcで作ろうかな?
2010年06月06日 06:50 |
PCI Express
| トラックバック:0
| コメント:0
今日は、娘の高校の文化祭に行ってきました。
車で駅まで行って、高校のある駅まで行って、駅から15分程度、高校まで歩いて行きました。どうしてそうしたかと言うと、高校には駐車できないので、歩きで行く必要があったからです。自転車では17Km程度あるので、時間がかかってしまいます。それに、奥さんと小6の娘と一緒に行ったので、一緒に自転車では無理でした。
入るとテントがあって、これでチケットを買います。チケットは文化祭でのお金として使えます。これは余れば、現金と引換てくれます。うちは、引換えるのも面倒だし、口蹄疫募金してきました。
のぼりも沢山あって、立体的に作ってあって、気合が入っていました。
娘のクラスに行くと、娘はいたのですが、何で来たんだと邪魔にされました。おかげで娘のクラスの出し物は何をやっていたのかよく分かりませんでした。残念。そんなに邪険にしなくてもいいじゃない~!!でも、私も高校のことはそうだったと思いますね。その気持はわかります。
小6の娘が好きなイラスト部の展示を見て、アイス(本格的に冷凍庫を持ち込んでいましたが、やはり31みたいに上手にはアイスを丸く取れていませんでした。あれ難しいんですよね。たぶん)、ドーナツ(ミスタードーナツです)を食べて帰ってきました。
掲示物で面白かったのは、みんなのお弁当ワールドカップという掲示物でした。先生方のお弁当の写真も貼ってあります。皆さん豪華なお弁当です。私も食べたいというと、いつもお弁当を作ってくれている、奥さんに申し訳ないか?
写真には半分以上ご飯を食べてしまっている写真も。。。おいおい、だめだろう食べる前に写真をとらないと。。。私みたい。自分でも料理を前にすると、食い気が優って、ついつい食べる前の写真を撮り忘れてしまいます。。。
その後はイーアスへ行ってお買い物。
ルピシアで紅茶、[5503] WEDDING を買ってきました。飲んでみるのが楽しみです。
2010年06月05日 18:35 |
日記
| トラックバック:0
| コメント:0
”
Spartan-6のPCIe Endpoint Block IPの勉強2(シミュレーションでRoot Portの動作を確認2) ”の続き。
今回は、pio_writeReadBack_test1を行った。pio_writeReadBack_test1は”
Spartan-6 FPGA PCI Express 用インテグレイテッド エンドポイント ブロック ユーザー ガイド (英語版) ”の150ページに全ソースが載っている。これをtests.vに追加した。だが、それだけではだめで、信号やTASKの実体は下の階層のVerilogソースにあるので、board.RP.tx_usrappまでのパスを全部の信号やTASKに追加した。一部を転載すると下のような感じになっている。
board.RP.tx_usrapp.P_READ_DATA = 32'hffff_ffff; // make sure P_READ_DATA has known initial value board.RP.tx_usrapp.TSK_TX_MEMORY_WRITE_32(board.RP.tx_usrapp.DEFAULT_TAG, board.RP.tx_usrapp.DEFAULT_TC, 10'd1, board.RP.tx_usrapp.BAR_INIT_P_BAR[ii][31:0] , 4'hF, 4'hF, 1'b0);
まさにVerilogだから、参照出来ているので、VHDLの言語仕様ではできない。良いのか悪いのかよく分からないが、下位の信号やTASKが自由に使えるのは取り敢えず便利だ。
書き直してコンパイル、リンクして、下のコマンドでISimを起動した。
demo_tb.exe -gui -testplusarg TESTNAME=pio_writeReadBack_test1
Root Port (RP)から、多量のパケットを送信して、同様のパケットを受信している。下にRPの送受信タイミングを示すISimの波形ウインドウを示す。
次にEndPointを見てみる。やっと、EndPointでも送信と受信を観測することができた。下にEndPointの送受信タイミングのISimの波形ウインドウを示す。
黄色い四角の部分で、パケットを受信して、次にパケットを送信している。
シミュレーション時のISimのログを下に示す。
Simulator is doing circuit initialization process. Running test {pio_writeReadBack_test1}...... [ 0] : System Reset Asserted... Finished circuit initialization process. [ 399600000] : System Reset De-asserted... [ 960680600] : Transaction Reset Is De-asserted... board.EP.s6_pcie_v1_3_i.PCIE_A1.B_PCIE_A1_INST.SHIP.SHELL.BUT.pcie_pcie_inv.pcie_pcie.pcie_core.xil_pcie_sa_mod18.xil_pcie_sa_mod19.com.tlm.u_tlm_rx.xil_pcie_sa_mod75 checking [ 1894626600] : Transaction Link Is Up... [ 1895816600] : TSK_PARSE_FRAME on Transmit [ 2233396600] : TSK_PARSE_FRAME on Receive [ 2295792600] : Check Device/Vendor ID - PASSED [ 2296992600] : TSK_PARSE_FRAME on Transmit [ 2559776600] : TSK_PARSE_FRAME on Receive [ 2696968600] : Check CMPS ID - PASSED [ 2696968600] : SYSTEM CHECK PASSED [ 2696968600] : Inspecting Core Configuration Space... [ 2698168600] : TSK_PARSE_FRAME on Transmit [ 2739366600] : TSK_PARSE_FRAME on Transmit [ 2966151800] : TSK_PARSE_FRAME on Receive [ 3007750600] : TSK_PARSE_FRAME on Receive [ 3140542600] : TSK_PARSE_FRAME on Transmit [ 3181740600] : TSK_PARSE_FRAME on Transmit [ 3407728200] : TSK_PARSE_FRAME on Receive [ 3452524600] : TSK_PARSE_FRAME on Receive [ 3582916200] : TSK_PARSE_FRAME on Transmit [ 3624114600] : TSK_PARSE_FRAME on Transmit [ 3849302600] : TSK_PARSE_FRAME on Receive [ 3890898600] : TSK_PARSE_FRAME on Receive [ 4025289800] : TSK_PARSE_FRAME on Transmit [ 4066488600] : TSK_PARSE_FRAME on Transmit [ 4290876600] : TSK_PARSE_FRAME on Receive [ 4335672600] : TSK_PARSE_FRAME on Receive [ 4467663800] : TSK_PARSE_FRAME on Transmit [ 4508862600] : TSK_PARSE_FRAME on Transmit [ 4735664600] : TSK_PARSE_FRAME on Receive [ 4777262600] : TSK_PARSE_FRAME on Receive [ 4910064600] : TSK_PARSE_FRAME on Transmit [ 4951262600] : TSK_PARSE_FRAME on Transmit [ 5177262600] : TSK_PARSE_FRAME on Receive [ 5222064600] : TSK_PARSE_FRAME on Receive [ 5352462600] : TSK_PARSE_FRAME on Transmit [ 5393664600] : TSK_PARSE_FRAME on Transmit [ 5618864600] : TSK_PARSE_FRAME on Receive [ 5660462600] : TSK_PARSE_FRAME on Receive [ 5793664600] PCI EXPRESS BAR MEMORY/IO MAPPING PROCESS BEGUN... BAR 0: VALUE = 00000000 RANGE = fff00000 TYPE = MEM32 MAPPED BAR 1: VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED BAR 2: VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED BAR 3: VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED BAR 4: VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED BAR 5: VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED EROM : VALUE = 00000000 RANGE = 00000000 TYPE = DISABLED [ 5793664600] : Setting Core Configuration Space... [ 5794864600] : TSK_PARSE_FRAME on Transmit [ 5836062600] : TSK_PARSE_FRAME on Transmit [ 5877264600] : TSK_PARSE_FRAME on Transmit [ 5918462600] : TSK_PARSE_FRAME on Transmit [ 5959664600] : TSK_PARSE_FRAME on Transmit [ 6000862600] : TSK_PARSE_FRAME on Transmit [ 6042064600] : TSK_PARSE_FRAME on Transmit [ 6060464600] : TSK_PARSE_FRAME on Receive [ 6083262600] : TSK_PARSE_FRAME on Transmit [ 6108465400] : TSK_PARSE_FRAME on Receive [ 6124464600] : TSK_PARSE_FRAME on Transmit [ 6150061800] : TSK_PARSE_FRAME on Receive [ 6194864600] : TSK_PARSE_FRAME on Receive [ 6239662600] : TSK_PARSE_FRAME on Receive [ 6284464600] : TSK_PARSE_FRAME on Receive [ 6329262600] : TSK_PARSE_FRAME on Receive [ 6374064600] : TSK_PARSE_FRAME on Receive [ 6418862600] : TSK_PARSE_FRAME on Receive [ 6524464600] : Transmitting TLPs to Memory 32 Space BAR 00000000 [ 6525664600] : TSK_PARSE_FRAME on Transmit [ 6530864600] : TSK_PARSE_FRAME on Transmit [ 6783664600] : TSK_PARSE_FRAME on Receive [ 6930862600] : Test PASSED --- Write Data: 01020304 successfully received [ 6934865000] : Finished transmission of PCI-Express TLPs Stopped at time : 69348650 ps : File "H:/HDL/FndtnISEWork/Spartan6/sp605_pcie_ISE121/s6_pcie_v1_3/simulation/tests/tests.v" Line 254
2010年06月05日 05:03 |
PCI Express
| トラックバック:0
| コメント:0
どうしてもクリティカルパスの遅延が制約ないに収まらない場合は、Floorplannnerで配置配線後のクリティカルパスをドラック&ドロップで移動して、その決定した制約をUCFに書き戻していた。PlanAheadでは、そのやり方が分からなかったが、
筑波大学の武内修先生の”PlanAhead の基本的な使い方” に書いてあった。実際に自分のプロジェクトでやって見ながら、LOC制約だけではなく、BEL制約も出力する方法を書いてみたいと思う。使用したISEのバージョンは12.1。
使用する回路は、CMOSカメラから画像を入力してディスプレイへ出力する回路とする。”
CMOSカメラから画像を入力してディスプレイへ出力15(できた!!!) ”で完成したのだが、どうもメインのクロックをDCMから使っていると不安定になり、”
ESP企画の旧パージョンボードでのPCLK処理方法 ”で直接PCLKをメインのクロックに使ったので、セットアップ時間がわずかに足りなくなっている。
それではProject NavigatorからPlanAheadを起動する。
Project NavigatorのProcessesウインドウのImplement Designを展開し、その中のPlace & Routeを展開する。Analyzer Timing / Floorplan Design (PlanAhead) をダブルクリックして、PlanAheadを起動する。
PlanAheadが立ち上げる。下から2番目のウインドウ(Timing Results) にタイミングエラーとなった制約が並んでいる。そのうちの一番上のタイミングエラーの制約のエラーが出ているSetupの制約をクリックする。
そうすると、右上のDeviceウインドウに、そのパスが表示される。これを移動するのだが、上の図で
青い矢印と四角 で示したCreate Site Constraint Modeと、
赤い矢印と四角 で示したCreate BEL Constraint Modeがある。
まずは、Create Site Constraint Modeからやってみようと思う。Create Site Constraint Modeアイコンをクリックしてハイライトさせる。ピンクの矢印のように、パスの真ん中のSRAM_Controller_inst/mem_addr<15>FDRをドラック&ドロップする。
そして、マウスの左ボタンを離して、配置したところが下の図だ。
これを拡大してみた。
スライスには2つのFFがあるが、SRAM_Controller_inst/mem_addr<15>FDRは、そのうちの下のFF、FFXを使用している(上のFFはFFY)。Create Site Constraint Modeだと、スライスのFFXとFFYの位置を変えることなく、配置を移動することができる。
ここで、PlanAheadのFileメニューからSave Designを実行すると、下のような制約がUCFファイルに加えられた。
# PlanAhead Generated physical constraints INST "SRAM_Controller_inst/mem_addr_15" LOC = SLICE_X18Y6;
SRAM_Controller_inst/mem_addr_15は SLICE_X18Y6のスライスにマップされるが、2つあるうちのどちらのFFに配置されるか指定されていない。
次に、Create BEL Constraint Modeだが、これはCreate Site Constraint Modeと違い、スライス内のFFの位置も変更することができる。Create Site Constraint Modeではドラック&ドロップで、スライスごとにしか移動できなかったが、Create BEL Constraint Modeでは、スライス内のFFYにも配置できる。
これで、同様に、PlanAheadのFileメニューからSave Designを実行すると、UCFに加えられる制約は下のようになる。
# PlanAhead Generated physical constraints INST "SRAM_Controller_inst/mem_addr_15" BEL = FFY; INST "SRAM_Controller_inst/mem_addr_15" LOC = SLICE_X18Y6;
SRAM_Controller_inst/mem_addr_15は SLICE_X18Y6のスライスにマップされ、スライスの中の上側のFFYにマップされる。
2010年06月04日 05:26 |
PlanAheadについて
| トラックバック:0
| コメント:2
第16回画像センシングシンポジウム に参加します。
6月10日のインタラクティブセッション2 で、”
CMOSカメラから画像を入力してディスプレイへ出力15(できた!!!) ”で完成したシステムにマックスプラス代数による2次元ウェーブレット変換例を実装してデモします。(先生のお供ですが。。。)
もし、第16回画像センシングシンポジュウムの6月10日にいらっしゃる方はお立ちよりください。IS2-27です。
2010年06月03日 05:16 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
”
CoreGenからChipScope Proを使用する2(ILAコアの生成) ”の続き。
今回は、ChipScope Analyzer で波形を観察する。だが、その前に、信号名を波形に反映させる必要がある。これをChipScope Analyzer のDataport に信号名をいちいち入れたのでは面倒だ。そこで調べてみるとFPGA EditorのILAダイアログで、ILAのデータポートにネット名を関連付けて、それをCDCファイルとしてエクスポートできることがわかった。そのCDCファイルをChipScope Analyzer でimportすれば、信号名をwaveform ウインドウで使用することができるはずだ。
まずは、FPGA Editorを立ち上げて、CDCファイルを作成しよう。Project NavigatorのProcessesウインドウのImplement Design -> Place & Route -> View / Edit Routed Design (FPGA Editor)をダブルクリックして、FPGA Editorを起動する。ToolsメニューからILA...を選択する。
ILAダイアログが開く。ILAダイアログを見るとDataportとNetの対応表がすでに出来ているので、Write CDC...ボタンをクリックする。
保存ダイアログが開く。ファイル名をつけてCDCファイルをセーブする。
Project NavigatorのProcessesウインドウのAnalyze Design Using ChipScopeをダブルクリックしてChipScopeを立ち上げる。最初のInitialize Chain アイコンをクリックしてFPGA やPROMを認識する。最初のDEV:0(Spartan-3A)を選択して、右クリックメニューからConfigure...を選択して、ダイアログが開く。ここでコンフィギュレーションするbitファイルとcdcファイルを選択するが、
ここでは、bitファイルだけ選択して、cdcファイルは選択しない。ここで、FPGA Editorの生成したcdcファイルを選択するとエラーとなる。 bitファイルをFPGA にダウンロードすると、下の画面が出るはずだ。(古いChipScopeのバーションだが、詳しい操作は、”
ISE10.1iのChipscope Proチュートリアル3 (Verilog版DDR SDRAMコントローラのテスト回路) ”を参照されたい)
ここではまだ、信号名は入っていない。次にFileメニュー -> Import... を選択する。Signal Importダイアログが開く。Select New Fileボタンをクリックする。
ファイル選択ダイアログが開く。先程、FPGA Editorで作ったCDCファイルを選択して、開くボタンをクリックする。
Import FileにFPGA Editorで作ったCDCファイルが入力される。次にUint/DeviceのAuto-create Busesにチェックを入れて、OKボタンをクリックする。
そうすると、めでたく、信号名を入力することができた。ただし、何故か101~104までは信号名を入力できなかったので、自分で信号名を書き換えた。これはなぜだか分からない?でも4個くらい信号名を書き換えるのであれば、問題ない。
ここまでで、CoreGenからChipScope Proを使用するやり方は終了。
Graphic_Controller_Test の動作を見てみるために、DDR2 SDRAMコントローラのコマンド入力にトリガをかけてみてみた。
そうしたところ、Char_Gen_Controllerが書くデータはおかしいが、最初の何秒かはDDR2 SDRAMコントローラに正常な読み書きの信号が着ていて、動作しているらしいことがわかった。数秒経ってから、おかしくなってしまう。その時間は不定だ。デバック難しそう。下はおかしくなった時の波形。
やはり、ChipScope Proは必須だな~。。。信号名が入れられるのであれば、ChipScopeのコアをHDLに接続する方法の方が信号がなくならなくて良いかもしれない。しかし、HDLを修正してしまうので、SVNでのバージョン管理が面倒になるという欠点はあるかもしれない。
2010年06月03日 04:59 |
Chipscope
| トラックバック:0
| コメント:0
”
CoreGenからChipScope Proを使用する1(ICONコアの生成) ”の続き。
前回、CoreGen(CORE Generator)で、ICONコアを生成した。今回はILAコアを生成して、トップモジュールのVerilogソースを変更して、ICONコアとILAコアをインスタンスして、ILAコアに観測したい信号を接続する。
ICONコアと同様にHierarchyウインドウでの右クリックメニューからNew Source...を選択する。Select Source TypeからIP(CORE Generator & Architecture Wizard)を選択して、File nameにGCT_ila と入力して、Nextボタンをクリックする。
New Source WizardのView by FunctionのDebug & Verification からChipScope Pro を選択し、その下のILA (ChipScope Pro - Integrated Logic Analyzer) を選択する。Nextボタンをクリックする。
Summaryが表示される。Finishボタンをクリックする。
ILA (ChipScope Pro - Integrated Logic Analyzer)ダイアログが表示される。
1/2ページでは、Sample Data Depthを1024に、Data Port Widthを128(これは多め指定しておいて後で丁度良い値に変更します)に設定した。後はデフォルト値にする。Next>ボタンをクリックする。
2/2ページでは、Counter Widthを4に設定した。これはトリガーをカウントできると良いかな?ということで入れた。後はデフォルト値にする。Generateボタンをクリックする。
これで、ILAコアが生成され、Project NavigatorのDesignウインドウにGCT_ilaが表示された。
HierarchyウインドウからGCT_iconを選択して、下のProcessウインドウのView HDL Instantiation Templateをダブルクリックすると、右のウインドウにインスタンシエーション・テンプレートが表示されるので、それを参考にトップモジュールを変更する。同様にGCT_ilaについても行う。
使用する信号を宣言して、ILAコアのDATAを信号と下のように接続した。
GCT_icon GCT_icon_inst ( .CONTROL0(CONTROL0) // INOUT BUS [35:0] ); GCT_ila GCT_ila_inst ( .CONTROL(CONTROL0), // INOUT BUS [35:0] .CLK(clk_ddr2), // IN .DATA(DATA), // IN BUS [127:0] .TRIG0(TRIG0) // IN BUS [7:0] ); assign DATA[31:0] = ddr2_write_data; assign DATA[33] = ddr2_read_write; assign DATA[34] = ddr2_addr_fifo_we; assign DATA[35] = ddr2_wrdata_fifo_we; assign DATA[36] = ddr2_addr_fifo_full; assign DATA[37] = ddr2_wrdata_fifo_full; assign DATA[62:38] = ddr2_address_cmd; assign DATA[63] = ddr2_rddata_valid; assign DATA[95:64] = ddr2_read_data; assign DATA[96] = ddr2_initialize_end; assign DATA[97] = Bitmap_VGAC_req; assign DATA[98] = Bitmap_VGAC_gnt; assign DATA[99] = Char_GP_req; assign DATA[100] = Char_GP_gnt; assign DATA[101] = Bitmap_VGAC_addr_busy; assign DATA[102] = Bitmap_VGAC_data_ena; assign DATA[103] = Char_GP_addr_busy; assign DATA[104] = Char_GP_wrdata_busy; assign TRIG0[0] = ddr2_addr_fifo_we; assign TRIG0[1] = ddr2_wrdata_fifo_we; assign TRIG0[2] = ddr2_addr_fifo_full; assign TRIG0[3] = ddr2_wrdata_fifo_full; assign TRIG0[4] = ddr2_rddata_valid; assign TRIG0[5] = ddr2_initialize_end; assign TRIG0[6] = Bitmap_VGAC_req; assign TRIG0[7] = Char_GP_req;
DATAを128本使うように宣言したが、105本のみ使用しているので、GCT_ilaコアを再生成する。HierarchyウインドウでGCT_ilaを選択して、ProcessesウインドウのManage Coresをダブルクリックする。
CoreGenが開く。右下のProject IPからGCT_ilaを選択して、右ウインドウのActionsからRecustomize and Generate (Under Current Project Settings) をクリックする。
Data Port Widthを105に修正して、Generateボタンをクリックして、もう一度ILAコアを再生成する。
今日はこれで終了とする。
”
CoreGenからChipScope Proを使用する3(ChipScope Analyzerで波形を観察) ”に続く。
2010年06月02日 05:14 |
Chipscope
| トラックバック:0
| コメント:0
今日、FPGAの部屋のアクセス数が153万アクセスになりました。自分で153万アクセスちょうどを踏んだので、画像を貼っておきます。皆さん、ありがとうございました。これからもよろしくお願いします。
2010年06月01日 17:47 |
日記
| トラックバック:0
| コメント:0
Spartan-3A Stater Kitを使用し、ISE12.1のMIGでDDR2-SDRAMを制御しようと思って、試しにやってみた。
最初にProject NavigatorからMIGのIPを生成しようとしたらTCLエラーで失敗。
結局、CORE Generator 単体で立ち上げて、Spartan-3A Stater Kit用のDDR2-SDRAMコントローラを生成することができました。
mig_v3_4\board_files\sp3a_board_files\ddr2_sdram\verilog\vlog_bl8\example_design\parフォルダのcreate_ise.batを起動して、ISE12.1のプロジェクトを作成した。これをインプリした。
インプリメントできたので、Chipscope Proを立ち上げて、ダウンロードし、dbg_data_valid_outでトリガーしたら、dbg_cmp_dataにデータが出てきた。
dbg_led_error_outも0なので、エラーなしで動いているみたいだ。まだマニュアルも読んでいないので、よくわからないけど。。。動作周波数は133MHz、ということはddr2-266だと思う。
2010年06月01日 17:45 |
Spartan3A Starter Kit
| トラックバック:0
| コメント:0
Spartan-6セミナに行ったとき に、CoreGen(CORE Genarator) からChipScope Pro(以下、ChipScope)コアを生成してDDR3 SDRAMをテストしたので、これをやってみたいと思っていた。疑問だったCDCファイル(信号名を記述したファイル)の対処方法もわかったのでブログに備忘録を書いておこうと思う。
ICON、ILAコアを生成して、HDLで信号を接続する方法は、今までやってきたCore Inserterを使用する方法に比べて、HDLを修正する必要があるという欠点があるが、論理合成で無くなってしまった信号名にもHDL上で信号を渡すので、問題なく観察ができるという利点がある。いままで、Core Inserterで信号名の検索に苦労してきたので、HDLを修正する必要はあるが、ChipScopeのコアで行う方法をやってみたかったのだ。
プロジェクトは以前、原
因がわからずに休止状態になったGraphic Contorller Testプロジェクト 、これにCoreGenからChipScopeをかけて、どのような状態になっているかを見ることにする。
最初にCoreGenでICONコアを生成する。Project NavigatorのHierarchyウインドウから、右クリックメニューを表示してNew Source...を選択する。
Select Source TypeからIP(CORE Generator & Architecture Wizard)を選択して、File nameにGCT_icon と入力して、Nextボタンをクリックする。
New Source WizardのView by FunctionのDebug & Verification からChipScope Pro を選択し、その下のICON (ChipScope Pro - Integrated Controller) を選択する。Nextボタンをクリックする。
Summaryが表示される。Finishボタンをクリックする。
ICON (ChipScope Pro - Integrated Controller) のWizardが表示される。今回はVIO使わないので、 Number of Controller Portsは1とする。Generateボタンをクリックする。
これで、ICONコアが生成され、Project NavigatorのDesignウインドウにGCT_iconが表示された。
今日は疲れたので、この辺りで終了とする。録画してあったF1を見よう。
”
CoreGenからChipScope Proを使用する2(ILAコアの生成) ”に続く。
2010年06月01日 04:56 |
Chipscope
| トラックバック:0
| コメント:0