FC2カウンター FPGAの部屋 2008年01月

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

FPGAの部屋

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

DDR2 SDRAMコントローラのインプリメントテスト(動作周波数の確保)

DDR2 SDRAMコントローラのインプリメントテストにはまっている。
動作周波数が予定の200MHzを満足できなかった。原因はIOBの出力用のDDRレジスタに入れるところで、組み合わせ回路を入れるとその組み合わせ回路分のディレイがクリティカルパスになってしまったからだ。前のレジスタとIOBの出力用のDDRレジスタのサンプルクロックは半クロックずれていて、必要な遅延時間は5ns/2 = 2.5ns なので特に厳しい。
以前は下のような記述だった。

    // Insantiate three-state DDR registers
    assign dq_tri_d0 = dqs_reset_3d_dqtri | not_dqs_enable_3d;
    assign dq_tri_d1 = not_dqs_enable_3d;
    
    generate
    genvar j;
        for (j=DDR2_DATA_WIDTH-1; j>=0; j=j-1) begin: WRDATA_TRI
            FDDRRSE WRDATA_DDR2_TRI (
                .Q(out_tri[j]),
                .D0(dq_tri_d0[j/8]), // DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル
                .D1(dq_tri_d1[j/8]),
                .C0(clk),
                .C1(clkx),
                .CE(vcc),
                .R(reset),
                .S(gnd)
            );
        end
    endgenerate


