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を用いると、プリチャージなどのコマンドを発行する必要は無く、 適宜リード、ライトとデータを送信するだけでよい。 |