一、自动刷新
自动刷新由控制器对SDRAM正常操作,需要时钟信号,时序图

自动刷新步骤:
上电即开始–预充电–A10拉高选择all bank–等待tRP后,自动刷新命令–等待tRFc后,第二次自动刷新命令–等待tRFc,自动刷新结束,空操作命令

///自动刷新操作任务,采用线性序列机方法localparam  ref_PRE_TIME = 1'b1,    //预充电时刻ref_REF1_TIME = REF_PRE + 1,    //第一次自动刷新时刻,充电时刻加REF_PRE(tRP选通潜伏期) ref_REF2_TIME = REF_PRE + REF_REF + 1,   //第二次自动刷新时刻,每次刷新后等待tRFcref_END = REF_PRE + REF_REF *2;     //自动刷新结束时刻//自动刷新过程时间计数器always@(posedge clk or negedge rst_n)begin if(!rst_n)ref_cnt <= 16'd0;else if(ref_cnt == ref_END)ref_cnt <= 16'd0;else if(ref_req || ref_cnt>1'b0)ref_cnt <= ref_cnt +16'd1;elseref_cnt <= ref_cnt;end//一次刷新操作完成标志位ref_opt_donealways@(posedge clk or negedge rst_n)beginif(!rst_n)ref_opt_done <= 1'b0;else if(ref_cnt ==ref_END)ref_opt_done <= 1'b1;else ref_opt_done <= 1'b0;end//一次突发写操作过程状态标识信号。ref_req刷新操作时,ref_opt_done拉高,自动刷新操作完成后拉低reg ref_opt;always@(posedge clk or negedge rst_n)beginif(!rst_n)ref_opt <= 1'b0;else if(ref_req ==1'b1)ref_opt <= 1'b1;else if(ref_opt_done == 1'b1)ref_opt <= 1'b0;else ref_opt <= ref_opt;end//自动刷新操作,线性序列机,根据时序图,是在下降沿后发生改变,上升沿时正好能读取到task auto_ref;begincase(ref_cnt)ref_PRE_TIME:begincommand <= C_PRE;         //预充电sa[10] <= 1'b1;         //SDRAM地址总线A0-A10,其中的A10拉高选择all bankendref_REF1_TIME:begincommand <= C_AREF;    //自动刷新endref_REF2_TIME:begincommand <= C_AREF;    //自动刷新endref_END:begin               //结束,空操作命令FF <= 1'b1;               //标记寄存器,拉高command <= C_NOP;enddefault:command <= C_NOP;endcaseendendtask

二、不带自动预充电写操作
时序图:

写操作步骤:
上电–激活行时刻,写操作开始立刻激活命令,激活行、bank–激活后tRCD,写命令,激活列、bank–写命令后经突发长度SC_BL写数据、写数据完成到预充电时间间隔后预充电–预充电后tRP后结束,写操作结束时刻

