FC2カウンター FPGAの部屋 NiosⅡ 9.0 IDE を使ってみる2(SDRAMが動作しない)
FC2ブログ

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

FPGAの部屋

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

NiosⅡ 9.0 IDE を使ってみる2(SDRAMが動作しない)

NiosⅡ 9.0 IDE を使ってみる1”でSDRAMのVerifyがエラーになって先に進めなかった。(原因がわかりました。SDRAM_Dの宣言をinout とする必要があるところをoutputにしてしまいました。)
動作するサンプル回路は、PLLのlockedとPowerONタイマータイムアウトのANDを取ってSOPC Builderで生成したNiosⅡシステムのリセットに入っている。FPGA技術Vol.4でも備前長船さんがaltpllのlocked 信号はロック前の準安定状態でもぽつぽつ1になってしまうと書いてあったので、それでPLLのlockedとPowerONタイマータイムアウトのANDを取っているのだと思う。
今回はALTPLLの設定にHold 'locked' output low for というオプションを見つけたので、それを入れてPowerONタイマータイムアウトは入れないでどうなるか様子を見てみることにした。

さて、初めにSOPC Builder を立ち上げてpll をDelete し、Generate ボタンをクリックしてシステムを生成する。
Nios2_IDE_90_8_090813.png

システムの生成が終了した。
Nios2_IDE_90_9_090813.png

SOPC Builder で生成してあったaltpllpll をMegaWizard Plug-In Managerで修正する。QuartusⅡのToolsメニューからMegaWizard Plug-In Manager... を選択する。ダイアログでEdit an existing custom megafunction variation を選択して、Next >ボタンをクリックする。altpllpll.v を選択してNext > ボタンをクリックして、設定を開始する。
Parameter Settings のInputs/Lock の項目で、Lock output のCreate 'locked' output にチェックを入れる。次にHold 'locked' output low for にもチェックを入れる。
Nios2_IDE_90_10_090813.png

これでaltpllpllの設定は終了したのでFinishボタンで終了した。
次にトップのnois2_sdram_led.v を修正した。altpllpll をインスタンシエーションした。具体的には下のようになった。

/ nois2_sdram_led

`default_nettype none

module nois2_sdram_led(
    input    wire         clk,
    input    wire        reset_n,
    output    wire [7:0]    exboard_led_pio, 
    output    wire        sdram_clk,
    output    wire [11:0]    SDRAM_A,
    output    wire [1:0]    SDRAM_BA,
    output    wire        SDRAM_nCAS,
    output    wire        SDRAM_CKE,
    output    wire        SDRAM_nCS,
    output    wire [15:0]    SDRAM_D,
    output    wire [1:0]    SDRAM_DQM,
    output    wire        SDRAM_nRAS,
    output    wire        SDRAM_nWE);
    
    wire clk_pll;
    wire pll_locked;

  nois_sdram nois_sdram_inst
    (
      .clk_0                             (clk_pll),
      .out_port_from_the_exboard_led_pio (exboard_led_pio),
      .reset_n                           (pll_locked),
      .zs_addr_from_the_sdram          (SDRAM_A),
      .zs_ba_from_the_sdram            (SDRAM_BA),
      .zs_cas_n_from_the_sdram         (SDRAM_nCAS),
      .zs_cke_from_the_sdram           (SDRAM_CKE),
      .zs_cs_n_from_the_sdram          (SDRAM_nCS),
      .zs_dq_to_and_from_the_sdram     (SDRAM_D),
      .zs_dqm_from_the_sdram           (SDRAM_DQM),
      .zs_ras_n_from_the_sdram         (SDRAM_nRAS),
      .zs_we_n_from_the_sdram          (SDRAM_nWE)
    );
    
    altpllpll altpllpll_inst(
        .inclk0 ( clk ),
        .c0 ( clk_pll ),
        .c1 ( sdram_clk ),
        .locked ( pll_locked )
    );
endmodule


これでQuartusⅡでコンパイルして通った。やってみたのですが、やはり同じでした。残念。もう一度サンプルと同じ回路を使ってやってみます。
サンプル回路とほとんど同じにしてみました。reset_nはスイッチにつながっているので、スイッチを押さなければ1です。クロックをcountでカウントしてcount[10] が1になって、altpllpll のlocked が1になった時、ANDでNoisⅡシステムのリセットが外れるようにしました。これでサンプル回路と同じはずです。(下にソースを示します)これでもSDRAMがFailしました。

// nois2_sdram_led

`default_nettype none

