FC2カウンター FPGAの部屋 キャラクタ描画テスト回路の実機デバック4(DCMの配置)
fc2ブログ

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

FPGAの部屋

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

キャラクタ描画テスト回路の実機デバック4(DCMの配置)

前回、BUFG入力までの配線が長くなりすぎていたのが原因だったので、DCMの配置を見直すことにした。もともとDCMは1つも配置を固定してない。全部ツール任せになっていた。
DCMは3つ使っていて、水晶発振器の50MHzをDDR2 SDRAMの動作周波数150MHzに変換するDCM(DCM1とする)、水晶発振器の50MHzをVGAコントローラの動作周波数65MHzに変換するDCM(DCM2とする)、DCM1の150MHzを元にDDR2 SDRAMコントローラに必要な反転クロック、90度位相がずれたクロックを生成するDCM(DCM3とする)だ。
DCM1は2つのBUFG、DCM2は2つのBUFG、DCM3は3つのBUFGを使用する。このSpartan3A700には、24個のBUFGMUX(BUFGMUXはBUFGと市ても使える)があって、FPGAチップの上下の真ん中に4個ずつ、左右の真ん中に8個ずつ配置されている。水晶発振器のクロック入力はFPGAチップの上側の真ん中にあるので、最初のDCMはその近くが良い。下図のようにDCM1とDCM3が上側に配置されていて、DCM2が下側に配置されている。BUFGはDCMの真ん中に配置されている。色がついていないBUFGMUX、DCMは使用されていないもの。DCM1とDCM3で合計5個BUFGを使用するので、DCM1用のBUFGが下に追いやられてしまったようだ。
Bitmap_VGAC_debug_11_100221.png

解決策としては、豊富なBUFGMUXを持つ左側の真ん中にDCM3を持っていこうと思う。DCM3の配置を下の制約で示す位置に固定した。

INST "ddr2_sdram_cont_i/dcm_module_inst/DCM_INST1/DCM_SP" LOC = DCM_X0Y2;


インプリメントの結果、DCM1、DCM2が上側真ん中、DCM3が左側の真ん中に配置されて、DDR2 SDRAMのデータバス出力のタイミングエラーはなくなった。
これで、実機にダウンロードしてやってみたところ、VGA画面も出なくなってしまった?

この後、色々な試行錯誤を繰り返した。悶々とした時間が過ぎた。(途中で桜川市の真壁にひな人形まつりを見に行ってリフレッシュ)

結局DCMは配置によって、クロックパスが極端に遅くなることがあって、(これはすぐには気がつかないので、非常にわかりにくい。注意する必要がある)結局、DCM1は上側の真ん中、DCM2,DCM3は並んで、左側の真ん中に配置した。下に配置制約を示す。

INST "ddr2_sdram_cont_i/dcm_module_inst/DCM_INST1/DCM_SP" LOC = DCM_X0Y1;
INST "dcm_DDR2_VGA_clk_i/dcm_VGA_clk_dcm/DCM_SP" LOC = DCM_X0Y2;
INST "dcm_DDR2_VGA_clk_i/dcm_DDR2_clk_dcm/DCM_SP" LOC = "DCM_X2Y3";


さて、ddr2_dqとddr2_dqsにIBUF_DELAY_VALUE = 1を入れると、データが安定することが分かった。となるとRead関係で残るはsd_loop_inのみ。sd_loop_inにもIBUF_DELAY_VALUE = 1を入れると、データが不安定になった。そういえば、前回、sd_loop_inは配線を固定してない。
sd_loop_inもDDR2 SDRAMバーストテスト回路から配線制約を吐き出させて、キャラクタ描画テスト回路の制約ファイルに追加した。下が制約。

