基于FPGA的DDR SDRAM控制器的设计

更新时间:2023-03-10 23:28:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

题目:

普 通 本 科 毕 业 设 计

基于FPGA的DDR SDRAM控制器的设计

摘 要

随着半导体技术的发展,A/D采样的速率越来越高,相应需要越来越大容量的存储器。存储器是目前数字系统中的关键部件之一,DDR SDRAM(Double Data Rate SDRAM,双倍数据率同步动态随机存储器)以其大容量、高速率和良好的兼容性以及低成本在计算机、消费类电子、通信等领域得到了相当广泛的应用。DDR控制器实际上就是用户端与DDR存储器之间进行数据传输的一个桥梁,通过DDR控制器,用户端命令被转化成DDR存储器所支持的命令格式,从而实现用户端对DDR的访问。

本文对DDR SDRAM及其控制器的结构、接口和时序进行了深入研究与分析,得出一些DDR SDRAM控制器的关键技术特性,然后基于Altera公司Cyclone II系列的FPGA芯片EP2C8Q208C8平台,利用Verilog硬件描述语言设计实现了DDR SDRAM存储控制器。编写自动生成自加数据的模块,将自加数据写入到SDRAM中,再从SDRAM中读回,从UART 发送出去并在串口调试工具上显示。

【关键词】可编程逻辑门阵列 DDR SDRAM 存储控制器 通用异步收发器

II

Abstract

Along with the development of semiconductor technology, A/D sampling rate is higher and higher, requiring more capacity of corresponding. Storage of memory is one of the crucial devices in the digital system at present, the DDR (Double Data Rate) SDRAM has many advantages for it's large capacity, high speed and the low cost, it has been used in quite a number of fields, such as the Server, the WorkStation, the Personal computer and the consumer electronics, the communication and other areas. DDR controller actually is a bridge between client and DDR memory for data transmission, through the DDR controller, client command was converted into the DDR memory which support command format, so as to realize the visit of DDR clients.

The pivotal technologies of DDR SDRAM and memory controller, such as Structure, Interface and Timing are explored in this article, after a research on the main feature inside the DDR controller, several functional modules of the controller are designed out, and then based on FPGA chip Cyclone II Altera company EP2C8Q208C8 platform series used Verilog hardware description language. Write automatic generation and add data modules, with data from the data written to add SDRAM, and again read back from SDRAM, send it out from UART and display on serial port debugging tools.

【Key words】FPGA; DDR SDRAM; Memory Controller; UART

III

目 录

1 绪论 .............................................. 2 1.1 DDR SDRAM的现状及发展趋势 ....................... 2

1.1.1 DDR内存的现状 ....................................................................... 2 1.1.2 DDR内存的发展趋势 ............................................................... 3 1.2 课题研究的意义 .................................................................................... 3 1.3 课题研究的要求 .................................................................................... 2 1.4 本文的安排 ............................................................................................ 2

2 DDR SDRAM技术介绍 ................................. 4

2.1 DDR SDRAM的分类 .......................................................................... 4 2.2 DDR SDRAM的基本概念 .................................................................. 4

2.2.1 DRAM存储原理 ....................................................................... 5 2.2.2 DDR SDRAM的逻辑BANK与芯片位宽 .............................. 5 2.2.3 DDR SDRAM芯片容量 ........................................................... 5 2.2.4 DDR SDRAM内存刷新 ........................................................... 6 2.3 DDR SDRAM的命令 .......................................................................... 6

2.3.1 初始化 ......................................................................................... 6 2.3.2 DDR SDRAM指令 ................................................................... 7 2.4 DDR SDRAM读写操作时序 .............................................................. 8

2.4.1 读操作时序 ................................................................................. 8 2.4.2 写操作时序 ................................................................................. 8

3 FPGA和Quartus II简介 ............................ 10

3.1 FPGA技术简介 .................................................................................. 10

3.1.1 FPGA基本结构 ....................................................................... 10 3.1.2 FPGA的基本特点 ................................................................... 10 3.1.3 FPGA芯片的选择 .................................................................... 11 3.2 Quartus Ⅱ简介 ................................................................................. 11 3.3 Quartus II的设计流程 ...................................................................... 11

1

4 系统硬件设计 ..................................... 13

4.1 系统整体框架 ...................................................................................... 13 4.2 自动累加数据产生模块 ...................................................................... 13 4.3 DDR SDRAM控制器模块 ................................................................ 14

4.3.1 DDR SDRAM控制器整体状态分析 ..................................... 14 4.3.2 DDR SDRAM控制器总体架构 ............................................. 15 4.3.3 输入/输出FIFO模块 .............................................................. 16 4.3.4 控制接口模块设计 ................................................................... 17 4.3.5 控制接口模块设计 ................................................................... 19 4.3.6 数据通路模块设计 ................................................................... 21 4.4 串口读数据模块 .................................................................................. 23

5 系统控制器的功能验证 ............................. 26

5.1 系统控制器的功能仿真 ...................................................................... 26

5.1.1 系统控制器Testbench设计 ................................................... 26 5.1.2 系统控制器Testbench总体架构 ........................................... 26 5.1.3 DDR SDRAM Controller Testbench顶层模块设计 ............ 26 5.1.4 DDR SDRAM Controller Testbench仿真波形 .................... 27 5.2 串口读取数据验证 .............................................................................. 28

6 总结 ............................................. 29 参考文献 ............................................ 30 致 谢 .............................................. 31

1 绪论

1.1 DDR SDRAM的现状及发展趋势

1.1.1 DDR内存的现状

目前DDR内存市场占有量非常大,尤其是近些年随着市场需求的高速增长使得加入该行业和研究该技术的人员也越来越多,DDR控制技术处于高速发展阶段。和显卡、主板等差异化较大的市场相比,内存市场由于有着强

2

大的JDEDC把持,并且产品本身形态较为单一,因此各家产品性能和设计差距都不太大,同质化现象较严重。不过,同质化并不意味着发展速度慢,相反,也正是由于有了统一的JEDEC规范,内存一直按部就班地发展着。

