MIGの使いかた改
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* MIGって何? [#pf1190ca]
- DDR2-MEMORY用のコントローラとしてXilinxが提供してるIP
- これがないとDDR2-SDRAMのアクセス時に死ねる
- 動かそうと思ったら,DDR2-SDRAMの挙動についてある程度...
- ここではFLOPS-2D用のコントローラを想定
* MIGの生成のしかた [#f5ad695a]
- 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を用いると、プリチャージなどのコマンドを発行する必...
適宜リード、ライトとデータを送信するだけでよい。
終了行:
* MIGって何? [#pf1190ca]
- DDR2-MEMORY用のコントローラとしてXilinxが提供してるIP
- これがないとDDR2-SDRAMのアクセス時に死ねる
- 動かそうと思ったら,DDR2-SDRAMの挙動についてある程度...
- ここではFLOPS-2D用のコントローラを想定
* MIGの生成のしかた [#f5ad695a]
- 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を用いると、プリチャージなどのコマンドを発行する必...
適宜リード、ライトとデータを送信するだけでよい。
ページ名: