多FIFO灵活定制SDRAM控制器设计
2014-03-16武汉轻工大学数学与计算机学院丁国栋刘昌华
武汉轻工大学数学与计算机学院 丁国栋 刘昌华
1.引言
SDRAM常作为数据缓存应用于高速数据传输系统中。目前,许多嵌入式设备的大容量、高速度存储器都采用SDRAM来实现,大多都是用专用芯片完成其控制,提高了设计成本,而且使系统的电路变得复杂。FPGA因其灵活,实时的特性很好的解决了SDRAM的控制问题,它能很好满足SDRAM的时序要求。由于SDRAM的工作频率可以达到100Mhz以上,但图像数据传输速度却较低,这使SDRAM数据传输效率很低,一般会使用多个异步FIFO来实现匹配。这就又需要设计控制部分,每次都这样显然太繁琐。
本文以典型视频图像预处理的应用为背景,设计一个FIFO控制器内核,即利用FPGA的片上资源,开辟多路FIFO作为缓存,然后设计一些控制接口当面对不同设计时,只需要灵活搭配就行了。实验结果表明,该控制器能轮流地从多个缓存端口向SDRAM进行数据存取,充分利用了SDRAM的带宽,同时可以灵活定制FIFO控制接口,方便不同的设计需要。
2.SDRAM时序限制
SDRAM所有电源引脚必须同时加电,并且所有输入和电源引脚上电电压不得超过标称值0.3V。SDRAM加电完成后应立即对所有BANK进行预充电,然后等待200ms以避免输出总线上的数据冲突。等待期间要求DQM和CKE保持高电平。等待200ms以后需要发出模式寄存器设置(MRS)命令以初始化模式寄存器,并附加八个自动刷新周期(CBR)以保证后续操作正常。
SDRAM的存储单元必须要有定时的刷新周期以避免数据丢失。刷新控制器决定刷新的时间间隔,刷新计数器保证每个单元都能被刷新,SDRAM可以采用自动刷新或自刷新。预充作用是对BANK预充电或者关闭已激活的BANK。
SDRAM的基本读、写操作需要控制线和地址线相配合地发出一系列命令来完成,先发出BANK激活命令,并锁存相应的BANK地址和行地址,等待数据出现在数据线上。在读、写操作的最后要向SDRAM发出预充电命令,以关闭已经激活的页。
3.SDRAM控制器结构
SDRAM控制器的总体框架如图1所示,主要包括八块片上异步FIFO模块、FIFO控制器模块、地址产生模块、SDRAM状态机模块、时钟模块。其中八块异步FIFO分为四块读,四块写;由于SDRAM读写数据共用一个数据线所以FIFO控制器模块主要负责保证同一时间内最多只有一块FIFO与SDRAM进行数据交换,并且所有异步FIFO都要按序进行,同时给SDRAM状态机模块发出指令,其次要保证写入读出数据能够按照设定的length来进行分次准确地进出;地址产生模块主要是当写入读出数据时产生对应的地址,另一个作用就是根据应用需要来灵活分配SDRAM内存的空间及实现数据的灵活读出;SDRAM状态机模块负责接收指令再结合地址线产生SDRAM需要的时序控制信号,如刷新、预充电、读写使能、指令应答等;时钟模块负责产生异步FIFO,SDRAM和其它系统的时钟;片上FIFO模块负责对输入输出数据进行缓存,实现设计的跨时钟域通信;地址产生模块负责输入输出数据的地址的产生,同时根据实际需要来定制不同数量的FIFO,灵活分配SDRAM空间。
图1 SDRAM控制器结构框架图
在整个SDRAM控制器设计中最重要的就是片上FIFO的控制,SDRAM状态机的正确实现,而地址分配则是实现实际应用的关键。
3.1 控制器的状态机
控制器状态机的主要作用就是按照SDRAM物理时序要求,使用cmd信号同时结合地址信号产生正确的控制时序包括上电初始化、数据传递等。由于SDRAM的控制比较复杂,具有多种突发(burst)读、写方式和工作模式,考虑嵌入式预处理图像数据特点,其控制仅实现基本的读、写、突发、刷新、充电等状态。控制器状态转移图如图2所示,上电后对内存芯片进行初始化,初始化结束后,内存条进入Idel状态,刷新计数器开始工作,每当刷新计数器值减为0,便向内存芯片组发出刷新命令。刷新请求是内存请求,读和写操作是外部请求。在Idel状态中有请求仲裁逻辑,当内部和外部请求同时出现时,优先保证内部请求,状态转移至刷新操作。当刷新操作结束时,重新返回Idel状态,开始响应外部读写等请求。响应读、写请求后,状态从Idel转移到读、写状态。同时读、写地址和写入的数据锁存至控制器。控制器由读写地址解析出CS信号、页地址、行地址、列地址,等待某个周期后数据写入或读出。,芯片初始化结果如图3所示。
图2 SDRAM控制器状态
图3 SDRAM芯片的初始化
3.1.1 控制命令
状态控制模块主要完成预充电,刷新,工作模式设定,空操作,基本的读写等,由于SDRAM没有单独的预充电,刷新控制线且地址线也只有一根。所以这些状态的产生要结合地址控制信号片选信号CS,行地址选通信号RAS_N,列地址选通信号CAS_N,写使能信号WE_N。
3.1.2 数据读入读出
地址信号中BA0和BA1为页地址选择信号,A0~A12为地址信号,通过分时复用决定地址是行地址还是列地址。在读写操作中,在地址线上依次给出页地址、行地址、列地址,最终确定存储单元地址。其中发出读命令字后要经过CL个工作时钟后,读出数据才依次出现在数据总线上。在读操作的最后,要向SDRAM发出预充电命令,以关闭已经激活的页。等待tRP时间后,可以开始下一次操作。而发出写命令字后写命令可以立即写入,需写入的数据依次送到数据线上。在最后一个数据写入后延迟tWR时间发出预充电命令,关闭已经激活的页。等待tRP时间后,可以开始下一次操作。
3.1.3 刷新和预充电
Refresh状态用于刷新,SDRAM要求有定时刷新。当刷新控制信号有效时,状态转向Refresh,同时设置刷新周期数为1。刷新状态的控制还需要一个计数器,它是一个独立的进程。刷新计数器的初值由内存芯片要求、内存条个数和控制器工作频率共同决定。
SDRAM在读写操作后要求关闭激活的BANK,而在读写操作前要激活要使用的BANK。预充是对BANK预充电或者关闭已激活的BANK。SDRAM既可分别预充特定BANK也可同时作用于所有BANK,设计中对预充操作采用Precharge All对所有BANK进行预充。
3.1.4 地址分配
给控制器设定不同的起始地址addr、最大地址max_addr及FIFO深度length可以实现不同的用途和功能。在图像预处理中,如果要分离奇偶场数据,则写数据时设定为一帧图像的地址空间,读数据时用两个片上FIFO分别读出一半地址空间数据则可。而在向SDRAM中写数据时,则根据写FIFO读完成标志wr_done来判断是否已写入一个FIFO深度。如果wr_done有效,则将rWR1_ADDR加length,直到写入数据达到设定的最大地址max_addr为止。同理,从SDRAM中读出数据时,可根据读FIFO写完成标志rd_done来判断是否读出一个FIFO深度,如果rd_done有效,则rRD1_ADDR加length,直到读出数据达到设定的最大地址max_addr。这样就实现了数据在SDRAM里的有序准确进出。不用的FIFO,不对其设定起始地址和最大地址及深度。
3.2 片上FIFO功能及控制
片上FIFO实现了数据的异步通信,灵活地控制片上FIFO可以实现不同的功能。
3.2.1 片上FIFO引脚功能
异步FIFO是一个缓冲存储器件,用于在两个不同时钟域之间进行数据交换。数据在一个时钟域写入FIFO,然后从另外的时钟域读出,并被使用。它解决了不同时钟域数据的传输,给设计带来了极大的便利,得到了广泛的应用。本设计中采用的异步FIFO主要是由双端口存储器、空满标志rdempty、wrfull、读写数据计数rdusedw、wrusedw、读写请求及时钟、数据输入和输出接口组成。写有效时在写时钟下向FIFO依次写入数据,rdusedw开始加计数,当FIFO中数据存满时wfull置高,这时写入使能无效。读有效时在读时钟下向SDRAM依次读出数据,rdusedw开始减计数数据读空时rdempty置高,这时读使能无效。
图4 写入数据时状态图波形图
由于异步FIFO工作在不同时钟领域,其关键是如何正确设计空满判断逻辑,从而使FIFO不会溢出,不会产生数据丢失。笔者使用读写计数rdusedw、wrusedw来判断何时读写。图4,5为单路异步FIFO的读写数据仿真波形。
图5 读出数据状态图波形图
3.2.2 多路数据交换控制
由于同一时间只能有一路异步FIFO与SDRAM进行数据交换,在Verilog HDL设计中选择使用if-else语句进行分路控制。当某路写FIFO有效时,利用WR_MASK来控制数据进入SDRAM;当某路读FIFO有效时,利用RD_MASK来控制数据进入FIFO。由于SDRAM只有一根数据线所以该端口必须是inout类型,它需要加个控制信号,作为输入时要置高阻状态,否则将导致数据出现紊乱。
3.2.3 读写状态控制
写FIFO的读使能是由wrusedw信号控制wr_mask和计数使能的相与来实现的,当rd_mask有效时等待SC_CL个周期开始读出数据。读FIFO的写使能则由rdusedw信号控制wr_mask,因为SDRAM的BANK激活命令后必须等待大于RCD时间后发出读命令字,所以当wr_mask有效时,等待SC_CL+SC_RCD个周期,SDRAM的数据才能开始写入FIFO中。多路异步FIFO控制流程图如图6所示。
图6 多路异步FIFO控制状态图
3.3 异步FIFO灵活应用控制
设计的基本思路就是嵌入多路异步FIFO以方便在不同的应用中灵活的使用。当面临不同的需求而不需要全部的FIFO时,对不使用的FIFO可以设计一个顶层文件将其直接例化掉,还可以不用做任何处理直接不用其接口就行了。需要使用的只需按正常的要求加载上读写时钟clk,数据dq,分配好地址空间包括起始addr和终止地址max_addr即可,方便易行给后续设计带来了极大的便利。下面以图像预处理中分离奇偶场数据的应用为例,说明定制控制的基本流程。
(1)由于控制器有多路的FIFO,所以第一步就要根据设计明确要用几路读、写异步FIFO,其中单路FIFO的使用判断如图7。
(2)本例确定要使用一路读FIFO两路写FIFO来实现图像数据的分离,然后给其加载时钟,读、写使能等控制信号。
(3)接下来就是分配地址空间,它是实现奇偶场分离的关键。给将要写入的数据数据分配一帧像素数据空间,然后给两路读分别分配一场数据空间,那么当两路读FIFO输出的数据就是读入SDRAM中的那帧图像奇偶场的数据,分配地址空间的示意图如图8所示。
图7 单路FIFO判断图
图8 图像处理应用顶层
4.结论
本设计软件平台为QuartusII,Modelsim6.5,硬件平台为友晶DE2_70开发板,PC机一台。文中详细分析了SDRAM芯片的特性、SDRAM控制器的时序要求、数据的输入输出,针对控制器使用的复杂不便性,集中设计了FIFO控制器部分,使得控制器的使用更加具有通用性。同时SDRAM的控制机制比较复杂,具有多种突发读写的工作模式,我们可以根据实际应用中的需求情况来编写程序,实现基本的读写和刷新操作,而不需要顾全到每一种情况,从而降低系统的复杂性。在后续图像预处理中需要用到SDRAM控制器时,按照第三部分应用控制中讲述的方法调用该设计即可。从而实现了高速数据缓存,充分利用了SDRAM的有效带宽,提高了存取速度,达到实时视频预处理的要求,而且加快了整体设计的进度。
[1]胡昌顺,高嵩,吴春瑜,张文婧.SOC设计中多bits数据跨时钟域的解决方法[J].辽宁大学学报(自然科学版),2011(1).
[2]徐海铭,程月东.高速异步FIFO设计[J].电子与封装,2009(6):14-16.
[3]杨海涛,苏涛,巫幪.基于FPGA的SDRAM控制器的设计和实现[J].电子技术,2007,1:8-12.
[4]Liu Z W,Xie M.An effective AS-FIFO design formultiple asynchronous clock data transmission[C].Proceedings of International Conference on Communications,Circuits and Systems.Piscataway:IEEE Computer Society Press,2008:960-963.
[5]Apperson R W.Yu Z Y,Meeuwsen M J,et al.A scalable dual-clock FIFO for data transfers between arbitrary and haltable clock domains[J].IEEE Transactions on Very Large Scale Integration Systems,2007,15(10):1125-1134.
[6]KennimentDJ.Synchronization and arbitration in digital systems[M].San Francisco Wiley, 2008:14-38.
[7]Wooyoung Jang,David Z.Pan,An SDRAM-aware router for Networks-on-Chip,Proceedings of the 46th Annual Design Automation Conference,July 26-31,2009.
[8]赵丕凤,徐元欣,赵亮,等.多路读写的SDRAM接口设计[J].电子技术应用,28(9):19-23.
[9]夏宇闻.Verilog高级数字系统设计[M].北京:北京航空航天大学出版社,2001.