对于DDR系统来说,DDR控制器的研究是其关键核心,该部分要完成读写控制、地址控制等功能。 1.1.2 DDR内存的发展趋势

第一代DDR200规范并没有得到普及,第二代PC266 DDR SDRAM(133MHz时钟×2倍数据传输=266MHz带宽)是由PC133 SDRAM内存所衍生出的,它将DDR内存带向第一个高潮,其后来的DDR333内存也属于一种过度,而DDR400内存成为目前的主流平台选配,双通道DDR400内存已经成为800FSB处理器搭配的基本标准,随后的DDR533规范则成为超频用户的选择对象。

现在DDR2/3都在扩大产量,DDR3量产后,供应将大增,而成本将会降低,所以DDR3将会降价,这样也能促进普及,而普及又会促使厂商增加产量,产量增加又会进一步摊薄成本降低价格。随着人们要求的变高,速率更快容量更大的内存不断会涌现出来。

1.2 课题研究的意义

DDR内存遍布于各种电子产品,正渐渐成为现代社会中不可或缺的信息存储载体。存储器对现在的数字化系统性能至关重要,是决定系统性能的关键设备之一。面对越来越多样化的应用需求,存储技术发展得相当迅速,其中DDR SDRAM作为一种在性能与成本之间折中的解决方案,以其高速、大容量、运行稳定与高性价比等优点已经成为目前存储器的主流。

3

随着电子技术在工业、医疗、商业等领域的发展,人们对数据传输率的要求越来越高,传统的单片机早已不能满足这种高速数据传输的要求。与此同时,可编程逻辑器件FPGA以其强大的功能,开发过程投资小、周期短,可反复编程修改,开发工具智能化等特点,成为当今硬件设计的潮流;它的集成度高,可完成极其复杂的时序与组合逻辑电路功能,更适用于高速、高密度的高端数字逻辑电路设计领域。

本设计采用FPGA来进行系统设计。采用传统的单片机编程实现算法的方法虽灵活性较高,但是执行复杂工作时处理速度远远不能满足要求,而且单片机的时序性较差。要改善这个问题,FPGA是很好的选择之一,它有足够大的逻辑阵列密度(百万门级以上),比较高的速度(400MHZ以上)。

由此可见,采用FPGA完成DDR SDRAM控制器的设计可以使内存上升到一个新级别。因此对DDR存储控制器的设计研究具有重要意义。

1.3 课题研究的要求

本课题要求完成基于FPGA的DDR SDRAM(此SDRAM为SAMSUNG公司的K4S641632H芯片)控制器的设计,实现以下功能要求:

(1)初始化DDR SDRAM; (2)简化DDR SDRAM的读写时序;

(3)将DDR SDRAM接口的双时钟沿数据转换为单时钟沿数据,使得对DDR SDRAM的操作类似于普通RAM;

(4)控制器还要产生周期性的刷新命令来维持DDR SDRAM内的数据而不丢失。

1.4 本文的安排

本文对DDR SDRAM控制器从整体设计到各部分细化设计展开讨论,对系统涉及的各模块的设计进行详细描述,最后对系统功能仿真以及读写数据验证。全文的内容安排如下:

第一部分为绪论。简单介绍了内存的现状与发展趋势,并对本课题的研究意义及其要求做了简单论述。

第二部分,介绍了DDR SDRAM相关技术,首先对DDR的存储原理、逻辑BANK、位宽等基本概念进行了大致介绍,然后对其命令进行简单介绍,最后对其读写时序做了详细分析。

2

第三部分,介绍了FPGA相关知识并对此系统开发平台Quartus II也进行了简单介绍,接着描绘了此系统在开发平台上的设计流程。

第四部分,详细介绍了系统的整体架构包括自动累加数据生成模块、控制器模块、串口读数据模块,并分别重点研究构成控制器的主要模块:输入/输出FIFO模块、数据接口模块、命令模块、数据通路模块。

第五部分,主要是对控制系统的功能进行验证。将编写好的测试文件在Modelsim平台上完成功能仿真,并对系统的读写功能进行了串口输出验证。

最后,对系统实现了读写功能进行总结。

3

2 DDR SDRAM技术介绍

2.1 DDR SDRAM的分类

DDR的频率可以用工作频率和等效频率两种方式表示,工作频率是内存颗粒实际的工作频率,但是由于DDR内存可以在脉冲的上升和下降沿都传输数据,因此传输数据的等效频率是工作频率的两倍。

按DDR的频率可分为以下几类,如表2.1所示。

表2.1 DDR内存分类7

DDR规格 DDR200 DDR266 DDR333 DDR400 DDR433 DDR533 传输标准 PC1600 PC2100 PC2700 PC3200 PC3500 PC4300 实际频率 100MHz 133MHz 166MHz 200MHz 216MHz 266MHz 等效传输频率 200MHz 266MHz 333MHz 400MHz 433MHz 533MHz 数据传输率 1600MB/s 2100MB/s 2700MB/s 3200MB/s 3500MB/s 4300MB/s 2.2 DDR SDRAM的基本概念

DDR SDRAM是Double Data Rate SDRAM的缩写,是双倍速率同步动态随机存储器的意思。DDR存储器的核心建立在SDRAM的基础上,但在速度和容量上有了提高。首先,它使用了更多、更先进的同步电路,使用了差分时钟输入;其次,DDR使用了PLL锁相环和数据选通滤波信号(Data Strobe signal),当数据有效时,存储控制器可使用这个数据选通滤波信号来精确定位数据,每8位数据对应输出一次数据选通滤波信号,并且同步来自不同的双存储器模块的数据。

DDR存储器本质上不需要提高时钟频率就能加倍提高SDRAM的速度,它允许在时钟脉冲的上升治和下降沿读出数据,因而其速度是标准SDRAM的两倍。至于地址与控制信号则与传统SDRAM相同,仍在时钟上升沿进行传输。DDR存储器的设计可让存储控制器每一组DQ/DQS/DM与DIMM(Dual In-line Memory Module,双列直插式存储器模块)上的颗粒相接时,维持相同的负载,减少对主板的影响。在存储器架构上,传统SDRAM属于8组式,即

