SDRAM 仲裁
- state
- sdram_cmd_reg: 初始化、写操作、读操作、自刷新模块传来的指令,需要内部用sdram_cmd接收, 然后分别输出为sdram_cs_n、sdram_ras_n、sdram_cas_n、sdram_we_n
- aref_en: 当前状态为仲裁状态ARBIT,且aref_req=1 (依赖ARBIT、aref_req)
- wr_en: 当前状态为仲裁状态ARBIT,且wr_req=1 (依赖ARBIT、wr_req)
- rd_en: 当前状态为仲裁状态ARBIT,且rd_req=1 (依赖ARBIT、rd_req)
// SDRAM 仲裁
// 1. state
// 2. sdram_cmd_reg: 初始化、写操作、读操作、自刷新模块传来的指令,需要内部用sdram_cmd接收,
// 然后分别输出为sdram_cs_n、sdram_ras_n、sdram_cas_n、sdram_we_n
// 3. aref_en: 当前状态为仲裁状态ARBIT,且aref_req=1 (依赖ARBIT、aref_req)
// 4. wr_en: 当前状态为仲裁状态ARBIT,且wr_req=1 (依赖ARBIT、wr_req)
// 5. rd_en: 当前状态为仲裁状态ARBIT,且rd_req=1 (依赖ARBIT、rd_req)
module sdram_arbit(
input clk,
input rst_n,
input init_end,
input [3:0] init_cmd,//SDRAM命令,组成{CS#,RAS#,CAS#,WE#}
input [1:0] init_bank,//BANK地址,共4个BANK
input [12:0] init_addr,//SDRAM地址总线
input auto_ref_req,
input auto_ref_end,
input [3:0] auto_ref_cmd,//SDRAM命令,组成{CS#,RAS#,CAS#,WE#}
input [1:0] auto_ref_bank,//BANK地址,共4个BANK
input [12:0] auto_ref_addr,//SDRAM地址总线
input wr_req,
input wr_end,
input [3:0] write_cmd,
input [1:0] write_bank,
input [12:0] write_addr,
input wr_sdram_en,//三态门的判断条件
input [15:0] wr_sdram_data,//如果wr_sdram_en=1,那么sdram_dq为输出端口,将写操作的数据wr_sdram_data输出给SDRAM
input rd_req,
input rd_end,
input [3:0] read_cmd,
input [1:0] read_bank,
input [12:0] read_addr,
output aref_en,
output wr_en,
output rd_en,
output sdram_cke,
output sdram_cs_n,
output sdram_ras_n,
output sdram_cas_n,
output sdram_we_n,
output reg [1:0] sdram_bank,
output reg [12:0] sdram_addr,
output reg [15:0] sdram_dq
);
//==========================================parameter===========================================================
//状态机
localparam IDLE = 5'b0_0001 , //初始状态
ARBIT = 5'b0_0010 , //仲裁状态
ATREF = 5'b0_0100 , //自动刷新状态
WRITE = 5'b0_1000 , //写状态
READ = 5'b1_0000 ; //读状态
//命令指令参数
localparam NOP = 4'b0111 ; //空操作指令
//==========================================reg=================================================================
reg [2:0] state;
reg [2:0] next_state;
reg [3:0] sdram_cmd_reg;
//==========================================wire=================================================================
//==========================================assign=================================================================
assign sdram_cke = 1'd1;
assign sdram_cs_n = sdram_cmd_reg[3];
assign sdram_ras_n = sdram_cmd_reg[2];
assign sdram_cas_n = sdram_cmd_reg[1];
assign sdram_we_n = sdram_cmd_reg[0];
//assign {sdram_cs_n, sdram_ras_n, sdram_cas_n, sdram_we_n} = sdram_cmd; 还可以这样写
assign sdram_dq = (wr_sdram_en) ? wr_sdram_data:16'bz;
//==========================================always=================================================================
always@(posedge clk or negedge rst_n)begin
if(!rst_n )
aref_en
关注
打赏