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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?