4

存储器核心中的I/O寄存器有8位数据I/O,但对于8组式的DDR SDRAM而言,存储器核心中的I/O寄存器却是16位的,即在时钟信号上升沿时输出8位数据,在时钟信号下降沿时再输出8位数据,一个时钟周期总共可传输16位数据。

DDR芯片内部除了四个存储矩阵(四个逻辑BANK)之外,就是一些控制逻辑、行列缓冲与解码、I/O寄存器或缓冲,使用双向的DQS信号进行源同步计时定位读/写的数据信号2。

DDR存储器可以在不用大量增加管脚的情况下,大幅度提高数据传输的带宽(提高了一倍),并且目前价格也非常便宜,性价比很高,足以满足一般的存储设计需求。 2.2.1 DRAM存储原理

DRAM利用MOS管的栅电容上的电荷来存储信息,一个DRAM的存储单元存储的是0还是1取决于电容是否有电荷,有电荷代表1,无电荷代表0。但时间一长,由于栅极漏电,代表1的电容会放电,代表0的电容会吸收电荷,这样会造成数据丢失,因此需要一个外设电路进行内存刷新操作。刷新操作定期对电容进行检查,若电量大于满电量的1/2,则认为其代表1,并把电容充满电;若电量小于1/2,则认为其代表0,并把电容放电,藉此来保持数据的连续性。

2.2.2 DDR SDRAM的逻辑BANK与芯片位宽

DDR SDRAM是一种高速CMOS动态随机访问存储器,它在内部被配制成4个BANK的DRAM,外部数据具有4位、8位、16位三种宽度。

DDR SDRAM中每一个BANK中的存储单元被组织成正方阵列,由若干行和若干列组成,这些存储单元通过行和列的地址译码器来寻址。对于任何一个单元的读操作,整个行均被读出,然后重新写回(刷新)。对于任何一个单元的写操作,整个行均被读出,然后改变其中一个单元的值,最后将整个行写回。

阵列就如同表格一样,将数据“填”进去,可以把它想象成一张表格。和表格的检索原理一样,先指定一个行(Row),再指定一个列(Column),我们就可以准确地找到所需要的单元格,这就是内存芯片寻址的基本原理。对于内存,这个单元格可称为存储单元。 2.2.3 DDR SDRAM芯片容量

5

内存芯片的容量就是所有L-BANK中的存储单元的容量总和,计算有多少个存储单元和计算表格中的单元数量方法一样:

芯片容量=存储单元数量×位宽=(行数×列数×L-BANK数量)×位宽 DDR SDRAM具有如下的容量:

(1)64Mb(即67,108,864位):16M ×4(4M×4×4banks)、8M×8(2M×8×4banks)、4M×16(1M×16×4banks);

(2)128Mb(即134,217,728位):32M×4(4M×4×4banks)、16M×8(2M×8×4banks)、8M×16(1M×16×4banks);

(3)256Mb(即268,435,456位):64M×4(4M×4×4banks)、32M×8(2M×8×4banks)、16M×16(1M×16×4banks);

(4)512Mb(即536,870,912位):128M×4(4M×4×4banks)、64M×8(2M×8×4banks)、32M×16(1M×16×4banks);

(5)1Gb(即1,073,741,824位):256M×4(4M×4×4banks)、128M×8(2M×8×4banks)、64M×16(1M×16×4banks)

可以发现由于位宽的变化引起了存储单元的数量变化,也就是说在相同的总容量下,可以采用多种不同的位宽设计。 2.2.4 DDR SDRAM内存刷新

内存条应该叫做动态DRAM,其中的数据是靠电容特性存储的。由于电容会放电,要维持数据,就要不断的给它充电。给动态DRAM定期充电的机制就叫做数据刷新时钟电路,即内存刷新电路。一般情况下,内存刷新电路必须在数毫秒之内对DRAM刷新一次,否则数据就会丢失。很像是一个流沙漏斗,一旦不加沙就会完全漏光。刷新频率由芯片的工作频率以及每个BANK包含的行数决定。

2.3 DDR SDRAM的命令

2.3.1 初始化

DDR SDRAM是一种易失性存储器器件,也就是说,当器件掉电后,存储在DDR SDRAM中的所有内容及其配置信息将会丢失。DDR SDRAM每次上电后,必须按一定的顺序来初始化其内部状态机并配置用户定义的操作参数,否则会引起不可预料的操作结果。在DDR SDRAM能够被存取数据之前,需要先对其初始化1。该初始化流程是预先定义好的,初始化的过程中

6

将设置DDR SDRAM的普通模式寄存器和扩展模式寄存器,用来制定DDR SDRAM的工作方式。这些设置包括突发长度、突发类型、CAS潜伏期和工作模式以及扩展模式寄存器中的对DDR SDRAM内部PLL的使能与输出驱动能力的设置。模式寄存器可以被再编程,这时需要DDR SDRAM的各个区(BANK)处于空闲状态,从而改变存储器的工作模式。如果操作正确,对模式寄存器的再编程不会改变存储器内存储的数据。初始化完成之后,DDR SDRAM便进入正常的工作状态,此时便可对存储器进行读写和刷新。 2.3.2 DDR SDRAM指令

DDR SDRAM支持的指令与SDR SDRAM基本一致,本课题将其基本指令分为表2.2和表2.3,表2.2中的操作主要由CSn,RASn,CASn,WEn这四个信号来控制(CKE在这些操作下为高电平),需要由CKE来控制的信号放在了表2.3中,即对DDR SDRAM工作状态的配置必须配合CKE信号来完成。

