FPGA-SDRAM的读写控制

1 理论知识

1.1 基本概念

Synchronous Dynamic Random Access Memory        同步 动态 随机存取内存

优点:存储容量大,速度快,便宜

缺点:需要不断刷新保证数据的可靠性,行列地址线时分复用,对操作时序要求严格

1.2 存取原理

SDRAM 内部可以理解为一个存储阵列
        通过行地址(Row Address)和列地址(Column Address)(先行后列)精确定位到这一存储单元,进而进行数据的读写操作。N(行列个数乘积)个存储单元构成一个存储阵列,这个存储阵列我们称之为一个逻辑 Bank(Logical Bank,简称L-Bank、 Bank)。

        SDRAM 内部并不是一个全容量的 L-Bank,而是分割为若干个 L-Bank,目前大多为 4 个。一是技术、成本等诸多因素;二是由于SDRAM 的工作原理限制,单一 L-Bank 可能会造成非常严重的寻址冲突,大幅度降低内存效率。故在对 SDRAM 进行数据存取时,要先确定 L-Bank 地址,定位到指定逻辑Bank,再依次确定行地址和列地址。一次只能对一个 L-Bank 的一个存储单元进行操作。

        SDRAM 的基本存储单位是存储单元,一个存储单元的容量为若干个 Bit,对于SDRAM 而言就是芯片的位宽。

        每个 Bit 存放于一个单独的存储体中,存储体是利用电容能够保持电荷以及可充放电的特性制成,主要由行选通三极管列选通三极管存储电容以及刷新放大器构成。电容所存储的电荷会随时间慢慢释放,这就需要不断刷新为电容充电,以保证存储数据可靠性。

        将每个存储单元简化为单 Bit 的存储体,再将若干存储体排列为矩阵,同一行将行地址线相连,同一列将列地址线相连,就构成了一个存储阵列的简化模型。

1.3 操作命令

(1)SDRAM 器件引脚说明

        由于 SDRAM 在容量、位宽以及生产厂家存在差异,所以 SDRAM 在 Bank 地址、地址总线、数据总线和数据掩码可能存在位宽的差异,但各输入输出管脚的名称和实现功能并无出入。针对其中较为重要的输入输出引脚,我们以镁光公司生产的、容量为 4 Meg x 16 x 4 Banks SDRAM 芯片为例, 对其做一下功能介绍:

        上文中对 SDRAM 各引脚进行了简要功能描述,接下来简单说明一下 SDRAM 内部功能框图。 SDRAM 内部功能框图,具体见图:

        SDRAM 内部包含一个逻辑控制单元,内部包含模式寄存器和命令解码器。外部通过 CS_N、 RAC_N、 CAS_N、 WE_N 以及地址总线向逻辑控制单元输入命令,命令经过命令解码器进行译码后,将控制参数保存到模式寄存器中,逻辑控制单元进而控制逻辑运行。

        外部通过地址总线输入地址信息,地址信息在逻辑控制单元进行逻辑控制时起到辅助作用,除此之外,复用的地址总线与 Bank 控制逻辑、行地址复用器、列地址计数锁存器、列地址解码器等内部器件共同作用,精确选定存储阵列中与行列地址相对应的存储单元,进而进行数据存取操作。

(2)SDRAM 的存储容量与速度等级

        以镁光公司生产的 3 款 SDRAM 芯片为例,为读者说明一下 SDRAM 芯片存储容量相关参数含义,以及存储容量计算方法

        图中列举了镁光公司的 3 款 SDRAM 芯片,我们挑选其中一款进行容量计数方法的介绍。例“MT48LC16M16A2”,由图可知,“Micron”“ MT48LC16M16A2”分别表示此SDRAM 芯片的生产商和产品型号。“4Meg × 16 × 4Banks”才是表示 SDRAM 存储容量的具体参数,其中“4Meg”表示单个 L-Bank 包含的存储单元的个数,计算方法为单个存储阵列行地址数和列地址数的乘积,以此芯片为例,行地址总线为 A0-A12,行地址位宽为13 位,行地址数为 8192 (2^13)行,列地址位宽为 9 位,列地址数为 512(2^9)列,单个 LBank 中包含的存储单元个数为行地址数(8192)与列地址数(512)相乘,乘积为 4M(8192 ×512 = 4194306); “16”表示数据位宽,即每个存储单元存储数据的 bit 数; 4Meg 与 16 相乘表示单个 L-Bank 中可存储的 Bit 数;“4BANKS”表示一片 SDRAM 中包含的 L-Bank个数,此 SDRAM 芯片包含 4 个 L-Bank;由此可得 SDRAM 芯片的存储容量为256MBit(4Meg × 16 × 4BANKS)。

        容量计算方法可简化为:

        存储容量(Bit) = L-Bank 存储单元数 ×数据位宽(Bit) × L-Bank 个数

        接下来我们来说明一下 SDRAM 芯片的另一个概念:速度等级。 SDRAM 速度等级相关参数截图:

时钟频率(Clock Frequency),单位MHz,所列举的具体参数为 SDRAM 正常工作的最高时钟频率, SDRAM 工作时只能等于或低于这一时钟频率。

tRCD 表示写入自激活命令到开始进行数据读写,中间所需的等待时间,列举的数值表示等待时间的最小值,单位为 ns;

tRP 表示自预充电指令写入到预充电完成所需的等待时间,列举的数值表示等待时间的最小值,单位为 ns;

CL(CAS(READ)latency)列选通潜伏期,表示自数据读指令写入到第一个有效数据输出所需等待时间,单位ns;

Target tRCD-tRP-CL 表示最大工作频率下, tRCD、 tRP、 CL 等待的最小时钟周期数

(3)SDRAM 的操作命令

        CS_N、 RAS_N、 CAS_N、 WE_N 四路控制信号构成 SDRAM 指令集。除构成指令集的 4 路信号之外, CKE、 BA[1:0]、 A[12:0]等信号,在 SDRAM 的操作中,也起到辅助作用。SDRAM 操作指令集截图,具体见图:

注: H 表示高电平; L 表示低电平; X 表示无需关心
1. 禁止命令(Command Inhibit)
        禁 止 命 令 (Command Inhibit) , 其 他 数 据 手 册 也 称 为 取 消 设 备 选 择 命 令 (Device
Deselect),控制指令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b1XXX。不论 SDRAM 处于何种状态,此命令均可被执行,无需顾及 CKE 是否有效,即 CLK 是否使能,无需关心 DQM、ADDR、 DQ 的信号输入;执行此命令后, SDRAM 芯片不被选择,新的命令无法写入,但已经执行的命令不受影响。

2. 无操作命令(No-operation)
        无操作命令(No-operation),也可称为空命令,简称为 NOP 命令,控制指令为
{CS_N,RAS_N,CAS_N,WE_N} = 4’b0111。不论 SDRAM 处于何种状态,此命令均可被写入,该命令给被选中的 SDRAM 芯片传递一个空操作信息,目的是为了防止 SDRAM 处于空闲或等待状态时,其他命令被写入,此命令对正在执行的命令无影响。

3. 配置模式寄存器命令(Load Mode Register)
        配置模式寄存器命令(Load Mode Register),也被称为 Mode Reigister Set,简称 LMR 命令,控制指令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0000,此命令只有所有 L-Bank 均处于空闲状态时才可被写入,否则配置出错,而且在执行此命令后, SDRAM 必须等待相应的响应时间 tRSC(Register Set Cycle),模式寄存器配置周期)后,才可写入新的命令

        在写入此命令对 SDRAM 进行模式寄存器配置时,需要地址总线 A0-A11 辅助寄存器
的模式设置, A0-A11 赋值不同对应寄存器配置不同模式,未使用的地址总线设置为低电
平。下面我们来介绍一下 A0-A11 的不同赋值所对应的寄存器不同模式:

突发长度(Burst Length)
        突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉
及到存储单元(列)的数量就是突发长度(Burst Length,简称 BL)

        地址总线的低三位 A0-A2 是突发长度的控制位, SDRAM 芯片的突发长度可设置为1、 2、 4、 8 和整页,单位为字节,整页表示一次突发传输一整行的数据量,具体数值视芯片而定
        若在数据读/写操作时不使用突发传输,此时可等效为突发长度为 1 字节,每次读/写数据时,都要对存储单元进行寻址,如果要实现连续的读/写操作,就要不断地发送列地址和读/写命令,这种方法控制资源占用极大,效率较低。

        若使用突发传输, 只要指定起始列地址和突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址, 这样,除了第一笔数据传输需要若干个周期外,其后的每个数据只要一个周期即可获得。突发的数据长度一般是 4 或 8,如果传输时实际需要的数据长度小于设定的 BL 值,则调用“突发停止”命令结束传输。
     

突发类型
        突发类型的设置位为 A3,可将突发类型设置为两类,顺序和隔行。一般将 A3 设置为低电平,选择顺序类型,但也要结合实际情况进行选择。不同突发类型所对应的情况,具体见图:

列选通潜伏期(CAS Latency)
        列选通潜伏期是指从读命令被寄存到数据总线上到出现第一个有效数据之间的时钟周期间隔,列选通潜伏期可被设置为 2 个或 3 个时钟周期,设置位为 A6,A5,A4,当{ A6A5A4}=3’b010 时,潜伏期为 2 个时钟周期;当{ A6A5A4}=3’b011 时,潜伏期为 3 个时钟周期,时序图具体见图 

运行模式(Operating Mode)
        运行模式设置位为 A7,A8, SDRAM 存在标准模式、测试模式等多种模式,但对于普通用户,只开放了标准模式,在使用 SDRAM 时只需将 A7,A8 设置为低电平进入标准模式即可

写模式

        写模式设置位为 A9,控制 SDRAM 的写模式。当 A9 为低电平时, SDRAM 的读/写操作均采用突发方式, 突发长度由突发长度寄存器(A0-A2)设定;当 A9 位高电平时,SDRAM 的读操作依然采用突发方式,突发长度由突发长度寄存器(A0-A2)设定,但SDRAM 的写操作不在使用突发方式,每一个写命令只能写入一个数据。
        A10-A12 为保留位,对模式寄存器的配置不起作用,赋值为 0 即可。

4.预充电命令(Precharge)

        预充电的作用就是关闭指定的 L-Bank 或者全部 L-Bank 中激活的行(需要重新激活L-Bank),预充电命令执行后,必须等待对应的等待时间 tRP(tRP(Precharge command Period),预充电命令周期),相对应的 L-Bank 将可以被重新操作。

        预充电命令(Precharge)命令包括两类:全部预充电(Precharge All)和指定 L-Bank 预充电(Precharge Bank),控制指令均为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0010,通过地址总线中的 A10 和 L-Bank 地址线 BA[1:0]辅助控制预充电类型, 当 A10 为高电平时,执行全部预充电命令,对所有的 L-Bank 进行预充电,无需关心 BA[1:0]信号的输入;当 A10 为低电平时,只对由BA[1:0]选定的 L-Bank 进行预充电。当某个 L-Bank 执行预充电操作后,该L-Bank 处于空闲状态,在下次读写操作之前必须重新激活。