////一次突发写操作任务,线性序列机方法localparam wr_ACT_TIME = 1'b1;                  //激活行时刻,写操作开始立刻激活wr_WRITE_TIME = SC_RCD +1,                 //写命令时刻,激活到读命令或写命令延时tRCD后写命令wr_PRE_TIME = SC_RCD + SC_BL + WR_PRE + 1,     //预充电时刻,写命令后经突发长度SC_BL写数据、写数据完成到预充电时间间隔后预充电wr_END_TIME = SC_RCD + SC_BL + WR_PRE +REF_PRE;//写操作结束时刻,预充电后tRP后结束//一次突发写操作过程时间计数器always@(posedge clk or negedge rst_n)beginif(!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;elsewr_cnt <= 16'd0;end//一次写操作过程完成标志位always@(posedge clk or negedge rst_n)beginif(!rst_n)wr_opt_done <= 1'b0;else if(wr_cnt == wr_END_TIME)wr_opt_done <= 1'b1;elsewr_opt_done <= 1'b0;end//一次突发写操作过程状态标识信号wr_opt,写操作时拉高,写完拉低reg wr_opt;always@(posedge clk or negedge rst_n)beginif(!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;elsewr_opt <= wr_opt;end//写数据操作,数据写入(改变)时刻有效区间,激活到读命令或写命令延时tRCD后到突发长度8这一段时序数据写入always@(posedge clk or negedge rst_n)beginif(!rst_n)wr_data_vaild <= 1'b0;else if((wr_cnt > SC_RCD)&& (wr_cnt <= SC_RCD + SC_BL))wr_data_vaild <= 1'b1;elsewr_data_vaild <= 1'b0;end//一次突发写操作数据写完成标志位,写完拉高assign wdata_done = (wr_cnt == SC_RCD+SC_BL+1)?1'b1:1'b0;//一次突发写操作任务,类似线性序列机方法task write_data;begincase(wr_cnt)wr_ACT_TIME:begin                 //激活行时刻command <= C_ACT;                //激活命令sa <= raddr_r;             //激活行,SDRAM地址总线读写行地址寄存器 ba <= baddr_r;                  //激活bank,SDRAMBank地址读写bank地址寄存器endwr_WRITE_TIME:begin                //写命令时刻command <= C_WR;             //写命令sa <= {1'b0,caddr_r[8:0]}; //激活列,读写列地址寄存器A0-A9ba <= baddr_r;endwr_PRE_TIME:begin               //预充电时刻command <= C_PRE;          //预充电命令sa[10] <= 1'b1;         //所有bankendwr_END_TIME:begin              //写操作结束时刻command <= C_NOP;       //空命令FF <= 1'b1;                  标记寄存器拉高enddefault:command <= C_NOP;endcaseendendtask    //一次突发读操作任务,线性序列机方法 localparamrd_ACT_TIME  = 1'b1,              //激活行时刻rd_READ_TIME = SC_RCD+1,          //读命令时刻rd_PRE_TIME  = SC_RCD+SC_BL+1,    //预充电时刻rd_END_TIME  = SC_RCD+SC_CL+SC_BL;//读操作结束时刻//一次突发读操作过程时间计数器always@(posedge clk or negedge rst_n)beginif(!rst_n)rd_cnt <= 16'd0;else if(rd_cnt == rd_END_TIME)rd_cnt <= 16'd0;else if(rd_req ||rd_cnt>1'b0)rd_cnt <= rd_cnt + 16'd1;elserd_cnt <= 16'd0;end//一次突发读操作过程完成标志位   always@(posedge clk or negedge rst_n)beginif(!rst_n)rd_opt_done <= 1'b0;else if(rd_cnt == rd_END_TIME)rd_opt_done <= 1'b1;elserd_opt_done <= 1'b0;end//一次突发读操作过程状态标识信号always@(posedge clk or negedge rst_n)beginif(!rst_n)rd_opt <= 1'b0;else if(rd_req == 1'b1)rd_opt <= 1'b1;else if(rd_opt_done == 1'b1)rd_opt <= 1'b0;elserd_opt <= rd_opt;end//一次突发读操作过程中数据读完标志位assign rdata_done = (rd_cnt == rd_END_TIME)?1'b1:1'b0;always@(posedge clk or negedge rst_n)beginif(!rst_n)rd_data_vaild <= 1'b0;else if((rd_cnt > SC_RCD+SC_CL)&&(rd_cnt <= SC_RCD+SC_CL+SC_BL))rd_data_vaild <= 1'b1;elserd_data_vaild <= 1'b0;end//读数据assign rd_data = dq;//一次突发读操作任务,类似线性序列机方法task read_data;begincase(rd_cnt)rd_ACT_TIME:begin              //激活命令Command <= C_ACT;Sa <= raddr_r; Ba <= baddr_r;endrd_READ_TIME:begin            //读命令Command <= C_RD;Sa <= {1'b0,caddr_r[8:0]};Ba <= baddr_r;endrd_PRE_TIME:beginCommand <= C_PRE;         //预充电Sa[10] <= 1'b1;endrd_END_TIME:beginFF <= 1'b1;Command <= C_NOP;enddefault:Command <= C_NOP;endcaseendendtask

三、不带自动预充电读操作
与写操作类似

