Spartan-6 LX9 MicroBoardを使ったLPDDR SDRAMのハードマクロ実装(その2)
前回ざっくりとMIGを弄ってみました。今回は実際にインプリするので、……まぁ今回もざっくりと(ぉぃ
今回は実装し、動作をChipScopeを用いて確認するところまで行います。
前回、create_ise.batで自動生成したデザインは2種類ありました。それぞれ次のようなフォルダ構成です(詳細はUG416、p.32「MIGのディレクトリ構造とファイルの説明」を参照してください)
- example_design :トラフィック・ジェネレータを含んだ完全なMIGデザインサンプル。RTL,ucfファイル,スクリプトファイル
- user_design :MCBラッパーを含む、RTL、ucfファイル、スクリプトファイル*1
ここから分かることは、基板設計、初期ハードウェアデバッグ段階ではexample_design、汎用的に使うときにはuser_designのプロジェクトを利用するのが良いということでした。
今回はexample_designを使います
今回、ターゲットにしているLPDDR MT46H32M16を動かすのに考えなくてはならないことはあまり多くありません。
MIGベースのラッパーが複雑なことをしてくれて、さらにトラフィックジェネレータを使うのでLPDDRへの読み書きを意識する必要もありません。
考えなくてはならないのは次の点。
- メインクロックの取得
- LPDDRの動作クロック
- クロックの逓倍、分周率
- リセットスイッチの割り当て
- エラー表示、キャリブレーション終了のLEDの表示
LX9ボードにはTI製PLLクロックシンセサイザーCDCE913が搭載されています。
3つのクロック出力(Y1,Y2,Y3)があり、それぞれ(40MHz,66.67MHz,100MHz)が出力されています。
なお、Spartan-6のピンアサインでそれぞれ(V10,K15,C10)に接続されています。
LPDDR MT46H32M16は133MHz,166MHz,200MHzの周波数で動作できますが、今回133MHzにしました。
133MHzで動作させるにはY2=66.67MHzをクロック源にしてPLLに与えたほうがよさそうです
また、example_top.vの125行目(MIGのバージョンによって異なります)あたりを以下のように修正しました。コメントをつけて図4-3と対応させました。
localparam C3_CLKOUT0_DIVIDE = 2; // CLKOUT0にはメモリクロック(133MHzの)2倍を与える 533.3328/4 = 133MHz * 2 localparam C3_CLKOUT1_DIVIDE = 2; // CLKOUT1にはメモリクロック(133MHzの)2倍を与える 533.3328/4 = 133MHz * 2 localparam C3_CLKOUT2_DIVIDE = 6; // CLKOUT2. UG388、p.81参照 localparam C3_CLKOUT3_DIVIDE = 6; // CLKOUT3 localparam C3_CLKFBOUT_MULT = 8; // IBUFGに与えられえたクロック(Y2=66.67MHz)を何逓倍するか。この場合はx8=533.3328MHz
クロックを66.67MHzに設定したので C3_MEMCLK_PERIOD(単位はピコ秒)を変更し、シミュレーションの設定、リセット論理も変更します。
example_top.vの75行目あたり。
parameter C3_MEMCLK_PERIOD = 15000, parameter C3_CALIB_SOFT_IP = "TRUE", parameter C3_SIMULATION = "FALSE", parameter C3_HW_TESTING = "TRUE", parameter C3_RST_ACT_LOW = 0,
またexample_top.vの439行目あたりのLEDインジケータの設定が正論理になっているか確認します。(おそらくデフォルトで正論理なはずですが・・)
assign error = c3_error; assign calib_done = c3_calib_done; assign c3_sys_clk_p = 1'b0; assign c3_sys_clk_n = 1'b0;
次に、example_top.ucfを確認して、ピンアサインの変更、クロックの再設定を行います。
・23行目あたり。LX9マイクロボードのVCCAUXは3.3Vになっているので変更
############################################################################ # VCC AUX VOLTAGE ############################################################################ CONFIG VCCAUX=3.3; # Valid values are 2.5 and 3.3
・57行目あたり。クロックの設定
############################################################################ ## Clock constraints ############################################################################ NET "memc3_infrastructure_inst/sys_clk_ibufg" TNM_NET = "SYS_CLK3"; TIMESPEC "TS_SYS_CLK3" = PERIOD "SYS_CLK3" 15 ns HIGH 50 %; ############################################################################
・69行目。LEDインジケータの設定。(マイクロボードの黒い10ピンコネクタに囲まれているほうのLED2つ)。残念ながら、LVCMOS33にはできない。
NET "error" IOSTANDARD = LVCMOS18; NET "calib_done" IOSTANDARD = LVCMOS18; NET "calib_done" LOC = "F5" ; NET "error" LOC = "C2" ;
とりあえずここまでで完成。
ISEのProcesses:ウインドウで、Synthesize,Implement Design,Generate Programming Fileまで行う。
◆iMPACT起動
LX9マイクロボードをUSB接続します。
メニューのTools -> iMPACT
前々回のブログで設定は終わっているはずなので、「Boundary Scan」をダブルクリック。続いてメニューの Output -> Cable Setup
ここで、Cable Plug-inにチェックすると、digilent_pluginが出てくるはず。
もう一度、「Boundary Scan」をダブルクリックすると、LX9のFPGAのみ認識されるはずです。
Do you want to continue and Assign Configuration Files?
と聞かれたらOKを押す。
さきほど論理合成したexample_top.bitを指定する。
このあと、「SPI ROMがあるようだけど、接続する?」と聞いてきたら今回はNOで。
FPGAのアイコンをクリックするとiMPACT Processesに「→Program」が出現するのでダブルクリック。-> 書き込み終了。
なお、FPGA本体に書き込んだだけなのでデータは揮発性。USBドングルはそのまま接続しておきます。
iMPACTを終了します。
Project Navigatorに戻り、ウインドウ左下の鍵マーク「Analyze Design Using Chipscope」をダブルクリック。
- >ChipScope Proが立ち上がります。
メニューのJTAG Chain -> Digilent USB JTAG Cable...を選択。→「了解」を選択。
強制的にリセットトリガーをかけて各端子の観測をすることができます
ぽちっとな
ここまで書いて超ショッキングなことが発覚しました。。。
AvnetのLX9 MicroBoardサポートページ(要ログイン)に
・・・・サンプルプログラムあるし・・・・
うおい!!
orz
次回は、LPDDR SDRAMのリードライトの高速化と、CMOSカメラとの接続に挑戦します。
*1: ※ここではバスの話は複雑になるのでAXI4,AMBAといった話は特に取り上げません。また、このハードウェア単体で動作させることを前提にしているのでこの段階では考慮するつもりはありません。