5. 刷新命令(Refresh)
        SDRAM 只有通过刷新操作才能保证数据的可靠性。SDRAM 的刷新操作是周期性的,在两次刷新的间隔可以进行数据的相关操作。刷新周期是多少呢?
        目前国际公认的标准是,存储体中电容的数据有效保存期上限是 64ms,也就是说每一行刷新的循环周期最大为 64ms,那么刷新速度就是:行数/64ms。我们在 SDRAM 的数据手册中经常会看到 4096 Refresh Cycles/64ms 或 8192 Refresh Cycles/64ms 的相关介绍, 这里的 4096 与 8192 就代表 SDRAM 芯片中单个 L-Bank 的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化, 当单个 L-Bank 为 4096 行时,刷新间隔最大为 15.625μs,单个 L-Bank 为 8192 行时,刷新间隔最大为 7.8125μs。
        刷新命令(Refresh)分为两种:自动刷新命令(Auto Refresh)和自刷新(Self Refresh),控制指令相同,为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0001,两种刷新方式均不需要外部提供地址信息。

        当 CKE 为高电平时,写入刷新指令,执行自动刷新操作。在执行自动刷新命令前,必须先要执行预充电命令,将所有 L-Bank 关闭, SDRAM 内部刷新计数器会依次自动生成行地址,刷新是针对一行中的所有存储单元,所以无需列寻址。 由于刷新涉及到所有 LBank,因此在刷新过中,所有 L-Bank 都停止工作,而每次刷新需要等待对应的时钟周期,之后就可进入正常的工作状态, 在此期间,所有工作指令只能等待而无法执行。 64ms之后则再次对同一行进行刷新,如此周而复始进行循环刷新。
        当 CKE 为低电平时,写入刷新指令,执行自刷新操作。自刷新操作主要用于休眠模式低功耗状态下的数据保存, 在发出刷新命令时,将 CKE 置于无效状态,就进入了自刷新模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在自刷新期间除了CKE 之外的所有外信号都是无效的,只有重新使 CKE 有效才能退出自刷新模式并进入正常操作状态。

6. 激活命令(Bank Active)
        激活命令(Bank Active),控制命令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0011,只有SDRAM 处于空闲状态下才可被响应。激活命令是为后续操作激活某一特定 L-Bank 中的某一行,逻辑 Bank 地址线 BA[1:0]和地址总线 A0-A12 选择要激活的特定 L-Bank 的特定行,激活该行后,该行一直保持激活状态,并可以进行后续读/写操作,操作完成后,只有执行一次预充电命(Precharge)后,被激活的特定行被关闭。每次激活只能激活一个 L-Bank,同一个 L-Bank 中每次只能激活一行,当需要对同一 L-Bank 中其他行进行操作时, 必须先执行一个预充电命令关闭当前行,再激活另一行进行操作。
 

7. 写命令(Write)
        写命令(Write),控制命令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0100,用来实现对已激活的特定 L-Bank 的特定行的数据突发写入操作, BA[1: 0]指定需要写入数据的特定 LBank,地址线 A0-A9 指定需要写入存储单元的起始列地址, A10 的电平变化控制突发写操作完成后是否立即执行自动预充电操作,若 A10 为高电平,突发写操作完成后,立即执行自动预充电操作,关闭当前行;若 A10 为低电平,突发写操作完成后,当前行依然处于激活状态,以便对当前行执行新的读/写操作,想要关闭当前激活行,需写入预充电指令。

8. 读命令(Read)
        读命令(Read),控制命令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0101,用来实现对已激活的特定 L-Bank 的特定行的数据突发读取操作, BA[1:0]指定需要读取数据的特定 LBank,地址总线 A0-A9 指定需要读取存储单元的起始列地址, A10 的电平变化控制突发读操作完成后是否立即执行自动预充电操作,若 A10 为高电平,突发读操作完成后,立即执行自动预充电操作,关闭当前行;若 A10 为低电平,突发读操作完成后,当前行依然处于激活状态,以便对当前行执行新的读/写操作,想要关闭当前激活行,需写入预充电指令。

9. 突发终止(Burst Terminate)
        突 发 终 止 (Burst Terminate) , 也 称 为 Burst Stop , 控 制 命 令 为
{CS_N,RAS_N,CAS_N,WE_N} = 4’b0110, SDRAM 处于读/写操作过程中可被写入,突发停止操作被用来截断固定长度或者整页长度的突发,执行突发停止命令后,最近执行的数据读/写操作被终止,此命令操作并不会通过预充电关闭当前激活行,需通过预充电操作关闭被激活行。

