0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SDRAM控制器的设计——Sdram_Control.v代码解析(异步FIFO读写模块、读写SDRAM过程)

友晶FPGA 来源:友晶FPGA 2025-03-04 10:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

SDRAM控制器里面包含5个主要的模块,分别是PLL模块,异步FIFO 写模块,异步FIFO读模块,SDRAM接口控制模块,SDRAM指令执行模块。

4fe50166-f897-11ef-9310-92fbcf53809c.png

其中异步FIFO模块解读参考:05-SDRAM控制器的设计——异步FIFO的调用;

https://www.elecfans.com/d/6468023.html

SDRAM接口控制模块解读参考:03-SDRAM控制器的设计——control_interface.v代码解析;
https://www.elecfans.com/d/6458523.html

SDRAM指令执行模块解读参考:04-SDRAM控制器的设计——command.v代码解析

https://www.elecfans.com/d/6466276.html

PLL时钟模块

SDRAM控制器模块里面的PLL将27MHz时钟倍频出2个100MHz时钟,其中一个100MHz时钟给SDRAM里面的模块使用;另外一个100MHz时钟相移-109.8°以后输出给SDRAM器件。(相移-109.8°是这个SDRAM器件在DE10-Standard开发板上的时序约束经验值)

502118b8-f897-11ef-9310-92fbcf53809c.png

PLL参数设置如下:

5038e718-f897-11ef-9310-92fbcf53809c.png

关于Sdram_Control.v模块时钟分布请参考下图的蓝色走线:

504ee306-f897-11ef-9310-92fbcf53809c.png

其实也可以直接从FPGA 的50MHz时钟经过PLL得到100M时钟传递给工程里其他模块工作,这里设置27M是为了让大家看看FIFO跨时钟域的一个工作情况。

数据路径控制

SDRAM的数据口是一个inout接口,要做成三态门控制,控制电路代码如下:

50901d12-f897-11ef-9310-92fbcf53809c.png

从command.v传过来的oe信号为高时,将数据送到DQ端口,此为SDRAM的写入操作;当oe信号为低时,DQ输入为高阻,三态门截止,DQ端口的数据送出给读fifo模块进行缓存,此为SDRAM的读操作。(关于oe信号的控制请参考04-SDRAM控制器的设计——command.v代码解析)

自动且连续的读写操作

接下来是设置完成连续读写(64个数据)以及进行突发中断的操作。

command.v模块里面已经设置突发长度为整页(整页可读写数据量为1024),所以每次读写64个数据后需要提前中断突发操作。根据IS42R16320D手册可知下发突发中断命令或者预充电命令可提前结束突发操作。

50cb2042-f897-11ef-9310-92fbcf53809c.png

该案例选择预充电命令来结束突发操作。参考前面的章节可知预充电命令是RAS_N, CAS_N,WE_N组合为010。

50df1d2c-f897-11ef-9310-92fbcf53809c.png

为了拉出相关信号查看其波形,先要暂时把这些信号输出,不然这些信号会被Quartus在综合操作时优化掉。

50f57f4a-f897-11ef-9310-92fbcf53809c.png

从波形图可以看到,确实在每次读或者写64个数据后,都会跟着出现一个预充电命令来结束全页突发操作。

5120268c-f897-11ef-9310-92fbcf53809c.png

如果上面总体的图缩小看不清,可以参考下面放大的图:

51376838-f897-11ef-9310-92fbcf53809c.png

可能大家会疑惑为什么不直接写256个数据,然后读256个数据?这里设置64个数据长度是为了让大家看到多次读和写是如何进行的。

如果想设置256个数据也是可以的,这时就把自动读设计成写完256个数据后自动进行。

5162007a-f897-11ef-9310-92fbcf53809c.png

此时的波形图如图所示(一次性写完256个数据,一次性读完256个数据):

5176bc22-f897-11ef-9310-92fbcf53809c.png

指令的产生

读过程通过Pre_RD和mRD信号的组合标志出连续读的起始时间,通过Read信号标志出连续读的过程。

写过程通过Pre_WR和mWR信号的组合标志出连续写的起始时间,通过Write信号标志出连续写的过程。