表2.2 DDR基本指令真值表6 命令 无操作 读 写 行激活 自动刷新 预充电 写模式寄存器 符号 NOP READ WRIT ACT REF PRE MRS CSn L L L L L L L RASn X H H L L L L CASn X L L H L H L WEn X H L H H L L 注:L代表低电平,H代表高电平,X代表高电平或低电平

表2.3 DDR基本指令真值表

操作 进入自动刷新 退出自动刷新 进入低功耗 退出低功耗 符号 SELF SRE× PWDN PDE× CKEn-1 H H H H CKE L H L H 命令 REF DSEL/NOP DSEL/NOP DSEL/NOP 注:CKEn是CKE信号在第n个clock上升沿的逻辑状态,CKEn-1是CKE信号在第n-1个clock上升沿的状态。

7

2.4 DDR SDRAM读写操作时序

2.4.1 读操作时序

读操作的时序图如2-1所示:

图2-1 DDR SDRAM读操作时序图

上图的信号:CK和/CK是一组差分时钟,CK的上升沿对准COMMAND(命令)和ADDRESS(地址)的中央,一般叫做center-align(中间对齐)。ADDRESS只是一个column address(列地址),行地址已经在前面用ACTIVE命令打开了。DQ即数据总线,具有双向性,在空闲时为高阻。DQS 可以理解为数据使能信号,和数据同步,在空闲时也为高阻。DQ和DQS都是和时钟边沿对齐,叫做edge-align(边沿对齐)。

另外上面有一个CL=2.5的标识,CL即CAS Latency。CL是指内存在收到列地址信号(Column Address Strobe)后,要等待多少个系统时钟周期后才进行读取的动作。注意到上图中在列地址被采样2.5个时钟周期后,数据总线上出现了有效的读数据。 2.4.2 写操作时序

在对DDR SDRAM的写操作中,同样以状态机完成其时序控制。每发起一次写操作,DDR SDRAM存储8个16位的数据,其中控制信号FULL由前端数据缓存(FIFO)产生,当前端缓存中存储的数据达到设定的深度时,FULL被置为高。控制核以100MHz的时钟从缓存中读走宽度为16位的数据,当缓存内部的读计数器计数到达设定值时,FULL信号置低,控制器的读操作停止。

8

在DDR控制接口模块产生的时序配合下以双倍速率完成一次突发写。和读操作不同是发出写命令(write)后,需要等待tDQS时间才能送出写数据(DQ)和DQS。tDQS参数是指DQS的第一个跳变沿相对于写命令的延时时间,tDQS有最大值和最小值,就是说在最大最小值之间将DQ/DQS送出来,DDR SDRAM都能够正常接收。

写操作时序图如2-2。

图2-2 DDR SDRAM写操作时序图

9

3 FPGA和Quartus II简介

本次设计就是以EDA技术为基础,使用基于FPGA技术,利用Altera公司开发的功能强大的Quartus II9.1开发软件来完成相关的设计。

3.1 FPGA技术简介

3.1.1 FPGA基本结构

FPGA的结构一般分为三部分:可编程输入/输出模块、可编程逻辑单元(LE)、可编程内部互连资源(IR)。LE是FPGA芯片实现逻辑的基本结构,LE之间可以灵活地互相连接。LE的功能很强,不仅能够实现逻辑函数,还可以配置成RAM等复杂的形式。FPGA采用SRAM进行功能配置,可重复编程,但系统掉电后,SRAM中的数据丢失。因此需在FPGA外加EPROM或FLASH,将配置数据写入其中,系统每次上电自动将数据加载到SRAM中。装载的过程是在FPGA内部的一个时序电路的控制下自动进行的,所以在为FPGA设计电路时,一定要给它配备一个专用的配置芯片。

除了上述构成FPGA基本结构的三种资源以外,随着工艺的进步和应用系统需求的发展,一般在FPGA中还可能包含以下可选资源:存储器资源(块RAM、分布式RAM);数字时钟管理单元(分频/倍频、数字延迟、时钟锁定);算数运算单元(高速硬件乘法器、乘加器);多电平标准兼容的I/O接口;高速串行I/O接口;特殊功能模块(以太网MAC等硬IP核);微处理器(PowerPC405等硬处理器口核)。 3.1.2 FPGA的基本特点

FPGA有以下特点:采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片;FPGA可做其它全定制或半定制ASIC电路的中试样片;FPGA内部有丰富的触发器和I/O引脚;FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一;FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。

随着微电子技术、EDA技术、以及应用系统需求的发展,可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。FPGA正在逐渐成为数字系统开发的平台,并将在以下方面继续完善和提高:

(1)高集成度,大容量、低成本、低电压,低功耗;

10

(2)资源多样化;

(3)适用于片上系统:处理器、高速串行I/O、DSP等等;

(4)深亚微米工艺的使用。目前基于90nm工艺的FPGA已经商用,正在向65nm挺进;

(5)各种软硬IP库的发展和完善; (6)动态可重构技术实用化。 3.1.3 FPGA芯片的选择

根据系统的功能要求,本设计使用的FPGA是Altera公司的Cyclone II系列的EP2C8Q208C8,Cyclone II FPGA是Altera公司推出的低成本FPGA。Cyclone II系列的FPGA有专门的DDR SDRAM接口电路,可以方便地实现FPGA与DDR SDRAM的连接。在整个逻辑设计中,利用Altera公司的PLL锁相环Megafuntion产生所需要的时钟,采用Altera LPM宏功能模块中的异步FIFO,DDR SDRAM控制器接口采用Altera LPM宏功能模块中的DDR MEMORY接口。采用现成的IP核,方便了我们的设计,不仅在设计效率上得到了提高,而且在可靠性方面也得到了一定程度的保证。

DDR SDRAM系统中数据通路设计以及控制时序是本系统设计的核心,在构建系统之前,基于以下因素选择了Cyclone II系列的EP2C8芯片:

(1)高达400MHz的工作频率可以满足高速数据处理以及传输的要求; (2)Altera公司研发的Quartus II软件拥有更直观的开发界面,为整个系统的扩展和开发提供了很大的便捷。