1.4 操作时序

        
 

2 实战演练

2.1 实验目标

        设计并实现一个 SDRAM 数据读写控制器,使用 PC 机通过串口向 SDRAM 写入 10 字节数据,并将写入的 10 字节数据读出,通过串口回传至 PC 机,在串口助手上位机上打印显示回传数据。

2.2 硬件资源

        征 途 Pro 开 发 板 使 用 的 SDRAM 型 号 为 W9825G6KH , 存 储 容 量 为 256Mbit(32MByte), 地址位宽 13 位, 数据位宽 16 位

2.3 程序设计

2.3.1 整体模块设计

        本实验共调用大小 13 个模块,实验工程分三个部分,自下而上分层次讲解。

第一部分: SDRAM 控制器
        SDRAM 控制器的实现,最核心的部分就是对 SDRAM 进行数据的读写操作,而为了保证数据正确的写入和读取,以及写入数据的可靠性, SDRAM 的初始化和刷新操作必不可少。在此将 SDRAM 控制器中初始化、自动刷新和数据读写的实现部分定为第一部分。此部分的整体框图见下图:

        第一部分共调用 6 个模块,是三个部分中调用模块较多的部分,是本实验工程核心中的核心。顶层模块为 sdram_ctrl 模块,内部实例化 5 个功能子模块,连接各子模块对应信号,外部接收数据读写请求、读写地址和读写数据,输出 SDRAM 控制信号、地址和数据;顶层模块内部实例化的 5 个功能子模块分别为 sdram_init、 sdram_aref、sdram_write、 sdram_read 和 sdram_arbit。各部分功能描述,具体见表格:

第二部分: SDRAM 顶层模块

        顶层模块 sdram_top,对外输入地址、使能、数据等相关信号,输出 SDRAM 时钟、控制信号、地址和数据;内部实例化 2 个功能子模块, fifo_ctrl 模块,对 SDRAM 的读写数据进行跨时钟域处理,为 sdram_ctrl 模块提供读写 SDRAM 的数据读写地址;sdram_ctrl 模块,实现对SDRAM 的初始化、自动刷新和数据读写操作。

第三部分:串口读写 SDRAM 控制器
        本实验工程通过串口和 SDRAM 控制器实现对 SDRAM 的数据读写操作,所以最顶层由串口收发功能实现部分和 SDRAM 控制器构成。

        由图和表格可知,本部分共调用 6 个子模块,是调用模块较多的部分。顶层模uart_sdram,内部实例化 5 个子功能模块,连接各子模块对应信号,除此之外还包含读有效信号的约束代码(图中未画出),外部与 PC 机和 SDRAM 进行数据交互。 clk_gen 模块为调用的 IP核,生成实验工程使用的倍频和相位偏移时钟; uart_rx 模块、 uart_tx 模块为串口数据收发模块,实现工程与 PC机之间的的互数据交互; sdram_top 模块为 SDRAM 控制器,是 PC 机与 SDRAM 数据交互的纽带; fifo_read 模块,将读出 SDRAM 的数据通过 FIFO 进行数据缓存和跨时钟域处理,使读出数据被正确传入串口数据接收模块。

2.3.2 初始化模块

        SDRAM 在上电之后,执行正常操作之前需要被初始化,实际上就是对上文提到的SDRAM 内部逻辑控制单元进行初始化,初始化成功的 SDRAM 才可进行后续的其他操作。接下来我们将要学习掌握初始化操作时序,设计、实现并仿真验证初始化模块功能。

初始化操作时序
        SDRAM 的初始化是一套预先定义好的流程,除此之外的其他操作会导致 SDRAM 出现不可预知的后果。 SDRAM 初始化操作时序图,具体见图:

结合 SDRAM 初始化时序图, 列出 SDRAM 初始化参考流程如下:
        (1) 对 SDRAM 上电,加载稳定时钟信号, CKE 设置为高电平;
        (2) 等待 T=100us 的时间,此过程中操作命令保持为空操作命令;
        (3) 100us 等待结束后,写入预充电命令, A10 设置为高电平,对所有 L-Bank 进行预充电;
        (4) 预充电指令写入后,等待 tRP时间,此过程中操作命令保持为空操作命令;
        (5) tRP等待时间结束后,写入自动刷新命令;
        (6) 自动刷新命令写入后,等待 tRC时间,此过程中操作命令保持为空操作命令;
        (7) tRC等待时间结束后,再次写入自动刷新命令;
        (8) 自动刷新命令写入后,等待 tRC时间,此过程中操作命令保持为空操作命令;
        (9) tRC 等待时间结束后,写入模式寄存器配置指令,地址总线 A0-A11 参数不同辅助模式寄存器不同模式的设置;

        (10) 模式寄存器配置指令写入后,等待 tMRD 时间,此过程中操作命令保持为空操作命令;
        (11) tMRD等待时间结束后, SDRAM 初始化完成。


注: 1.对于 tRP、 tRC、 tMRD 等时间参数,不同芯片或速度等级可能存在差异,读者需查阅芯片对应数据手册进行参数设置;
        2.T=100us 为最小等待时间,我们在使用 SDRAM 时,等待时间 T 可适当延长;
        3.初始化过程中,至少进行两次自动刷新,也可适当增加刷新次数。

初始化模块框图
        在上一小节中,我们了解 SDRAM 的初始化的参考流程,本小节中我们介绍一下初始化模块的整体框图和输入输出信号的具体功能。模块框图和端口功能描述具体见图:

初始化模块波形图
        初始化模块整体波形图,具体见图:

2.3.3 自动刷新模块

自动刷新操作时序
        SDRAM 的刷新方式分为自刷新和自动刷新两种,这两种刷新方式,在实现和作用上存在差异

        自动刷新模式:作用是在 SDRAM 的正常操作过程中,保证数据不丢失,自动刷新过程需要外部时钟的参与但刷新行地址由内部刷新计数器控制,无需外部写入。

        自刷新模式则主要用于休眠模式低功耗状态下的数据保存, 自刷新过程无需外部时钟参与,与自动刷新相同的是,刷新行地址由内部刷新计算器控制,无需外部写入。

        两者的操作命令相同,当 CKE 信号保持高电平时,写入刷新指令,进入自动刷新模式;当 CKE 信号为低电平时,写入刷新指令,进入自刷新模式。

        自刷新模式下,除 CKE 之外的其他外部信号均无效,当 CKE 再次拉高时,退出自刷新模式,进入正常操作状态。两种刷新方式时序图:

        只对 SDRAM 的自动刷新操作的时序图和参考流程进行讲解
        SDRAM 的自动刷新类似于简化版的初始化操作,只是缺少了上电后的等待时间和模式寄存器配置部分,只包含一次预充电操作和两次自动刷新操作,自动刷新操作参考流程如下:

(1) 写入预充电命令, A10 设置为高电平,对所有 L-Bank 进行预充电;
(2) 预充电指令写入后,等待 tRP时间,此过程中操作命令保持为空操作命令;
(3) tRP等待时间结束后,写入自动刷新命令;
(4) 自动刷新命令写入后,等待 tRC时间,此过程中操作命令保持为空操作命令;
(5) tRC等待时间结束后,再次写入自动刷新命令;
(6) 自动刷新命令写入后,等待 tRC时间,此过程中操作命令保持为空操作命令;
(7) tRC等待时间结束后,自动刷新操作完成。

自动刷新模块框图

2.3.4 写数据模块

        在本章节的 SDRAM 控制器的实验中,我们使用的是 SDRAM 的不进行自动预充电的页突发写模式,所以我们只针对这一数据写入模式做一下讲解,其他写入模式不再说明:

结合图 53-44 页突发写模式时序图,我们来说一下 SDRAM 页突发写操作的流程。
(1) 发送激活指令到 SDRAM,同时 BA0-BA1、 A0-A12 分别写入 L-Bank 地址、行地址,激活特定 L-Bank 的特定行;
(2) 激活指令写入后,等待 tRCD时间,此过程中操作命令保持为空操作命令;
(3) tRCD等待时间结束后,写入写数据指令,同时 A0-A8 写入待数据的列首地址;
(4) 读数据指令写入同时,由 DQ 开始写入数据,在最后一个数据写入后的下一个时钟写入突发终止指令;
(5) 突发终止指令写入后, SDRAM 的页突发写操作完成。

注: 1.对于 tRCD 等时间参数,不同芯片可能存在差异,读者需查阅芯片对应数据手册;
2.页突发的突发长度数值上等于 SDRAM 一行包含的存储单元的个数,视芯片具体设计而定。
数据写模块框图

        wr_addr 为 24 位宽的地址信号,由 fifo_ctrl模块生成并传入,高 2 位为数据写入位置的逻辑 Bank 地址中间 13 位为数据写入位置行地址后 9 位为数据突发写入首地址; wr_data 为待写入数据,以数据写操作响应信号wr_ack 信号为使能,自 fifo_ctrl 模块中写 fifo 读取

2.3.5 数据读模块
        与SDRAM 数据写操作类似, SDRAM 的数据读操作也包含多种方式,在本章节的 SDRAM 控制器的实验中,我们使用的是 SDRAM 的不带自动预充电的页突发读模式。

2.3.5 仲裁模块

2.3.6 SDRAM控制模块

把各个模块进行实例化即可

2.3.7 FIFO 控制模块

        SDRAM 控制器的最后一个功能模块 FIFO 控制模块 fifo_ctrl。使用 FIFO 对传入的待写入SDRAM 的数据和自 SDRAM读出的数据进行进行缓存,实现跨时钟域处理;为数据读写模块提供 SDRAM 读写地址,产生读写请求。
 

SDRAM参考设计文档学习手册是用于指导读写SDRAM的例程的一份文档,本文将以Cyclone 4E FPGA和Verilog语言为主要工具进行开发。 首先,我们了解SDRAM(同步动态随机存取存储器)是一种常见的存储设备,用于存储大量数据。开发过程中,我们需要仔细阅读SDRAM参考设计文档学习手册,掌握SDRAM控制信号、时序要求、地址和数据传输等基本概念。 接下来,我们进行FPGA开发。选择Cyclone 4E FPGA是因为它具有适用于嵌入式系统和数字信号处理应用的低功耗和高性能特点。使用Verilog语言进行开发的原因是Verilog是一种常用的硬件描述语言,能够准确地描述电路的功能和时序。 在进行SDRAM读写例程的开发前,我们需要从SDRAM参考设计文档中获取如下关键信息: 1. 控制信号的定义和时序要求:包括写使能、读使能、数据读写、时钟信号等。 2. 地址和数据传输方式:SDRAM的地址线和数据线的布局、长度和顺序。 3. 初始化和复位要求:SDRAM的初始化和复位过程,以确保正常工作。 设计例程时,我们首先根据SDRAM参考设计文档中的时序要求,编写适当的Verilog模块。模块中需要定义相应的输入和输出信号,并设置时钟频率和延时要求。 然后,我们可以利用Cyclone 4E FPGA开发工具,将Verilog代码编译、综合和实现为具体的硬件电路。在这个过程中,我们需要根据FPGA的特性和资源限制,对Verilog代码进行适当的优化。 最后,我们可以通过在FPGA板上加载bitstream文件,将我们开发SDRAM读写例程部署到FPGA上进行验证。通过连接适当的外设,我们可以测试SDRAM读写功能的正确性和性能。 总结起来,SDRAM参考设计文档学习手册为我们提供了实现SDRAM读写的基本指导。通过结合Cyclone 4E FPGA和Verilog语言的开发工具,我们可以有效地开发出符合SDRAM要求的读写例程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值