当FIFO读模块中的数据量低于一次需要读取的数据量时,mRD置1;直到连续读完成时,mRD才会清零。即mRD保持为0或1的状态都会持续多个周期,因此我们无法通过电平状态来判断是否产生开始读信号Read,所以这里采取用寄存器保存mRD的前一状态,并与当前状态进行比较,当前一状态为0,当前状态为1,即产生上升沿时,开始读信号Read信号置1。写信号同理。

51b458c0-f897-11ef-9310-92fbcf53809c.png

提前一个时钟送出异步FIFO写模块的读出使能信号是因为写数据没有延迟,写命令发出的当拍要准备好数据,所以读使能信号提前一拍给出。

51cb8662-f897-11ef-9310-92fbcf53809c.png

51e8774a-f897-11ef-9310-92fbcf53809c.png

52026e52-f897-11ef-9310-92fbcf53809c.png

写入地址和读出地址

256个数据写入节奏是这样的:

当KEY1被按下,触发了counter产生数据0~255,这个数据同步传递给异步FIFO写模块进行缓存。当系统检测到write_side_fifo_rusedw1值大于64时,异步FIFO写模块的读出端口会把FIFO里面的数据读出,传递给SDRAM器件进行储存。FIFO一次读出64个数据。总共会读出4次。

52410504-f897-11ef-9310-92fbcf53809c.png

从top文件传递过来的地址0开始写SDRAM,一次写64个数据,写第二笔64个数据时初始地址是0+64,写第三笔64个数据时初始地址是64+64=128,写第四笔64个数据时初始地址是128+64=192。

5255a900-f897-11ef-9310-92fbcf53809c.png

526e0414-f897-11ef-9310-92fbcf53809c.png

256个数据读出节奏是这样的:

异步FIFO读模块从离开初始化状态且离开复位状态且检测到read_side_fifo_wusedw1小于64时开始读取SDRAM器件的数据。

5284a462-f897-11ef-9310-92fbcf53809c.png

其复位状态的离开主要看KEY0信号和wr_latch信号:

52972024-f897-11ef-9310-92fbcf53809c.png

第一笔64个数据(0~63)是等异步FIFO写模块已经完成256个字节的缓存操作(其中的192个数据已写入到SDRAM器件了)以后读出。此时读SDRAM的地址送出是0。

第二笔64个数据(64~127)是等异步FIFO读模块读出第一个数据0的下一个时钟节拍读出,因为此时read_side_fifo_wusedw1的值64-1等于63又小于64。此时读SDRAM的地址送出是64。

第三笔64个数据(128~191)是等到异步FIFO读模块数据又只剩63个数据时读出,此时地址送出是128。

第四笔64个数据(192~255)同样是等到异步FIFO读模块数据又只剩63个数据时读出,此时地址送出是192。

52ab620a-f897-11ef-9310-92fbcf53809c.png

无论是SDRAM写操作还是读操作,在读写完256个数据后又会从地址0开始重复读写:

52d63e08-f897-11ef-9310-92fbcf53809c.png

拿SDRAM读操作来说,当读完256个数据还继续触发读操作时抓取波形图可以看到:

52ed8f68-f897-11ef-9310-92fbcf53809c.png

可能读者会有疑惑,当异步FIFO写模块第四次累计了64个数据时,为什么没有马上写入SDRAM器件,而是先从SDRAM器件里面读出64个数据缓存到异步FIFO读模块,等这64个数据读完以后再继续往SDRAM里面写最后的64个数据(192~255)。这里是因为if语句存在优先级,电路是先判断有没有读指令,当有读命令时就先处理读操作。当异步FIFO写模块写入了第四个64个数据后,异步FIFO读模块就离开了复位状态,系统会自动发送读命令,此时就开始SDRAM器件数据的读取操作。

530fc63c-f897-11ef-9310-92fbcf53809c.png

PS

本文的Signaltap波形图文件对应:~sdramcontroloutput_filesSdram_Control.stp

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • fifo
    +关注

    关注

    3

    文章

    406

    浏览量

    45493
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151
  • SDRAM控制器
    +关注

    关注

    0

    文章

    29

    浏览量

    8610

原文标题:07-SDRAM控制器的设计——Sdram_Control.v代码解析

