SDRAM 数据写操作(页突发)
- state:
- cnt_cmd: 指令执行时长
- cnt_cmd_reset:上一个计数器的清零信号 (依赖计满信号:trp_end、trfc_end、tmrd_end)
- trcd_end、twrite_end、trp_end: 自家延时结束的信号(依赖 状态)
- wr_ack: 写数据期间的状态,整个过程都拉高
- wr_end: 状态终止
- wr_sdram_en:
// SDRAM 数据写操作(页突发)
// 1. state:
// 2. cnt_cmd: 指令执行时长
// 3. cnt_cmd_reset:上一个计数器的清零信号 (依赖计满信号:trp_end、trfc_end、tmrd_end)
// 4. trcd_end、twrite_end、trp_end: 自家延时结束的信号(依赖 状态)
// 5. wr_ack: 写数据期间的状态,整个过程都拉高
// 6. wr_end: 状态终止
// 7. wr_sdram_en:
module sdram_write(
input clk,
input rst_n,
input init_end,
input wr_en,
input [23:0] wr_addr,
input [15:0] wr_data,
input [9:0] wr_burst_len,
output wire wr_ack,
output wire wr_end,
output reg [3:0] write_cmd,
output reg [1:0] write_bank,
output reg [12:0] write_addr,
output reg wr_sdram_en,
output wire [15:0] wr_sdram_data
);
//==========================================parameter===========================================================
//状态机
localparam WR_IDLE = 3'b000, //写操作初始状态
WR_ACT = 3'b001, //行激活状态
WR_TRCD = 3'b011, //行激活等待状态
WR_WR = 3'b010, //写操作状态
WR_DATA = 3'b100, //突发写操作状态,突发写入多个数据,直到突发终止
WR_PRE = 3'b101, //预充电状态
WR_TRP = 3'b111, //预充电状态等待状态
WR_END = 3'b110; //结束状态
//等待时间参数定义
localparam TRP = 3'd2 , //预充电等待周期
TRCD = 3'd2 ; //激活等待周期
//命令指令参数
localparam NOP = 4'b0111 , //空操作指令
PRECHARGE = 4'b0010 , //预充电指令
ACTIVE = 4'b0011 , //激活指令
WRITE = 4'b0100 , //写指令
BURST_STOP = 4'b0110 ; //突发终止指令
// 突发长度——从外部传入
//parameter MAX_WR = 4'd10;
//==========================================reg=================================================================
reg [7:0] state;
reg [7:0] next_state;
reg [9:0] cnt_cmd;//2、9
//==========================================wire=================================================================
wire trcd_end;
wire twrite_end;
wire trp_end;
wire cnt_cmd_reset;
//==========================================assign=================================================================
assign trcd_end = ((state == WR_TRCD) && (cnt_cmd == TRCD -1))?1'd1:1'd0;
assign twrite_end = ((state == WR_DATA) && (cnt_cmd == wr_burst_len -1))?1'd1:1'd0;
assign trp_end = ((state == WR_TRP) && (cnt_cmd == TRP -1))?1'd1:1'd0;
assign cnt_cmd_reset = ((state == WR_IDLE)||(state == WR_WR) || (state == WR_END) || trcd_end || twrite_end || trp_end)?1'd1:1'd0;
assign wr_ack = ((state == WR_WR) || (state == WR_DATA) && (cnt_cmd
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【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脚手架写一个简单的页面?