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

Subversion Repositories sparc64soc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /sparc64soc/trunk/WB2ALTDDR3
    from Rev 2 to Rev 3
    Reverse comparison

Rev 2 → Rev 3

/dram_wb.v
56,6 → 56,8
output [ 7:0] ddr3_dm,
 
output phy_init_done,
output [ 7:0] fifo_used,
input dcm_locked,
input sysrst
62,7 → 64,6
);
 
wire [255:0] rd_data_fifo_out;
reg [255:0] rd_data_cache;
reg [ 23:0] rd_addr_cache;
wire [ 71:0] wr_dout;
wire [ 31:0] cmd_out;
69,14 → 70,8
reg wb_stb_i_d;
reg [ 31:0] mask_data;
 
wire push_tran;
wire fifo_read;
wire fifo_empty;
reg push_tran_d;
reg fifo_read_d;
reg fifo_empty_d;
 
 
wire [13:0] parallelterminationcontrol;
wire [13:0] seriesterminationcontrol;
 
171,6 → 166,7
assign trig0[254:239]=0;
 
reg fifo_full_d;
reg written;
 
dram_fifo fifo(
.aclr(ddr_rst),
179,29 → 175,76
.rdclk(ddr_clk),
 
.data({wb_sel_i,wb_dat_i,wb_we_i,wb_adr_i[33:3]}),
.wrreq(wb_cyc_i && wb_stb_i && (!wb_stb_i_d || fifo_full_d) && !fifo_full && !(rd_addr_cache==wb_adr_i[28:5] && !wb_we_i)),
.wrreq(wb_cyc_i && wb_stb_i && (!wb_stb_i_d || (fifo_full_d && !written)) && !fifo_full && !(rd_addr_cache==wb_adr_i[28:5] && !wb_we_i)),
.wrfull(fifo_full),
 
.rdreq(fifo_read),
.q({wr_dout,cmd_out}),
.wrusedw(fifo_used),
.rdempty(fifo_empty)
);
 
assign fifo_read=cmd_out[31] ? push_tran:rd_data_valid;
`define DDR_IDLE 3'b000
`define DDR_WRITE_1 3'b001
`define DDR_WRITE_2 3'b010
`define DDR_READ_1 3'b011
`define DDR_READ_2 3'b100
 
reg dram_ready_d;
reg [2:0] ddr_state;
reg push_tran;
reg fifo_read;
 
always @(posedge ddr_clk)
begin
fifo_empty_d<=fifo_empty;
fifo_read_d<=fifo_read;
dram_ready_d<=dram_ready;
fifo_full_d<=fifo_full;
end
always @(posedge ddr_clk or posedge ddr_rst)
if(ddr_rst)
begin
ddr_state<=`DDR_IDLE;
fifo_read<=0;
push_tran<=0;
rd_data_valid_stb<=0;
end
else
case(ddr_state)
`DDR_IDLE:
if(!fifo_empty && dram_ready)
begin
push_tran<=1;
if(cmd_out[31])
begin
ddr_state<=`DDR_WRITE_1;
fifo_read<=1;
end
else
ddr_state<=`DDR_READ_1;
end
`DDR_WRITE_1:
begin
push_tran<=0;
fifo_read<=0;
ddr_state<=`DDR_WRITE_2; // Protect against FIFO empty signal latency
end
`DDR_WRITE_2:
ddr_state<=`DDR_IDLE;
`DDR_READ_1:
begin
push_tran<=0;
if(rd_data_valid)
begin
rd_data_valid_stb<=1;
fifo_read<=1;
ddr_state<=`DDR_READ_2;
end
end
`DDR_READ_2:
begin
fifo_read<=0;
if(wb_ack_d1) // Enought delay to protect against FIFO empty signal latency
begin
rd_data_valid_stb<=0;
ddr_state<=`DDR_IDLE;
end
end
endcase
 
// Push transaction to controller FIFO
assign push_tran=!fifo_empty && dram_ready && (fifo_empty_d || fifo_read_d || !dram_ready_d);
 
reg rd_data_valid_stb;
reg rd_data_valid_stb_d1;
reg rd_data_valid_stb_d2;
235,9 → 278,15
rd_data_valid_stb_d2<=rd_data_valid_stb_d1;
rd_data_valid_stb_d3<=rd_data_valid_stb_d2;
rd_data_valid_stb_d4<=rd_data_valid_stb_d3;
fifo_full_d<=fifo_full;
if(wb_ack_o)
written<=0;
else
if(!fifo_full && fifo_full_d)
written<=1;
end
 
assign wb_ack_o=wb_we_i ? (wb_cyc_i && wb_stb_i && !fifo_full):rd_data_valid_stb_d2 && !rd_data_valid_stb_d3 || (!wb_we_i && rd_addr_cache==wb_adr_i[28:5]);
assign wb_ack_o=wb_we_i ? (wb_cyc_i && wb_stb_i && !fifo_full):(rd_data_valid_stb_d2 && !rd_data_valid_stb_d3) || (rd_addr_cache==wb_adr_i[28:5]);
 
always @(posedge ddr_clk)
begin
244,13 → 293,7
wb_ack_d<=wb_ack_o;
wb_ack_d1<=wb_ack_d;
if(rd_data_valid)
begin
rd_data_fifo_out_d<=rd_data_fifo_out;
rd_data_valid_stb<=1;
end
else
if(wb_ack_d1)
rd_data_valid_stb<=0;
rd_data_fifo_out_d<=rd_data_fifo_out;
end
endmodule

powered by: WebSVN 2.1.0

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