文章出处:【微信号:友晶FPGA,微信公众号:友晶FPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【开源骚客】《轻松设计SDRAM控制器》第九讲—解密读写FIFO

    终于到第九讲了,第九讲是这套《轻松设计SDRAM控制器》的最后一讲。相信大家也是非常的期待这套教程的终结,在前面的8讲内容,我们已经介绍完了SDRAM控制器、串口部分和命令
    发表于 05-08 22:38

    多路读写SDRAM接口设计

    摘要:介绍SDRAM的主要控制信号和基本命令时序,提出一种应用于解复用的支持多路读写SDRAM接口设计,为需要大容量存储的电路设计提供了
    发表于 12-03 15:20

    【每周FPGA案例】至简设计系列- SDRAM读写控制器

    第1节 SDRAM读写控制器--作者:小黑同学本文为明德扬原创及录用文章,转载请注明出处!1.1 总体设计1.1.1 概述同步动态随机存取内存(synchronousdynamic
    发表于 10-15 15:16

    具有时间隐藏特性的数据块读写SDRAM控制器

    针对SDRAM 控制器读写数据块访问延时长、速度慢的问题,提出时间隐藏技术,将其应用于SDRAM 控制器的设计,采用FPGA实现。实验结果表
    发表于 03-25 09:00 15次下载

    基于FPGA的高速SDRAM控制器的视频应用

    基于FPGA的高速SDRAM控制器的视频应用 0 引言    SDRAM(同步动态存储)是一种应用广泛的存储
    发表于 11-04 09:56 1050次阅读

    SDRAM控制器简易化设计

    SDRAM存储芯片拥有快速读写的性能,可以应用以回波模拟系统作为数据高速缓存SDRAM芯片是由SDRAM
    发表于 10-24 15:08 0次下载
    <b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>简易化设计

    NiosII的奇幻漂流-Chap09-SDRAM-v1.0

    介绍在 Nios II 中利用 SDRAM 控制模块实现对 SDRAM 存储芯片—— K4M561633G 的读写,通过本章,你能学到
    发表于 12-14 15:40 0次下载

    DDR SDRAM控制器参考设计VHDL代码

    Xilinx FPGA工程例子源码:DDR SDRAM控制器参考设计VHDL代码
    发表于 06-07 11:44 19次下载

    DDR SDRAM控制器verilog代码

    Xilinx FPGA工程例子源码:DDR SDRAM控制器verilog代码
    发表于 06-07 14:13 40次下载

    华清远见FPGA代码-SDRAM读写控制的实现与Modelsim

    华清远见FPGA代码-SDRAM读写控制的实现与Modelsim仿真
    发表于 10-27 18:07 26次下载

    SDRAM控制器的设计

    在很多通信芯片及系统的开发中,常常需要用到存储容量大、读写速度快的存储。在各种随机存储器件中,SDRAM的价格低、体积小、速度快、容量大,是比较理想的器件。但是,与SRAM相比较,SDRAM
    发表于 11-28 19:51 5次下载
    <b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>的设计

    FPGA读写SDRAM的实例和SDRAM的相关文章及一些SDRAM控制器设计论文

    本文档的主要内容详细介绍的是FPGA读写SDRAM的实例和SDRAM的相关文章及一些SDRAM控制器设计论文主要包括了:FPGA
    发表于 12-25 08:00 57次下载
    FPGA<b class='flag-5'>读写</b><b class='flag-5'>SDRAM</b>的实例和<b class='flag-5'>SDRAM</b>的相关文章及一些<b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>设计论文

    如何使用FPGA设计SDRAM控制器

    针对SDRAM 操作繁琐的问题,在对SDRAM 存储和全页突发式操作进行研究的基础上,提出一种简易SDRAM 控制器的设计方法。该设计方法
    发表于 12-18 16:13 6次下载
    如何使用FPGA设计<b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>

    基于SDRAM控制器软核的Verilog设计

    SDRAM控制逻辑复杂,使用很不方便。 为了解决这个矛盾,需要设计专用的SDRAM控制器,使系统用户象使用SRAM一样方便的使用SDRAM
    的头像 发表于 06-30 09:16 3358次阅读
    基于<b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>软核的Verilog设计

    SDRAM控制器设计之command.v代码解析

    command.v文件对应图中SDRAM指令执行模块,它会从SDRAM接口控制模块接收指令,然后
    的头像 发表于 02-25 10:32 934次阅读
    <b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>设计之command.<b class='flag-5'>v</b><b class='flag-5'>代码</b><b class='flag-5'>解析</b>