Altera FPGA的IOE DDR寄存器介绍
王敏志
概述
本文对Altera器件IOE的DDR功能进行简单介绍,DDR寄存器可以在时钟的上升沿和下降沿都采集或者发送数据,我们知道利用此特性FPGA可以实现DDR SDRAM、DDR2 SDRAM、RLDRAM II、QDR SRAM以及QDRII SRAM等存储器控制,这里笔者不是要涉及这些特性,而是特别介绍利用IOE的DDR寄存器实现某些高速串行应用中解串功能,比如LVDS。
ALTERA提供了专用的LVDS函数以及硬件SerDes供客户使用,那么我们为什么还要使用IOE的DDR寄存器来手动搭建SerDes呢?这是因为ALTERA提供的专用LVDS模块只能提供最大串化和解串因子是10,而我们知道现在很多ADC的分辨率超过了10bit,达到12bit、14bit甚至更高,这时候就需要我们想其它办法。当然,我们可以利用复用多路LVDS模块来解决这个问题,比如12bit可以利用两个6bit lvds模块。但是这个方法无法解决单FPGA处理多ADC通道的问题,因为往往有些应用中FPGA需要处理的ADC通道数远远大于FPGA提供的硬SerDes数目,这时候必然需要使用到软SerDes来解决问题。
这里,笔者只接受Receiver的情况,即DDR输入寄存器。DDR输出寄存器,或者LVDS发送(TX)大致类似。
APEX II器件IOE配置成DDR输入
首先,我们来看看ALTERA一款已经停产的老器件的情况,因为这个IOE结构相对比较简单,比较有利于我们理解,如图1所示。
图1:APEX II IOE配置成DDR输入I/O
如图1所示,有两个“input register”和一个“Latch”,两个输入寄存器分别使用时钟的上升沿和下降沿驱动。如果查看DDIO的用户手册,我们可以得到如图2所示的简化后的DDIO_IN的架构图。
图2:配置成输入DDR的I/O
如图2所示,时钟的下降沿触发寄存器BI获取第一个数据位,然后在对应的时钟上升沿触发寄存器AI获取第二个数据位,为了正确地将数据传输到FPGA逻辑内部,使用了另一个寄存器CI(虽然这里显示为锁存器),在时钟上升沿时将其和BI的数据一起驱动到逻辑内部。这里的时钟由PLL产生,其频率是高速串行数据率的一半,也就是一个寄存器在该高速时钟的上升沿获取数据,另一个寄存器在该高速时钟下降沿获取数据,而在下降沿获取的数据经过半个时钟周期的延迟和在上升沿获取的数据一起被同步到逻辑内部。
图3显示了高速串行数据和高速时钟信号之间的DDR时序关系,该高速时钟频率是串行数据率的一半。
图3:输入高速串行数据和高速时钟之间的DDR时序关系
不同器件IOE DDR寄存器比较
查看ALTERA不同系列器件手册对于IOE DDR寄存器描述,发现还是有一些细微差别,这里只是进行简单的总结。
{C}l Apex II的IOE DDR寄存器和Stratix第一代差别不大,基本相同
{C}l 需要注意的是Cyclone III的IOE中DDR寄存器没有嵌入到IOE中,必须使用临近的LAB中的寄存器
{C}l Stratix II开始高级的FPGA中IOEDDR寄存器中的那个Latch改成了Register
分析及结论
深入了解了FPGA的IOE DDR寄存器,研究利用该特性设计高速串行ADC的FPGA接口。
参考
[1] Stratix III Device Handbook
[2] AN 167
[3] ALTDDIO Megafunction User Guide
文章评论(0条评论)
登录后参与讨论