NET "sd_loop_in_IBUF"
ROUTE="{3;1;3s700afg484;df4ab136!-1;-70632;33392;S!0;-159;0!1;1612;-912!"
"1;1596;1056!1;1680;-1720!1;-1464;-3608!1;-1618;10040!1;-225;1797!1;-1632;"
"-10456!2;-3069;-3647!3;450;5392!3;4355;1359!4;4;-12032!4;4255;-597!5;"
"3927;-4329!5;0;-7000!6;-474;9200!6;178;6576!6;184;13320!7;-1185;4651!7;"
"-1867;-629!8;4111;-10997!8;192;-13688!9;0;-6876!9;3952;222!10;3905;-657!"
"11;2808;3082!11;2917;-5975!11;1152;657;L!11;1152;313;L!12;2123;3408;L!13;"
"-511;-4883!13;1168;-1715;L!13;1168;-1371;L!14;13605;-139!14;-447;-2703!"
"15;24;-6784!16;1099;79!17;-17;-7547!17;-652;-752!18;-658;-744!19;3905;"
"-657!20;1099;-97!21;2976;-3486!22;3935;-4073!22;-652;-752!23;3952;98!24;"
"1152;313;L!24;1152;657;L!25;1152;313;L!25;1152;657;L!26;-2848;-1044!27;"
"-2957;1261!31;-2953;1265!34;-8965;428;L!34;-8965;772;L!35;3935;-4073!36;"
"3935;-4073!37;6944;-24!38;3952;98!39;1099;79!40;1099;79!41;1152;313;L!41;"
"1152;657;L!42;6912;0!43;-2968;104!44;12173;-119!45;1099;79!46;1152;657;L!"
"46;1152;313;L!51;1352;-701;L!51;-2104;-1045;L!52;1352;-701;L!53;1176;"
"-1377;L!56;1152;657;L!56;1152;313;L!57;1152;657;L!57;1152;313;L!58;-2304;"
"313;L!58;1152;313;L!58;1152;657;L!58;-2304;657;L!59;1152;657;L!59;1152;"
"313;L!60;6944;-24!61;6944;-24!64;-2112;-1039;L!65;1160;651;L!65;1160;307;"
"L!66;-7565;776;L!66;-7565;432;L!67;15333;-139!84;1152;657;L!84;1152;313;L"
"!85;-2304;313;L!85;-2304;657;L!91;-7237;772;L!91;-7237;428;L!}";


これを追加して、ddr2_dqとddr2_dqsのIBUF_DELAY_VALUE = 1をとってみたが、やはり安定しない。
sd_loop_inの配線を固定した状態でも、ddr2_dqとddr2_dqsのIBUF_DELAY_VALUE = 1を制約に加えれば安定する。
DDR2 SDRAMバーストテスト回路とキャラクタ描画テスト回路のsd_loop_inの配線の遅延値は配線を固定したにも関わらず、1.439nsec と1.412nsec と異なっている。この僅かな遅れが致命的なのか?
とりあえず、一部、最初に少しがまだ動いていて、おかしいようだが、これは他の原因かもしれないので、とりあえず、現在は動作を禁止しているキャラクタ生成コントローラを動作させてみようと思う。
UCFに追加した制約を以下に示す。

// 02/20 @ 12:48:23
NET "ddr2_sdram_cont_i/read_write_io_inst/ddr2_cont_iob_inst/dqs_clk_node<0>"
ROUTE="{3;1;3s700afg484;c20d0b8b!-1;-70632;12888;S!0;-159;0!1;-161;-887!"
"2;-1291;-2737!3;-29;-8091!4;259;-695!5;-1703;-139!6;108;53;L!}";
// 02/20 @ 12:51:22
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<0>"
ROUTE="{3;1;3s700afg484;a5bd1784!-1;-70632;26072;S!0;-159;0!1;2447;-605!"
"2;4489;301!2;4489;645!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<1>"
ROUTE="{3;1;3s700afg484;751a0e0!-1;-70632;19640;S!0;-159;0!1;1696;1720!2;"
"1784;1376!2;1784;1032!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<2>"
ROUTE="{3;1;3s700afg484;89ffb99b!-1;-70632;6136;S!0;-159;0!1;1696;1720!2;"
"1784;1376!2;1784;1032!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<3>"
ROUTE="{3;1;3s700afg484;61a7f9cb!-1;-70632;9192;S!0;-159;0!1;2447;-605!2;"
"4489;645!2;4489;301!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<4>"
ROUTE="{3;1;3s700afg484;5a9ec78e!-1;-70632;9512;S!0;-159;0!1;1696;1720!2;"
"1784;1376!2;1784;1032!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<5>"
ROUTE="{3;1;3s700afg484;c3906147!-1;-70632;5816;S!0;-159;0!1;2447;-605!2;"
"4489;645!2;4489;301!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<6>"
ROUTE="{3;1;3s700afg484;3cdde0e5!-1;-70632;19320;S!0;-159;0!1;2447;-605!"
"2;4489;645!2;4489;301!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<7>"
ROUTE="{3;1;3s700afg484;48045bde!-1;-70632;26392;S!0;-159;0!1;1696;1968!"
"2;1784;1032!2;1784;1376!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<8>"
ROUTE="{3;1;3s700afg484;8152c779!-1;-70632;40144;S!0;-159;0!1;1696;1720!"
"2;1784;1376!2;1784;1032!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<9>"
ROUTE="{3;1;3s700afg484;bfa7b4d9!-1;-70632;53328;S!0;-159;0!1;1696;2040!"
"2;1784;1376!2;1784;1032!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<10>"
ROUTE="{3;1;3s700afg484;ace04032!-1;-70632;36448;S!0;-159;0!1;2447;-605!"
"2;4489;645!2;4489;301!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<11>"
ROUTE="{3;1;3s700afg484;fc333603!-1;-70632;49952;S!0;-159;0!1;2447;-605!"
"2;4489;645!2;4489;301!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<12>"
ROUTE="{3;1;3s700afg484;4ce19306!-1;-70632;50272;S!0;-159;0!1;1696;1720!"
"2;1784;1032!2;1784;1376!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<13>"
ROUTE="{3;1;3s700afg484;7f7f4c8c!-1;-70632;39824;S!0;-159;0!1;2447;-605!"
"2;4489;301!2;4489;645!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<14>"
ROUTE="{3;1;3s700afg484;10d3a509!-1;-70632;36768;S!0;-159;0!1;1696;1720!"
"2;1784;1032!2;1784;1376!3;167;0;L!4;167;0;L!}";
NET "ddr2_sdram_cont_i/read_write_io_inst/dq_data<15>"
ROUTE="{3;1;3s700afg484;473a4c3d!-1;-70632;53648;S!0;-159;0!1;2479;-949!"
"2;4457;661!3;0;8!3;0;-336!4;167;0;L!5;167;0;L!}";

