Verdvana

空持千百偈 不如吃茶去

基于FPGA的SDRAM读写实验

06 Mar 2019 » Verilog HDL, FPGA

1 前言

        FPGA内部的存储资源有限,所以需要SDRAM来存取大量高速数据,同时也可以解决跨时钟域数据存取问题。

  • 开发环境:
    • Quartus Prime Standard 18.1
  • 操作系统:
    • Windows 10 Pro 1903

2 SDRAM简介

2.1 SDRAM介绍

        SDRAM:

  • Synchronous(同步):说明需要时钟信号;
  • Dynamic(动态):需要刷新防止数据丢失;
  • Random(随机):根据指定地址自由读写。

        SDRAM内部是四个存储阵列(4个bank),每个bank就像一张表,有行地址和列地址。所以SDRAM的容量可以通过以下公式计算:

  • SDRAM总存储容量 = 行数 × 列数 × BANK数量 × 每个存储单元的位数 (单位:bit)

        比如DE1-SoC上的SDRAM:IS42R16320D。行列和块地址如下表:

名称宽度地址
行地址  13        A0-A12
列地址  10        A0-A9
块地址  2        BA0,BA1

        由公式可得:

  • SDRAM总存储容量 = 2^13 × 2^10 × 2^2 × 16bit = 32M × 16bit = 512Mbit

        SDRAM内部是四个存储阵列(4个bank),每个bank就像一张表,有行地址和列地址。 确定其中的某一个位置,需要先选中bank地址(BANK ADDR),再选中行地址(ROW ADDR),最后选中(COLUMN ADDR)。

        查看数据手册可得知SDRAM工作时钟频率。还以IS42R16320D为例:

Clock frequency: 200, 166, 143 MHz

        所以它可以在以上三种频率下工作。

2.2 SDRAM命令介绍

        要控制SDRAM需要给它写命令,SDRAM有三个命令控制引脚“RAS”、“CAS”和“WE”,对应内部有命令解码器,主控就是通过这三个接口通道来发送命令,然后解码器解码从而控制SDRAM。SDRAM的初始化、读写等操作其实就是给它命令,通过命令的配置告诉SDRAM以什么样的模式配置、工作方式和工作内容等等。下表为SDRAM基本操作命令:

命令缩写    RAS    CAS    WE    
空操作NOP111
读操作ACT011
写操作RD101
突然操作终止BT110
预充电PALL010
刷新操作SELF001
配置模式寄存器    MRS000

2.3 模式寄存器

        除命令解码器之外,SDRAM内部还有个模式寄存器(Mode Register,MR)。在SDRAM上电初始化的过程中需要模式寄存器的设置。模式寄存器通过地址总线来设置,并且将会一直保存配置信息直到下一次编程或掉电为止。模式寄存器的地址总线定义如下表:

3

        其中,突发(Burst)是指在同一行中相邻的存储单元进行数据传输的方式,连续传输的周期数就是突发长度,只要指定起始列地址和突发长度,寻址与数据的读取将自动进行。

2.4 SDRAM初始化时序

        正如之前说的,SDRAM的初始化主要是为了完成SDRAM的模式配置,初始化流程有严格的规定:

1

        其中上电初期100μs的等待时间必须给足,一般直接上200μs。

        由于SDRAM的L-Bank逻辑单元是电容结构,容易掉点,所以要及时充电。手册规定必须每64ms对所有行、列完成一次刷新,确保数据得更新,叫做预刷新

2.5 SDRAM读写操作

        SDRAM常用两种读写操作方式:

  • 通过地址索引实现单个逻辑单元数据的读写;
  • 通过突发连续读写来实现最多256个数据的连续操作。

        为了实现更高的带宽,一般采用突发连续读写操作方式。SDRAM突发读写的时序如下图:

2

        前面说了突发读写,如果要连续的突发传输,只需要控制好两端突发读取命令的间隔周期即可。突发长度在模式寄存器的配置中初始化有1、2、4、8以及256个数据的操作模式。SDRAM突发长度寄存器配置表如下:

M3M2M1M0突发长度
1/00001
1/00012
1/00104
1/00118
1/0100Reserved
1/0101Reserved
1/0110Reserved
0111全页
1111Reserved

        同时,突发读写实现的是连续的读写操作。在结束一次突发读写前,不需要重新进行行地址索引。但需要注意的是这条个连续读写操作的重点在于操作的连续,而非地址的连续。另外在模式寄存器配置中,可以设定SDRAM突发读写为顺序读写或交错读写。寄存器配置表如下:

M3突发模式
0Sequential
1Interleaved

        在大量数据流的缓存处理中,设置为顺序式的突发读写模式,同时以全页读写的方式进行突发读写操作,能达到更大的带宽,更高的效率。但这样做的前提是每次读取或写入时,都必须准备好256个数据缓存器,以保证数据的读写能够连续进行,因此还需要用到FIFO。


3 SDRAM控制器HDL设计

3.1 宏定义

        为了方便移植与修改,先将SDRAM控制器代码中用到的参数进行宏定义。

        首先是行地址列地址和BANK地址。根据数据手册可以看出,


        告辞。