目录

1. FIFO深度的确定?

2. FIFO与SDRAM的读写请求的处理?FIFO什么时候读,什么时候写?

3. FIFO与SDRAM的时钟处理?即FIFO的读写时钟如何设置?

4. SDRAM的读写数据和地址如何处理?


用FPGA对SDRAM的控制,存在一个主要缺点:对于数据流只能间歇性的读写,不能连续对数据流进行缓存。在某些特殊的情况,读写请求可能会被忽略,造成数据遗漏。因此在以数据流的形式访问SDRAM时,一般配合FIFO使用。

问题点及分析:(下面对问题的解析限于个人理解,可能不全或者有误的地方,路过的大神还请帮忙指出!感谢~~~)

1. FIFO深度的确定?

需要根据FIFO连续写入的时钟、数据量和速以及读取的时钟进行估计FIFO深度。可以参考:FIFO深度如何确定_赤橙黄绿蓝_新浪博客 (sina.com.cn)

在一般的应用场景中,读写FIFO可能时随机的,即并不是确定的连续一段时间内写入确定的数据量以及有确定的读的速率。因此,在这种场景下,要确定FIFO的深度,需要估计出最大的写入速率以及最小的读出速率,这样才能计算出在写完的时刻,会有多少数据剩余没有读出。

2. FIFO与SDRAM的读写请求的处理?FIFO什么时候读,什么时候写?

FIFO写(FIFO往SDRAM中写),在FIFO的存放数量大于等于burst长度,就拉高写使能;

FIFO读(FIFO从SDRAM中读),当FIFO的存放数量小于所能存放数量的一半时,拉高读使能;

在往FIFO中写以及从FIFO中读取数据时,需要判断FIFO的满、空标志位。