module nois2_sdram_led(
    input    wire         clk,
    input    wire        reset_n,
    output    wire [7:0]    exboard_led_pio, 
    output    wire        sdram_clk,
    output    wire [11:0]    SDRAM_A,
    output    wire [1:0]    SDRAM_BA,
    output    wire        SDRAM_nCAS,
    output    wire        SDRAM_CKE,
    output    wire        SDRAM_nCS,
    inout    wire [15:0]    SDRAM_D,
    output    wire [1:0]    SDRAM_DQM,
    output    wire        SDRAM_nRAS,
    output    wire        SDRAM_nWE,
    
    output    wire [7:0]    digit);
    
    wire clk_pll;
    wire pll_locked;
    reg        [10:0] count;
    wire reset_n_int_node, reset_n_int;

  nois_sdram nois_sdram_inst
    (
      .clk_0                             (clk_pll),
      .out_port_from_the_exboard_led_pio (exboard_led_pio),
      .reset_n                           (reset_n_int),
      .zs_addr_from_the_sdram          (SDRAM_A),
      .zs_ba_from_the_sdram            (SDRAM_BA),
      .zs_cas_n_from_the_sdram         (SDRAM_nCAS),
      .zs_cke_from_the_sdram           (SDRAM_CKE),
      .zs_cs_n_from_the_sdram          (SDRAM_nCS),
      .zs_dq_to_and_from_the_sdram     (SDRAM_D),
      .zs_dqm_from_the_sdram           (SDRAM_DQM),
      .zs_ras_n_from_the_sdram         (SDRAM_nRAS),
      .zs_we_n_from_the_sdram          (SDRAM_nWE)
    );
    
    altpllpll altpllpll_inst(
        .inclk0 ( clk ),
        .c0 ( clk_pll ),
        .c1 ( sdram_clk ),
        .locked ( pll_locked )
    );
    
    always @(posedge clk) begin
        if (!reset_n)
            count <= 11'd0;
        else begin
            if (count[10]==1'b0)
                count <= count + 11'd1;
        end
    end
    assign reset_n_int_node = count[10];
    assign reset_n_int = reset_n_int_node & pll_locked;
    
    assign digit = 8'b1111_1111; // 7segment LED 消灯
endmodule


(2009/08/15:上のVerilog-HDLコードが間違っていたので、SDRAM_Dのoutputをinoutに変更しました。この下の3つの波形はSDRAM_Dをoutputとして測定した波形です。Readデータが出ていませんでした)

さてどうしよう?仕方がないので、この際せっかくSignalTapⅡの使い方を練習したので、SignalTapⅡでSDRAMとのやり取りを見てみることにした。
まずは、SDRAMにWrite しているところをキャプチャする。下の図。
Nios2_IDE_90_11_090814.png

SDRAMの領域をVerifyするのは、アドレス0番地から書いて読みだしているようだ。その0番地と1番地のWriteを見いる。最初にバンクをアクティベートしてから、0014hと0084hを書き込んでいる。
次のその番地をReadした時の値を見てみる。下の図参照。
Nios2_IDE_90_12_090814.png

0番地、1番地をReadしてもデータはFFFFhだ。読めていない。ちなみにリフレッシュはどうかというと。下の図。
Nios2_IDE_90_13_090814.png

ちゃんとプリチャージしてリフレッシュしている。間隔は20nsのクロックサイクルで256サンプル = 5.12us しかサンプルできないのでわからない。もうFPGAのリソースが残っていないので、これが限界だ。
  1. 2009年08月14日 06:15 |
  2. NiosⅡ EDS
  3. | トラックバック:0
  4. | コメント:2

コメント

解決方法ではないですけど、私的セオリーを(^^;
最初、テスト回路を作るときは必ずオンチップメモリを載せ、そこだけでプログラムが実行できるようにしてます。2c5ですので容量は限られますが、8KBも取れれば結構いろいろできます。
とりあえずでもソフトが動くようになれば、エラーが全くのランダムなのか、あるパターンを持ってるのか、など調べやすくなると思います。
外部メモリが一発で動く事はそうはない、と思ってますので、安全策ですね。
  1. 2009/08/14(金) 08:22:47 |
  2. URL |
  3. 独楽 #-
  4. [ 編集 ]

独楽さん、コメントありがとうございます。
Xilinxでもそうと言いますか、内蔵メモリからブートしたことしかないですが、今回はマニュアルに従っただけです。
今回は基板が正常に動くかどうかのチェックを兼ねています。ですが、サンプルで動いて、同じような自分で生成した回路では動かないのはなぜなのかはわかりません。でも、SignalTapⅡが無料でも使えるから良いですね。
  1. 2009/08/14(金) 12:21:25 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/1202-88b2cc8d
この記事にトラックバックする(FC2ブログユーザー)