📄 sdr_sig.v
字号:
`timescale 1ns/100ps
`include "sdr_par.v"
module sdr_sig(
//input
clk,
rst_n,
i_state,
c_state,
sys_addr,
//output
sdr_CKE, // sdr clock enable
sdr_CSn, // sdr chip select
sdr_RASn, // sdr row address
sdr_CASn, // sdr column select
sdr_WEn, // sdr write enable
sdr_BA, // sdr bank address
sdr_DMQ, // sdr dmq
sdr_ADDR // sdr address
);
//-------------io port declare------------------
input clk;
input rst_n;
input[2:0] i_state;
input[3:0] c_state;
input[21:0] sys_addr;
//-----signal connect to sdram hardware---------
output reg sdr_CKE;
output reg sdr_CSn;
output reg sdr_RASn;
output reg sdr_CASn;
output reg sdr_WEn;
output reg[1:0] sdr_BA;
output reg[1:0] sdr_DMQ;output reg[11:0]sdr_ADDR;
//----parameter declare------------
parameter Tp = 2;
`define sdr_COMMAND {sdr_CSn, sdr_RASn, sdr_CASn, sdr_WEn}
//----varibale declare-------------
//--------------main code start-----------------
always@(posedge clk)
begin
if(!rst_n)
begin
`sdr_COMMAND<= #Tp `INHIBIT;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b11;
sdr_BA <= #Tp 2'b11;
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
else
begin
//-----to handle the init state machine-------
case(i_state)
`i_NOP:
begin
`sdr_COMMAND<= #Tp `NOP;
sdr_CKE <= #Tp 1'b1; //初始化要求
sdr_DMQ <= #Tp 2'b11; //初始化要求
sdr_BA <= #Tp 2'b11;
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
`i_tRP,
`i_tRFC,
`i_tMRD:
begin
`sdr_COMMAND<= #Tp `NOP;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00; //清除信号,允许输入输出
sdr_BA <= #Tp 2'b11;
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
`i_PRE:
begin
`sdr_COMMAND<= #Tp `PRECHARGE;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00;
sdr_BA <= #Tp 2'b11;
//A10=1,so pre-charge all banks
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
`i_AR:
begin
`sdr_COMMAND<= #Tp `AUTO_REFRESH;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00;
sdr_BA <= #Tp 2'b11;
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
`i_MRS:
begin
`sdr_COMMAND<= #Tp `LOAD_MODE_REGISTER;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00;
sdr_BA <= #Tp 2'b00; //auto refresh need
sdr_ADDR <= #Tp {
2'b00, //A11,A10
1'b0, //A9 burst read and write
2'b00, //A8,A7
3'b010, //A6,A5,A4 cas latency=2
1'b0, //A3 sequential
3'b111 //full page operation
};
end
`i_ready:
begin
//-----------------to handle the cmd state machine----------------
case(c_state)
`c_tRFC,
`c_RW_tRFC,
`c_tRCD,
`c_RD_DATA,
`c_R_tRP,
`c_WR_DATA,
`c_W_tRP,
`c_IDLE:
begin
`sdr_COMMAND<= #Tp `NOP;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00; //清除信号,允许输入输出
sdr_BA <= #Tp 2'b11;
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
`c_AR,
`c_RW_AR:
begin
`sdr_COMMAND<= #Tp `AUTO_REFRESH;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00;
sdr_BA <= #Tp 2'b11;
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
`c_ACTIVE:
begin
//-----------send row addr to sdram----------
`sdr_COMMAND<= #Tp `ACTIVE;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00;
//sample bank addr
sdr_BA <= #Tp sys_addr[21:20];
//sample row addr
sdr_ADDR <= #Tp sys_addr[19:8];
end
`c_READ:
begin
//----------send read cmd to sdram------------
`sdr_COMMAND<= #Tp `READ;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00;
//----------sample bank addr------------------
sdr_BA <= #Tp sys_addr[21:20];
//----------send col addr---------------------
sdr_ADDR <= #Tp {
4'b0000, //A10=0,disable auto precharge
sys_addr[7:0] //A7-A0
};
end
`c_R_PRE:
//-----to terminate the full page read transmit--------
begin
`sdr_COMMAND<= #Tp `PRECHARGE;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00;
sdr_BA <= #Tp 2'b11;
//A10=1,so pre-charge all banks
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
`c_WRITE:
begin
//----------send read cmd to sdram------------
`sdr_COMMAND<= #Tp `WRITE;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00;
//----------sample bank addr------------------
sdr_BA <= #Tp sys_addr[21:20];
//----------send col addr---------------------
sdr_ADDR <= #Tp {
4'b0000, //A10=0,disable auto precharge
sys_addr[7:0] //A7-A0
};
end
`c_W_PRE:
begin
//-----to terminate the full page write transmit--------
`sdr_COMMAND<= #Tp `PRECHARGE;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b11; //note here
sdr_BA <= #Tp 2'b11;
//A10=1,so pre-charge all banks
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
default:
begin
`sdr_COMMAND<= #Tp `NOP;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00;
sdr_BA <= #Tp 2'b11;
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
endcase
end
default:
begin
`sdr_COMMAND<= #Tp `NOP;
sdr_CKE <= #Tp 1'b1;
sdr_DMQ <= #Tp 2'b00; //清除信号,允许输入输出
sdr_BA <= #Tp 2'b11;
sdr_ADDR <= #Tp 12'b1111_1111_1111;
end
endcase
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -