always @ (posedge clk or negedge reset )
begin
if(reset==0)
begin
NOP_counter<=19200;
ref_req<=0;
rr<=0;
start<=1;
end
else
begin
if(NOP_counter==1)
begin ;NOP_counter<=800;if(rr==0) begin rr<=rr+1; start<=1; end else start<=0;end
else begin NOP_counter<=NOP_counter-1; end
ref_req <= ((NOP_counter == 1) | ref_req) & ~act_ref_req & init_done;
end
end
always@(posedge clk or negedge reset )
begin
if(reset==0)
begin
i_addr<={12{1'b1}};
counter<=0;
i_state<=3'b000;
i_next<=3'b000;
r<=0;
end
else
if(!init_done && (start==0))
case(i_state)
// qu xiao xin pian
3'b000:
begin i_cmd<=4'b1111;i_state<=3'b001;end
// precharge
3'b001: begin i_cmd<=4'b0010;i_state<=3'b011;i_next<=3'b010;end
//auto_charge
3'b010:begin i_cmd<=4'b0001;i_state<=3'b011;counter<=3;
if(r<1) begin i_next<=2; r<=r+1;end
else i_next<=7;
end
//NOP
3'b011:begin i_cmd<=4'b0111; if(counter > 1) counter<=counter-1; else i_state<=i_next; end
//
3'b101:begin i_state<=3'b101; end
// mo shi she ding
3'b111:begin i_cmd<=4'b0000; i_state<=3'b011; i_next<=3'b101; counter<=4;i_addr={12{1'b0}}; end
default :i_state<=3'b000;
endcase
end
always @(posedge clk or negedge reset)
begin
if(reset==0)
init_done<=0;
else
if(i_state==5) init_done<=1;
end
always @(posedge clk )
begin
if(reset==0)
begin
m_state<=0;
m_next<=0;
oe<=0;
m_count<=0;
act_ref_req<=0;
end
else
case(m_state)
// idle
0: if(init_done)
begin
if(ref_req==1)
begin m_state<=6; end
else
begin
m_state<=1;
end
end
// row active
1:
begin
m_state<=2;m_cmd<=4'b0011; oe <= 1'b0;bank<=m_bank;addr<=m_bus_addr[20:9]; m_next<=wr?3:4; m_count<=2;//*********************** tRC
end
//read
3:begin m_cmd <= {{{1'b0}},3'h5}; oe <= 1'b0;
if (ref_req)
begin
m_state <= 6;
end
else
begin
addr <= {4'b0100,m_bus_addr[7:0]};
out_data <= dq;
m_state <=2;
m_next<=1;
m_count<=2;
end
end
//write
4:begin m_cmd <= {{{1'b0}},3'h4};
if (ref_req)
begin
m_state <= 6;
end
else
begin
addr <={4'b0100,m_bus_addr[7:0]};
m_state <=2;
m_next<=1;
oe <= 1'b1;
end
end
//ref
6:begin oe <= 1'b0; m_state <= 7; //*********************************************tRP
addr <= {12{1'b1}};//
// precharge all if arf, else precharge csn_decode
if (ref_req)
m_cmd <= {{1{1'b0}},3'h2};
else
m_cmd <= {{{1'b0}},3'h2};
end
// ref_act
7:begin
act_ref_req <= 1'b1;
m_state <= 2;
m_cmd <= {{1{1'b0}},3'h1};
m_count <= 3;
m_next <= 0;
end
default: begin
m_state <= m_state;
m_cmd <= 4'b1111;
oe <= 1'b0;
end // default
endcase