FC2カウンター FPGAの部屋 2008年01月21日
FC2ブログ

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

FPGAの部屋

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

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