MIGって何?

 - DDR2-MEMORY用のコントローラとしてXilinxが提供してるIP
 - これがないとDDR2-SDRAMのアクセス時に死ねる
 - 動かそうと思ったら,DDR2-SDRAMの挙動についてある程度の知識が必要 < 各自調べるべし
 - ここではFLOPS-2D用のコントローラを想定

MIGの生成のしかた

 - coregenの起動
 - coregenでMIGを選択
 - 最初に雑多なことを聞かれるので,それまでnextする
 - Memory typeにはSODIMMsを選択
 - Memory PartにはMT4HTF3264HY-667を選ぶ
 - Data Widthは64
 - Burstは4
 - Burst Typeはシーケンシャル
 - CAS Latency 5を選択
 -Output Drive Strength : Fullstrength
 -RTT - ODT : 75 Ohms
 -Additive Latency : 0
  next>
 -Use DCM : チェック
 -DCI for DQ/DQS : チェック
 -DCI for Address/Control : 未チェック
 -Class for Address and Control : ClassII
 -Limit to 2Bytes per Bank : 未チェック
 -System Clock : Differential
  next>
 -使用されているピン
  --後で設定するので何もしない
  next>
 -BankSelection: 特に何もしない。
  next>
 -確認
  next>
 -ライセンスを確認: チェックする
   next>
 -PCB作りがどうとか言ってる。
 next>
  -また確認
  generate

さて、以下生成したディレクトリの構成。 /docs, /example_design, /user_design の三つがあるが、 /docs, /user_design はいらないので消去。

続いて、 /example_design/rtl/ の ddr2_sdram.v を編集。

