SDRAM控制器

article/2025/10/26 14:59:28

1.SDRAM简介

  1. 简介:SDRAM为同步动态随机存储内存,同步指的是时钟与外部输入的时钟保持一致,也就是与外部共用一个时钟;动态指的是每个时间段内,都要进行一次刷新操作,否则里面的数据会丢失,这也是由存储特性决定的;随机指的是数据存储地址可由我们自己任意指定。
  2. bank与地址: 在SDRAM中,有多个bank,每个bank都有自己的行列地址,相互独立,在读写的时候,我们需要指定那个bank的那行,那列进行读写,其中行列地址线是共用的,下面会具体的说明
  3. 命令:我认为SDRAM是响应式的,对任何SDRAM的操作都要给出对应的命令,否则是无法得到想要的结果的。
  4. 数据: SDRAM输入输出的数据线是共用的

本文章使用的SDRAM是黑金AX4010上的


2. SDRAM的操作流程

  • 上电延时,然后初始化
  • 进入仲裁状态机,优先执行刷新请求,读写请求的优先级可自行决定
    ps:是不是感觉挺简单的٩(๑>◡<๑)۶

3. SDRAM 初始化

  • 找到说明文档,查阅初始化时序图
    在这里插入图片描述

  • CKE为SDRAM使能线,在整个运行过程中,一直为高即可

  • COMMAND,command是由4根线共同组成的,分别是:CS,RAS,CAS,WE,在手册的可以方便的找到不同的命令,其4根线上高低电平分别是怎样的

  • DQM为掩码,设置dqm的值,在读写sdram时,可以只对数据的高八位或者低八位或者十六位都感兴趣,一般一直设为00,即十六位都感兴趣

  • A 为行列地址线,row地址时,A全部有效,col地址时,其第九位有效

  • BA 为bank,指定对那个bank进行操作

  • DQ: 为sdram的数据线

  • 从时序图可以看到,上电后,我们需要延时最少100us,然后给个NOP命令,一般为了稳定,都会延时200us;在NOP命令后,然后再给PRECHARGE(预充电)命令,此时需要指定bank,如果A10为高的话,就是对所有的bank,如果A10为低的话,就按照BA指定的来,一般设置A10为高,后面的一些延时和对应的命令按照时序图来即可

  • 直接来到LOAD Mode Register这个命令,此时需要指定A的值,不同的A值,在后面对SDMRA的操作会不同,阅读手册可知

  • A0,A1,A2:控制突发长度,给一个读写命令,我可以连续读写多少个数据,我设置的是000,突发长度为1,我认为这样便于书写程序

  • A3: 读写是连续的,还是随机的,仅对突发长度不为1时有效;读写的需要给定地址,也就是说写入的第一个数据的地址是以给定的,如果突发长度不为1的话,后面的数据的地址是在给定地址的基础上依次加一,还是说是随机的。

  • A4,A5,A6:仅对读数据有效,给了读命令后,在接下来的几个周期内,数据才会出来,俗称潜伏期

  • 其他位就不作介绍了,都为0即可,

  • 至此SDRAM的初始化就完成了

在这里插入图片描述


4. SDRAM的写

  • 老规矩,先查阅手册,找到时序图,可惜没有我想要的完整的,那分开吧,
  1. 激活命令,激活对应的row地址和bank
  2. 延时两个周期
  3. 写命令,指定对应的col行地址和数据(A10最好为0,不然给一个命令后,又得给激活命令,重复1,2步骤)
  4. 如果想继续写,写数据达到突发长度后,然后继续再给一个写命令和新的col地址
  5. 如果不想写了,写数据达到突发长度后,给一个PRECHARGE命令,然后就写完成了。
    ps : 此步骤只是写SDRAM的一种,我认为是最简单,也是比较高效的一种
    可以参考下面的写时序,与我说的,只是A10给定的值不同,可以看出,如果A10给1了的话,它会自动进行一个PRECHARGE操作,而为0的话,则需要我们自己给定,以结束这次的写操作。
    在这里插入图片描述

5. SDRAM读和刷新

SDRAM的读与SDRAM的写基本上一样,同样刷新操作更简单,大家可以按照读时序图自己琢磨,下面给出对应的时序图
在这里插入图片描述

在这里插入图片描述

6. 注意事项

1. 读写的时候,A10的值是非常值得关注的。
2. 读时,何时接收数据;写时,何时获取数据。
3. 仲裁模块的书写,确保读写数据后,没有超过刷新周期,这里可以用读写速度换取稳定性

7. 异步FIFO

最后来介绍一下异步FIFO的实现,我们都知道FIFO是一种先进先出的一种结构,可以说是很简单的,但是设计起来还是有点难度的,难点如下

1. 由于使用的是同一块内存,如何做到读与写如何不冲突
2. 如何判断是否写满了,以及是否为空
3. 如何计算FIFO里面读写的数据量

接下来,我还是结合代码来说明吧

1. 读写

curr表示当前读写的地址,next表示下一次的读写地址只需要合理地对next地址进行更新即可做到合理性

reg[8:0]		curr_read_ptr,next_read_ptr;				//读指针
reg[8:0]		curr_write_ptr,next_write_ptr;				//写指针

