FPGAの部屋FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。SDRAMコントローラIOテストモジュールのシミュレーション3”で非同期FIFOを自作してシミュレーションがうまくいったようなので、インプリメントをしてみた。Floorplannerで、分散RAMの位置固定を、もう一度やってみると、うまくいったのでddr2_dqから最短の遅延で非同期FIFOのRAMに接続することができた。ucfファイルを書き換えたので、一度インプリメントし直す。Analyzerを立ち上げて、結果を見てみた。すると、クロックの立ち上がりのクロック解析はエラーが出ていて、クロックの立下りのクロック解析結果は解析するパスがないとのこと。え、FALLINGのパスがない?おかしい。Editorを立ち上げて見てみることにした。DQ0用のクロックの立下りのときのデータをサンプルするrdd_afifo_dout_0_OBUFを見てみた。下がそのSLICEMの図。ここでクロックの部分を拡大してみる。すると、CLKにつながっているノードはdqs_clkではなく、DQS2intclk_FIFO_FALL_not0000というノードが接続されている。CLK_Bが選択されて反転されていない。こちらの予定と違っている。ちなみにクロックの立ち上がりでサンプルする方のSLICEM、rdd_afifo_dout_16_OBUFを見てみると、CLKにdqs_clkが入っている。DQS2intclk_FIFO_FALL_not0000を探してみると、dqs_clkを反転してDQS2intclk_FIFO_FALL_not0000ノードに出すだけでした。DQS2intclk_FIFO_FALL_not0000ノード全体はこんな感じで、各クロックの立下りをクロックとする分散RAM(SLICEM)に行っているようです。上のモジュールでdqs_clkを反転して非同期FIFOに与えているのだが、RAM16X1Dプリミティブが立ち上がり動作なので、こうなってしまったのか?本来は、分散RAM(SLICEM)の中でCLK_Bを使うことによってクロックを反転したいんだが。これでは困るので、プリミティブで書かないで、分散RAMを推定させる記述をしてみる。(XSTでRAMを推定させる話は、VHDLだけど、”VHDLでのブロックRAMや分散RAMの初期化(外部データファイル)”を参照)だが、結果は同じだった。呼び出しているところを見ると、以下のようなVerilogコードになっている。DQSクロックの立下りをAFIFOに入力する。(full_fall));DQS2intclk_FIFO_FALLの.wr_clkにdqs_clkを入れるところで反転していた。(~dqs_clk)としてみた。(.WCLK(~wr_clk),.WE(wr_en),.A0(wp[0]),.A1(wp[1]),.A2(wp[2]),.A3(wp[3]),.D(din[i]),.SPO(),.DPRA0(rp[0]),.DPRA1(rp[1]),.DPRA2(rp[2]),.DPRA3(rp[3]),.DPO(dout[i]));endendgenerate次に当然、上のモジュールでの呼び出しも以下のように変更した。DQSクロックの立下りをAFIFOに入力する。(full_fall));こうしたらうまく行きました。上のモジュールやるとだめで、プリミティブの入力のときに反転するとうまくいくんだ~ということがわかった。コードを書くときには注意しないといけない。EditorでFALL側の分散RAMを見るとCLK入力にdqs_clkが入力されていて、CLK_Bが選択されているのがわかる。これでだいたいIO部分とリード部分は行けたと思う。今度は本体を作ることにしよう。<追記>とりあえず何の役にも立たないプロジェクトですけど、Veritakのプロジェクトとテストベンチ付きでだれかほしい方はいらっしゃいますか?もし、いらしたら、公開しようかと思います。どこかの方がバグをリポートしていただければ、私にもすごいメリットがありますし。<もう一度追記>うまくいかない記述とうまくいく記述のXSTでの論理合成結果を比べてみた。対してインバータが入っている。WCLKの直前でインバータが入っている。HierarchyオプションがYesでやっていたので、これかな?と思って、Noに変更してみたが結果は同じだった。直前でやらないとSLICEMのCLK_Bは使用されないようだ。コメント:4プロフィールAuthor:marseeFPGAの部屋へようこそ!FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。WEBブログデザイナ。