|
/*------------------------------------
??????? ?? SDRAM?????
?????? ?????��???????????1????????????��?��????bank???
2??????tRCD???????????��?????��?????????a[10]?????????
3?????????????????????????
--2015-10-08
-------------------------------------*/
`include "sdram_head.v"
module sdr_read(capture_clk, sys_clk, rd_rst_n, int_addr, rd_data, rd_done, rd_bus, sdr_dq, valid);
input sys_clk;
input capture_clk;
input rd_rst_n;
input [24:0] int_addr;
input [15:0] sdr_dq;
output reg rd_done;
output reg [15:0] rd_data;
output reg [19:0] rd_bus;
output reg valid;
localparam s0 = 3'b000;
localparam s1 = 3'b001;
localparam s2 = 3'b010;
localparam s3 = 3'b011;
localparam s4 = 3'b100;
localparam s5 = 3'b101;
reg [2:0] state;
reg [9:0] count;
// reg load_h;
// reg load_l;
reg [15:0] cap_dq;
reg [15:0] sys_dq;
reg [15:0] sys_dq_int;
always @ (posedge capture_clk)
begin : capture_reg
if (!rd_rst_n)
cap_dq <= 16'd0;
else
cap_dq <= sdr_dq;
end
always @ (posedge sys_clk)
begin : sync_reg
if (!rd_rst_n)
begin
sys_dq <= 16'd0;
sys_dq_int <= 16'd0;
end
else
begin
sys_dq_int <= cap_dq;
sys_dq <= sys_dq_int;
end
end
always @ (posedge sys_clk)
begin : read_fsm_1s
if (!rd_rst_n)
begin
rd_bus[19:16] <= `NOP;
rd_bus[15] <= 1;
rd_bus[14:0] <= 0;
count <= 0;
rd_done <=0;
state <= s0;
rd_data <= 0;
valid <= 0;
end
else
case (state)
s0 : begin
rd_bus[19:16] <= `ACT; //???????????
rd_bus[15] <= 1;
rd_bus[14:13] <= int_addr[24:23]; //????bank???
rd_bus[12:0] <= int_addr[22:10]; //?????��??
state <= s1;
end
s1 : if (count < `tRCD-1)
begin
rd_bus[19:16] <= `NOP;
count <= count + 1'b1;
end
else
begin
rd_bus[19:16] <= `RD;
rd_bus[14:13] <= int_addr[24:23]; //Bank???
rd_bus[10] <= 1; //a10=1?????????????????????????????????
rd_bus[9:0] <= int_addr[9:0]; //?��??
count <= 0;
state <= s2;
end
s2 : if (count < 3)
begin
rd_bus[19:16] <= `NOP;
count <= count + 1'b1;
end
else
begin
count <= 0;
state <= s3;
end
s3 : if (count == 0)
begin
valid <= 1;
rd_data <= sys_dq;
count <= count + 1'b1;
end
else if (count > 0 && count < `RD_SIZE)
begin
valid <= 1;
rd_data <= sys_dq;
count <= count + 1'b1;
end
else
begin
rd_bus[19:16] <= `BT; //????????????????????????
count <= 0;
valid <= 1;
rd_data <= sys_dq;
state <= s4;
end
// s3 : if (count < `RD_SIZE)
// begin
// valid <= 1;
// rd_data <= sys_dq;
// count <= count + 1;
// end
// else
// begin
// rd_bus[19:16] <= `BT; //????????????????????????
// count <= 0;
// valid <= 1;
// rd_data <= sys_dq;
// state <= s4;
// end
s4 : begin ////???????????????5????��??????4
if (count < `RD_DATA_LY) //????3?????????sdram??????????�o?????????????
begin
count <= count + 1'b1;
valid <= 1;
rd_data <= sys_dq;
rd_bus[19:16] <= `NOP;
end
else
begin
count <= 0;
valid <= 0;
rd_bus[19:16] <= `PRECHANGE;
state <= s5;
end
end
s5 : begin
rd_bus[19:16] <= `NOP;
rd_data <= 0;
rd_done <= 1;
end
default : rd_bus[19:16] <= `NOP;
endcase
end
endmodule |
|