对读地址进行更新,可以看到,只要不为空的时候,我们就可以一直更新next读地址的值,同样,只要没有写满的时候,就可以一直更新next写地址的值。

always@(posedge rclk or negedge rst)
beginif(rst == 1'b0)next_read_ptr <= 'd1;else if(r_en == 1'b1)if(r_empty == 1'b0)if(next_read_ptr == 'd511)next_read_ptr <= 'd0;elsenext_read_ptr <= next_read_ptr + 1'b1;elsenext_read_ptr <= next_read_ptr;elsenext_read_ptr <= next_read_ptr;
end

2. 判断是否为空和满

满和空其实很好判断,只要当下一个写的地址等于当前读的地址,即可判断为满,
空也是如此,当下一个读的地址等于当前写的地址,即为空,还要考虑初始情况,next_read等于next_write的时候也是为空的

assign 	w_full  = (next_write_ptr == curr_read_ptr ) ? 1'b1 : 1'b0; 
assign  r_empty = ( next_read_ptr == curr_write_ptr || (next_read_ptr == next_write_ptr)) ? 1'b1 : 1'b0;

3. 计算FIFO里面的数据量

FIFO里面的数据量其实读写地址的差值,但是当写的地址在读的地址后面的时候,又不仅仅是差值了,而是数据总长度减去这个差值了。

always@(posedge rclk or negedge rst)
beginif(rst == 1'b0)data_count <= 'd0;else if(curr_read_ptr >= curr_write_ptr && next_read_ptr != next_write_ptr)data_count <= 'd511 - curr_read_ptr + curr_write_ptr;elsedata_count <= curr_write_ptr - curr_read_ptr;
end

最后给出我自己实现的SDRAM_FIFO控制器,其中包括sdram_pluse仿真模块,以及testbench;FIFO没有调用IP核,利用SDRAM和FIFO将sdram封装成一个可以方便实用的异步sdram_fifo.
欢迎大家下载学习,写的很通俗易懂。下载地址.


http://chatgpt.dhexx.cn/article/jmsdvpVu.shtml

相关文章

FPGA学习历程(四):SDRAM 控制器(初始化与刷新)

目录 一、数据手册相关信息1.1 命令真值表1.2 时间参数1.3 模式寄存器配置 二、初始化模块2.1 模块时序图2.2 模块源码2.2.1 sdram_init.v2.2.2 sdram_top.v2.2.3 tb_sdram_top.v 2.3 Modelsim仿真 三、刷新模块3.1 模块时序图3.2 模块源码3.2.1 sdram_aref.v3.2.2 sdram_top.v…

手把手带你实现SDRAM控制器(带Verilog代码)

上篇博客&#xff0c;我们了解了SDRAM的控制命令以及寻址方式&#xff0c;SDRAM芯片需要配合专门的控制电路使用才能发挥功能&#xff0c;这一节我们将一步步分析&#xff0c;使用Verilog搭建一个SDRAM驱动控制器。 目录 学习目标 问题分析 初始化模块 信息收集 模块接口确…

SDRAM 控制器(一)

1、基础知识 SDRAM&#xff08;synchronous Dynamic Random &#xff09;&#xff0c;同步动态随机存储器&#xff0c;同步指内存工作需要同步时钟&#xff0c;内存的命令的发送和数据的接收都以它为标准。动态是指需要不断地刷新来保证数据不丢失&#xff08;电容存储&#xf…

操作系统面试题(二十一):什么是DMA

DMA DMA&#xff08;Direct Memory Access 直接内存访问&#xff09; DMA意味着CPU授予I/O模块权限不涉及在不涉及CPU的情况下依然可以读取/写入内存&#xff0c;即DMA不需要CPUde支持 DMAC&#xff08;DMA 控制器&#xff09; 控制直接内存访问的过程 DMA的优点&#xff1a…

操作系统面试题:虚拟内存是什么,解决了什么问题,如何映射?

虚拟内存是什么&#xff1f; 虚拟内存别称虚拟存储器&#xff08;Virtual Memory&#xff09;。电脑中所运行的程序均需经由内存执行&#xff0c;若执行的程序占用内存很大或很多&#xff0c;则会导致内存消耗殆尽。为解决该问题&#xff0c;Windows中运用了虚拟内存技术&…

Linux面试题(34道)

1、Linux中各个目录的作用 1&#xff09;/ 根目录 2&#xff09;/boot 引导程序&#xff0c;内核等存放的目录 3&#xff09;/sbin 超级用户可以使用的命令的存放目录 4&#xff09;/bin 普通用户可以使用的命令的存放目录 5&#xff09;/lib 根目录下的所程序的共享库目录 6&…

【游戏客户端面试题干货】-- 2021年度最新游戏客户端面试干货(操作系统篇)

【游戏客户端面试题干货】-- 2021年度最新游戏客户端面试干货(操作系统篇&#xff09; 大家好&#xff0c;我是Lampard~~ 经过一番艰苦奋战之后&#xff0c;我终于是进入了心仪的公司。 今天给大家分享一下我在之前精心准备的一套面试知识。 今天和大家分享的是操作系统相关的面…

操作系统和网络(一):计算机网络常见面试题

计算机网络常见面试题总结 1. OSI &#xff0c; TCP/IP &#xff0c;五层协议的体系结构 OSI分层&#xff08;7层&#xff09; &#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP分层&#xff08;4层&#xff09; &#xff1a;网络接…

【Java实习生】每日面试题打卡——操作系统篇

临近秋招&#xff0c;备战暑期实习&#xff0c;祝大家每天进步亿点点&#xff01;Day15本篇总结的是 操作系统 相关的面试题&#xff0c;后续会每日更新~ 1、请分别简单说一说进程和线程以及它们的区别? 根本区别&#xff1a;进程是操作系统资源分配的基本单位&#xff0c;而…

操作系统面试题(一)

请你说一下进程与线程的概念&#xff0c;以及为什么要有进程线程&#xff0c;其中有什么区别&#xff0c;他们各自又是怎么同步的 参考回答&#xff1a; 基本概念&#xff1a; 进程是对运行时程序的封装&#xff0c;是系统进行资源调度和分配的的基本单位&#xff0c;实现了…

操作系统面试常问——for考研复试面试

关于操作系统的一些面试常问问题 前言&#xff1a; 本人22考研党已上岸&#xff0c;发一些复试准备整理的资料作为对考研准备的一个收尾。由于近几年基本都是线上复试&#xff0c;线上的话会更加注重概念的考察&#xff0c;本人在复试准备期间搜集了面试题&#xff0c;整理了…

操作系统面试题(三)

请你来说一说协程 参考回答&#xff1a; 1、概念&#xff1a; 协程&#xff0c;又称微线程&#xff0c;纤程&#xff0c;英文名Coroutine。协程看上去也是子程序&#xff0c;但执行过程中&#xff0c;在子程序内部可中断&#xff0c;然后转而执行别的子程序&#xff0c;在适…

操作系统面试题(十四):什么是虚拟内存?

虚拟内存&#xff08;virtual Memory&#xff09; 日常生活中&#xff0c;当我们使用电脑的时候&#xff0c;尤其是windows电脑&#xff0c;经常会打开许多软件&#xff0c;这些软件占用的内存已经远远大于计算机的物理内存。之所以会这样&#xff0c;就是因为虚拟内存的存在 …

操作系统面试题:设备管理

管理什么设备&#xff1f; 除cpu,内存外的所有设备 怎么管理设备&#xff1f; 通过将物理设备映射成逻辑设备 为什么要把物理设备映射成逻辑设备&#xff1f; 物理设备是I/O系统中实际安装的设备&#xff0c;物理名通常是字符串或者ID 而逻辑设备的逻辑名比较好记 如何理解…

操作系统面试问题汇总(超详细)

操作系统的组成 1、驱动程序是最底层的、直接控制和监视各类硬件的部分&#xff0c;它们的职责是隐藏硬件的具体细节&#xff0c;并向其他部分提供一个抽象的、通用的接口。 2、内核是操作系统之最内核部分&#xff0c;通常运行在最高特权级&#xff0c;负责提供基础性、结构性…

操作系统面试题(二)

请你讲述一下互斥锁&#xff08;mutex&#xff09;机制&#xff0c;以及互斥锁和读写锁的区别 参考回答&#xff1a; 1、互斥锁和读写锁区别&#xff1a; 互斥锁&#xff1a;mutex&#xff0c;用于保证在任何时刻&#xff0c;都只能有一个线程访问该对象。当获取锁操作失败时…

几率大的杂乱+操作系统面试题(含答案)

其他面试题类型汇总&#xff1a; Java校招极大几率出的面试题&#xff08;含答案&#xff09;----汇总 几率大的网络安全面试题&#xff08;含答案&#xff09; 几率大的多线程面试题&#xff08;含答案&#xff09; 几率大的源码底层原理&#xff0c;杂食面试题&#xff08;含…

操作系统常见面试题

文章目录 进程和线程进程和线程的区别协程与线程的区别进程与线程的切换流程什么是虚拟地址空间为什么虚拟地址空间切换后感觉程序变慢进程间通信方式线程&#xff08;进程&#xff09;间同步方式线程的分类协程&#xff08;纤程&#xff09;线程和协程的区别 进程&#xff08;…

这可能最全的操作系统面试题

文章目录 操作系统简介篇解释一下什么是操作系统操作系统的主要功能软件访问硬件的几种方式解释一下操作系统的主要目的是什么操作系统的种类有哪些为什么 Linux 系统下的应用程序不能直接在 Windows 下运行操作系统结构单体系统分层系统微内核客户-服务器模式 为什么称为陷入内…

操作系统面试题(史上最全、持续更新)

尼恩面试宝典专题40&#xff1a;操作系统面试题&#xff08;史上最全、持续更新&#xff09; 本文版本说明&#xff1a;V28 《尼恩面试宝典》升级规划为&#xff1a; 后续基本上&#xff0c;每一个月&#xff0c;都会发布一次&#xff0c;最新版本&#xff0c;可以联系构师尼…