//只要FIFO不在清空阶段,且目前FIFO中数据量大于突发长度,FIFO就可以继续往SDRAM中写入数据
assign sd_wr_req=(!wr_load)&&(fifo_rduse>=SC_BL)? 1'b1:1'b0;//只要FIFO不在清空阶段,且目前FIFO中数据量小于FIFO一般的存储量,FIFO就可以继续从SDRAM中读取数据
assign sd_rd_req=(!rd_load)&&(fifo_wruse[7]==1'b0)? 1'b1:1'b0;

3. FIFO与SDRAM的时钟处理?即FIFO的读写时钟如何设置?

FIFO主要应用于跨时钟处理,以及数据缓存。FIFO的写入时钟一般取决于连接的模块的时钟,而读时钟可以根据SDRAM的需求时钟以及写时钟确定。

当FIFO读写时钟差别很大,可以参考:今天华为面试题:异步FIFO读时钟是写时钟的100倍,或者写是读的100倍会出现什么问题? - 第2页 - FPGA/ASIC/IC前端设计 - EETOP 创芯网论坛 (原名:电子顶级开发网) ,觉得挺有意思的。建议自己动手试试。

4. SDRAM的读写数据和地址如何处理?

对于数据流的存取,主控制器只需要提供存取在SDRAM的起始地址和最大地址即可。FPGA代码设计根据SDRAM的burst length来自动生成每次读写SDRAM的地址。然后再在其基础上,生成SDRAM模块需要的行、列、BANK地址。代码中,只要往SDRAM中读写一个突发长度的数据完成,地址就自动+SC_BL。

以下代码实现对SDRAM顺序读写数据。

//写SDRAM的地址,写完一次增加一个突发长度
always @(posedge clk or negedge rst_n)
beginif(~rst_n)   wr_sdram_addr<=wr_addr;      //写起始地址else if(wr_load)  wr_sdram_addr<=wr_addr; //对wr_fifo清零后,重新开始写else if(sd_wrdata_done)    //SDRAM一次突发写完毕beginif(wr_sdram_addr==wr_max_addr-SC_BL) wr_sdram_addr<=wr_addr;  //达到最大地址else wr_sdram_addr<=wr_sdram_addr+SC_BL;endelse wr_sdram_addr<=wr_sdram_addr;
end//读SDRAM的地址,读完一次增加一个突发长度
always @(posedge clk or negedge rst_n)
beginif(~rst_n)   rd_sdram_addr<=rd_addr;      //读起始地址else if(rd_load)  rd_sdram_addr<=rd_addr; //对rd_fifo清零后,重新开始读else if(sd_rddata_done)    //SDRAM一次突发读完毕beginif(rd_sdram_addr==rd_max_addr-SC_BL) rd_sdram_addr<=rd_addr;else rd_sdram_addr<=rd_sdram_addr+SC_BL;endelse rd_sdram_addr<=rd_sdram_addr;
end
//SDRAM的行地址
always @(posedge clk or negedge rst_n)
beginif(~rst_n) sd_raddr<=13'd0;else if (sd_wr_req) sd_raddr<=wr_sdram_addr[21:9];else if (sd_rd_req) sd_raddr<=rd_sdram_addr[21:9];else sd_raddr<=sd_raddr;
end//SDRAM的列地址
always @(posedge clk or negedge rst_n)
beginif(~rst_n) sd_caddr<=13'd0;else if (sd_wr_req) sd_caddr<=wr_sdram_addr[8:0];else if (sd_rd_req) sd_caddr<=rd_sdram_addr[8:0];else sd_caddr<=sd_caddr;
end//SDRAM的bank地址
always @(posedge clk or negedge rst_n)
beginif(~rst_n) sd_baddr<=13'd0;else if (sd_wr_req) sd_baddr<=wr_sdram_addr[23:22];else if (sd_wr_req) sd_baddr<=rd_sdram_addr[23:22];else sd_baddr<=sd_baddr;
end

代码的仿真及调试情况,下篇文章继续总结。

SDRAM控制器在连续读写数据时的优化相关推荐

  1. java数据库的优化_用Java向数据库中插入大量数据时的优化

    使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试: public void ex ...

  2. matlab定位文件,Matlab读写文件时的定位

     打开文件读写数据时,需要判断和控制文件的读写位置,如数据是否读完,或者需要读写指定位置上的数据等.  在读写文件时,Matlab 自动创建一个文件位置指针来管理和维护文件读写数据的起始位置.  ...

  3. oracle 最大值及其_学习笔记:Oracle优化 SQL查询最大值 最小值时的优化方法案例...

    天萃荷净 select max(id),min(id) from table优化,分享开发DBA需求,在SQL语句查询最大值.最小值数据时的优化方式案例 1.查看数据库版本 SQL> selec ...

  4. 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

    [转]使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? Posted on 2008-06-11 15:24 路缘 阅读(3868) 评论(0) 编辑 收藏  http://www.cnbl ...

  5. 使用TCP协议连续传输大量数据时,是否会丢包,应如何避免

    使用TCP协议连续传输大量数据时,是否会丢包,应如何避免 这个问题看看似比较容易,但很多人有不同的理解.开发中遇到是否每包(包数据可能大于1460)发送完之后需要由server->client确 ...

  6. asp.net MVC控制器中返回JSON格式的数据时提示下载

    Asp.net mvc在接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如下: 视图中js代码: $("# ...

  7. lwip连续发数据卡死_用lwip发送大量数据时,遇到的问题解答记录;

    这两天,师弟在两台电脑上搭建了lwipwin32通信平台,目的是能够不断发送一幅幅图片图像大小为1280*720大小的图片.如果不考虑压缩情况且是256色即1字节,这样大小的一幅图片需要发送大约发送1 ...

  8. lwip连续发数据卡死_用lwip发送大量数据时,遇到的问题解答记录 | 求索阁

    1.概述: lwip是轻量型的TCP/IP实现,只需10几KB的RAM和40几KB的ROM就能够跑起来,适合应用于嵌入式设备的网络通信.有牛人Adam Dunkels发明,提供给用户上那种接口 RAW ...

  9. SDRAM控制器操作时序

    此为学习http://dengkanwen.com/137.html整理的笔记,侵删! SDRAM工作原理 内部的状态跳转图 我们所需关注的几个地方: 1)粗黑线表示在该状态下会自动跳转到另一个状态, ...

  10. 基于Qsys的SDRAM控制器

    1.Intel FPGA中SDRAM控制器IP示意图 相比LED/数码管等简单外设,SDRAM芯片配置显得复杂许多,当然可以自行编写状态机实现初始化和读写控制,但是为了加快开发速度,可以借助Intel ...

最新文章

  1. Ubuntu 20.04上安装Git方法
  2. IIS 下配置无后缀的URL ReWrite
  3. 如何用杠铃策略,构建你的“反脆弱性”
  4. 戴尔笔记本win8全新安装
  5. 笔记(用Python做些事情)--变量(数字、字符串)
  6. RHEL4-SFTP配置
  7. js小学生图区_推荐12个最好的 JavaScript 图形绘制库
  8. mysql报错1241_flask内的mysql插入语句报错:1241, 'Operand should contain 1 column(s)
  9. cin.get()和cin.getline()区别
  10. 清除浮动-:after伪元素法(HTML、CSS)
  11. 教师空间中html是指什么,教师空间个性签名
  12. IO流 Buffered 综合练习
  13. hdu 1873“看病要排队”——优先队列的应用
  14. Delphi XE8 iOS与Android移动应用开发(APP开发)[完整中文版]
  15. #低码系列#如何设计一个低代码平台?
  16. Nginx 企业级优化
  17. Hyperledger Fabric 2.0 官方文档中文版 第6章 教程(上)
  18. Python什么都能做(二)用Python画微信新出的表情包
  19. 密码管理神器-1Password,安全与否?
  20. 教你如何正确反编译apk

热门文章

  1. Winhex的使用教程
  2. As a good Java programer
  3. 怎么远程传输大文件?
  4. VS2019 MFC在静态库运行时出现的LNK2005和LNK1169问题
  5. 跨境转运常用运费计算方式
  6. 个所税服务器没有企业信息,【重要】企业纳税申报一定要看进来!
  7. 计算机不打印怎么回事,打印机无法打印怎么办解决方案
  8. ubuntu防火墙,ufw命令
  9. 应用电子计算机英文,应用电子技术英文介绍
  10. 中秋海报设计素材|中秋节海报文案