SDRAM通用控制器的FPGA模块化设计
发布时间:2008/5/28 0:00:00 访问次数:813
摘要: 介绍了一种sdram通用控制器的fpga模块化解决方案。
关键词: sdram控制器;fpga;vhdl;状态机;仲裁机制
引言
同步动态随机存储器(sdram),在同一个cpu时钟周期内即可完成数据的访问和刷新,其数据传输速度远远大于传统的数据存储器(dram),被广泛的应用于高速数据传输系统中。基于fpga的sdram控制器,以其可靠性高、可移植性强、易于集成的特点,已逐渐取代了以往的专用控制器芯片而成为主流解决方案。然而,sdram复杂的控制逻辑和要求严格的时序,成为开发过程中困扰设计人员主要因素,进而降低了开发速度,而且大多数的基于fpga的sdram控制器都是针对特定的sdram芯片进行设计,无法实现控制器的通用性。本文介绍一种通用sdram控制器的fpga模块化解决方案。
sdram及其控制过程
sdram控制逻辑复杂,命令种类多样,需要周期性刷新操作、行列管理的等多重操作。
sdram首先要进行初始化操作。在上电后等待100ns,至少执行1条空操作,然后对所有页执行预充电操作,接着向各页发出两条刷新操作指令,最后执行sdram工作模式的设定lmr命令用来配置sdram工作模式寄存器。sdram工作寄存器可以根据具体应用的需要进行设置。
初始后的sdram在得到了ras、cas、we的值后开始执行相应的命令。在对sdram进行读、写过程中,必须要先进行页激活act操作,保证存储单元是打开的,以便从中读取地址或者写入地址,然后通过预充电phc命令实现来关闭存储单元。在进行写操作时,内部的列地址和数据都会被寄存,而进行读操作时,内部地址被寄存,数据的存储则发生在cas 延迟时间(通常为1~3个时钟周期)后。最后,操作终止:当sdram顺次的进行读、写操作后,当到达到突发长度或者突发终止指令bt出现时,sdram将终止其操作。
模块化的sdram控制器设计
在sdram控制器的fpga实现方案中,采用了fpga的自底向上的模块化设计思想,首先分析顶层模块的功能,再将其功能分类细化,分配到不同的子模块去实现,然后自底向上的先逐步完成各个子模块的设计,最后将子模块相互连接生成顶层模块。经过分析,sdram控制器应实现的功能有:为sdram提供刷新控制以保持sdram中的数据;对主机的命令进行仲裁,将下一步要执行的命令翻译成可与sdram连接的信号;为sdram的读、写生成数据路径。因此,根据sdram的指令操作特点将sdram控制器划分为接口控制模块、命令生成模块和数据路径模块三个主要模块(图1)。
图1 sdram控制器的fpga模块化设计方案
下面,对其接口信号进行介绍,需要注意的是,为了实现该控制器的通用性,addr、datain、dataout、dq、dom信号设计成可根据sdram的容量改变的形式。
与主机接口信号:clk(系统时钟);reset(系统复位);cmd[2:0](译码指令);cmdack(指令应答信号);addr[asize-1:0](地址线);datain/dataou[dsize-1:0](输入、输出数据总线);dm[(dsize/8)-1:0](数据掩码)。
与sdram接口信号:sa(地址线);ba(页地址);cs_n(片选信号);cke(时钟使能信号);ras、cas、we(命令控制信号);dqm[(dsize/8)-1:0](sdram数据掩码);dq[dsize-1:0](双向数据线)。
各个模块的设计与实现
接口控制模块
接口控制模块主要实现的功能是将cmd[2:0]翻译成接口指令和对刷新计数器的控制指令。接口模块在工作过程中首先通过要通过状态机来完成对cmd[2:0]的翻译。在vhdl程序中声明一个用户自定义类型states,根据cmd[2:0]输入来决定状态的转移,完成对cmd[2:0]的解码,部分代码如下:
type states is(nop,reada,writea,refresh,
precharge,load_mode);
signal state : states ;
………………
case cmd is
when "011" => state<=refresh;
when "111" => state<=nop;
………………
另外,sdram需要周期性刷新操作以保持数据。在模块的程序设计中,刷新周期的控制通过一个计数器来完成,到达规定的计数周期数时,接口模块通过ref_req信号向sdram发出刷新请求。直到sdram完成刷新操作,发出ref_ack刷新应答信号,计数器才重新赋值,开始下一次的计数。
命令生成模块
命令生成模块实现对输入的sdram指令请求进行仲裁判断的功能,并将仲裁后要执行的指令解码成sdram需要的ras、cas等信号,从而实现指令对sdram的控制。仲裁机制是sdram控制器设计不可或缺的一个环节。仲裁机制实现要遵循如下规则:
*sdram在每一刻只有一个指令在执行;
*先到的指令先执行,如果刷新请求到来时,其它命令正在执行中,要等到当前命令执行完成后,才能执行刷新指令;
*其它指令和刷新请求同时到来时刷新操作先执行。
经过仲裁判断后,指令将传入命令生成器。命令生成器不仅要把指令解码成sdram需要的ras、cas等信号,同时还要对命令执行的时间进行控制。下面的例程仅供参考。
if (do_state=refresh or do_state=reada or
do_stat
摘要: 介绍了一种sdram通用控制器的fpga模块化解决方案。
关键词: sdram控制器;fpga;vhdl;状态机;仲裁机制
引言
同步动态随机存储器(sdram),在同一个cpu时钟周期内即可完成数据的访问和刷新,其数据传输速度远远大于传统的数据存储器(dram),被广泛的应用于高速数据传输系统中。基于fpga的sdram控制器,以其可靠性高、可移植性强、易于集成的特点,已逐渐取代了以往的专用控制器芯片而成为主流解决方案。然而,sdram复杂的控制逻辑和要求严格的时序,成为开发过程中困扰设计人员主要因素,进而降低了开发速度,而且大多数的基于fpga的sdram控制器都是针对特定的sdram芯片进行设计,无法实现控制器的通用性。本文介绍一种通用sdram控制器的fpga模块化解决方案。
sdram及其控制过程
sdram控制逻辑复杂,命令种类多样,需要周期性刷新操作、行列管理的等多重操作。
sdram首先要进行初始化操作。在上电后等待100ns,至少执行1条空操作,然后对所有页执行预充电操作,接着向各页发出两条刷新操作指令,最后执行sdram工作模式的设定lmr命令用来配置sdram工作模式寄存器。sdram工作寄存器可以根据具体应用的需要进行设置。
初始后的sdram在得到了ras、cas、we的值后开始执行相应的命令。在对sdram进行读、写过程中,必须要先进行页激活act操作,保证存储单元是打开的,以便从中读取地址或者写入地址,然后通过预充电phc命令实现来关闭存储单元。在进行写操作时,内部的列地址和数据都会被寄存,而进行读操作时,内部地址被寄存,数据的存储则发生在cas 延迟时间(通常为1~3个时钟周期)后。最后,操作终止:当sdram顺次的进行读、写操作后,当到达到突发长度或者突发终止指令bt出现时,sdram将终止其操作。
模块化的sdram控制器设计
在sdram控制器的fpga实现方案中,采用了fpga的自底向上的模块化设计思想,首先分析顶层模块的功能,再将其功能分类细化,分配到不同的子模块去实现,然后自底向上的先逐步完成各个子模块的设计,最后将子模块相互连接生成顶层模块。经过分析,sdram控制器应实现的功能有:为sdram提供刷新控制以保持sdram中的数据;对主机的命令进行仲裁,将下一步要执行的命令翻译成可与sdram连接的信号;为sdram的读、写生成数据路径。因此,根据sdram的指令操作特点将sdram控制器划分为接口控制模块、命令生成模块和数据路径模块三个主要模块(图1)。
图1 sdram控制器的fpga模块化设计方案
下面,对其接口信号进行介绍,需要注意的是,为了实现该控制器的通用性,addr、datain、dataout、dq、dom信号设计成可根据sdram的容量改变的形式。
与主机接口信号:clk(系统时钟);reset(系统复位);cmd[2:0](译码指令);cmdack(指令应答信号);addr[asize-1:0](地址线);datain/dataou[dsize-1:0](输入、输出数据总线);dm[(dsize/8)-1:0](数据掩码)。
与sdram接口信号:sa(地址线);ba(页地址);cs_n(片选信号);cke(时钟使能信号);ras、cas、we(命令控制信号);dqm[(dsize/8)-1:0](sdram数据掩码);dq[dsize-1:0](双向数据线)。
各个模块的设计与实现
接口控制模块
接口控制模块主要实现的功能是将cmd[2:0]翻译成接口指令和对刷新计数器的控制指令。接口模块在工作过程中首先通过要通过状态机来完成对cmd[2:0]的翻译。在vhdl程序中声明一个用户自定义类型states,根据cmd[2:0]输入来决定状态的转移,完成对cmd[2:0]的解码,部分代码如下:
type states is(nop,reada,writea,refresh,
precharge,load_mode);
signal state : states ;
………………
case cmd is
when "011" => state<=refresh;
when "111" => state<=nop;
………………
另外,sdram需要周期性刷新操作以保持数据。在模块的程序设计中,刷新周期的控制通过一个计数器来完成,到达规定的计数周期数时,接口模块通过ref_req信号向sdram发出刷新请求。直到sdram完成刷新操作,发出ref_ack刷新应答信号,计数器才重新赋值,开始下一次的计数。
命令生成模块
命令生成模块实现对输入的sdram指令请求进行仲裁判断的功能,并将仲裁后要执行的指令解码成sdram需要的ras、cas等信号,从而实现指令对sdram的控制。仲裁机制是sdram控制器设计不可或缺的一个环节。仲裁机制实现要遵循如下规则:
*sdram在每一刻只有一个指令在执行;
*先到的指令先执行,如果刷新请求到来时,其它命令正在执行中,要等到当前命令执行完成后,才能执行刷新指令;
*其它指令和刷新请求同时到来时刷新操作先执行。
经过仲裁判断后,指令将传入命令生成器。命令生成器不仅要把指令解码成sdram需要的ras、cas等信号,同时还要对命令执行的时间进行控制。下面的例程仅供参考。
if (do_state=refresh or do_state=reada or
do_stat