今日は休暇をとって、息子の付き添いで
渋谷のコナミカードゲームセンター に行ってきました。
今日は遊戯王フリー対戦(小・中学生限定)だった。
TXと地下鉄に乗って渋谷に着いたが、目印の109がどこだかわからなくなった。昔々、28年くらい前に祐天寺に住んでいたので、渋谷にはよく行っていたのだが、良くわからなくなってしまった。
バスの人に聞いて、向こうだというので行ってみると、そうそう、ここです。ハチ公前。見覚えがあります。道玄坂ですよね。最初に出たのは宮益坂でした。スクランブル交差点に立つと右側がセンター街。左側に行くと東急。昔はよくセンター街のこけしというお好み焼き屋に行きました。
東急の反対側のビルにコナミカードゲームセンターがあります。
行ってみるとデュエル用の机が並んでいる。遊戯王ショップもあった。息子はうれしさのあまり興奮していた。
最初にスタッフさんとデュエル。何とか勝利することが出来た。これでちょっと自信がついたようだ。
1時から同じ小・中学生とフリーデュエル、なかなか勝てなかった。6勝14敗だった。6勝出来たので商品としてカードを2枚いただいた。
本当に息子にとっては、充実した1日だったようだ。親としてもうれしい。私もどのようなデュエルか興味があったので、詳しく聞いたのだが、いろいろ効果を使って戦略的に戦っているようだ。これから息子もデッキを強化するそうだ。
2007年03月30日 21:06 |
日記
| トラックバック:0
| コメント:0
Spartan3E Starter KitのVGAコントローラをVerilogで書こうと思っているので、仕様を決定している。
VGAの表示領域は800×600で72Hz。とりあえずはテストのためにビットごとに色を+1で作る回路をつけて状況を見ようと思っている。でも、仕事が忙しくなれば家でも仕事をするかもしれないので、中断するかもしれない。
まずは
fpga-lab.org さんの
3月25日の徒然日 記で知った
VGA Video Output でVGAフォーマットのお勉強。その結果、仕様を一部だが決定した。
DDR SDRAMコントローラを使うために、Spartan3E Starter KitでVGAコントローラを作ることにした。解像度は800×600、垂直同期の周波数は72Hzとする。そうするとピクセルクロックは50MHzとなる。このピクセルクロックはSpartan3E Starter Kitに搭載される50MHzの水晶発信器をDCMで等倍して作ることにする。
水平同期関係のパラメータは、表示領域が800ピクセル、Front Porchは56ピクセル、Back Porchは64ピクセル、水平同期パルスは120ピクセルとなる。
一方、垂直同期関係のパラメータは、表示領域が600ライン、Front Porchが37ライン、Back Porchは23ライン、垂直同期パルスは6ラインとなる。
画素のフォーマットはSpartan3E Starter KitではRGBそれぞれ1ビットずつの3ビットが必要である。それぞれを1バイトのビット1に割り付ける。更に4バイトごとに整列させるためにダミーバイトを1つつける。
Spartan3E Starter KitのDDR SDRAMは16ビット幅であるので、1クロックで4バイト読み出しが出来る。(16ビット×2) これは4バイトなので、VGAの1ドット分となる。DDR SDRAMは100MHzで動作しているので、画面描画のために、フルにDDR SDRAMから読み出していると50/100でDDR SDRAMの帯域の1/2を占有することになる。あとの1/2でDDR SDRAMにプロセッサからアクセスしたり、DMA(しないけど)したりすることになる。
現在のDDR SDRAMコントローラは、リードしたデータを読み出す場合にデータのみを出力しているが、VGAコントローラとプロセッサなどのほかのマスタ・デバイスのアクセスを分けるために、2ビット分のIDを付加する。
VGAコントローラ、プロセッサなどのほかのマスタ・デバイス、アービタ、DDR SDRAMコントローラのデータパスのブロック図を下に示す。
2007年03月29日 13:14 |
VGAコントローラ
| トラックバック:1
| コメント:7
今日、
fpga-lab.org さんの
徒然日記3月27日 を読んでいたら、”山際伸一ホームページ”の紹介があった。びっくり。ポルトガル懐かしい。今はどうなんだろう?
世界のYahoo天気予報で見てみると日本と同じ気温のようだ。もう一度ポルトガルに行って、
おいしい鰯の炭火焼を食べたい。エスカルゴも。。。 4月に日本に来るそうなので、A氏を誘って会いに行こうか?
2007年03月27日 22:57 |
日記
| トラックバック:0
| コメント:0
Virtex5, Virtex4, Spartan3Eのインプリメント結果3(SLICEL) ではSLICELを比較したが、今度はIOBの違いを検証してみようと思う。
下はFPGA Editorで見たSpartan3EのIOB、ddr_dq<0>だ。
上のIOB、ddr_dq<0>をダブルクリックすると下のような表示が開く。
出力では出力用DDRレジスタと出力をイネーブルする信号のDDRレジスタを使用してる。入力はクロックの立下りエッジ用のFFのみを使用しているが、本当であればfall, rise両方の入力用FFを使っている。riseの方は上のモジュールで接続していないので、なくなってしまったようだ。本来ならばIOBのFFを全て使う予定なのだ。
次にVirtex4のIOBだ。
Virtex4からバッファと入力用FFと出力用FFに分かれている。
次に入力用FFの ddr_sdram_cont_inst/read_data_module_inst/dq_fall<0>を見てみよう。
入力遅延なしで入力用FFに入っている。
次に出力用FFの ddr_sdram_cont_inst/write_data_module_inst/ddr_out<0> を見てみよう。
Spartan3Eの出力用DDRレジスタと同様の回路になっている。あたりまえか???
次にVirtex5だ。Virtex4と同様に、入力用FFの ddr_sdram_cont_inst/read_data_module_inst/dq_fall<0>と出力用FFの ddr_sdram_cont_inst/write_data_module_inst/ddr_out<0> があるが、間にODELAYがある。
上の入力用FFと出力用FFを拡大するとこうなる。
まずは、入力用FFの ddr_sdram_cont_inst/read_data_module_inst/dq_fall<0>の中身は下のようだ。
真ん中から、やや右下にあるのがDDRのFFのようだ。そのうちの1つにエッジしか使用していない。
次に、出力用FFの ddr_sdram_cont_inst/write_data_module_inst/ddr_out<0>の中身を見てみる。
中のFFが2つともDDRになっている。これはSpartan3E、Virte4と同じ回路だ。(当たり前)
今後はODELAYを使ってみたい。 それとISERDESとOSERDESのインスタンスがどのようになるのかも興味がある?
2007/03/25: 追記:ODELAYでなくてIODELAYでした。
Virtex5のユーザーズガイドによるとILOGIC/ISERDESとOLOGIC/OSERDESの両方または、いずれか一方と接続できるそうです。
2007年03月24日 20:29 |
Virtex5のお勉強
| トラックバック:0
| コメント:0
IOデータの19インチ液晶ディスプレイを買った。今までは17インチのCRTだったので、ModelSimのWave画面を見るのが見やすくなった。
ioPLAZAで21,800円とお得だったので購入した。どうやらモデルチェンジのためらしい。液晶ディスプレイをDVIで接続するためにグラボも買ってしまった。といっても4,480円のグラボだけど。AGPしか入らないので、それを買った。
感想はかなりくっきりすっきりしたけど、ちょっと明るすぎるかな?というのが欠点かも? 結構暗くして、コントラストを落としているが、結構明るい。
いままで使っていたCRTをハードオフで引き取ってもらうことにした。お金はもらえないかもしれないが、引き取ってはくれるそうだ。すぐに持って行こうと思ったが、一度液晶の画面の右1/5だけ色がおかしくなったことがあったので、1週間ほど取っておくつもりだ。
2007年03月24日 20:22 |
日記
| トラックバック:0
| コメント:0
DDR SDRAMコントローラを改造したSDR SDRAMコントローラが大体完成した。CAS LATENCYは3です。VHDLで書いてあります。
下のシミュレーションはSDRAMの初期化が終了して、SDRAMに読み書きする時のシミュレーション波形だ。(SDRAMのモデルをマイクロン・テクノロジーからダウンロードしてつけています)
DDR SDRAMコントローラと同様のinput_addressにアドレスをセットしてaddr_fifo_wrenを'1'にする。その時にread_write='0'の場合はWriteなので input_data, input_maskをセットしてwrdata_fifo_wrenを'1'にする。read_write='1'の場合はreadなのでアドレスだけセットする。
そうすると、バンクがアクティブになってないときはACTコマンドを発行してWRITE, 又はREADコマンドを発行する。READの場合はrddata_validが1の時に読み出したデータがoutput_dataに出力される。
上の図の例は、ACTでバンクアクティブして、シングルWRITE、シングルREAD、バーストWRITE、バーストREADだ。これはどれも同一バンクにアクセスしている場合だ。異なるバンクにアクセスする場合は一度プリチャージしてから、ACTコマンドを発行して、行アドレスを入力する。
2007年03月23日 18:26 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
今は平成7年式のエスティマ・ルシーダ・ディーゼルを載っているが、セルがかからないことが出てきた。更に走っていると異音がしてきたのでディーラーに持っていった。
セルスタータとヒータのウォーターパイプ、イクイップメント・シャフトのベアリング交換で合計15万円程度かかるそうだ。
厳しい。。。もう車を交換したほうがいいか? どうしよう。とりあえず保留にしてきたが、変えるとしたら自転車が載るくらいのもっと手ごろな大きさのものがいいかも? どうしようか迷い中だ。
自転車が載せられることは、中学通学用自転車が故障した時に持ち帰る、又は修理に持っていくのに必須なのだ。本当は軽トラックが一番なんだけどね!!!
通勤にはどうも???
2007年03月22日 20:48 |
日記
| トラックバック:0
| コメント:0
今日は急遽、息子を病院に連れて行った。息子は心身症の一種でストレスがかかると腰が痛くなる。7月からずっと小学校に行っていなかったが、3月20日の卒業式にだけは行ってきたのだった。
やはり腰が痛くなってしまったが、次の日には治るだろうと思っていた。しかし、今日まで治らないので、行きつけの病院に急遽行ってきたのだった。
先生は卒業式に行って無理しすぎたのだろうということだった、いやな思い出がある小学校にずっといたので、ストレスがかかりすぎてしまったのだろう。
早く治って、中学校では正常な学生生活を送れることを切望している。
2007年03月22日 20:29 |
日記
| トラックバック:0
| コメント:0
Virtex5, Virtex4, Spartan3Eのインプリメント結果2(分散RAM) では分散RAMのFPGA Editorでの見え方を比較したが、今度はロジックとして使用したLUT(LookUp Table)を比較してみようと思う。SLICELというスライスだ。
まずはSpartan3Eはこのようになる。これはN27という中間のインスタンスだ。LUTから出力に出ている。
次にVirtex4はこうだ。N31という中間のインスタンスだ。同様にLUTから出力に出ている。
以前のSLICEMとの差はLUTのようだ。
次にVirtex5はこのようだ。N31という中間のインスタンスだ。同様にLUTから出力に出ている。
かなり配線が来ていて、6入力LUTを有効に使用しているようだ。上の2つのLUTは結合されてより大きなロジックを担当している。出力はin_port<3>となっている。3つ目のLUT出力のN31も上の2つのLUTの入力として使われている。これはLCD4HEXDisp.vファイルにある、PicoBlazeプロセッサの入力ポートのセレクタとして、使われているようだ。
// 入力ポート用のセレクタ always @* begin if (read_strobe==1'b1) begin case (port_id) 8'h00 : in_port <= input_data_latch; 8'h01 : in_port <= {6'b000000, ope_is_idle, int_cnt_is_zero}; 8'h02 : in_port <= upper_4hex_data[15:8]; 8'h03 : in_port <= upper_4hex_data[7:0]; 8'h04 : in_port <= lower_4hex_data[15:8]; 8'h05 : in_port <= lower_4hex_data[7:0]; default : // 6 in_port <= {cursor_position, 1'b0, cursor_move, left_level, right_level}; endcase end else in_port <= 8'bxxxx_xxxx; end
複雑なセレクタでは6入力LUTが有効に使われるのだろう。
2007年03月21日 10:27 |
Virtex5のお勉強
| トラックバック:0
| コメント:0
昨日は息子の小学校の卒業式だった。息子は7月から腰が痛くて、ずーと小学校に行っていなかったが、最後ということで、腰が痛くなるのを押して卒業式に出た。
朝、お友達が迎えに来てくれて学校に行き、卒業式に出席した。最初に卒業証書授与だったが、腰が痛くなり松葉杖状態になったそうだ。
校長先生のお話は聞けたが、来賓の方のあいさつ辺りで限界となり、保健室で待機。その後の卒業生全体写真は取れたようだ。
今日も腰が痛いといって、松葉杖状態だが、だいぶましになってきたようだ。
4月の中学校の入学式は、私も行く予定だが、腰が痛くならないように祈っている。これから自転車を買ってやらなくては。。。アルベルトなどのベルト駆動自転車にしようかな? 結構チェーン駆動との違いはあるのだろうか?
2007年03月21日 09:45 |
日記
| トラックバック:0
| コメント:0
Virtex5, Virtex4, Spartan3Eのインプリメント結果 でMAPログの比較を行った。今度はFPGA Editorで見た分散RAM(LUTを使った小規模のRAM)とロジックとして使用したLUT(LookUp Table)、それにIOBを比べてみようと思う。
まずは分散RAMから見ていこう。これはDDR SDRAMコントローラのaddr_fifo.vのFIFOに使用している分散RAMを見ていこう。
まずはSpartan3Eの分散RAMを下に示す。
これは、
このISEのVerilogファイルプロジェクト にあるaddr_fifo.vの中の分散RAMだ。RAM16X1DがDual Portの分散RAMである。それをwrite pointer, read pointerをつけて、16深度のFIFOとして使用している。16深度なので4本の読み出しアドレスと4本の書き込みアドレスを持っている。下にVerilogファイルでの分散RAMのインスタンシエーションコードを示す。
generate genvar i; for (i=USER_INPUT_ADDRESS_WIDTH-1; i>=0; i=i-1) begin: ADDR_RAM RAM16X1D #( .INIT(16'h0000) // Initial contents of RAM ) RAM16_INST ( .DPO(out_sig[i]), .SPO(), .A0(wp[0]), .A1(wp[1]), .A2(wp[2]), .A3(wp[3]), .D(din[i]), .DPRA0(rp[0]), .DPRA1(rp[1]), .DPRA2(rp[2]), .DPRA3(rp[3]), .WCLK(clk), .WE(we) ); end endgenerate
上図のスライス内部構造を見ると上の4本が書き込みアドレス(wp)で、下のまとまっている4本が読み出しアドレス(rp)だ。真ん中のGLOBAL_LOGIC0は入力データだ。アドレスは0固定のため、いつも0が入っている。下から2番目がCLK、一番下がWrite Enableである。右側に出ているのは出力だ。分散RAMを実装できるのはSLICEMのようだ。スライスにはSLICEMとロジックとROMにしか使用できないSLICELがあるようだ。
スライスには2つの分散RAMエレメントがあるが、アドレスが使用されているので2つとも使用してしまうようだ。
次はVirtex4の分散RAMを見てみよう。
使用していないD-FFの前のマルチプレクサが違っているみたいだが、分散RAM部分は同じようだ。1SLICE=2LUTsも変化がない。
次にVirtex5だ。
かなりSLICEの中の論理が増えているようだ。1SLICEの中にLUTとFFのペアが4組ある。上の図は分散RAMを実装しているのでSLICEMだ。LUTにアドレスが6本あるので、4本使用していて、2本はGNDに接続されている。Virtex5で分散RAMを実装する際には64深度にしたほうが使い切れて良いだろう。
2007年03月20日 20:21 |
Virtex5のお勉強
| トラックバック:0
| コメント:0
Virtex5, Virtex4, Spartan3EのDDR SDRAMコントローラのインプリメント(MAP)結果を比較してみることにした。
まずは Virtex5 でDDR SDRAMコントローラをインプリメントしてみた。ここで Virtex4, Virtex5 用にインプリメントしたものは、ターゲット基板がないので、DQの遅延値は0となっているので、実際には動作しない。比較のためにインプリメントするだけである。
Spartan3Eは Spartan3E Stater Kit 用にパッドを固定してあるが、Virtex5,Virtex4ではパッドは固定していない。クロックの最大遅延のみを20ns, デューティ比を50%に設定してある。
おまけに、Virtex5でインプリメントを行った時に、dcm100.xawを入れたらプロジェクトがおかしくなってしまった。具体的にはXSTの論理合成が終わったよ。というチェックマークがどうやってもつかなくなってしまった。もう一度作り直してもだめだったので、下のようなVerilogファイルを作って3つのFPGAのインプリメントを行った。
// dcm100.v `default_nettype none `timescale 1ns / 1ps module dcm100 (CLKIN_IN, RST_IN, CLK0_OUT, CLK2X_OUT, LOCKED_OUT); input CLKIN_IN; input RST_IN; output CLK0_OUT; output CLK2X_OUT; output LOCKED_OUT; wire CLKIN_IN; wire RST_IN; wire CLK0_OUT; wire CLK2X_OUT; wire LOCKED_OUT; wire clk_node, clk_bufg; wire clk2x_node; DCM DCM_INST1 ( .CLKIN(CLKIN_IN), .CLKFB(clk_bufg), .DSSEN(1'b0), .PSINCDEC(1'b0), .PSEN(1'b0), .PSCLK(1'b0), .RST(1'b0), // リセットごとにDCMのロックが外れないようにgndにしておく .CLK0(clk_node), .CLK90(), .CLK180(), .CLK270(), .CLK2X(clk2x_node), .CLK2X180(), .CLKDV(), .CLKFX(), .CLKFX180(), .LOCKED(LOCKED_OUT), .PSDONE(), .STATUS() ); defparam DCM_INST1.CLKIN_PERIOD = 20.0; defparam DCM_INST1.DLL_FREQUENCY_MODE = "LOW"; defparam DCM_INST1.DUTY_CYCLE_CORRECTION = "TRUE"; defparam DCM_INST1.CLKDV_DIVIDE = 16.0; defparam DCM_INST1.PHASE_SHIFT = 0; defparam DCM_INST1.CLKOUT_PHASE_SHIFT = "NONE"; defparam DCM_INST1.STARTUP_WAIT = "FALSE"; defparam DCM_INST1.FACTORY_JF = 16'hFFFF; BUFG CLK_BUFG_INST ( .I(clk_node), .O(clk_bufg) ); assign CLK0_OUT = clk_bufg; BUFG CLK_BUF_2X_INST ( .I(clk2x_node), .O(CLK2X_OUT) ); endmodule
インプリメント(MAP)結果を見るとSpartan3Eは、下の結果になった。
Target Device : xc3s500e Target Package : fg320 Target Speed : -4 Mapper Version : spartan3e -- $Revision: 1.36 $ Mapped Date : SUN 18 MAR 20:14:54 2007 Design Summary -------------- Number of errors: 0 Number of warnings: 2 Logic Utilization: Number of Slice Flip Flops: 575 out of 9,312 6% Number of 4 input LUTs: 517 out of 9,312 5% Logic Distribution: Number of occupied Slices: 581 out of 4,656 12% Number of Slices containing only related logic: 581 out of 581 100% Number of Slices containing unrelated logic: 0 out of 581 0% *See NOTES below for an explanation of the effects of unrelated logic Total Number of 4 input LUTs: 804 out of 9,312 8% Number used as logic: 517 Number used as a route-thru: 63 Number used for Dual Port RAMs: 172 (Two LUTs used per Dual Port RAM) Number used for 32x1 RAMs: 52 (Two LUTs used per 32x1 RAM) Number of bonded IOBs: 66 out of 232 28% IOB Flip Flops: 49 Number of ODDR2s used: 38 Number of DDR_ALIGNMENT = NONE 38 Number of Block RAMs: 1 out of 20 5% Number of GCLKs: 6 out of 24 25% Number of DCMs: 3 out of 4 75% Total equivalent gate count for design: 113,976 Additional JTAG gate count for IOBs: 3,168 Peak Memory Usage: 165 MB
次にVirtex4は下のようになった。
Target Device : xc4vlx15 Target Package : sf363 Target Speed : -10 Mapper Version : virtex4 -- $Revision: 1.36 $ Mapped Date : SUN 18 MAR 12:50:36 2007 Design Summary -------------- Number of errors: 0 Number of warnings: 4 Logic Utilization: Number of Slice Flip Flops: 577 out of 12,288 4% Number of 4 input LUTs: 609 out of 12,288 4% Logic Distribution: Number of occupied Slices: 608 out of 6,144 9% Number of Slices containing only related logic: 608 out of 608 100% Number of Slices containing unrelated logic: 0 out of 608 0% *See NOTES below for an explanation of the effects of unrelated logic Total Number of 4 input LUTs: 896 out of 12,288 7% Number used as logic: 609 Number used as a route-thru: 63 Number used for Dual Port RAMs: 172 (Two LUTs used per Dual Port RAM) Number used for 32x1 RAMs: 52 (Two LUTs used per 32x1 RAM) Number of bonded IOBs: 66 out of 240 27% Number of BUFG/BUFGCTRLs: 6 out of 32 18% Number used as BUFGs: 6 Number used as BUFGCTRLs: 0 Number of FIFO16/RAMB16s: 1 out of 48 2% Number used as FIFO16s: 0 Number used as RAMB16s: 1 Number of DCM_ADVs: 3 out of 4 75% Total equivalent gate count for design: 93,429 Additional JTAG gate count for IOBs: 3,168 Peak Memory Usage: 210 MB
最後にVirtex5は下のようになった。
Target Device : xc5vlx30 Target Package : ff324 Target Speed : -1 Mapper Version : virtex5 -- $Revision: 1.36 $ Mapped Date : SUN 18 MAR 13:10:3 2007 Design Summary -------------- Number of errors: 0 Number of warnings: 3 Slice Logic Utilization: Number of Slice Registers: 584 out of 19,200 3% Number used as Flip Flops: 584 Number of Slice LUTs: 692 out of 19,200 3% Number used as logic: 561 out of 19,200 2% Number using O6 output only: 476 Number using O5 output only: 56 Number using O5 and O6: 29 Number used as Memory: 124 out of 5,120 2% Number used as Dual Port RAM: 106 Number using O6 output only: 6 Number using O5 output only: 34 Number using O5 and O6: 66 Number used as Single Port RAM: 18 Number using O6 output only: 18 Number used as exclusive route-thru: 7 Number of route-thrus: 64 out of 38,400 1% Number using O6 output only: 63 Number using O5 output only: 1 Slice Logic Distribution: Number of occupied Slices: 306 out of 4,800 6% Number of LUT Flip Flop pairs used: 881 Number with an unused Flip Flop: 297 out of 881 33% Number with an unused LUT: 189 out of 881 21% Number of fully used LUT-FF pairs: 395 out of 881 44% Number of unique control sets: 47 A LUT Flip Flop pair for this architecture represents one LUT paired with one Flip Flop within a slice. A control set is a unique combination of clock, reset, set, and enable signals for a registered element. The Slice Logic Distribution report is not meaningful if the design is over-mapped for a non-slice resource or if Placement fails. IO Utilization: Number of bonded IOBs: 66 out of 220 30% IOB Flip Flops: 70 Specific Feature Utilization: Number of BlockRAM/FIFO: 1 out of 32 3% Number using BlockRAM only: 1 Total primitives used: Number of 18k BlockRAM used: 1 Total Memory used (KB): 18 out of 1,152 1% Number of BUFG/BUFGCTRLs: 6 out of 32 18% Number used as BUFGs: 6 Number of DCM_ADVs: 3 out of 4 75% Total equivalent gate count for design: 119,969 Additional JTAG gate count for IOBs: 3,168 Peak Memory Usage: 403 MB
下の各FPGAごとの占有領域数などの比較表を示す。
この表を見るとSpartan3よりもVirtex4の方がLUTを使っているようだ。Virtex5は4入力LUTから6入力LUTに変更されているので、LUT数が減っている。Virtex5は一番占有スライス数が少ないが、1スライスにLUTとFFのペアが4組あるので、(Spartan3EとVirtex4は2組)スライスの使用率は他の2つよりも低いようだ。
ピークメモリ使用率はSpartan3Eは165MBだったが、Virtex5は403MBと倍以上だった。容量も倍以上のようだが、やはりメモリを使うようである。
次は、各FPGAをFPGA Editorで見たときの様子を書いてみたい。
2007年03月18日 14:35 |
Virtex5のお勉強
| トラックバック:0
| コメント:0
この前、”仕事では、どうもわけがわからないことがある。IOBのDDRレジスタを使ってクロックを出していて、前のIOBのDDRレジスタを駆動するクロックを使用したIOBのFFでデータを出しているのだが、どうもIOBの出力レジスタから出力パッドまでの遅延がそれぞれ違うのだ。なぜかはまだわからないが、なぜなんだろう? 解明中。”と書いたのだが、私のミス?でUCFが間違っていた。
LVDSのICへはクロックとデータを出力している。クロックはIOBのDDRレジスタを使って、D0に'0'、D1に'1'を入れることによって、クロックを出力している。下の図でフィードバックループが外になくて、FPGA内部に設定してある感じである。(つながっているデバイスもSDRAMではなくてLVDSの送信用ICだけど)
データは最後をFF出力にしてIOB内のFFを使うように設定してある。こうすれば、グローバルクロック配線遅延は大体同一なので、クロック出力時間と、データ出力時間が等しくなり、データとクロックの位相関係が保証できるはずだ。
ところがクロックとデータの出力時間が2ns程度違っている。
クロックのタイミングアナライザでの解析値とFPGA Editorでの回路構成を下に示す。
Tiockpは2.720nsだった。データのタイミングアナライザでの解析値とFPGA Editorでの回路構成を下に示す。
データのTiockpは4.766nsだった。この差は約2nsある。これが何で生じているかをXilinxのアンサー・サーチなどで調べてみたが、無いようだった。更にデータがDDRじゃないからだめなのかな?と思いデータもわざわざDDRにしてみたが、やはりTiockpは変化がなかった。
これで2、3日くらい悩んでしまったが、ふとUCFを見るとクロック出力のほうは、IOBのスルーレートがFASTで8mA出力になっていた。データのほうのUCFは位置の固定だけでデフォルトだったので、スルーレートはSLOWで12mA出力だ。ここがおかしかった。。。
データをクロックの設定にあわせたらTiockpも同じになった。
あ~あ、時間が無駄になってしまった。その前の固めてあるインプリを見るとデータもちゃんと設定してあるので、いつの時点かでUCFがなくなってしまったようだ。
1つ考えられるのは、UCFをPACEで設定するようになってから、 floorplanner や Constraints Editor で作ったUCFと互換が取れにくくなってしまったことがある。両方を使用していると、制約が2重になることもあったし、その時に修正したときに間違って消してしまったのかもしれない。新しいツールを出す時は互換性を完全に取ってもらいたい。(かなり八つ当たりモードです。反省)
2007年03月17日 15:40 |
UCFの書き方
| トラックバック:0
| コメント:0
技術発表会が終了してすぐなのだが、昨日は職場の引越し。
今年度はアスベスト工事で2回引っ越したが、今度は天井施工、エアコン交換工事でまた引っ越した。元の部屋に戻るため、10日後に、もう一度、戻るための引越しがある。
それやこれやで、どうも体調が悪くなったようだ。どうも、微熱があって、なんだか寒い。私は気を張って緩むと体調を崩しやすいようだ。
仕事では、どうもわけがわからないことがある。IOBのDDRレジスタを使ってクロックを出していて、前のIOBのDDRレジスタを駆動するクロックを使用したIOBのFFでデータを出しているのだが、どうもIOBの出力レジスタから出力パッドまでの遅延がそれぞれ違うのだ。なぜかはまだわからないが、なぜなんだろう? 解明中。
2007年03月16日 05:55 |
日記
| トラックバック:0
| コメント:2
今日は技術発表会だった。
しばらく発表していないので、ドキドキしたが、何とか発表できた。まあまあの出来だったと思う。
階段講堂で聴講していたのので、首が痛くなってしまった。
その後、懇親会をやってきた。
やはり、FPGAをやっている人がいないので、細かい話が出来ずに残念だ。
陶芸の話をするが、釉薬を持ったりして、20Kgくらいだそうだ。かなり重労働だとこと。陶芸教室に通おうと思っていたのだがどうししようか?
明日は、また職場の天井を張るので、もう一度引っ越しになる。
2007年03月14日 21:29 |
日記
| トラックバック:0
| コメント:0
明日は技術発表会なので、最後の発表練習をする予定。
今回は基板を作ったよ、ということで、部品を選定、調達するのは大変だ、ということをメインに基板の概要を説明する予定。15分発表の5分質疑応答なので、たいしたことはしゃべれない。
近くの方で、お暇な方は見に来てください。
2007年03月13日 06:09 |
日記
| トラックバック:0
| コメント:0
Virtex5のお勉強(PLLのテスト)のプロジェクトでPLLを試しにインプリメントしてみたが、今度はシミュレーションしてみる。
テストベンチ、PLLtest_top_tb.tbw を作って論理シミュレーションしてみる。
ModelSim XE� 6.1e starter で論理シミュレーションしてみた。
次にVeritakでシミュレーションしてみた。
当然だが結果は同じだった。
シミュレーションをしているとメモリをだいぶ消費していることに気がついた。
それでそれぞれのシュミレータがどのくらいメモリを消費しているか調べてみることにした。最初にWindowsをリブートしてISEを立ち上げてから各シミュレータを立ち上げて消費メモリを調べてみた。結果を下に示す。各シミュレータは並列に立ち上げずに、1つずつ立ち上げては落としている。シミュレーション時間はModelSimが1us、Veritakが1.082usだ。
(ModelSim XE� 6.1e starter, Veritak-Basic 3.30A) ModelSimは90MB程度メモリを使用しているが、使うたびにベースが増えてしまう。ライブラリかなにかが残ってしまうのか? 使用メモリも使用するたびに減りはするようだが?
Veritakはこのデザインでは、500MB強メモリを消費するようだ。Veritakは波形を全部記憶しているのでメモリを消費するのかもしれない? Veritakを使う時はメモリを十分に用意しないといけないようだ。
2006.03.11 追記: 改めてみてみるとModelSimとVeritakの波形のCLKOUT0_OUTとCLKOUT3_OUT波形が位相が違っているようだ。485nsの波形を見るとわかると思う。なぜだろうか? 初期状態が異なるのか? 調べてみたところModelSimは 255ns 辺りからPLLの波形出力が始まっていて、しかも最初は乱れている。
(ModelSimのバージョンが古いのが原因でした。理由は後ろに書いてあります。) Veritakは 245ns からPLLの波形出力が始まっていて、最初からちゃんとした波形が出力されている。
この差が後で位相の差として効いてくるようだ。2つ比べないと違うとはわからない。論理としては合っているから。 (ModelSimのバージョンが古いのが原因でした。理由は後ろに書いてあります。) 試してみるのでしたら
PLLtestのプロジェクト をおいておきますので、試してみてください。ただし例によって保証はありませんので、自己責任でお使いください。
2006.03.12 追記: 原因がわかりました。ModelSimをISE8.2i用の6.1e starterを使っていたのが原因でした。ライブラリが古かったので違いが出たようです。
ModelSimを最新の ModelSim XE� 6.2c starter にしてIPアップデート用のライブラリを更新したところVeritakと同様の波形が表示されました。Veritakと比較する場合はModelSimはライブラリを最新にしておかなければだめという教訓が出来ました。
いろいろご迷惑をおかけしまして申し訳ありませんでした。
2007年03月11日 09:22 |
Virtex5のお勉強
| トラックバック:0
| コメント:5
Virtex5のお勉強としてPLLをCoreGenで作ってみた。どうせシビアなテストは出来ないが、どんなもんかだけでもやってみようと思った。
WebPACKで唯一出来る xc5vlx30 でプロジェクトを作った。最初にNew Source... で IP を選択して PLLtest1 という名前をつけて FPGA Features and Design -> Clocking -> Virtex-5 -> Choose wizard by component -> PLL ADV v9.1i を選択する。
PPL_ADVの選択ウイザードが走る。デフォルトでは CLKOUT0 にしかチェックがついていないので、 CLKOUT1 から CLKOUT5 までチェックをつけた。更に、Clock Jitterに100psを設定した。
wizardの次の画面に行くと、出力周波数と位相、デューテイ比を設定する。最初は全部のクロックが100MHzなので、CLKOUT_DIVIDE をいじって周波数を変えてみる。下の画面のように変えてみた。最初にやってみた時は、位相が-360になってしまったり、 デューティ比が中途半端のものがあったが、IPのアップデート (ISE 9.1i IP Update 1) をかけたら?直ったような気がする。
後はwizardを進めていってPLL_ADVを作った。その後、簡単なトップファイル (PLLtest_top.v) を作った。入力をそれぞれのクロックでシフトレジスタとして2つのDFFをカスケード接続した簡単な回路だ。なぜシフトレジスタとしたかというと、最大動作周波数を見るためだ。
UCFファイルは入力周波数を入れているだけだ。UCFにINPUT_JITERの設定項目が増えている。
NET "CLKIN1_IN" TNM_NET = CLKIN1_IN; TIMESPEC TS_CLKIN1_IN = PERIOD "CLKIN1_IN" 10 ns INPUT_JITTER 100 ps;
これでインプリメントしてPARリポートを見てみると動作周波数ごとに Worst Case Slack、Best Case Achievable、Timing Errors が表示される。これは動作周波数というかクロック周期の制約をあたえたからだが。ISE9.1iから表示が変わって、 Worst Case Slackの値の意味が良くわからない。SETUPの方は Best Case Achievable(クリティカルパス)をクロック周期から引いた値みたいだが、(SETUPだからそうか?)HOLDの方が良くわからない。マニュアルやアンサー・サーチを見てみたが良くわからないし。今のところナゾである。わかる方は教えてください。
次はModelSimとVeritakでシミュレーションしてみようと思う。
2007年03月11日 07:55 |
Virtex5のお勉強
| トラックバック:0
| コメント:0
今朝、布団をたたんでいたら、庭の梅ノ木に
ウグイス メジロが来ていた。(ウグイスだと思っていました。勉強がたりませんね。。。)あわててデジカメを持ってきて取った。もう春なんだね~。
でも、
ホーホケキョとも 何も鳴いてないのが淋しい。
2007年03月09日 20:25 |
日記
| トラックバック:0
| コメント:2
ぽっぽファクトリーさんのコメントでVeritakの新しいバージョン、Veritak-Basic Version 3.30A(シェアウェア版)が
VeritakのWebページ に出ていることを教えてもらったので、早速ダウンロードしてインストールしてみた。
やはり、アイコンがかっこよくなっている。やはりこっちのほうが良いと思った。シミュレーションのスピードを計測したら16秒だったので少し速くなっているのかもしれない。かも知れないというのは古いほうを消してしまったので、最初に古いバージョンのを実行して時間を計測してから、新しいバージョンで時間を計測すればよかったのだが、そうしていないということだ。いずれにせよ。ModelSim starterに比べて十分に高速なので満足。
まだ機能がわからないので、使いこなせるように勉強していきたいと思う。
次の予定は
”これからの展開” Verilog2001版DDR SDRAMコントローラを改造して(6) お仕事用?、SDR SDRAMコントローラを作る。 をしようかと思っている。これが一番簡単に出来そう。実際はSDR SDRAMコントローラの上に一層皮をかぶせる予定なので、今までと同じローカル側のインターフェースで作る予定。
Verilogで作るか、VHDLで作るかなのだが。どうしようかな?せっかくVeritakがあるのでVerilog2001で作りたいのだが。。。だめだったら後でVHDL版から変換してもいいか?
こういうところでVHDL, Verilog2001まったく同一に作ったのが生きる???
2007年03月09日 06:04 |
シミュレーション
| トラックバック:0
| コメント:0
Design Wave Magazineの4月号で、Spartan3E Starter Kitを使った記事が出ているというのを、fpga-lab.orgさんの
徒然日記2007年3月8日 で知った。
早速、Design Wave MagazineのWebサイトを見てみると、
”基礎から学ぶVerilog HDL&FPGA設計(第1回)全加算器をHDLで設計してみよう” という記事があった。
今までCQ出版社は、自分のところで作った基板しか使わないと思っていた(特に連載には、例外はあるみたいだが)ので、とてもびっくりした。今度から、いろいろな基板を使って記事が出てくると思うと、とても楽しみだ。
しかし、やはり年間購読は早く届くのでとてもよいと思う。私はDWMとインターフェースを取って置いてくれる様に書店に頼んである。1割引なのでなかなか年間購読に踏み切れない。
2007年03月08日 21:02 |
その他のFPGAの話題
| トラックバック:0
| コメント:5
昨日はサイプレス PSoC Express セミナー 2007に行ってきた。
パシフィコ横浜の会議センターに12時ころ着いた。パシフィコ横浜には展示会でよく行っているが、会議センターに行くのは初めてだった。
入り口でボードを頂いて、会場に入る。ボードは何か4つの区画に分かれて、それぞれに違う品種のPSoCが載っていてテストできるようなっている。
最初は講義で
PSoC の概要やPSoC Expressの使い方を講義した。次にもらったボードを使った演習をした。ノートパソコンを持っていったので、PSoC Expressを立ち上げてサンプルを4つやった。
PSoC Express ではコードを書かないでも機能を実現できてしまう。Simさんが電子ブロックのようだとコメントに書いてくれたが、まさにそのようだ。しかし、プロパティを設定して、入力に対して出力がどう出るかをテーブルやif then などで書かなければいけない。また部品がなければ、自分で作るしかないようだ。また、実際に使えるレベルになるとすると、結構覚えることは多いように思う。それでも簡単なサンプルならば本当にすぐに機能を実現できるから便利だ。
トレーニングの中でLab4が一番面白かった。左下の区画のPSoCでADコンバータを構成して、LCDにバーグラフと電圧値(mV)で出力する。更に、I2Cで右下の区画のPSoCにデータを転送して7セグLEDにその電圧値を表示、電圧値の判定をして、その結果を左下の区画のPSoCに送りかえす。それは電圧が1000mV以下だったらLEDを消灯、2000mV以下だったらLEDを点灯、それ以上だったらLEDを点滅というものだ。下に写真を示す。これが電子ブロックを作っているような感じで、わりと簡単に出来る。
私は食べなかったが、おやつ食べ放題、飲み物飲み放題のセミナーだった。結構楽しかったし、ためになった。前回、参加しようと思っていたら、足指の骨折で参加できなかったので、本当に良かった。
Simさんもこのセミナーに参加されていたようだし、いろいろコメントして頂いておなじみの方も参加されていたかもしれないな? と思った。
2007年03月08日 06:09 |
PSoC
| トラックバック:0
| コメント:2
ISE9.1iは
”Verilog2001版DDR SDRAMコントローラーのISE9.1iSP1によるインプリメント” で書いたように、少しおかしいところもあるが、だいたいISE8.2iよりも良くなっている気がする。というのは、以前ISE8.2iSP3でどうしてもTranslateでTCLエラーでGUIからインプリメントできなくて、コマンドラインでインプリメントしたという記事を書いた。(
”ISE8.2iをコマンドラインから使う” )そのプロジェクトをISE9.1iSP1でインプリメントしたところ問題なく完了できた。とりあえずこれだけなのだが、これだけでもISE9.1iSP1が好ましく思えてきた。
私の職場のパソコンにはISE6.3SP3、ISE8.2SP3、ISE9.1iSP1と3つのISEが入っている。1つのISEでおかしい時は、その他のISEでやってみることにしている。
今日は
サイプレスPSoC Expressセミナー なので、パシフィコ横浜に行ってきます。
2007年03月07日 06:15 |
Xilinx ISEについて
| トラックバック:0
| コメント:2
”Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ1” で紹介したVerilog2001版DDR SDRAMコントローラーをシミュレーションするには ModelSim XEⅢ 6.1e starter でシミュレーションすると私のマシンで4分44秒かかった。私のパソコンはPen4 1.7GHz, DDR SDRAM 1Gbyteの古いパソコンだ。やはりDDR SDRAMモデルをつけて13usくらいシミュレーションすると、コードが1万行を越えるのでModelSimのstarterだと、このくらい時間がかかるようだ。
ModelSimのstarterバージョンはXilinxサイトの
ISE Webpack FAQ の
”4. ModelSim ザイリンクス エディション III (MXE-III) Starter での制限は?” にあるようにコードが1万行を越えると極端に遅くなるようだ。
これだとデバックが面倒くさくなる。(ModelSim SEだと十数秒だと思う)もっと速くなるとデバックが簡単になる。という訳でmixiで教えてもらった
Veritak というシミュレータを試してみた。このシミュレータはProバージョンでも2万7千円と格安だが、シェアウェアバージョンもあって、機能はある程度限定されるが約5千円で
Vectorからシミュレータ を購入できる。
最初のコンパイルに時間がかかるかもしれないが、シミュレーション時間は約20秒だった。ModelSim XEⅢ 6.1e starter よりも約8倍速い。
これをVectorで注文した(まだ、ライセンスキーは来ていないし、お金も払っていないので評価状態だが)ので、コードが1万行を越えるような重いシミュレーションはVeritakでやろうと思っている。まだなれないので、使い方を探るのが大変だが、大体使えるようだ。下にVerilog2001版DDR SDRAMコントローラーをシミュレーションした時の Veritak-Basic3.21 による波形を示す。尚、バージョンの進んでいるProバージョンはウインドウがかっこよくなっている。mixiでの製作者の方の書き込みによると、近いうちにサイトでメジャーアップデートの時に、シェアウェア版もアップデートされるようになるようだ。
mixiのVeritak友の会コミニティに皆さん、いろいろ教えていただいてありがとうございます。また質問すると思いますが、よろしくお願いします。
2007年03月05日 21:24 |
シミュレーション
| トラックバック:0
| コメント:4
今年度初めてスキーに行ってきた。
子供の病気と私の足指の骨折で、今シーズンは今までスキーに行けなかった。
やはりスキー場はいいもんだ。雪山を見るのだけでもいい気持ち。それに今回はgooから50%割引券を送ってきたのでそれを使用してた。リフト代が50%オフなので5人で1万円くらいだった。とてもお得だった。
最近は子供達もスキーが上手になって、中級コースもいけるようになった。初めてハンターマウンテンスキー場の頂上まで行ってきた。雪もやわらかかったので、何とか大丈夫のようだ。一緒に頂上まで行けて、とても楽しかった。
でも雪は少ないようだった。一番下は雪が少ない。3月末まで持たないような感じだ。もう一度、3月末に行きたかったがだめか?
今は家に帰って、ブログを書いているが一人で日帰りで運転したので、とっても疲れた。もう眠ろうと思う。
2007年03月03日 22:53 |
日記
| トラックバック:0
| コメント:0
FPGAインフォメーションの
BBS で論理合成で信号がなくなってしまうときに、XSTのKEEP属性を使用して、
信号をキープする方法をポスト した。
VHDLは今までやってきたのでOKだが、Verilog HDLはやったことがなかった。そこで推測というか、どうやるか興味があったので制約ガイドやアンサーサーチを見た。
その結果、
”8.1i XST - Verilog コードで属性を受け渡す場合の推奨方法について” を見つけた。それによるとVerilog2001だと
(* IOSTANDARD="LVDCI_33" *) input rxd ;
のように書くそうだ。
そこで、Verilog2001版DDR SDRAMコントローラの addr_fifo.v の wire fifo_full; があるが、論理合成して Constraints Editor のNET検索で見ると fifo_full はネットがなくなっている。
これで wire fifo_full; を下のように変えると、下のスナップショットのように論理合成後にネット名が残った。
(* KEEP="TURE" *) wire fifo_full;
2007年03月01日 22:30 |
入門Verilog
| トラックバック:0
| コメント:0