设计文件
// SDRAM 读操作
// 1. rd_data_reg: SDRAM 工作时间和模块的系统时钟有相位差,需要打拍同步
// 2. state
// 3. cnt_cmd: 指令执行时长
// 4. cnt_cmd_reset:上一个计数器的清零信号 (依赖计满信号:trp_end、trfc_end、tmrd_end)
// 5. trcd_end、tcl_end、tread_end、trp_end: 自家延时结束的信号(依赖 状态)
// 6. rd_ack: 写数据期间的状态,整个过程都拉高
// 7. rd_end: 状态终止
module sdram_read(
input clk,
input rst_n,
input init_end,
input rd_en,
input [23:0] rd_addr,
input [15:0] rd_data,
input [9:0] rd_burst_len,
output wire rd_ack,
output wire rd_end,
output reg [3:0] read_cmd,
output reg [1:0] read_bank,
output reg [12:0] read_addr,
output wire [15:0] rd_sdram_data
);
//==========================================parameter===========================================================
parameter TRCD = 10'd2 , //激活等待周期
TCL = 10'd3 , //潜伏期
TRP = 10'd4 ; //预充电等待周期
parameter RD_IDLE = 4'b0000 , //空闲
RD_ACT = 4'b0001 , //行激活
RD_TRCD = 4'b0011 , //激活等待
RD_READ = 4'b0010 , //读操作
RD_CL = 4'b0100 , //潜伏期
RD_DATA = 4'b0101 , //读数据
RD_PRE = 4'b0111 , //预充电
RD_TRP = 4'b0110 , //预充电等待
RD_END = 4'b1100 ; //一次突发读结束
parameter NOP = 4'b0111 , //空操作指令
ACTIVE = 4'b0011 , //激活指令
READ = 4'b0101 , //数据读指令
BURST_STOP = 4'b0110 , //突发停止指令
PRECHARGE = 4'b0010 ; //预充电指令
//==========================================reg=================================================================
reg [8:0] state;
reg [8:0] next_state;
reg [9:0] cnt_cmd;//2、12
reg [15:0] rd_data_reg;//跨时钟域打拍
//==========================================wire=================================================================
wire trcd_end;
wire tcl_end;
wire tread_end;
wire trp_end;
wire rdburst_end;
wire cnt_cmd_reset;
//==========================================assign=================================================================
assign trcd_end = ((state == RD_TRCD) && (cnt_cmd == TRCD -1))?1'd1:1'd0;
assign tcl_end = ((state == RD_CL) && (cnt_cmd == TCL -1))?1'd1:1'd0;
assign tread_end = ((state == RD_DATA) && (cnt_cmd == rd_burst_len -1 + TCL))?1'd1:1'd0;//突发长度+CL
assign trp_end = ((state == RD_TRP) && (cnt_cmd == TRP -1))?1'd1:1'd0;
assign rdburst_end = ((state == RD_DATA) && (cnt_cmd == rd_burst_len - 3'd4))?1'd1:1'd0;
assign cnt_cmd_reset = ((state == RD_IDLE) || (state == RD_TRCD) || (state == RD_END) || trcd_end || tcl_end || tread_end || trp_end)?1'd1:1'd0;
assign rd_ack = ((state == RD_DATA) && (cnt_cmd >= 10'd1) && (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脚手架写一个简单的页面?