索引

  • 1. Bank地址未激活
  • 2. fifo深度不足导致数据错位
  • 3. 刷新中断导致sdram数据异常
  • 4. 图像行数异常
  • 5. 刷新请求失效

1. Bank地址未激活


根据sdram手册可知,激活命令ACT给出bank地址和行地址,写命令WR给出bank地址和列地址


通过仿真观察可知,wr模块中的act_cmd并没有送到顶层模块的对外接口cmd上,反查代码发现act_cmd和pre_cmd并没有赋给wr模块的输出wr_cmd!

更新后缺陷解决:

2. fifo深度不足导致数据错位


tb文件模拟的是串口给出的一幅图像数据6404808bit,一行数据由0-255循环给出。最后存到sdram的是一个300行512列16bit的数据矩阵,因此sdram中最后2字节数据应该是16’hFEFF=16’d32838。

仿真分析发现,tb产生的数据fifo_wr_data[7:0]和写使能fifo_wr_en是正常的,每行数据从00开始,7f结束

第一行的读使能fifo_rd_en和数据fifo_dout[15:0]也是正常的,fifo为FWFT模式,预读取数据从0001开始,7e7f结束

但是第2行开始位置的数据开始错乱,row_cnt=1,col_cnt=2的数据为828e,发生了跳变错位

进一步分析,查看wr模块内部wfifo发现在读第1行的时候full有拉高(从fifo_wr_cnt=1023时开始写请求,到从fifo中读数据,这中间还需要经过REQ-ACT等状态),即数据把 FIFO 的深度写满了,数据将不能再进去,也不会覆盖原有的数据。所以是fifo深度设置裕量过小,导致了部分数据的缺失。(full拉高前后的数据刚好是828e)

深度1024的fifo(FWFT)实际深度有1027。

3. 刷新中断导致sdram数据异常


当有刷新请求时col_cnt重新计数导致列地址错乱,修改代码后正常。

4. 图像行数异常

一幅图像最后的数据是在row=1,col=511,而tb设计的是6404808bit的一幅图像数据,理论上sdram中存储的是30051216bit数据。但从仿真中确实看出在image_end拉高后仍传输了2行数据。

进一步查看波形发现,在row=15时出现错误:

正常逻辑是fifo_wr_cnt计数=1023时表示fifo存满sdram的一行数据量,此时sdram_wr_start拉高,状态机跳转至WRREQ写请求状态,等到arbiter模块响应返回wr_en信号,开始进行ACT-WR操作。在跳转至WR状态的同时拉高fifo_rd_en开始从fifo中取数,当一行数据取完或者有刷新请求时跳出WR状态,同时拉低fifo_rd_en。当刷新结束且sdram一行数据没有写完时,重新回到WR状态继续从fifo中取数。

这里存在逻辑缺陷:当有刷新请求ref_req和一行数据写完标志row_end同时到达时,在PRE状态下中断响应的优先级高于正常写操作,所以当PRE结束后会直接跳转到WRREQ状态,从而缺失了fifo_wr_cnt统计,导致fifo没有数据却直接进行读取。

修改代码,调整响应刷新和写行结束的优先级,当两者同步到达时,arbiter模块接收到wr_data_en||wr_ref_break后会跳转到ABT状态优先响应ref_req,刷新结束后等待wr_req跳转至WR状态;write模块则优先跳回IDLE状态,重新开始fifo_wr_cnt一行计数。


5. 刷新请求失效


如仿真结果,当有刷新请求ref_req时,arbiter状态机始终没有收到refresh模块返回的刷新授权操作ref_en信号,所以并未跳转到刷新REF状态。

反查refresh模块代码发现,ref_req刷新请求信号仅保持一个时钟周期,逻辑错误。