3.2 Quartus Ⅱ简介

Quartus II是Altera开发的CPLD/FPGA应用软件工具,Quartus II提供了完善的集成而且与电路构造不关联的设计环境,拥有数字逻辑设计的全部特性。

此外,Quartus II软件为设计流程的每个阶段提供Quartus II图形用户界面、EDA工具界面和命令行界面。设计流程包括以下几个步骤:设计输入;综合;仿真;器件编程与配置。其中器件编程与配置包括以下四种编程模式:被动串行模式、JTAG模式、插座内编程模式和主动串行模式。

3.3 Quartus II的设计流程

建立工程是每个开发过程的开始,当工程建立好后,要适当选择设计的

11

输入方式,设计输入就是完成电路设计。Quartus II提供原理图输入方式、文本输入方式和内存编辑输入方式。大多数工程设计时,都会用到LPM功能模块和宏功能模块来加速设计输入。当编译成功后,进行功能仿真验证电路功能是否正确。通过功能仿真能及时发现设计中的错误,加快设计速度,提高设计的可靠性。综合优化是指将HDL语言、原理图等设计输入翻译成由与、或、非门,RAM,触发器等基本逻辑单元组成的逻辑连接。综合优化完成后需要检查综合结果是否与原设计一致,做综合后仿真。在仿真时,把综合优化生成的标准延时文件反标注到综合仿真模型中去,可估计门延时带来的影响.综合后仿真虽然比功能仿真准确一些,但是只能估计门延时,不能估计线延时。这些都通过后,进行程序下载和功能确认。满足设计要求,设计完成,否则继续上述工作。

设计流程如图3-1所示。

设计准备设计输入:原理图硬件描述语言波形图功能仿真设计处理:优化、综合适配、分割布局、布线时序仿真 器件编程与测试

图3-1 Quartus II设计流程图

12

4 系统硬件设计

4.1 系统整体框架

系统主要由三大块组成,分别是自动累加数据产生模块、DDR SDRAM控制器模块、串口读数据模块。其中DDR SDRAM控制器模块是本设计的重点,它又由命令模块、控制器接口模块、数据通路模块和输入/输出FIFO模块相互协作来完成对数据的读写操作。

系统的整体框架如图4-1所示。

DDR SDRAM控制器模块输入FIFO模块命令模块输出F串口读数I读数据据模块FO模块 图4-1 系统整体框图

自加数据写数据产生模块控制接口模块数据通路模块4.2 自动累加数据产生模块

为了验证DDR SDRAM控制器的功能,在FPGA内部设计了一个自动累加数据产生器供给SDRAM的写入数据部分。此模块自动产生0x00到0xFF的数据并与控制器地址线、数据线相连,经输入FIFO缓存,写入到SDRAM中;然后经过一系列有序的控制器操作指令后经输出FIFO缓存;最后,由串口读出数据在串口调试工具上显示出来,从而可以通过读出来的数据验证控制器是否能够有效的实现功能。此模块包含有读写生成信号、读写数据产生信号、读写请求信号及响应信号。上电500us延时等待SDRAM就绪后,每640ns写入8个16bit数据到SDRAM。

13

自动累加数据产生模块的原理图如图4-2所示。

图4-2 自动累加数据产生模块

自动累加数据产生模块部分代码如下: always @(posedge clk or negedge rst_n) if(!rst_n) wrf_dinr <= 16'd0;

else if(!wr_done && ((cntwr > 6'h05) && (cntwr <= 6'h0d))) begin//上电0.5ms延时完成

wrf_dinr <= wrf_dinr+1'b1; //写入数据递增 assign wrf_wrreq = wrf_wrreqr; assign wrf_din = wrf_dinr; endmodule

4.3 DDR SDRAM控制器模块

4.3.1 DDR SDRAM控制器整体状态分析

DDR SDRAM支持的常用命令有7种:空操作(NOP)、激活操作(Active)、突发读(Burst Read)、突发写(Burst Write)、自动刷新(Auto refresh)、预充电(Precharge)、模式寄存器配置(Mode Register Set)。所有的操作命令都是通过信号线RAS_N、CAS_N、WE_N共同控制来实现的。在对DDR SDRAM 进行存取数据操作之前,首先要对其初始化;初始化完成之后,DDR SDRAM 便进入正常的工作状态,此时便可对存储器进行读写和刷新;数据的存取以一个激活命令(Active)开始,接着便是读(Burst Read)或写(Burst Write)命令。自动刷新(Autorefresh)命令用来周期性地刷新DDR SDRAM,以保

14

持其内部的数据不丢失。

状态转换图如图4-3所示。

复位空闲初始化自动刷新预充电空闲配置模式读或写命令寄存器读激活写写等待预充电读等待

图4-3 DDR SDRAM控制器状态机

4.3.2 DDR SDRAM控制器总体架构

本系统控制器是本次设计的主体部分,自动累加数据产生模块和串口读数据模块协同其工作来实现功能验证。其包括输入/输出FIFO模块、控制接口模块、CMD命令模块、数据通路模块。其中控制接口模块包括命令接口模块和刷新控制模块,用于接收系统的控制信号,进而产生不同的CMD命令模块用于接收CMD命令并解码成操作指令并产生SDRAM的操作动作,包括仲裁和命令产生模块;数据通路模块则用于控制数据的有效输入和输出。

15

系统控制器大致框架如图4-4所示

ResetClkData(15:0)输出FIFO输入FIFOSd_add(11:0)Data_inwritereadyread控制接口模块命令模块Sd_BA(1:0)Sd_csSd_weSd_rasSd_casSd_Data(15:0)Sd_DQM(1:0)Addr(22:0)Data_out数据模块

图4-4 DDR SDRAM控制器框图

4.3.3 输入/输出FIFO模块

输入/输出FIFO模块的顶层原理图文件如图4-5所示。

图4-5 输入输出FIFO模块