dq_tri_d0とdq_tri_d1が組み合わせ回路出力では遅延時間が満足できなかったので、1クロック前の信号からとって、組み合わせ回路を作り、それを1クロック遅延した。
このように。。。

    // Insantiate three-state DDR registers, 組み合わせ回路があると間に合わないので、いったんラッチする
    assign dq_tri_d0_b = dqs_reset_2d_dqtri | not_dqs_enable_2d;
    assign dq_tri_d1_b = not_dqs_enable_2d;
    always @(posedge clkx) begin
        if (reset) begin
            dq_tri_d0 <= {DDR2_DQS_DM_WIDTH*8{1'b1}};
            dq_tri_d1 <= {DDR2_DQS_DM_WIDTH*8{1'b1}};
        end else begin
            dq_tri_d0 <= dq_tri_d0_b;
            dq_tri_d1 <= dq_tri_d1_b;
        end
    end
    
    generate
    genvar j;
        for (j=DDR2_DATA_WIDTH-1; j>=0; j=j-1) begin: WRDATA_TRI
            FDDRRSE WRDATA_DDR2_TRI (
                .Q(out_tri[j]),
                .D0(dq_tri_d0[j/8]), // DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル
                .D1(dq_tri_d1[j/8]),
                .C0(clk),
                .C1(clkx),
                .CE(vcc),
                .R(reset),
                .S(gnd)
            );
        end
    endgenerate


Timing Analyzerの遅延時間をとってなかったので、どのくらい遅延時間の予定値を外れていたか?忘れてしまったが、大して外れていなかったと思う。100psとか、数100psだったと思う。
動作周波数を満足するのは難しい。いろいろ試行錯誤をしている。
もう1箇所、クリティカルパスになってしまって、遅延時間が延びてしまったところがあった。そのために、もう1つテクニック?を使ったが、それはまたの機会に。。。
  1. 2008年01月31日 05:13 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

パーティションを効果的に利用する方法

ISEのインクリメンタルデザインフローであるパーティション(Partition)を効果的に使用する方法がザイリンクス・アンサー”#24108 - 9.1i, Incremental Design Flow - インクリメンタル デザインを ISE 9.1i で再利用する方法”に書いてあったので、備忘録として書いておこうと思う。これをODDRについて調べているときに見つけた。
それによると、ODDRやIDDRなどのIOバッファ関連のプリミティブやレジスタなどは最上位においておくということだ。これは納得できる。そうじゃないとパーティションの使用が難しい。
後は、パーティションモジュールの入出力にレジスタを配置するとのことだ。
なかなか条件が厳しい。その気でモジュールを作らないと使えそうにない。
  1. 2008年01月28日 11:22 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:2

スイッチングハブ+無線LANが壊れた

うちはフレッツADSLだが、NTTからルーター機能付モデムをレンタルして使用している。その後に、4ポート付の無線LAN付のルーターを、WANは使用しないで、LANがわのみスイッチングハブとして使用し、そのルーターの無線LANをノート用に使用している。

ここから本題。昨日、風呂から出てみたら急にネットが使えなくなっていた。えー、まったくつながらない。ADSLモデムを見るとLINKはしているがLANがつながっていない。何だ何だとみると、無線LAN付のルーターの電源が入っていない。電源のACアダプタを見るとプラグの元のプラスチックが折れている。。。がーん、ショック。。。
急いで復旧作業を。。。幸いに4ポート付の無線LAN付のルーターはもう1つ予備がある。そっちをつないで、ブリッジモードに設定。DNS設定をきったり、IPアドレスを変更したり、無線LANのキーを入れてと、ノートのアクセスポイントの設定も変更。やっと、インターネットが見えるようになりました。
前の無線LAN付のルーターは、WiiやPSP、ノートパソコンの無線LANで使うことになっているので、設定変更が面倒だ。よって、今日、ホームセンターなどでACアダプタを購入しようと思う。

2008/01/28:追記
ホームセンターでACアダプタを購入して復旧しました。よかった。。。
  1. 2008年01月27日 07:02 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

DDR2 SDRAMコントローラを試しにインプリメント

いままでシミュレーションしてきたファイルがどのようにVirtex4のロジックに割り当てられるかが興味があったので、クロック周期のUCFだけ書いてISEツールに後はお任せでインプリメントしてみた。
そうしたところ、このようにDDRレジスタのところでエラーが出てしまった。
OLOGIC_Error_080126.png

その部分のソースはこうなっている。

    // Instantiate Output DDR registers
    generate
    genvar i;
        for (i=DDR2_DATA_WIDTH-1; i>=0; i=i-1) begin: WRDATA_OUT
            FDDRCPE WRDATA_DDR2_OUT (
                .Q(ddr2_out[i]),
                .D0(wrdata_3d[i]),
                .D1(wrdata_4d_half[i]),
                .C0(clk),
                .C1(clkx),
                .CE(dqs_enable_3d[i/8]),
                .CLR(reset),
                .PRE(gnd)
            );
        end
    endgenerate


FDDRCPEがVirtex4ではサポートされていないのかとソフトウェアマニュアルのライブラリガイドを見ると、FDDRCPEはVirtex4とSpartan3のみプリミティブとしてサポートだそうだ。
でもおかしい。前に”Virtex5, Virtex4, Spartan3Eのインプリメント結果”というブログの記事で、Virtex5, Virtex4, Spartan3EのDDR SDRAMコントローラのインプリメント(MAP)結果を比較している。このときにVirtex4でもDDR SDRAMコントローラをインプリメントしてプロジェクトも残っているはず。。。
探してみるとVirtex4用のDDR SDRAMコントローラがあって、今同じISEのバーション(ISE9.2SP4)でインプリメントしてみたが、問題なくできた。
試しにFPGA Editorで見てみたが、問題なくOLOGICにアサインできているようだ。(下の図参照 ddr_dq0のOLOGIC)
OLOGIC_FPGA_Editor_080126.png

どちらも同じFDDRCPEを使っていて、どこか違うか良くわからない。確かにうまく行ったほうは周辺の入力表示回路がついていて、出力パッドのインターフェース規格(SSTL2-1)がUCFに書いてあるがそれだけの違いだ。
よくわからないが、せっかくVirtex4の勉強もしながらのDDR2 SDRAMコントローラの作製なので、OLOGICで書き換えることにした。
そういえばVirtex4の勉強のときも、ILOGICは勉強したが、OLOGICはやっていなかった。Virtex2と同じだと思っていた。FPGA EditorでOLOGICの図を見るとFFが1つ増えている。何に使うのだろう。Virtex4のOLOGICについて勉強することにした。

2008/01/28:追記
上のエラーはddr2_dqのVerilogファイルのポート宣言がoutputだけになっていたためだった。inoutに変更したら、FDDRCPEプリミティブを使用してもMAPが成功するようになった。
今のところVirtex4のDDR出力レジスタ用プリミティブODDRを使う方法がよくわからない。現在、FDDRCPEやFDDRRSEと同じように使おうとするとエラーになってしまっている。
  1. 2008年01月26日 06:13 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

新年会?のお誘い

@eleの新年会にも行けなかったことだし、つくば市周辺の電子工作が趣味の方、FPGAが好き?な方で新年会というか、お話し会(宴会)をしようかなと思っています。
今のところ、まったく決まっていませんが、土曜の夜あたり(もしくは連休の日曜日)に4,000~5,000円くらいの会費(これはお酒の量によっても変動しますよね?)にしようと思っています。
参加ご希望の方はいらっしゃいますでしょうか?
  1. 2008年01月23日 11:24 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:7

VeritakでのDDR2 SDRAMコントローラのシミュレーション4(Read)

今日は代休でお休みなのでRead編を書く。
”VeritakでのDDR2 SDRAMコントローラのシミュレーション3(Write)”で書き込んだデータをReadしてみる。
DDR2_READタスクで読み出す。そのタスクを下に示す。

DDR2_READ(25'h000_0100);
DDR2_READ(25'h000_0104);


これで”VeritakでのDDR2 SDRAMコントローラのシミュレーション3(Write)”で書き込んだデータをReadすることができる。
そのタイミングチャートを下の図に示す。
ddr2_read_080121.png

ピンクが1度目のREADコマンド、緑が2度目のREADコマンド、黄色が2つのREADコマンドで読まれた8バーストデータ(BL=4)。
青が次のREADコマンドを発行するための全バンクプリチャージ・コマンド。オレンジが次のReadのためのバンク・アクティブ・コマンド。
最後に、水色が読み出されたデータの最初の2つ。12345678と9abedef0が見える。
これでDDR2 SDRAMコントローラ単体のシミュレーションは一通りできたが、もう少しパラメータを変更してシミュレーションしたい。それが終了したら、まだ、Read回路のIOBにディレイが入っていないので、”Virtex4のIDELAY(FIXEDモード)”を参照してIDELAYを入れようと思う。それが入れ終わったら、データ設定、表示回路(SWや7セグLEDなど)を付け加えてシミュレーションしたい。それができたら、いよいよインプリメントに進むことにする。
  1. 2008年01月21日 15:20 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

VeritakでのDDR2 SDRAMコントローラのシミュレーション3(Write)

VeritakでのDDR2 SDRAMコントローラのシミュレーション3、Write編だ。
どうしてもWriteしないとReadできないのでWriteが先になる。
DDR2 SDRAMコントローラを作っている感想はDDRとあまり変化がないということだ。DDR2の特徴のPosted CASもODT(On-die Termination) もOCD(これはサポートされていないようだが。。。)使っていないので、そういう感想になると思う。
ともかくDDR2 SDRAM Writeは、どうなっているかというと。。。
ddr2_write_080121.png

このようになっている。
これは”VeritakでのDDR2 SDRAMコントローラのシミュレーション2(Read, Write)”のテストベンチのDDR_WRITEタスクの下の部分だ。

DDR2_WRITE(25'h000_0100, 4'b0000, 32'h1234_5678, 4'b0000, 32'h9ABC_DEF0);


上の図でピンクの四角で囲った部分がバンク・アクティブコマンドを発行したところ。
黄色黄緑色の四角で囲った部分が1個目のWRITEコマンドを発行。青の四角が2こめのWRITEコマンドを発行した部分。
黄色の四角が実際のデータを書き込む部分。Posted CASは使用していなし、CAS Latency=3なのでWL=2。tDQSS(MAX)を使用している。リトルエンディアンのつもりで作ってあるので、ライト用FIFO(wrdata_fifo)に書き込むデータの下位16bitから書き込むようになっている。
つまり、最初のデータは12345678(hex)なので、最初に1234のデータが出るがDQSがトグルしないのでDDR2 SDRAMにスルーされ、次に5678がDQSの立ち上がりエッジでDDR2 SDRAMに書き込まれる。次のDQSの立ち下がりエッジ上位16ビットの1234が書き込まれる。次にdef0、9abcが書き込まれる。2つ目のWRITEコマンドが続けて発行されているので、連続したバーストアクセスとなり、引き続きデータが4バースト書き込まれ、結局8バースト・ライトとなっている。
(注:DDR2 SDRAMは1つのWRITEコマンドを発行すると少なくとも4バースト・ライトとなります)

2008/01/23 追記:
Burst Lengthを書き忘れました。BL=4です。
  1. 2008年01月21日 09:22 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:5

VeritakでのDDR2 SDRAMコントローラのシミュレーション2(Read, Write)

今度はVeritakでのDDR2 SDRAMコントローラのシミュレーションのRead、Write編だ。
まずは、下のようなテストベンチで動作を確認している。

    task DDR2_WRITE;
        input [USER_INPUT_ADDRESS_WIDTH-1 : 0] address;
        input [INTERFACE_MASK_WIDTH-1 : 0] inmask0;
        input [INTERFACE_DATA_WIDTH-1 : 0] indata0;
        input [INTERFACE_MASK_WIDTH-1 : 0] inmask1;
        input [INTERFACE_DATA_WIDTH-1 : 0] indata1; // DDR2で4バーストのため2つ連続してデータを入れる
        begin
            input_address = address;
            input_data = indata0;
            input_mask = inmask0;
            read_write = 1'b0; // Write
            addr_fifo_wren = 1'b1;
            wrdata_fifo_wren = 1'b1;
            @(posedge sim_clk); // 次のクロックへ
            #1; // デルタ遅延による誤動作を防ぐため最小遅延を入れる
            addr_fifo_wren = 1'b0; // アドレスを入れるのは1回だけ
            input_data = indata1;
            input_mask = inmask1;
            @(posedge sim_clk); // 次のクロックへ
            #1; // デルタ遅延による誤動作を防ぐため最小遅延を入れる
            addr_fifo_wren = 1'b0;
            wrdata_fifo_wren = 1'b0;
            #1;
        end
    endtask
        
    task DDR2_READ;
        input [USER_INPUT_ADDRESS_WIDTH-1 : 0] address;
        begin
            input_address = address;
            read_write = 1'b1; // Read
            addr_fifo_wren = 1'b1;
            @(posedge sim_clk); // 次のクロックへ
            #1; // デルタ遅延による誤動作を防ぐため最小遅延を入れる
            addr_fifo_wren = 1'b0;
            #1;
        end
    endtask
    
    initial begin
        input_address = 25'h000_0000;
        input_data = 32'h0000_0000;
        input_mask = 4'b0000;
        read_write = 1'b0;
        addr_fifo_wren = 1'b0;
        wrdata_fifo_wren = 1'b0;

        @(posedge initialize_end); // DDR2 SDRAMの初期化終了まで待つ
        @(posedge sim_clk);
        #1; // デルタ遅延による誤動作を防ぐため最小遅延を入れる
        DDR2_WRITE(25'h000_0100, 4'b0000, 32'h1234_5678, 4'b0000, 32'h9ABC_DEF0);
        DDR2_WRITE(25'h000_0104, 4'b0000, 32'h2233_4455, 4'b0000, 32'h3344_5566);
        
        @(posedge sim_clk); // 次のクロックへ
        @(posedge sim_clk); // 次のクロックへ
        @(posedge sim_clk); // 次のクロックへ
    
        DDR2_WRITE(25'h180_0010, 4'b0000, 32'h1122_3344, 4'b0000, 32'h4455_6677);
        DDR2_READ(25'h000_0100);
        DDR2_READ(25'h000_0104);
        DDR2_READ(25'h180_0010);
        
        #1000000;
        
        $stop;
    end


外とのインターフェースは以前の”Spratan3E Starter KitのDDR SDRAMコントローラの説明”と同一だが、DDRと違いDDR2はプリフェッチ4、つまり1つコマンドを入れると4バーストしてしまう。そこで、Writeの場合にaddr_fifoにアドレスを入れて、wrdata_fifoにデータを入れるときに2回連続して入れることにした。wrdata_fifoのビット幅はDDR2 SDRAMの2倍なので、こうすると4バーストできる。
上のテストベンチでシミュレーションしてみた結果が下の図だ。
ddr2_read_write_all_080121.png

流れはこうだ。

1.最初にWriteする行アドレスを入れてバンクをアクティベートする。
2.その後に2回Write。
3.その後のWriteは行アドレスが違うので、いったん全バンクプリチャージ(対応するバンクは1つなので全バンクプリチャージしています)。
4.今回のWriteする行アドレスを入れてバンクをアクティベート。
5.1回Write。
6.Readするのに、行アドレスが違うので、いったん全バンクプリチャージ。
7.Readする行アドレスを入れてバンクをアクティベートする。
8.2回Read。
9.行アドレスが違うので、いったん全バンクプリチャージ。
10.今回のReadする行アドレスを入れてバンクをアクティベートする。
11.Read


テストベンチはこのようになっている。次回はWrite, Readの詳しい内容を見ていくことにする。
  1. 2008年01月21日 05:49 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

VeritakでのDDR2 SDRAMコントローラのシミュレーション (初期化)

VeritakでDDR2 SDRAMコントローラのシミュレーションが大体できたようだ。(”DDR2 SDRAMコントローラのシミュレーション時のバグ”も参照)
DDR2 SDRAMの初期化手順は”DDR2 SDRAM(Micron MTH16M16-37E)の初期化について”の手順で行っている。シミュレータの出力を下に示すが、同様のことを行っているのが確認できた。最後に、DDR2 SDRAMのモデルからInitialization Sequence is complete も表示され、初期化が終了できたのも確認できた。

DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200806000.0 ps INFO: Precharge bank 0
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200806000.0 ps INFO: Precharge bank 1
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200806000.0 ps INFO: Precharge bank 2
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200806000.0 ps INFO: Precharge bank 3
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200821000.0 ps INFO: Load Mode 2
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200841000.0 ps INFO: Load Mode 3
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200861000.0 ps INFO: Load Mode 1
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200861000.0 ps INFO: Load Mode 1 DLL Enable = Enabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200861000.0 ps INFO: Load Mode 1 Output Drive Strength = Full
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200861000.0 ps INFO: Load Mode 1 ODT Rtt = 75 Ohm
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200861000.0 ps INFO: Load Mode 1 Additive Latency = 0
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200861000.0 ps INFO: Load Mode 1 OCD Program = OCD Exit
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200861000.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200861000.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200861000.0 ps INFO: Load Mode 1 Output Enable = Enabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200881000.0 ps INFO: Load Mode 0
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200881000.0 ps INFO: Load Mode 0 Burst Length = 4
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200881000.0 ps INFO: Load Mode 0 Burst Order = Sequential
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200881000.0 ps INFO: Load Mode 0 CAS Latency = 3
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200881000.0 ps INFO: Load Mode 0 Test Mode = Normal
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200881000.0 ps INFO: Load Mode 0 DLL Reset = Reset DLL
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200881000.0 ps INFO: Load Mode 0 Write Recovery = 3
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200881000.0 ps INFO: Load Mode 0 Power Down Mode = Fast Exit
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200901000.0 ps INFO: Precharge bank 0
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200901000.0 ps INFO: Precharge bank 1
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200901000.0 ps INFO: Precharge bank 2
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200901000.0 ps INFO: Precharge bank 3
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200916000.0 ps INFO: Refresh
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 200996000.0 ps INFO: Refresh
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201076000.0 ps INFO: Load Mode 0
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201076000.0 ps INFO: Load Mode 0 Burst Length = 4
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201076000.0 ps INFO: Load Mode 0 Burst Order = Sequential
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201076000.0 ps INFO: Load Mode 0 CAS Latency = 3
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201076000.0 ps INFO: Load Mode 0 Test Mode = Normal
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201076000.0 ps INFO: Load Mode 0 DLL Reset = Normal
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201076000.0 ps INFO: Load Mode 0 Write Recovery = 3
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201076000.0 ps INFO: Load Mode 0 Power Down Mode = Fast Exit
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201096000.0 ps INFO: Load Mode 1
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201096000.0 ps INFO: Load Mode 1 DLL Enable = Enabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201096000.0 ps INFO: Load Mode 1 Output Drive Strength = Full
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201096000.0 ps INFO: Load Mode 1 ODT Rtt = 75 Ohm
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201096000.0 ps INFO: Load Mode 1 Additive Latency = 0
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201096000.0 ps INFO: Load Mode 1 OCD Program = OCD Default
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201096000.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201096000.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201096000.0 ps INFO: Load Mode 1 Output Enable = Enabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201116000.0 ps INFO: Load Mode 1
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201116000.0 ps INFO: Load Mode 1 DLL Enable = Enabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201116000.0 ps INFO: Load Mode 1 Output Drive Strength = Full
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201116000.0 ps INFO: Load Mode 1 ODT Rtt = 75 Ohm
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201116000.0 ps INFO: Load Mode 1 Additive Latency = 0
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201116000.0 ps INFO: Load Mode 1 OCD Program = OCD Exit
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201116000.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201116000.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201116000.0 ps INFO: Load Mode 1 Output Enable = Enabled
DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task: at time 201116000.0 ps INFO: Initialization Sequence is complete


これがタイミングチャートだ。
ddr2_initialize_080120.png

これで初期化はうまく行った。
次は、もう大体できたがライト、リードのシミュレーションだ。
  1. 2008年01月20日 21:35 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

DDR2 SDRAMコントローラのシミュレーション時のバグ

DDR2 SDRAMは現在、DDR2 SDRAM(Micron MTH16M16-37E)のモデルをMicron社のMT47H16M16BG-37Eのページからダウンロードして、DDR2 SDRAMコントローラに接続し、
Veritakシミュレータでシミュレーションを行っている。
初期化の手順は”DDR2 SDRAM(Micron MTH16M16-37E)の初期化について”を参照して行っている。
そうしたところ、DDR2 SDRAMのモデルからエラーが出力された。

DDR2_SDRAMtest_tb.MT47H16M16_inst: at time 201881000.0 ps ERROR: Write Recovery = 2 is illegal @tCK(avg) = 5000.000000


これはモードレジスタをセットするときに、Write Recoveryの値をどうせ使わないからと、2にセットしているのだが、クロックサイクル5ns つまり200MHzではエラーだということのようだ。
確かに規格のtWRを見ると15ns なので3クロック必要だ。DDR2 SDRAMモデルはクロックサイクルを判別して、設定値が妥当かどうかもチェックしているようだ。すごくよくできていると思った。
DDR2 SDRAMモデルから下のようにいろいろなINFOも出てきて、とても役に立つ。
DDR2_Model_080118.png
  1. 2008年01月18日 05:27 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

PCI-X+SDR SDRAMテスト回路(続き)

PCI-X+SDR SDRAMテスト回路のシミュレーションが今度は本当にうまく行った。
SDR SDRAMのモデルはMicron社のVerilogモデルmt48lc16m16a2.vを使わせていただいています。
下の図はModelSim SEでシミュレーションしたところ。PCI-XからSDR SDRAMへの読み書きするところだ。
最初に4番地に0x55667788をPCI-Xターゲット・ライトで書き込む。これがピンクで囲ったところ。次にそのデータをSDR SDRAMに書き込む。それが緑で囲った部分。
オレンジで囲んだ部分が、同じ4番地からPCI-Xターゲット・リードでデータを読み出すトランザクション。SDR SDRAMのリードデータが用意できないので、一旦スプリット応答でトランザクションを終了している。
青で囲った部分でSDR SDRAMのリードコマンドを発行してdata_busにSDR SDRAMのリードしたデータが出力されている。出力データは左から2番目のフィールドに0x55667788XXXXXXXXと表示されている。 XXXXXXXXの部分は書き込まれていないのでXになっているようだ。CAS Latencyは3。
読み出したデータをスプリット完了でホストに通知しているのが黄色の部分。

#こちらのモデルのせいでスプリット完了のときのTRDY#がおかしいですが、それはご愛嬌ということで。。。
pcix2sdr_sdram_080115.png

今度はSTOP#(pcix_stop_b)もアサートされていない。大丈夫そう。。。

さらにISE9.1SP3でインプリメントして実際に確かめてみました。
そうするとLinux上からSDR SDRAMにシングル転送ですが、書き込み後読み出せることを確認できました。
下がホストPCからPCI-Xバス越しにボードのSDR SDRAMデータをリードしようとしてスプリット応答し、その後スプリット完了でデータを通知するときのチップスコープ波形です。
pcix2sdr_sdram_read_080115.png

スプリット完了で0x00001234というデータを返していますが、そのデータの下位8ビットがdata_bus(39:32)に現れています。
133MHzで(たぶん)SDR SDRAMに読み書きできました。よかった~。うれしいです。
でも、間違いということもあるので、オシロで動作周波数の確認を怠らないようにしないと。。。

2008/01/15:追記
SDRAMのクロックを”FPGA Editorの使い方3”を参考にテストポイントに配線してオシロで見てみた。そうしたら133MHzのクロックが確認できた。ちゃんと動作しているようだ。
  1. 2008年01月15日 15:14 |
  2. 基板のFPGA回路
  3. | トラックバック:0
  4. | コメント:0

ター菜

うちでは生協で食品を頼んでいる。それが月曜日に配達になるのだが、うちの奥さんがター菜という野菜を頼んで、配達されたようだ。
それが実に巨大で直径34cmもある。真ん中がへこんでいるので帽子としても使える。調子に乗って本当にかぶって写真を撮った。その写真は秘密だが、ター菜の全景写真を載せる。(うちの奥さんと娘もター菜といっしょに写真を取った)
tasai_080115.jpg

ひじょーに立派だ。
ちなみにター菜は中国の野菜だそうで、炒め物やおひたしにするとおいしい。皆さんもスーパーなどで見つけたら食べてみてはいかがだろうか?
  1. 2008年01月14日 20:29 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋まとめサイトとYahooグループ

FPGAの部屋のまとめサイトとFPGAの部屋のコンテンツに関する議論や質問用のYahooグループ”FPGAの部屋”を作って、ブログのトップに記載しました。
今までカテゴリの目次にまとめられていたものが、あまりアクセスがないようですし、わかりにくそうでした。
カテゴリ分けしたブログの記事へのリンクをWebサイトに掲載しました。自分でも記事を検索するときに使いやすくなった気がします。
Yahooグループ”FPGAの部屋”はコンテンツに関する議論や質問用に試しに作ってみました。これからの展開では削除したり、使わなくなったりということがある可能性があります。
  1. 2008年01月13日 09:53 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

Notepad++

今までVHDLやVerilogHDLを書くのにPeggyを使用してきたが、今度はフリーのエディタNotepad++を使うことにした。
今までSHIFT-JISの漢字コードを表示する方法がわからなかったのだが、geekletさんから表示する方法を教えてもらった。geekletさんありがとうございました。
現在バージョン4.7.2を使用しているが、その場合の日本語の表示方法はこうだ。
まずはメニューの 設定 から 言語スタイルの設定... を選択。
Notepad++_1_080111.png

スタイル設定ダイアログが出てくるので、Enable global fontをチェックし、フォントスタイルのフォント名に日本語フォント(私はMSゴシック)を設定し、保存して閉じる ボタンをクリック。
Notepad++_2_080111.png
これで日本語フォントが出るはず。
Notepad++は補完機能もある。予約語はCTRL+SPACE。自分で定義した信号名(signal)などはCTRL+SHIFT+SPACEで補完してくれる。
一番便利なのは、要らない部分をたためることだ。
例えば、下のprocess文を邪魔だと思えば行番号の右側の四角の中の-をクリックするとそこをたたむことができる。
Notepad++_3_080111.png

たたむとこんな風になる。
Notepad++_4_080111.png


Peggyのように複数起動できたり、ウインドウを分割できたりすれば完璧なのだが、まだやり方がわからない。とりあえずメインのエディタとして使ってみようと思う。
それにNotepad++はプラグインがつけられて、いろいろ機能が拡張できる。今、気に入っているのはバイナリエディタとしても使えることだ。いろいろ使ってみたい。
実行機能もあるので、ModelSimでコンパイルするという機能も使えるかも?
  1. 2008年01月11日 15:51 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

PCI-X+SDR SDRAMテスト回路

PCI-X+SDR SDRAMテスト回路のシミュレーションがようやくうまくいくようになった。
SDR SDRAMのモデルはMicron社のVerilogモデルmt48lc16m16a2.vを使わせていただいています。
下の図はModelSim SEでシミュレーションしたところ。PCI-XからSDR SDRAMへの読み書きするところだ。
最初に4番地に0x55667788をPCI-Xターゲット・ライトで書き込む。これがピンクで囲ったところ。次にそのデータをSDR SDRAMに書き込む。それが緑で囲った部分。
オレンジで囲んだ部分が、同じ4番地からPCI-Xターゲット・リードでデータを読み出すトランザクション。SDR SDRAMのリードデータが用意できないので、一旦スプリット応答でトランザクションを終了している。
青で囲った部分でSDR SDRAMのリードコマンドを発行してdata_busにSDR SDRAMのリードしたデータが出力されている。出力データは左から2番目のフィールドに0x55667788XXXXXXXXと表示されている。XXXXXXXXの部分は書き込まれていないのでXになっているようだ。CAS Latencyは3。
読み出したデータをスプリット完了でホストに通知しているのが黄色の部分。
pcix2sdr_sdram_070109.png

大体シミュレーションはOKそうなので、インプリメントして確かめてみようと思う。

2007/01/12 追記:
インプリメントしてみたところ、間違っていました。STOP#がアサートされていて、TRDY#が1にドライブされていませんでした。ただいま修正中です。
テストモジュールということで、ろくなドキュメントを書かず(ブログをドキュメント代わりに)に作っていたので、その付けがきています。やはりドキュメントはしっかり書かないとだめですね。身にしみました。
  1. 2008年01月09日 15:33 |
  2. 基板のFPGA回路
  3. | トラックバック:0
  4. | コメント:0

FPGAやツールの使い方の記事

なつたんさんの2008/01/07の今日の日記で書かれていたが、”FPGAの部屋で話題になっていた、同期リセットのようなネタも面白いけど仕事の内容を避けるのが難しい。”そうである。
やはり、お仕事でやっている方(私もそうだが)はお仕事の内容をばらしてしまうので、その辺の内容を記事に書くのが難しいのだろう。
私はばらしまくりのような気もするが、一応、全ソースコードをさらしている訳でもないので良いだろう。Xilinxのツールを使用して回路を構成する上での方向性や困ったことは共通のデータベースになってくれれば良いと思う。
大学の工学部も人気がなくなっているという報道もされているし、電子工作というかハードウェアまで手を出す人が少なくなっている気がするので、私のブログがFPGAを使ったハードウェアの振興に少しでも役に立てば良いな~と思っている。

GoogleグループにFPGAの部屋を作ってみました。が、まだ、どの様に使うかは決めていません。
  1. 2008年01月08日 12:29 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

ブログエディタ

今日、ブログを書いていたらブラウザの操作をミスってしまって、書いていたブログが消えて、すごい悔しい思いをした。それで、ブログエディタを試してみた。
BlogWriteは軽いし良かったのだが、 ブラウザで見たときに改行がbrタグになっていた。ブラウザで編集したいときもあるのであきらめた。
xfyブログエディタは重すぎて使えない。。。
何かFC2に最適な、お勧めのブログエディタがあったら教えてください。

2007/01/07:ubicast Blogger も試してみたのだが、やはり追記というか、追加書き込みすると投稿した日にちが変わってしまうので、目次のブログを書くときに都合が悪い。
結局、FireFoxに、テキストを選択したら、すぐにクリップボードにコピーするアドインを入れて自衛しながら、ブラウザのブログ入力ツールを使うことにした。

  1. 2008年01月07日 20:21 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:5

DDR2 SDRAM(Micron MTH16M16-37E)の初期化について

Suzaku-V用DDR2 SDRAMコントローラを作るにあたって、DDR2 SDRAM(Micron MTH16M16-37E)の初期化手順をまとめておこうと思う。
最初の電源ONからの手順の一番最初はSuzaku-Vの方でやってくれていると信じる。(パワーONリセットもあることだし。。。)

1.電源とクロックが安定した(リセットが解除されてから)200us後で、CKEを1にしてNOPまたはDESECTコマンドを入れる
2.400us待って全バンク・プリチャージコマンドを入れる
3.EMR(2)レジスタに値をセット(オール0)
4.EMR(3)レジスタに値をセット(オール0)
5.EMRレジスタに値をセット(DLLをイネーブル)。
 Output Enable, RDQS Disable, DQS# Enable, OCD = "000", RTT = 75Ω, Posted CAS = 0 (Posted CASは使用しない), Output Drive Strength = Full Strength, DLL Enable
  値は 0_0000_0000_0100
6.MRレジスタに値をセット(DLLをリセット)。
  PD Mode = Fast Exit, Write Recovery = 3 (オート・プリチャージコマンドは使用しない), DLL Rest = Yes, TM = Normal, CAS# Latency = 3, Burst Type = Sequential, Burst Length = 4
  値は 0_0011_0011_0010
7.全バンク・プリチャージ・コマンドを発行。
8.リフレッシュ・コマンドを2回発行。
9.MRレジスタに値をセット(DLLリセットなし)。
  PD Mode = Fast Exit, Write Recovery = 3 (オート・プリチャージコマンドは使用しない), DLL Rest = No, TM = Normal, CAS# Latency = 3, Burst Type = Sequential, Burst Length = 4
  値は 0_0010_0011_0010
10.EMRレジスタに値をセット(OCD Default)
   Output Enable, RDQS Disable, DQS# Enable, OCD = "111", RTT = 75&;, Posted CAS = 0 (Posted CASは使用しない), Output Drive Strength = Full Strength, DLL Enable
   値は 0_0011_1000_0100
11.EMRレジスタに値をセット(OCD exit)
   Output Enable, RDQS Disable, DQS# Enable, OCD = "000", RTT = 75&;, Posted CAS = 0 (Posted CASは使用しない), Output Drive Strength = Full Strength, DLL Enable
   値は 0_0000_0000_0100

6.でMRレジスタに値をセット(DLLをリセット)してから200クロックしてから正常の操作ができるようになるそうである。
このようにDDR2はDDRよりも面倒だ。

2008/01/18 追記:
MRレジスタに値をセットするところで値を2から3に変更。理由は”DDR2 SDRAMコントローラのシミュレーション時のバグ”を参照。
  1. 2008年01月06日 16:58 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

2008年の初詣

今日は高校受験の合格祈願のために大生郷天満宮に初詣に行ってきた。大生郷天満宮は去年も初詣で行ってきた。
今年はじいちゃん、ばあちゃんも一緒に連れていた。
私と息子以外は近所のお店で甘酒を飲んだ。どうも、私と息子は甘酒が嫌いなのだ。どうも飲むと、あるものを連想してしまうので、飲めないのだ。代わりにミルクティーを飲んだ。こっちのほうがよほどおいしいと思うが。。。
その後、近くの水海道風土博物館坂野家住宅に行ってきた。大地主の住宅を保存したもののようだ。かやぶきの大邸宅で、土間に馬屋やお茶の乾燥所などがある。かまども4つあり、本当に広い土間だった。でも、冬は本当に寒かっただろう。。。あまり暮らしたくないと思った。
一番、すごいと思ったのは窓ガラスだった。斜めから見るとガラスの厚さが不均等なのでゆがんで見える。昔のガラス製造技術が未熟だったため、そのようなガラスなのだそうだ。このガラスは一見に値すると言えそうだ。
sakanoke_070104.jpg
  1. 2008年01月04日 21:51 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Sukaku-VのLEDテスト回路

Sukaku-VのLEDテスト回路を作ってみた。
Veritakでシミュレーションをすると動いているようなので、ISEでインプリメントしてみた。
XSTでウォーニングが出たので、修正を加えてSukaku-Vにインプリメントしたら動作した。
動作はSW1で7セグLEDのカウントアップ、SW2でカウントアップする7セグLEDの位置を変更。SW3はLEDのカウントをアップするスイッチだ。
下の写真は7セグLEDに123と表示して、LEDは'A'、"1010"を表示している。
これで、表示回路が大体できたので、DDR2-SDRAMコントローラの方をやってみたい。
SuzakuV_disp_070102.jpg
  1. 2008年01月02日 19:49 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:4

書初め

今日は、小学校の娘が書初めをした。”お正月”というお題だった。
自己流だが書を書くのが好きなので、私も書いてみた。
自分では気に入っているのだが、高校のときに書道で習っただけだ。そのうち、書道教室にでも行こうかと思っている。
osyougatu_070102.jpg
  1. 2008年01月02日 19:37 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

あけましておめでとうございます

new_year_080101.jpg

あけましておめでとうございます。今年もよろしくお願いします。
2008年の初日の出です。午前7時でした。
今年もブログを書こうと思います。よろしくお願いいたします。
とりあえず、冬休み中にSuzaku-Vをコンフィグしてみたいと思っています。
  1. 2008年01月01日 07:14 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:4