Sdram写操作调试记录相关推荐

  1. 相信我,SDRAM真的不难(四)----写操作(页突发模式)

    写在前面 本文是SDRAM系列文章的第四篇,对SDRAM的突发写操作进行了详细介绍.代码编写与仿真验证. 其他博文链接:相信我,SDRAM真的不难----汇总篇(电梯直达) 1.写操作 SDRAM提供 ...

  2. SX1278 FSK 调试记录

    SX1278 FSK 调试记录 先挖个sx1278 FSK的坑慢慢填 手中有两个SX1278模组 是安信可的产品 采用主从模式 SPI访问 MCU是STM32F107 数据格式 说明收据接收的第一步就 ...

  3. 野火MINI_STM32_CubeMX_SPI1_W25Q64 调试记录

    野火MINI_STM32_CubeMX_SPI1 调试记录 1.原理图 2. 生成代码 3. main.c 中的关键信息如下所示. 3. W25Q64.C代码如下所示 4.W25Q64.h代码参考 5 ...

  4. 【tm1650调试记录】

    tm1650调试记录 阅读芯片手册 调试遇到的问题 1:数据的写入 2:数码管不亮 3:数码管调试模式亮,正常运行不亮 TM1650的应用补充--仅适用于LED驱动 亮度 片选信号DIG 配置顺序 代 ...

  5. Altera DDR3调试记录

    Altera DDR3调试记录 [2021-3-6] 生成DDR_IP ======================= 使用example_design搭建仿真环境 读readme.txt \core ...

  6. FPGA SATA IP控制器的SATA接口调试记录

    本文档是基于FPGA K7 SATA IP控制器的SATA接口调试记录,接口遵循标准的ACHI协议. 操作系统内核版本:5.4.18 由于K7PCIE只有3个bar,AHCI协议规定SATA控制器是在 ...

  7. 【以太网模块调试记录】ZLG EPORTM集成式RJ45调试记录(STM32/GD32)

    ZLG(致远电子)集成式RJ45模块调试记录 集成了RJ45网络接口和PHY芯片(YT8512H) 官网链接:https://www.zlg.cn/Ethernet/Ethernet/product/ ...

  8. android 蓝牙 驱动,转个蓝牙修改帖--Android BCM4330 蓝牙BT驱动调试记录

    本帖最后由 旋律2014 于 2014-3-27 09:15 编辑 一.关于BT driver的移植: 1. Enablebluetootch in BoadConfig.mk BOARD_HAVE_ ...

  9. selinux移植调试记录

    LINUX平台selinux移植调试记录 前言 什么是selinux 主要作用 selinux的组成 工作模式 工作流程 查看当前的文件或进程的安全上下文 uboot和kernel中的配置 refpo ...

最新文章

  1. ArcGIS制图之Sub Points点抽稀
  2. UnicodeEncodeError\: gbk codec cant encode character \\xa1 in position 9699的解决办法
  3. 《C和指针》一1.7 问题
  4. nginx mysql占用率高_nginx/mysql查看内存占用
  5. 学python要下载什么-从应用的角度去学习Python--为孩子下载课本
  6. Elasticsearch索引定时清理
  7. Python:利用python编程实现三维图像绘制展示(六面体旋转、三维球柱状体、下雪场景等)
  8. VS2010-MFC(对话框:一般属性页对话框的创建及显示)
  9. java前台线程(普通线程) 和 后台线程
  10. winform基础窗体设置及基础控件
  11. python用什么系统好_10分钟用python搭建一个超好用的CMDB系统
  12. 如何优雅的处理Restful
  13. ubuntu14.04LTS 安装后几个基本设置
  14. vscode设置鼠标滚轮滚动 翻页速度
  15. 如何查出一个表中重复的名字
  16. 使用Matlab理解PID
  17. 103000大写加零吗_金额大写前面要加零的有哪些
  18. Guava---Splitter
  19. Ubuntu16.04 Modelsim 10.2c安装
  20. 为echarts的叠加柱状图设置颜色

热门文章

  1. 最新的安卓单机游戏下载,好玩的手机单机游戏你都玩过吗?
  2. Android Toast 吐司 自定义使用 实现动态打勾对号效果 Toast自定义教程(三)
  3. 松下dp-8016p打印机-网络打印设置
  4. android 仿旅游日历控件_android 仿预订日历时间选择(如去哪儿,携程
  5. 计算光线反射的reflect向量
  6. OA服务器文件夹,OA服务器架设 图文详解.docx
  7. 自己动手,编写神经网络程序
  8. LB和ZLY的软考锦鲤
  9. Windows 系统里睡眠和休眠有什么区别?
  10. C++ 开源矩阵 运算工具——Eigen