FIFO模块部分代码如下: //例化SDRAM写入数据缓存FIFO模块 Wrfifo uut_wrfifo( data(wrf_din), rdclk(clk_100m), rdreq(sdram_wr_ack),

16

wrclk(clk_25m), wrreq(wrf_wrreq), q(sys_data_in), wrusedw(wrf_use) );

//例化SDRAM读出数据缓存FIFO模块 Rdfifo uut_rdfifo( data(sys_data_out), rdclk(clk_25m), rdreq(rdf_rdreq), wrclk(clk_100m),

wrreq(/*rdf_wrreq*/sdram_rd_ack), q(rdf_dout), wrusedw(rdf_use) ); endmodule

4.3.4 控制接口模块设计

系统控制接口模块包括命令接口和刷新控制两个模块,该模块内含了初始化机制和系统指令分析机制。将CMD[2:0]翻译成接口指令和对刷新计数器的控制。首先通过状态机完成对CMD[2:0]的翻译,根据CMD[2:0]输入来决定状态的转移,完成CMD[2:0]的解码,系统控制接口模块如图4-6所示。

SDRAM需要周期性刷新来保持数据的不丢失,芯片数据手册中通常会给出在一定时间T内至少刷新n次,如果用户使用的频率为FrMHz的时钟,则刷新周期Tf可以通过算式Tf=(T*Fr)/n计算得到。刷新控制在程序中通过一个计数器来完成,当到达规定的计数周期,就向SDRAM发出REF_REQ刷新请求,知道SDRAM完成刷新操作,发出REF_ACK刷新应答信号,计数器才重新赋值开始下一次的计数。

初始化机制不仅要完成对SDRAM的初始化配置,还要完成对控制器的初始化配置,使控制器与外部SDRAM的工作模式一致。其过程如下:由计数器控制在系统上电200us左右后,先进行SDRAM的初始化配置工作,由一个

17

Precharge all bank指令完成对所有BANK的预充;接着是执行多个Refresh指令,然后通过模式配置指令LOAD_MODE来完成SDRAM的工作模式设置;之后进行控制器的初始化配置工作,先发出指令LOAD_REG1给控制器载入模式字,再发出LOAD_REG2指令载入控制器的刷新计数器值,完成控制器初始化配置。

上述初始化过程结束后,系统指令分析机制才可接收并分析系统的读写信号和地址信息,以及从下个模块反馈回来的CMDACK信号,并产生对应的CMD命令和SADDR地址信息给CMD命令解析模块。通过程序设置,实现了根据初始化配置的参数来确定在读写到特定时刻发出Precharge或者Refresh的CMD指令,从而简化了系统的控制。而每当收到CMDACK为1时,表示CMD指令已经发出并有效,此时就要发出NOP命令。要说明的是,SADDR是分时复用的,在初始化载入模式时,SADDR用以传输用户自己定义的模式字内容;而在正常的读写期间,SADDR作为地址线传输SDRAM所需的行、列和块地址。此外,系统指令分析机制会根据控制器对SDRAM的操作处于什么样的状态,而反馈SDRAM_FREE和FDATA_ENABLE信号给系统用户。

图4-6 系统控制接口模块

ddr_control_interface模块部分代码: always @(posedge CLK or negedge RESET_N)

18

begin

if (RESET_N == 0) begin

NOP <= 0; READA <= 0; WRITEA <= 0; REFRESH <= 0; PRECHARGE <= 0; LOAD_MODE <= 0; LOAD_REG2 <= 0; LOAD_REG1 <= 0; SADDR <= 0; end

// This always block implements the refresh timer刷新计时器(16bit)执行逻辑 always @(posedge CLK or negedge RESET_N) begin if (RESET_N == 0) begin

timer <= 0; timer_zero <= 0; REF_REQ <= 0; end endmodule

4.3.5 控制接口模块设计

此模块由两个子模块组成:命令仲裁子模块和命令产生子模块。命令仲裁子模块主要用来对主机总线命令和由控制器产生的刷新命令进行决断。

该模块对CMD指令进行判断,其结果就是输出相应的操作指令信号给命令响应模块。例如,CMD为001时,则会输出do_read信号为1,CMD为010时,则会输出do_write信号为1,在同一时刻,只会输出一种有效的的操作指令。此外,该模块内含用以预设某些模式参数的模式寄存器,主要包括三类:第一类是SDRAM模式控制寄存器,在LOAD_MODE指令时,将该

19

寄存器的值送入SDRAM的模式寄存器中,以控制SDRAM的工作模式;第二类是SDRAM控制器的参数寄存器(LOAD_REG1),使得SDRAM控制器的工作方式与外部的SDRAM器件的工作方式匹配;第三类是SDRAM的刷新周期控制寄存器,该寄存器预设用户定义的自动刷新计数值,用于SDRAM的刷新周期预设。上述三类寄存器的预设值都是系统控制接口模块在初始化时通过SADDR传送给来的。

命令产生模块根据从CMD命令解析模块得到的操作指令,做出符合SDRAM读写规范的操作动作,来进行用户期望的操作;给出数据选通信号OE,来控制数据通路模块(写操作时OE为1,读操作时OE为0)。此外,该模块把系统非复用的地址ADDR处理为SDRAM复用的地址,分时送给SA、BA。程序中地址复用方法为:

assign raddr = ADDR[ROWSTART + ROWSIZE -1:ROWSTART] //raddr为行地址

assign caddr = ADDR[COLSTART + COLSIZE -1:COLSTART] //caddr为列地址