INST "ddr2_sdram_cont_i/dcm_module_inst/DCM_INST1/DCM_SP" LOC = DCM_X0Y1;
INST "dcm_DDR2_VGA_clk_i/dcm_VGA_clk_dcm/DCM_SP" LOC = DCM_X0Y2;
INST "dcm_DDR2_VGA_clk_i/dcm_DDR2_clk_dcm/DCM_SP" LOC = "DCM_X2Y3";

NET "ddr2_dq[0]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[1]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[2]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[3]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[4]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[5]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[6]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[7]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[8]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[9]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[10]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[11]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[12]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[13]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[14]" IBUF_DELAY_VALUE = 1;
NET "ddr2_dq[15]" IBUF_DELAY_VALUE = 1;
#
NET "ddr2_dqs[0]" IBUF_DELAY_VALUE = 1;
# NET "sd_loop_in" IBUF_DELAY_VALUE = 1;


# sd_loop_in // 02/21 @ 20:52:31
NET "sd_loop_in_IBUF"
ROUTE="{3;1;3s700afg484;df4ab136!-1;-70632;33392;S!0;-159;0!1;1612;-912!"
"1;1596;1056!1;1680;-1720!1;-1464;-3608!1;-1618;10040!1;-225;1797!1;-1632;"
"-10456!2;-3069;-3647!3;450;5392!3;4355;1359!4;4;-12032!4;4255;-597!5;"
"3927;-4329!5;0;-7000!6;-474;9200!6;178;6576!6;184;13320!7;-1185;4651!7;"
"-1867;-629!8;4111;-10997!8;192;-13688!9;0;-6876!9;3952;222!10;3905;-657!"
"11;2808;3082!11;2917;-5975!11;1152;657;L!11;1152;313;L!12;2123;3408;L!13;"
"-511;-4883!13;1168;-1715;L!13;1168;-1371;L!14;13605;-139!14;-447;-2703!"
"15;24;-6784!16;1099;79!17;-17;-7547!17;-652;-752!18;-658;-744!19;3905;"
"-657!20;1099;-97!21;2976;-3486!22;3935;-4073!22;-652;-752!23;3952;98!24;"
"1152;313;L!24;1152;657;L!25;1152;313;L!25;1152;657;L!26;-2848;-1044!27;"
"-2957;1261!31;-2953;1265!34;-8965;428;L!34;-8965;772;L!35;3935;-4073!36;"
"3935;-4073!37;6944;-24!38;3952;98!39;1099;79!40;1099;79!41;1152;313;L!41;"
"1152;657;L!42;6912;0!43;-2968;104!44;12173;-119!45;1099;79!46;1152;657;L!"
"46;1152;313;L!51;1352;-701;L!51;-2104;-1045;L!52;1352;-701;L!53;1176;"
"-1377;L!56;1152;657;L!56;1152;313;L!57;1152;657;L!57;1152;313;L!58;-2304;"
"313;L!58;1152;313;L!58;1152;657;L!58;-2304;657;L!59;1152;657;L!59;1152;"
"313;L!60;6944;-24!61;6944;-24!64;-2112;-1039;L!65;1160;651;L!65;1160;307;"
"L!66;-7565;776;L!66;-7565;432;L!67;15333;-139!84;1152;657;L!84;1152;313;L"
"!85;-2304;313;L!85;-2304;657;L!91;-7237;772;L!91;-7237;428;L!}";


しかし、だいぶ苦労してしまった。昨日一日は、ひな人形まつりを見に行った以外はインプリメントし続けた。MIGのDDR2 SDRAMのIPもUCFがガチガチになっているんだろう?もしくはLUTのプリミティブで直接書いてあって、配線も固定されているとか?もしくはエリア制約をうまくかけてあるのかな?機会があればMIGでやってみたい。
  1. 2010年02月22日 04:57 |
  2. VGAコントローラ
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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