SDRAM学习(二)——自动刷新,读写操作相关推荐

  1. java app token 失效_请求时token过期自动刷新token操作

    1.在开发过程中,我们都会接触到token,token的作用是什么呢?主要的作用就是为了安全,用户登陆时,服务器会随机生成一个有时效性的token,用户的每一次请求都需要携带上token,证明其请求的 ...

  2. Linux学习笔记2-文件读写操作

    1.查看执行过的命令(历史文件) 执行过的命令,可以在终端按上下方向键来选择. 用History命令会列出历史命令(只保存最近使用的一千条命令,保存在家目录.bash_history文件)前面是标号, ...

  3. GitHubDesktop:学习:二:(第三次操作)版本回退:成功

    目录 一.目的 1.1 想知道:GitHubDesktop里面版本回退 二.参考 1.1 GitHubDesktop:学习:一:成功:安装和使用 1.10基础的git教程,傻瓜都会用的Github D ...

  4. ballerina 学习二十九 数据库操作

    ballerina 数据操作也是比较方便的,官方也我们提供了数据操作的抽象,但是我们还是依赖数据库驱动的. 数据库驱动还是jdbc模式的 项目准备 项目结构 ├── mysql_demo │ ├── ...

  5. 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表

    http://blog.csdn.net/abclixu123/article/details/8210109 链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的.在C语言中,链表是通过 ...

  6. SDRAM的数据存储实现并对其数据进行读写操作

    SDRAM的数据存储实现并对其数据进行读写操作 文章目录 SDRAM的数据存储实现并对其数据进行读写操作 1 SDRAM 1.1 简介 1.2 SDRAM结构和原理 1.3 SDRAM块 2 SDRA ...

  7. FLASH的基本原理与读写操作笔记

    一.概念: 每个文件对应多个block,每个block对对应多个扇区sector,每个sector对应有多个页. 一般一个扇区(sector)多个页(page)  , 一个块 (bank)又有多个扇区 ...

  8. 利用FPGA实现简单的sdram的读写操作

    没有什么事都是一帆风顺的,学业...让人学会了很多但是又让人难以忘怀...人生路上起起伏伏,并不是真心的付出就可以得到相同的回报,有时候可能还会恰恰相反... 好了,负面情绪就不带给大家了,博主还是来 ...

  9. FPGA中用verilog直接读写操作SDRAM

    1 简介 SDRAM 型号为MT48LC32M16A2.SDRAM,英文名是: Synchronous Dynamic Random Access Memory,相较于 SRAM(静态存储器), SD ...

最新文章

  1. 阿里从来不只属于马云,但马云会永远属于阿里
  2. 边工作边刷题:70天一遍leetcode: day 97-1
  3. Django 的模板语法之过滤器
  4. html中两个标签上对齐,css将两个元素水平对齐的方法(兼容IE8)
  5. Python开发之--前端 HTML基础
  6. (33)FPGA面试题附加约束的作用
  7. mysql innodb trx_如何区分MySQL的innodb_flush_log_at_trx_commit和sync_binlog
  8. 基于麻雀算法优化的核极限学习机(KELM)分类算法 - 附代码
  9. window10安装vnc无法使用,window10安装vnc无法使用的原因和解决办法
  10. 面经-毕马威南京-实习-算法-20191216
  11. pm2部署next项目
  12. 激光雷达定位-论文心得
  13. 关于程序员清明节假期延长至七天的通知
  14. 解决外网下载速度过慢问题
  15. Java项目:ssh实验室预约管理系统
  16. 日期推算/日历(小程序)
  17. 数据结构和算法(四)之链表结构
  18. 区块链上的虚拟开放世界游戏是怎样的?| TVP思享
  19. HTTTP协议之POST和GEG区别
  20. 词云python灿烈_如何用Python做中文词云?

热门文章

  1. DevOps 到底是什么到底是什么
  2. 2017年乌镇互联网大会部分要点实地记录
  3. java中金额转换精度问题
  4. 化工厂人员定位的实施,新导化工厂人员定位带来的效果
  5. 被多次定义,第一次再次定义
  6. 关于上位机和下位机的一些解释
  7. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.6 异构建模的方法...
  8. Mysql笔试+面试题积累(实时更新)
  9. 计算机基础教育对工科学生的意义,深入进行高校工科非计算机专业计算机基础教育改革…...
  10. Variant 用法详解