您当前的位置: 首页 > 

刘颜儿

暂无认证

  • 5浏览

    0关注

    99博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

04-SDRAM:读操作(突发)

刘颜儿 发布时间:2022-07-30 22:14:00 ,浏览量:5

设计文件
// 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             
关注
打赏
1659364566
查看更多评论
0.0363s