您的位置: 嵌入式在线 > 解决方案 > 通信与网络 > 视频解码器验证板的DDR SDRAM控制器的实现

视频解码器验证板的DDR SDRAM控制器的实现

2008-02-03      嵌入式在线      收藏 | 打印

  DDR SDRAM (Double Data Rate Synchronous Dynamic Random Access Memory, 双数据率同步动态随机存储器) 是SDRAM 的更新换代产品, 本设计是H.264解码芯片的FPGA 的验证工作的一部分, 由于该解码芯片主要包括: 运动补偿, 去块化效应, 显示模块, 以及软件部分(与PC 接口)。所以本设计实现对DDR SDRAM 的控制以及对不同模块访问DDR SDRAM进行仲裁。

  实现时FPGA 选用Xilinix 公司的V ERTEX -26000 进行实现, DDR SDRAM 选用HYNIX 的512MB DDR 333MHz   64 位4bank结构的DDR SDRAM。根据本设计的DDR SDRAM 的特点和本设计的实际应用, 主要包括时钟解决方案, DDR SDRAM 控制器的设计和对多用户访问的仲裁3部分, 主要用FPGA 来实现。

  1时钟解决方案

  DDR SDRAM 是一种大容量, 高速度的同步动态存储器, 采用2.5 V工作电压, 他允许在时钟脉冲的上升沿和下降沿传输数据, 这样不需要提高时钟的频率就能加倍提高SDRAM 的速度, 并具有比SDRAM 多一倍的传输速率和内存带宽, 但是由于其在时钟的上升沿与下降沿都可传输数据, 工作频率比较固定, 一般只能工作在一个频率或几个频率下, 且绝对工作频率比SDR SDRAM 高。

  常用的DDR 内存一般工作在266MHz 和333MHz 的数据速率。这就需要一个133MHz 或166MHz 的系统时钟。对于这点用CYPRESS 公司的时钟芯片CY27EE16ZE 来产生所需的时钟频率。该芯片符合I2C 总线标准, 可以通过并口用C+ + 编程实现I2C 总线标准对其进行如下配置得到166MHz 的时钟频率; 设定如下: Q = 13,Qtotal = 15, P =95, PO = 0, Ptotal = 198 , post divider= 2; 由CLOCK1 端口进行输出。

  由于DDR SDRAM 的双数据传输结构是两倍的预读取设计, 可以在每个时钟周期内传输2 个数据字。输入输出数据均参照DQS信号。DQ S 指针在读周期由DDR 发送, 而在写周期由控制器发送, 他应用于对齐数据。因为DDR SDRAM 有以上特点决定了在实现过程中需要几个不同相位的时钟, 且需把命令字的产生和数据通道区别开来, 利用FPGA 中的DCM (D igital ClockM anager) 来实现不同时钟的同步和产生不同相位和不同频率的时钟。设计时参考了Xilinix 公司的DDR SDRAM 控制器。

  2DDR SDRAM 控制器的设计

  控制器与DDR SDRAM 主要接口信号包括: 数据线、元器件与应用昝春华等: 视频解码器验证板的DDR SDRAM 控制器的实现地址线、存储单元库(bank) 选择信号、时钟信号、使能信号、片选信号、DATA STROBE 信号以及命令字输入信号。由于DDR SDRAM 比起以往的SDR SDRAM 即有其特殊点又有共同点, 在设计时主要考虑以下几点进行控制:

  首先, 和SDR SDRAM 一样需要时钟信号来完成对信号的同步操作, 并通过命令字来进行控制, 对数据的管理也是以Bank Row Cloumn 的模式来管理的, 这就要求在对DDR SDRAM 进行读写操作时, 首先选择好要操作的存储库单元库(Bank) , 并同时锁存行地址(RowA ddress) , 这一过程叫做激活, 在发出读写信号时再锁存列地址(Column A ddress) , 并进行相应的操作。

  DDRSDRAM 命令字主要由片选信号CS, 行地址选通信号RAS, 列地址选通信号CAS 以及读写控制信号WEB 三个信号控制并配合一定的地址、数据输入, 这些命令字信息和地址信息都是在时钟的上升沿进行锁存的。DDR SDRAM 基本控制操作包括初始配置, 激活要操作的地址, 充电、刷新以及读写操作, 所对应的命令字和地址输入列表如1 所示。

命令字和地址输入列表

  在执行操作时, 各个命令字必须按照一定的顺序, 主要包括以下几种:
       1) 在执行操作前应首先对DLL使能, 而在执行读命令前必须保证DLL使能已保持200个周期的高电平;
      (2) 在初始配置和auto refresh之前, 所有的bank都应被precharge;
      (3) precharge命令在读写命令完成后才有效;
      ( 4) 在进行读写操作之前, 应首先关闭打开的旧地址, 激活新的Row 地址;

      对于命令字的产生用一个含12个状态的状态机来实现, 并用独热码进行状态编码 。根据此状态机控制器产生相应的命令和控制信号。

      SDRAM 的初始化操作, 即利用LoadMode Register命令通过地址线对DDR SDRAM 内部的模式寄存器进行初始操作。对DDR SDRAM 的突发长度(Burst Lenth) , 突发模式, CasLatency 进行配置。这些信息都预存在一个特殊的寄存器里, 在系统上电后的一段时间里, 按照一定的时序赋值给控制模块, 实现对DDR SDRAM 初始配置。所谓突发长度就是在一个读/写周期DDR SDRAM 所能连续读写的数据段长度。而Cas Latency 是指内存在收到信号后, 要等待多少个系统时钟周期后才进行读取的动作。一般是越短越好, 不过这还要看内存颗粒的原始设定值,否则会造成系统的不稳定。本设计选用的512MB 的DDRSDRAM 规定如下:

