OpenCores
URL https://opencores.org/ocsvn/wbddr3/wbddr3/trunk

Subversion Repositories wbddr3

[/] [wbddr3/] [trunk/] [rtl/] [wbddrsdram.v] - Diff between revs 11 and 12

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 11 Rev 12
Line 80... Line 80...
                o_ddr_cs_n, o_ddr_ras_n, o_ddr_cas_n, o_ddr_we_n,
                o_ddr_cs_n, o_ddr_ras_n, o_ddr_cas_n, o_ddr_we_n,
                o_ddr_dqs, o_ddr_dm, o_ddr_odt, o_ddr_bus_oe,
                o_ddr_dqs, o_ddr_dm, o_ddr_odt, o_ddr_bus_oe,
                o_ddr_addr, o_ddr_ba, o_ddr_data, i_ddr_data);
                o_ddr_addr, o_ddr_ba, o_ddr_data, i_ddr_data);
        parameter       CKREFI4 = 13'd6240, // 4 * 7.8us at 200 MHz clock
        parameter       CKREFI4 = 13'd6240, // 4 * 7.8us at 200 MHz clock
                        CKRFC = 320,
                        CKRFC = 320,
 
                        CKWR = 3,
                        CKXPR = CKRFC+5+2; // Clocks per tXPR timeout
                        CKXPR = CKRFC+5+2; // Clocks per tXPR timeout
        input                   i_clk, i_reset;
        input                   i_clk, i_reset;
        // Wishbone inputs
        // Wishbone inputs
        input                   i_wb_cyc, i_wb_stb, i_wb_we;
        input                   i_wb_cyc, i_wb_stb, i_wb_we;
        input           [25:0]   i_wb_addr;
        input           [25:0]   i_wb_addr;
Line 156... Line 157...
 
 
        wire    w_this_closing_bank, w_this_opening_bank,
        wire    w_this_closing_bank, w_this_opening_bank,
                w_this_maybe_close, w_this_maybe_open,
                w_this_maybe_close, w_this_maybe_open,
                w_this_rw_move;
                w_this_rw_move;
        reg     last_closing_bank, last_opening_bank;
        reg     last_closing_bank, last_opening_bank;
 
        wire    w_need_close_this_bank, w_need_open_bank,
 
                w_r_valid, w_s_valid;
//
//
// tWTR = 7.5
// tWTR = 7.5
// tRRD = 7.5
// tRRD = 7.5
// tREFI= 7.8
// tREFI= 7.8
// tFAW = 45
// tFAW = 45
Line 338... Line 341...
 
 
        wire    w_precharge_all;
        wire    w_precharge_all;
        reg     banks_are_closing, all_banks_closed;
        reg     banks_are_closing, all_banks_closed;
        reg     [3:0]    bank_status     [0:7];
        reg     [3:0]    bank_status     [0:7];
        reg     [13:0]   bank_address    [0:7];
        reg     [13:0]   bank_address    [0:7];
 
        reg     [3:0]    bank_wr_ck      [0:7]; // tWTR
 
        reg             bank_wr_ckzro   [0:7]; // tWTR
 
 
 
        wire    [3:0]    write_recycle_clocks;
 
        assign  write_recycle_clocks = CKWR+4+4;
 
 
        always @(posedge i_clk)
        always @(posedge i_clk)
        begin
        begin
                bank_status[0] <= { bank_status[0][2:0], bank_status[0][0] };
                bank_status[0] <= { bank_status[0][2:0], bank_status[0][0] };
                bank_status[1] <= { bank_status[1][2:0], bank_status[1][0] };
                bank_status[1] <= { bank_status[1][2:0], bank_status[1][0] };
