FC2カウンター FPGAの部屋 VeritakでのDDR2 SDRAMコントローラのシミュレーション2(Read, Write)
FC2ブログ

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

FPGAの部屋

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

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

コメント

コメントの投稿


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

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