DRSDRAM 规定

  由于对DDR SDRAM 进行读写操作时, 首先要激活所要操作的Row , 然后再通过Column 地址对这个Row 里的数据进行操作。且在同一个存储单元库里只能有一个Row 处于激活状态, 所以在对另一个Row 进行操作时应首先关闭原先的Row 关闭。 

        这个动作是由充电(precharge) 命令完成的。

  由于DDR SDRAM 也是一种动态存储器, 其实质就像一个电容, 总是趋向于放电, 必须定时对其进行刷新操作,所选的DDR SDRAM 要求64μs内要刷新8000次, 选择等时刷新, 即用一计时器定时向状态机发出一个刷新命令。数据在时钟的上升沿与下降沿都可以传输, 所以较之SDR SDRAM 在同一时种周期数据传输率提高了一倍。为了与系统时钟同步, 需要把从DDR SDRAM 中出来的数据装配成两倍位宽的数据输给系统, 同时系统输入的数据也应分别在上升沿和下降沿分解成1/2 宽度的信号分别输入。对于in/out 端口用FPGA 里的IOBUF来实现, 并考虑数据输入要与DQS 信号的中间位置对齐。

  3对多用户访问的仲裁

  由于在整个系统中运动补偿模块、去块化效应模块、显示模块以及软件部分是时分复用来对DDR SDRAM 进行访问的, 且他们的访问周期并不完全相同, 如果分配不好就有可能使得某些模块无法占用总线, 而对于时间要求严格的可能会由于没能及时占用总线而完不成任务; 所以在对不同用户的请求进行仲裁时应考虑各个用户数据的特点以及对时间的要求是否严格。

  对于时间要求严格者其优先级较高, 本设计中显示模块对时间要求比较严格, 所以规定其优先级较高, 用if else语句实现。而其他模块认为其优先级相同。为了保证每个用户都能及时地得到响应, 请求时间长的比较紧急, 采用先到者先响应的仲裁策略,下面是对3 个优先级相同的(REQA , REQB, REQC) 访问产生响应(A ck1, A ck2, A ck3) 的部分用Verilog 代码实现, 在这部分定义了一个深度为4, 宽度为2 的数组, 请求同时到达时, 指定优先级, 当有先后时, 先到者放置在最先执行的地方。
reg[1: 0 ] i, j;
reg[2: 0 ] con, sequ;
reg[1: 0 ] sequen [0: 3 ];
reg[1: 0 ] tmp, tmp1;
assign req= {REQ 1, REQ 2, REQ 3};
assign tmp= i+ 1;
assign tmp1= i+ 2;
alw ays@ (po sedge CL K o r negedge RST)
if (! RST)
..
else begin
 sequ= (con^ req)&req;
 con< = req;
 end
 case (sequ)
 3′b000: begin
  i< = i;
   sequen [0 ]< = sequen [0 ];
   ..;
   end
 3′b001: begin
 sequen [ i]< = 2′d3;
  i< = i+ 1;
  end
 ..;
 ..;
 3′b011: begin
 sequen [ i]< = 2′d3;
 sequen [ tmp ]< = 2′d2;
  i< = i+ 2;
  end
 ..;
 ..;
 3′b111: begin
 sequen [ i ]< = 2′d3;
  sequen [ tmp ]< = 2′d2;
  sequen [ tmp1 ]< = 2′d1;
  i< = i+ 3;
  end
 endcase
 end
w ire ack;
reg ack_ d;
assign ack= ack1° °ack2° °ack3;
alw ays@ (po sedge clk)
a ck_ d= ack;
alw ays@ (po sedge clk o r negedge rst)
begin
 if (! rst)
 j< = 0;
 else if ( (ack= = 1)&&(ack_ d= = 0) )
 begin
 if ( (j= = 3) j< = 0;
 else j< = j+ 1; end
alw ays@ (po sedge clk o r negedge rst)
begin
 if (! rst)
 begin ack1< = 0; ack2< = 0; ack3< = 0; end
 else begin
 case (sequen [ j ])
 2′d3: begin ack1< = 1; ack2< = 0; ack3< = 0; end
 ..;
 ..;
 endcase
end


  4 结 语

  本设计虽然是为多媒体芯片的FPGA 验证而设计的,但其应用具有通用性, 也可以适用于其他验证板开发。而且多用户访问仲裁可以任意增加用户数量, 只需把其中定义的数组深度和宽度 适当增加就可以了。对于用户过少的情况还可以使用列举法实现。

 

本文来源:现代电子技术     作者:

隐藏原文↑


查看原文↓

解决方案悬赏

如果您是正在寻求此类产品解决方案的整机制造商,请点击”我要悬赏”按钮提交您所需要的特定解决方案。

我要悬赏
解决方案揭榜

如果您是此类产品解决方案的提供商、组织或个人,请点击“我要揭榜”按钮揭榜悬赏区里您所拥有的解决方案。

我要揭榜

验证码:  看不清?