SDRAM控制器设计(5)不带自动预充电的写操作时序
程序员文章站
2022-04-01 22:57:18
...
1.时序图
不带自动预充电的写操作时序图
主要包含**命令,写命令和预充电命令。
时序很明确,这里同样采用线性序列机方法实现写操作任务。
首先,还是参数定义
//一次突发写操作任务,线性序列机方法
localparam wr_ACT_TIME = 1'b1,
wr_WRITE_TIME = SC_RCD+1,
wr_PRE_TIME = SC_RCD+SC_BL+WR_PRE+1,
wr_END_TIME = SC_RCD+SC_BL+WR_PRE+REF_PRE;
//一次突发写操作过程时间计数器
aaa@qq.com(posedge Clk or negedge Rst_n)
begin
if(!Rst_n)
wr_cnt <= 16'd0;
else if(wr_cnt == wr_END_TIME)
wr_cnt <= 16'd0;
else if(wr_req||wr_cnt>1'b0)
wr_cnt <= wr_cnt + 16'd1;
else
wr_cnt <= 16'd0;
end
具体操作的线性序列机
//一次突发写操作任务,类似线性序列机方法
task write_data;
begin
case(wr_cnt)
wr_ACT_TIME:begin
Command <= C_ACT;
Sa <= raddr_r; //**行
Ba <= baddr_r;
end
wr_WRITE_TIME:begin
Command <= C_WR;
Sa <= {1'b0,caddr_r[8:0]}; //**列
Ba <= baddr_r;
end
wr_PRE_TIME:begin
Command <= C_PRE; //预充电
Sa[10] <= 1'b1;
end
wr_END_TIME:begin
Command <= C_NOP;
FF <= 1'b1;//退出任务标志位
end
default:
Command <= C_NOP;
endcase
end
endtask
最后,与刷新操作不同的是写操作里除了需要对写操作完成和写操作过程进行标志外,还有需要对写入突发长度数据时刻的有效区间和写完数据时刻进行标志,这对于在何时变换待写入的数据和何时可改变地址有重要的参考作用。写数据时控制器需要对数据线进行操作,对数据线的操作采用使能三态门输出方式,只有在需要传输待写入数据时使能数据线输入待写入数据,其他时刻设置为高阻态。具体产生这些标志位的代码如下:
//一次写操作过程完成标志位
aaa@qq.com(posedge Clk or negedge Rst_n)
begin
if(!Rst_n)
wr_opt_done <= 1'b0;
else if(wr_cnt == wr_END_TIME)
wr_opt_done <= 1'b1;
else
wr_opt_done <= 1'b0;
end
//一次突发写操作过程状态标识信号
reg wr_opt;
aaa@qq.com(posedge Clk or negedge Rst_n)
begin
if(!Rst_n)
wr_opt <= 1'b0;
else if(wr_req == 1'b1)
wr_opt <= 1'b1;
else if(wr_opt_done == 1'b1)
wr_opt <= 1'b0;
else
wr_opt <= wr_opt;
end
//写数据操作,数据写入(改变)时刻有效区间
aaa@qq.com(posedge Clk or negedge Rst_n)
begin
if(!Rst_n)
Wr_data_vaild <= 1'b0;
else if((wr_cnt > SC_RCD)&&(wr_cnt <= SC_RCD+SC_BL))
Wr_data_vaild <= 1'b1;
else
Wr_data_vaild <= 1'b0;
end
//一次突发写操作数据写完成标志位
assign Wdata_done = (wr_cnt == SC_RCD+SC_BL)?1'b1:1'b0;
//SDRAM 数据线,采用三态输出
assign Dq = Wr_data_vaild ? Wr_data:16'bz;
上一篇: gulp --- 前端自动化构建工具