assign baddr= ADDR[BANKSTART +`BANKSIZE -1:BANKSTART] //baddr为BANK地址(ROWSTART、COLSTART、BANKSTART分别为行、列、块在ADDR中的起始位)

在程序中,WRITEA和READA的CMD指令实际隐含了ACTIVE命令,所以该模块在收到do_write或do_read指令后,会先进行激活动作,经过初始化配置规定的CAS延迟时间之后再进行读写动作。例如初始化时,模式字规定CAS=2,BURST LENGTH=PAGE,则从命令接口模块收到do_write=1后,会先做出激活动作并给出行地址(发出RAS_N=0,CAS_N=1,WE_N=1,SA=raddr),过2个时钟延迟后,再做出写动作并给出列地址(发出RAS_N=1,CAS_N=0,WE_N=0,SA=caddr)。

此外,收到各类操作指令后,该模块会反馈给CMD命令解析模块cmdack信号为1,并最终反馈到系统控制接口模块的CMDACK信号为1,如果没有收到任何操作指令,则cmdack信号为0,并最终反馈到系统控制接口的CMDACK信号为0。

系统控制命令模块如图4-7所示。

20

图4-7 命令模块

ddr_command部分代码如下:

// address, cs, cke, and command signals(ras,cas,wen)产生逻辑 always @(posedge CLK ) begin if (RESET_N==0) begin SA <= 0; BA <= 0; CS_N <= 1; RAS_N <= 1; CAS_N <= 1; WE_N <= 1; CKE <= 0; end else begin

CKE <= 1; endmodule

4.3.6 数据通路模块设计

数据通路模块主要是在writea和reada命令期间处理数据的通路操作,是

21

对时序要求最为严格的部分,也是最关键的部分。由于在上升沿和下降沿都需要处理数据,所以需要采用一些其他资源来保证时序的精确性。

DQ是双向数据线,用来传输从SDRAM读出数据和向SDRAM写入的数据。无论是数据在读出还是写入时,都是在OE有效,即OE为高电平时才能进行传输。DM是由主机输入的数据掩码,通过DQM输出到SDRAM的LDQM和UDQM管脚,进而控制SDRAM I/O缓冲的低字节和高字节。该模块受OE信号的控制,使数据的进出和相应的操作指令在时序上同步,如图4-8所示。

根据系统设计对SDRAM读写要求的不同,对控制器进行简单的参数修改(主要是初始化时模块内容字的设置),即可使对SDRAM的控制符合自己的要求。该控制器使得系统对SDRAM的操作非常简单。以写操作为例,初始化结束后,只要SDRAM空闲,系统就会收到SDRAM-FREE有效信号,此时可以发出FPGA-WR指令,同时给出ADDR地址信息,在收到反馈的FDATA-ENABLE有效后,系统将数据通过DATAIN写到SDRAM中去,即完成写操作,系统无需关心SDRAM的刷新和预充电。

图4-8 数据通路模块

ddr_data_path部分代码如下:

// 采集来自SDRAM的读数据,产生DQS信号 always @(negedge CLK200 or negedge RESET_N) begin

if (RESET_N == 0) begin

dqs1a <= 0; dqs2a <= 0;

22

dqs1b <= 0; dqs2b <= 0; delayed_OE <= 0; din2x_1 <= 0; din2x_2 <= 0; dqs_oea <= 0; dqs_oeb <= 0; end …………………… assign DQOUT = dq2; assign DQOE = ioen;

assign DQS[0] = dqs_oea ? dqs2a : 1'bz; assign DQS[1] = dqs_oeb ? dqs2b : 1'bz; endmodule

4.4 串口读数据模块

为了实现读出数据的可视化显示效果,设计了串口读数据模块,用于接收数据,通过串口线传输数据在电脑上显示出来。

此模块编写主要有波特率除数、接收数据寄存器、发送数据寄存器、状态寄存器控制寄存器、移位寄存器。

接收寄存器保存接收到的数据,完全接收后状态寄存器接收准备好置位1;当从接收寄存器读取数据后,状态寄存器的接收准备好清零。当将字符写入发送寄存器时,发送准备好位为0,当将字符从发送数据寄存器传输到发送以为寄存器时,发送准备好位置1;除数寄存器的值用于产生波特率时钟;控制寄存器的每一位使能状态寄存器中对应位的中断,当状态位及其对应的中断使能位为1时,产生一个中断。

发送数据寄存器和发送移位寄存器提供双重缓冲,主控制器可以在前一个字符正在移出时将新数值写入发送数据寄存器,并可通过读出状态寄存器的发送准备好位、发送移位寄存器空位和发送溢出错误位监控视发送器的状态。此模块可以通过改变波特率设置相应的传输速率,并且可以设置发送逻辑相应的起始位、数据位和停止位。

23

串口显示模块的顶层原理图文件如图4-9所示。

图4-9 串口读数据模块

uart_ctrl模块的部分代码如下: module uart_ctrl( clk,rst_n, tx_data,tx_start, fifo232_rdreq, rs232_tx );

input clk; //25MHz主时钟 input rst_n; //低电平复位信号 input[7:0] tx_data; //待发送数据

input tx_start; //串口发送数据启动标志位,高有效 output fifo232_rdreq; //FIFO读请求信号,高有效 output rs232_tx; //RS232发送数据信号 //---------------------------------------------------------------- //串口发送底层模块和串口波特率选择模块接口 wire clk_bps; //发送数据标志位,高有效

wire bps_start; //波特率时钟计数器启动信号,高有效 //---------------------------------------------------------------- //例化串口数据发送底层模块 uart_tx uut_tx( clk(clk), rst_n(rst_n),

24

tx_data(tx_data), tx_start(tx_start), clk_bps(clk_bps), rs232_tx(rs232_tx), bps_start(bps_start), fifo232_rdreq(fifo232_rdreq) );

//例化串口数据发送波特率控制模块 uart_speed_select uut_ss( clk(clk), rst_n(rst_n), bps_start(bps_start), clk_bps(clk_bps) ); endmodule

25

5 系统控制器的功能验证

5.1 系统控制器的功能仿真

5.1.1 系统控制器Testbench设计

在完成一个设计后,需要进行测试以确认设计的正确性和完整性。而要进行测试,就需要编写测试激励和结果检查程序,即测试平台(testbench)。

本设计的系统控制器功能仿真通过利用Verilog语言写testbench的方法,以Mentor公司的Modelsim作为仿真工具,通过检查波形来完成。Testbench不仅要产生激励(即输入),还要验证响应(即输出)。 5.1.2 系统控制器Testbench总体架构

DDR SDRAM控制器要实现写数据到寄存器,读校验数据。在建立测试平台时,首先要建立任务函数,如burst_write、burst_read等,DDR SDRAM控制器总体架构如图5-1所示。

ddr_sdram_topTest task(ddr_sdram.v)DDR SDRAM Controller Testbench(ddr_sdram_tb.v)

图5-1 DDR SDRAM Controller Testbench总体架构

5.1.3 DDR SDRAM Controller Testbench顶层模块设计

DDR SDRAM Controller Testbench部分程序代码如下: $display(\

0xfffffff5, 0xfffffff6, 0xfffffff7\ $display(\ burst_write(0, 32'hfffffff0, 16'hffff, 3, 4);

26

$display(\ $display(\ burst_read(0, 0, 3, 3, 4);

5.1.4 DDR SDRAM Controller Testbench仿真波形

DDR SDRAM Controller Testbench对SDRAM写仿真波形,如图5-2所示。

图5-2 Testbench对SDRAM写仿真波形

DDR SDRAM Controller Testbench对SDRAM读、校验仿真波形,如图5-3所示。

5-3 Testbench对SDRAM读、校验仿真波形

27

5.2 串口读取数据验证

在系统的硬件设计和仿真完成之后,将编译后的文件下载到系统的硬件中,对DDR SDRAM控制器的读信号进行了实时的采集与显示。

本设计采用JTAG接口的EPCS间接编程,将SOF文件转换为JIC文件,然后用JIC文件以及Quartus II Programmer对串行配置器件EPCS进行编程。通过串口从SDRAM中读出的数据,通过读的结果可以看出:自加数据写入了SDRAM中,且串口读出了其写入的数据。

串口调试助手设置以及接收到的数据如图5-4所示。.

图5-4 串口调试结果

28

6 总结

本设计根据SDRAM控制指令的特点,详细的介绍了一种基于FPGA的DDR SDRAM控制器的设计方案。本设计涉及到了许多新的知识与技术需要学习和了解,也有很多已经比较成熟的技术需要进一步深入理解。在设计过程中的某些方面就不可避免的遇到一些疑问、困难和想法。

完成该设计首先要有一定的FPGA知识基础,既要掌握用FPGA进行设计的方法,又要深入了解FPGA内部各个逻辑单元模块的结构以及它们所起的作用,比如FPGA上各个BANK的时钟域、FPGA的外存接口等;其次要掌握DDR SDRAM存储器相关的关键技术,从存储器芯片的内部结构到工作原理、工作时序分析,信号之间的相互联系等;此外,要理解存储控制器要完成的工作及其工作过程,根据控制器要实现的功能将其划分为各个功能模块,对各个模块进行分析与设计,简化难度。

本设计主要用到了FPGA技术,详细研究了DDR SDRAM的主要工作原理和结构的基础上,基于Verilog硬件描述语言完成DDR SDRAM控制器的设计,通过逻辑仿真、综合,最后通过将生成的硬件语言文件下载到开发板中来验证系统的读写功能。

最后,个人认为本设计有很好的实用价值。原因是目前高性价比DDR存储器将得到越来越广泛的应用,与其相对应的软核控制器以其灵活的适应性、高可靠性、良好的可复用性必将成为硬件设计的主流,并且其功能也会在以后的应用实践中不断发展与完善,有着相当好的应用前景。

29

参考文献

[1] 刘云清、佟首峰、姜会林,2005:《利用FPGA实现SDRAM控制器的设计》,长春理工大学学报,P47~50。

[2] 宋一鸣、谢奕、李春茂,2003:《基于FPGA的SDRAM控制器设计[J]》,P11~13。 [3] 田 丰、邓建国、李巍、贾治华,2005:《SDRAM控制器的设计与VHDL实现[J]》,P14~17。

[4] 李广军、孟宪元,2003:《可编程设计ASIC设计[M]》,成都电子科技大学出版社。 [5] 罗玉平、施业斌、尹社广,2002:《SDRAM视频存储控制器的设计与实现[J]》,P23~26。

[6] 曹华、邓彬,2005:《使用Verilog实现基于FPGA的SDRAM控制器[J]》,P11~14。 [7] 赵丕凤、徐元欣、赵亮,《多路读写的SDRAM接口设计[J]》,P19~23。

[8] 吴子域、余松煜、管云峰,2006:《基于卷积交织的SDRAM控制器的设计[J]》,P22~25。

[9] 陈飞,2002:《SDRAM控制器的VHDL实现[J]》,P17~20。

[10] 夏宇闻,2001:《Verilog高级数字系统设计[M]》,北京航空航天大学出版社。 [11] 任晓东、文博,2003 :《CPLD/ FPGA 高级应用开发指南》,北京电子工业出版社。

[12] 孙宁,2006:《高清视频解码芯片中SDRAM存储器接口的设计与优化[D]》,合肥工业大学。

[13] 张锋、宋弘,2009:《基于FPGA的双倍速率动态存储器设计》,四川理工学院学报。

[14] 吴继华、王诚,2005:《Altera FPGA/CPLD设计(高级篇)[M]》,北京人民邮电出版社。

[15] Micron Technology, 2009, 1Gb: × 4, ×8, ×16 DDR SDRAM Features [EB/OL]. [16] Cheng Jingyuan, Song Kezhu, Wang Yanfang. 2006, “Data Gathering and Transferring Sub-system Designing of Time-lapse Marine Seismic Data Acquisition and Recording System [J].” Journal of Basic Science and Engineering.

[17] Guo Li, Zhang Ying, Li Ning, 2002, The Feature of DDR SDRAM and the Implementation of DDR SDRAM [J].” The Journal of China Universities of Posts and Telecommunications.

30

致 谢

祝所有老师、同学、朋友、家人在人生的旅途中一帆风顺,心想事成!

31

本文来源:https://www.bwwdw.com/article/hiow.html

Top