ddr2_tb_top #
(

以下、

endmodule の上までを消去。 これは、メモリにデータを書き込むテスト回路と、チップスコープで回路をための 信号を消しているのである。 これにともない

 // Debug signals (optional use)
 //***********************************
 // PHY Debug Port demo
 //***********************************
 wire [35:0]                        cs_control0;
 wire [35:0]                        cs_control1;
 wire [35:0]                        cs_control2;
 wire [35:0]                        cs_control3;
 wire [191:0]                       vio0_in;
 wire [95:0]                        vio1_in;
 wire [99:0]                        vio2_in;
 wire [31:0]                        vio3_out;

を消去してかまわない。 さらに、

 //Debug signals
 wire [3:0]                        dbg_calib_done;
 wire [3:0]                        dbg_calib_err;
 wire [(6*DQ_WIDTH)-1:0]           dbg_calib_dq_tap_cnt;
 wire [(6*DQS_WIDTH)-1:0]          dbg_calib_dqs_tap_cnt;
 wire [(6*DQS_WIDTH)-1:0]          dbg_calib_gate_tap_cnt;
 wire [DQS_WIDTH-1:0]              dbg_calib_rd_data_sel;
 wire [(5*DQS_WIDTH)-1:0]          dbg_calib_rden_dly;
 wire [(5*DQS_WIDTH)-1:0]          dbg_calib_gate_dly;
 wire                              dbg_idel_up_all;
 wire                              dbg_idel_down_all;
 wire                              dbg_idel_up_dq;
 wire                              dbg_idel_down_dq;
 wire                              dbg_idel_up_dqs;
 wire                              dbg_idel_down_dqs;
 wire                              dbg_idel_up_gate;
 wire                              dbg_idel_down_gate;
 wire [DQ_BITS-1:0]                dbg_sel_idel_dq;
 wire                              dbg_sel_all_idel_dq;
 wire [DQS_BITS:0]                 dbg_sel_idel_dqs;
 wire                              dbg_sel_all_idel_dqs;
 wire [DQS_BITS:0]                 dbg_sel_idel_gate;
 wire                              dbg_sel_all_idel_gate;

も消去。 こうした後に、 u_ddr2_top_0 (

  .ddr2_dq                (ddr2_dq),
  .ddr2_a                 (ddr2_a),
  .ddr2_ba                (ddr2_ba),
  .ddr2_ras_n             (ddr2_ras_n),
  .ddr2_cas_n             (ddr2_cas_n),
  .ddr2_we_n              (ddr2_we_n),
  .ddr2_cs_n              (ddr2_cs_n),
  .ddr2_odt               (ddr2_odt),
  .ddr2_cke               (ddr2_cke),
  .ddr2_dm                (ddr2_dm),
  .phy_init_done          (phy_init_done),
  .rst0                   (rst0),
  .rst90                  (rst90),
  .rstdiv0                (rstdiv0),
  .clk0                   (clk0),
  .clk90                  (clk90),
  .clkdiv0                (clkdiv0),
  .app_wdf_afull          (app_wdf_afull),
  .app_af_afull           (app_af_afull),
  .rd_data_valid          (rd_data_valid),
  .app_wdf_wren           (app_wdf_wren),
  .app_af_wren            (app_af_wren),
  .app_af_addr            (app_af_addr),
  .app_af_cmd             (app_af_cmd),
  .rd_data_fifo_out       (rd_data_fifo_out),
  .app_wdf_data           (app_wdf_data),
  .app_wdf_mask_data      (app_wdf_mask_data),
  .ddr2_dqs               (ddr2_dqs),
  .ddr2_dqs_n             (ddr2_dqs_n),
  .ddr2_ck                (ddr2_ck),
  .rd_ecc_error           (),
  .ddr2_ck_n              (ddr2_ck_n),
  .dbg_calib_done         (dbg_calib_done),
  .dbg_calib_err          (dbg_calib_err),
  .dbg_calib_dq_tap_cnt   (dbg_calib_dq_tap_cnt),
  .dbg_calib_dqs_tap_cnt  (dbg_calib_dqs_tap_cnt),
  .dbg_calib_gate_tap_cnt  (dbg_calib_gate_tap_cnt),
  .dbg_calib_rd_data_sel  (dbg_calib_rd_data_sel),
  .dbg_calib_rden_dly     (dbg_calib_rden_dly),
  .dbg_calib_gate_dly     (dbg_calib_gate_dly),
  .dbg_idel_up_all        (dbg_idel_up_all),
  .dbg_idel_down_all      (dbg_idel_down_all),
  .dbg_idel_up_dq         (dbg_idel_up_dq),
  .dbg_idel_down_dq       (dbg_idel_down_dq),
  .dbg_idel_up_dqs        (dbg_idel_up_dqs),
  .dbg_idel_down_dqs      (dbg_idel_down_dqs),
  .dbg_idel_up_gate       (dbg_idel_up_gate),
  .dbg_idel_down_gate     (dbg_idel_down_gate),
  .dbg_sel_idel_dq        (dbg_sel_idel_dq),
  .dbg_sel_all_idel_dq    (dbg_sel_all_idel_dq),
  .dbg_sel_idel_dqs       (dbg_sel_idel_dqs),
  .dbg_sel_all_idel_dqs   (dbg_sel_all_idel_dqs),
  .dbg_sel_idel_gate      (dbg_sel_idel_gate),
  .dbg_sel_all_idel_gate  (dbg_sel_all_idel_gate)
  );

を u_ddr2_top_0 (

  .ddr2_dq                (ddr2_dq),
  .ddr2_a                 (ddr2_a),
  .ddr2_ba                (ddr2_ba),
  .ddr2_ras_n             (ddr2_ras_n),
  .ddr2_cas_n             (ddr2_cas_n),
  .ddr2_we_n              (ddr2_we_n),
  .ddr2_cs_n              (ddr2_cs_n),
  .ddr2_odt               (ddr2_odt),
  .ddr2_cke               (ddr2_cke),
  .ddr2_dm                (ddr2_dm),
  .phy_init_done          (phy_init_done),
  .rst0                   (rst0),
  .rst90                  (rst90),
  .rstdiv0                (rstdiv0),
  .clk0                   (clk0),
  .clk90                  (clk90),
  .clkdiv0                (clkdiv0),
  .app_wdf_afull          (app_wdf_afull),
  .app_af_afull           (app_af_afull),
  .rd_data_valid          (rd_data_valid),
  .app_wdf_wren           (app_wdf_wren),
  .app_af_wren            (app_af_wren),
  .app_af_addr            (app_af_addr),
  .app_af_cmd             (app_af_cmd),
  .rd_data_fifo_out       (rd_data_fifo_out),
  .app_wdf_data           (app_wdf_data),
  .app_wdf_mask_data      (app_wdf_mask_data),
  .ddr2_dqs               (ddr2_dqs),
  .ddr2_dqs_n             (ddr2_dqs_n),
  .ddr2_ck                (ddr2_ck),
  .rd_ecc_error           (),
  .ddr2_ck_n              (ddr2_ck_n),
  .dbg_calib_done         (),
  .dbg_calib_err          (),
  .dbg_calib_dq_tap_cnt   (),
  .dbg_calib_dqs_tap_cnt  (),
  .dbg_calib_gate_tap_cnt  (),
  .dbg_calib_rd_data_sel  (),
  .dbg_calib_rden_dly     (),
  .dbg_calib_gate_dly     (),
  .dbg_idel_up_all        (),
  .dbg_idel_down_all      (),
  .dbg_idel_up_dq         (),
  .dbg_idel_down_dq       (),
  .dbg_idel_up_dqs        (),
  .dbg_idel_down_dqs      (),
  .dbg_idel_up_gate       (),
  .dbg_idel_down_gate     (),
  .dbg_sel_idel_dq        (),
  .dbg_sel_all_idel_dq    (),
  .dbg_sel_idel_dqs       (),
  .dbg_sel_all_idel_dqs   (),
  .dbg_sel_idel_gate      (),
  .dbg_sel_all_idel_gate  ()
  );

として、デバッグ信号をグラウンドに接続する。 そして、ディレクトリ /example_design/sim/ に移動。

この中には、ddr2_model.v wiredly.v ddr2_parameter.vh があるが、これが指定したメモリのverilog記述となっている。 さらに、sim_tb_top.v というのがいるが、こいつがテストベンチ生成用の親玉。

こいつの一番下あたりに、

	initial begin
		$shm_open();
		$shm_probe("AC");
	end
	initial begin
		#(70_000);
		$finish;
	end

を記述。この#(70_000)という数字は、 初期化が終わるまでのおよその時間である。 これは動作周波数により伸び縮みするので、柔軟に設定していただきたい。 ここまでやって波形を見てみると、

phy_init_done

という信号がたっていることが分かるが、これが DDR2の初期化が終了したことを示す信号線である。 ここからは具体的なプロトコルに沿ってデータを送信すれば良い。 尚、MIGを用いると、プリチャージなどのコマンドを発行する必要は無く、 適宜リード、ライトとデータを送信するだけでよい。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-29 (木) 00:03:47