Line 357... Line 365...
                                        &&(bank_status[3][2:0] == 3'b00)
                                        &&(bank_status[3][2:0] == 3'b00)
                                        &&(bank_status[4][2:0] == 3'b00)
                                        &&(bank_status[4][2:0] == 3'b00)
                                        &&(bank_status[5][2:0] == 3'b00)
                                        &&(bank_status[5][2:0] == 3'b00)
                                        &&(bank_status[6][2:0] == 3'b00)
                                        &&(bank_status[6][2:0] == 3'b00)
                                        &&(bank_status[7][2:0] == 3'b00);
                                        &&(bank_status[7][2:0] == 3'b00);
 
 
 
                bank_wr_ck[0] <= (|bank_wr_ck[0])?(bank_wr_ck[0]-4'h1):4'h0;
 
                bank_wr_ck[1] <= (|bank_wr_ck[1])?(bank_wr_ck[1]-4'h1):4'h0;
 
                bank_wr_ck[2] <= (|bank_wr_ck[2])?(bank_wr_ck[2]-4'h1):4'h0;
 
                bank_wr_ck[3] <= (|bank_wr_ck[3])?(bank_wr_ck[3]-4'h1):4'h0;
 
                bank_wr_ck[4] <= (|bank_wr_ck[4])?(bank_wr_ck[4]-4'h1):4'h0;
 
                bank_wr_ck[5] <= (|bank_wr_ck[5])?(bank_wr_ck[5]-4'h1):4'h0;
 
                bank_wr_ck[6] <= (|bank_wr_ck[6])?(bank_wr_ck[6]-4'h1):4'h0;
 
                bank_wr_ck[7] <= (|bank_wr_ck[7])?(bank_wr_ck[7]-4'h1):4'h0;
 
 
 
                bank_wr_ckzro[0] <= (bank_wr_ck[0][3:1]==3'b00);
 
                bank_wr_ckzro[1] <= (bank_wr_ck[1][3:1]==3'b00);
 
                bank_wr_ckzro[2] <= (bank_wr_ck[2][3:1]==3'b00);
 
                bank_wr_ckzro[3] <= (bank_wr_ck[3][3:1]==3'b00);
 
                bank_wr_ckzro[4] <= (bank_wr_ck[4][3:1]==3'b00);
 
                bank_wr_ckzro[5] <= (bank_wr_ck[5][3:1]==3'b00);
 
                bank_wr_ckzro[6] <= (bank_wr_ck[6][3:1]==3'b00);
 
                bank_wr_ckzro[7] <= (bank_wr_ck[7][3:1]==3'b00);
 
 
 
                if (w_this_rw_move)
 
                        bank_wr_ck[rw_cmd[16:14]] <= (rw_cmd[`DDR_WEBIT])? 4'h0
 
                                : write_recycle_clocks;
 
 
                if (reset_override)
                if (reset_override)
                begin
                begin
                        bank_status[0][0] <= 1'b0;
                        bank_status[0][0] <= 1'b0;
                        bank_status[1][0] <= 1'b0;
                        bank_status[1][0] <= 1'b0;
                        bank_status[2][0] <= 1'b0;
                        bank_status[2][0] <= 1'b0;
Line 467... Line 498...
        assign  w_ckREFRst[12: 0] = CKRFC-2-12;
        assign  w_ckREFRst[12: 0] = CKRFC-2-12;
        assign  w_ckREFRst[16:13] = 4'h0;
        assign  w_ckREFRst[16:13] = 4'h0;
 
 
        always @(posedge i_clk)
        always @(posedge i_clk)
                if (reset_override)
                if (reset_override)
                        refresh_cmd <= { 3'h0, `DDR_NOOP, w_ckREFIn };
                        refresh_cmd <= { `DDR_NOOP, w_ckREFIn };
                else if (refresh_ztimer)
                else if (refresh_ztimer)
                        refresh_cmd <= refresh_instruction[20:0];
                        refresh_cmd <= refresh_instruction[20:0];
        always @(posedge i_clk)
        always @(posedge i_clk)
                if (reset_override)
                if (reset_override)
                        need_refresh <= 1'b0;
                        need_refresh <= 1'b0;
Line 604... Line 635...
 
 
                        // s_match <= w_s_match;
                        // s_match <= w_s_match;
                end
                end
        end
        end
 
 
        wire    w_need_close_this_bank, w_need_open_bank,
 
                w_r_valid, w_s_valid;
 
        assign  w_need_close_this_bank = (r_pending)&&(bank_status[r_bank][0])
        assign  w_need_close_this_bank = (r_pending)&&(bank_status[r_bank][0])
 
                        &&(bank_wr_ckzro[r_bank])
                        &&(r_row != bank_address[r_bank])
                        &&(r_row != bank_address[r_bank])
                        ||(pipe_stall)&&(s_pending)&&(bank_status[s_bank][0])
                        ||(pipe_stall)&&(s_pending)&&(bank_status[s_bank][0])
                                &&(s_row != bank_address[s_bank]);
                                &&(s_row != bank_address[s_bank]);
        assign  w_need_open_bank = (r_pending)&&(bank_status[r_bank][1:0]==2'b00)
        assign  w_need_open_bank = (r_pending)&&(bank_status[r_bank][1:0]==2'b00)
                        ||(pipe_stall)&&(s_pending)&&(bank_status[s_bank][1:0]==2'b00);
                        ||(pipe_stall)&&(s_pending)&&(bank_status[s_bank][1:0]==2'b00);
        assign  w_r_valid = (!need_refresh)&&(r_pending)
        assign  w_r_valid = (!need_refresh)&&(r_pending)
                        &&(bank_status[r_bank][3])
                        &&(bank_status[r_bank][3])
                        &&(bank_address[r_bank]==r_row)
                        &&(bank_address[r_bank]==r_row)
 
                        &&((r_we)||(bank_wr_ckzro[r_bank]))
                        &&(!bus_active[0]);
                        &&(!bus_active[0]);
        assign  w_s_valid = (!need_refresh)&&(s_pending)
        assign  w_s_valid = (!need_refresh)&&(s_pending)
                        &&(bank_status[s_bank][3])
                        &&(bank_status[s_bank][3])
                        &&(bank_address[s_bank]==s_row)
                        &&(bank_address[s_bank]==s_row)
 
                        &&((r_we)||(bank_wr_ckzro[s_bank]))
                        &&(!bus_active[0]);
                        &&(!bus_active[0]);
 
 
        always @(posedge i_clk)
        always @(posedge i_clk)
        begin
        begin
                need_close_bank <= (w_need_close_this_bank)
                need_close_bank <= (w_need_close_this_bank)
Line 630... Line 662...
                                &&(!need_close_bank)
                                &&(!need_close_bank)
                                &&(!w_this_closing_bank)&&(!last_closing_bank);
                                &&(!w_this_closing_bank)&&(!last_closing_bank);
 
 
                maybe_close_next_bank <= (r_pending)
                maybe_close_next_bank <= (r_pending)
                        &&(bank_status[r_nxt_bank][0])
                        &&(bank_status[r_nxt_bank][0])
 
                        &&(bank_wr_ckzro[r_nxt_bank])
                        &&(r_nxt_row != bank_address[r_nxt_bank])
                        &&(r_nxt_row != bank_address[r_nxt_bank])
                        &&(!w_this_maybe_close)&&(!last_maybe_close);
                        &&(!w_this_maybe_close)&&(!last_maybe_close);
 
 
                close_bank_cmd <= { `DDR_PRECHARGE, r_bank, r_row[13:11], 1'b0, r_row[9:0] };
                close_bank_cmd <= { `DDR_PRECHARGE, r_bank, r_row[13:11], 1'b0, r_row[9:0] };
                maybe_close_cmd <= { `DDR_PRECHARGE, r_nxt_bank, r_nxt_row[13:11], 1'b0, r_nxt_row[9:0] };
                maybe_close_cmd <= { `DDR_PRECHARGE, r_nxt_bank, r_nxt_row[13:11], 1'b0, r_nxt_row[9:0] };

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.