一种基于FPGA实现的高速缓存设计
扫描二维码
随时随地手机看文章
摘 要:为了解决嵌入式实时数据采集系统中,高速采集数据量大,而处理器的处理速度有限的矛盾,保证数据不丢失并提高处理器的数据吞吐率,文中提出一种基于FPGA(现场可编程门阵列) 实现的最优FIFO(先入先出存储器) 结构设计,它可以成倍提高数据流通速率,增加嵌入式系统的实时性。
关键词:高速数据采集系统;数字信号处理器;异步先入先出存储器;现场可编程门阵列
引 言
随着雷达、通信和图像处理中数字处理技术的飞速发展,现代化生产和科学研究对数据采集系统的要求更加严格。在嵌入式条件下,要求数据获取的速度越来越快,精度越来越高,以致数据量及处理速度要求大增,高速ADC的出现和DSP性能的不断提高也对系统将来的升级提出了更高要求,特别在一些特殊领域,如航空、航天等,其嵌入式系统体积小、功能强、实时性高,为了避免数据处理不及时,发生数据丢失,破坏系统可靠性,更要进一步提高系统实时性,必须研究开发高速嵌入式数据采集系统。
针对具体的任务要求,文中提出了一种通过FPGA 实现转换接口的高速数据采集系统的系统结构,即高速A/D+大容量FPGA+高速DSP的嵌入式高速数据采集系统。模数转换器A/D进行高速数据采集,FPGA实现对高速A/D 采集数据的存储和控制调度,DSP 通过查询方式访问前端采集通道,对采集的数据进行高速处理,这种方法大大提高了DSP 可以访问的外设数目,提高了DSP的处理能力,同时由于DSP 不直接与模数转换芯片接口,所以ADC 芯片的升级或者替代都不会影响原来的数据采集,而且采用了时分复用方式读取转换完成的数据,因此这个系统数据采集速率可以达到所采用的ADC 芯片输出的最高速率,能充分发挥DSP 算法处理功能强大、速度快的优势,而FPGA 设计灵活、通用性强等特点,使得整个系统具有实时性高、体积小、开发周期短、易于维护和扩展、适合于实时信号处理等多个优点。文中结合成功开发的高速采集系统结构,提出一种基于FPGA实现的最优FIFO构来实现高速缓存,它可以成倍提高数据流通速率,增加嵌入式系统的实时性。
高速数据采集系统结构
实时信号处理系统中,高层处理算法的特点是所处理的数据量较低层算法少,但算法的控制结构复杂,适于用运算速度高、寻址方式灵活、通信机制强大的DSP芯片来实现。特别是TI 公司的C6000 系列DSP,其峰值处理速度已达每秒数十亿条指令,是当今最先进的DSP之一,非常适合于嵌入式实时系统应用。低层的信号预处理算法处理的数据量大、计算量大、对处理速度的要求高,但运算结构相对比较简单,适于用FPGA来进行硬件实现,这样能同时兼顾速度及灵活性。目前FPGA的容量已经跨过了百万门级,使得FPGA成为解决系统级设计的重要选择方案之一。它主要应用于协处理器,辅助DSP芯片完成一些计算密集型的算法。
在笔者设计的高速信息处理计算机中,高速ADC模块、FPGA 模块以及DSP 模块构成了高速数据采集系统,从此结构中可以看到,DSP可以在未知ADC 控制方式的情况下,定时地访问外设来获得模数转换后的数据,而大容量的FPGA协助DSP完成数据的预处理,并可以保证采集数据不丢失。
其中ADC是一个12位精度、65MHz采样速率的高速模数转换器,可进行高速采样,处理器选用TI公司的TMS320C6701 。DSP 内部最高时钟频率可以达到167MHz,DSP读取外部SDRAM 的最高时钟频率是1/2×CPU ,而读取外部异步存储器的时钟频率可以通过CE 空间控制寄存器来编程控制,其参数需要满足一定要求,即CLK>(Setup+Strobe+Hold)>2个时钟周期,时钟频率最高可达80MHz。如果DSP 不通过缓存直接与A/D相连,在采样过程中,若A/D连续采样数据,DSP一直处于连续的间隔取数的状态,这将占用DSP 大部分处理时间,导致DSP 不能从事其他工作。也有可能出现上一次的数据还没有被计算机处理完,下一次采集过程就开始的情况。如果选取更高速的A/D ,更会发生数据丢失,破坏系统的可靠性。因此最好的做法是采用高速缓存来存储采样到的数据,再集中传输一批数据,保证DSP有充足的时间去处理、计算。
系统中采用容量比较大的FPGA,利用自主设计的IP核,主要协助主处理器实现数据的预处理(如FFT) 功能。为了保证设计的硬件系统体积尽可能小,因此在不增加系统的硬件负担的前提条件下,利用系统中现有的FPGA,设计了基于FPGA 实现的异步FIFO 存储器作为高速缓存器,它满足前后读写时钟频率不同的硬件环境,可使采集系统设计灵活、简单、方便,具有很强的可扩展性。FIFO 存储器具有两个特点:数据进出有序;输出输入口独立。灵活使用FIFO ,可根据需要设计为不同速率、不同容量的数字系统,接口电路简洁且不占用系统地址资源,系统移植或升级换代方便,而且控制简单。
基于FPGA 实现的异步FIFO 的设计
FIFO结构设计
设计一个异步FIFO ,读写使能由不同的时钟激励来控制输入数据和输出数据,空/满标志来防止数据的上溢和下溢,以及“半满”状态标志,在字宽和容量深度两方面都可以扩展。读写操作自动访问存储空间连续的存储单元,读出的数据和写入的数据顺序相同,不需要额外的地址信息。首先,由复位信号清空存储器数据;然后,在写使能和写时钟控制下向存储器中写数据,当FIFO写半满,half-full将有效(同步于写时钟) ,触发C6701中断,C6701中断服务程序通过DMA将FIFO中的数据取走并写入C6701片内数据存储器或SDRAM中去,FIFO中的数据空间存满后,full信号有效,外部设备就不再向FIFO中写数据了;同理,在读时钟和读使能控制下从存储器中读数据时,若FIFO中的数据被外部设备取空了,则empty 信号有效,外部设备停止对FIFO的读取。
本系统数据宽度根据需要,两个端口可以设计为两端是12位、16位、32位。
一般常用的FIFO设计,都是两端数据宽度相同的FIFO 结构。这很容易在XILINX公司提供的IP核中找到,或者用行为级语言描述得到。
但是,在笔者设计的硬件平台下,这些设计有局限性,分析如下:
因为TI公司的DSP C6701的EMIF支持32bit宽度的ASRAM,SDRAM和SBSRAM等存储器,只有CE1空间支持16bit和8bit的ROM接口,本系统设计的FPGA是CE2和CE3空间寻址,物理接口是32bit。那么如果FIFO读写端口设计为12位,DSP接收的32位数据仅低12 位有效,而高20位是无效数据,一方面,这将大大降低DSP 读取数据的吞吐率,另一方面由于需要处理无效数据而降低系统的实时性。
为了改进系统的性能,提高系统的实时性,可以采取两个措施:一是设计整字节宽度的FIFO端口,基于前端A/D的要求,最佳的数据宽度是16位;二是设计宽位数端口的FIFO,提高数据的吞吐率,基于后端DSP的要求,最佳的数据宽度是32位。由于C6701可以对数据存储器进行8bit/16bit/32bit的数据访问,数据从FIFO中读取数据到DSP 的数据存储器后,可以根据需要决定是按字节、字、还是双字处理。
针对笔者的硬件系统,提出了一种基于FPGA的新型FIFO结构,输入数据宽度与输出数据宽度不同,即输入为16位、输出为32位的异步FIFO。分析系统的数据吞吐率:由于A/D数据输入口的速度固定,数据按采样频率输入FIFO ,因此输入数据的时间是不变的,而C6701一次访问可以取走两个有效数据,在相同数据量的条件下明显降低数据读取时间,大大增加了DSP读取数据的吞吐率,提高系统实时处理时间。
如果输入数据的高4 位不接地,则传给DSP的数据高4位是任意值,所以取完数后要将取得的数进行预处理,这将降低DSP 的实时处理时间。因此在设计硬件电路时将FIFO的datain(15:12) 硬件置0,避免了DSP的软件复位,省去DSP对数据的预处理过程,从而提高了DSP的实时处理能力。
笔者设计的FIFO是利用两个16位RAM并行连接,输入数据在写控制模块的调度下依次写入两个RAM中,两个RAM的输出经过缓存器直接与DSP相应数据线相连,保证了32位的数据宽度,内部实现如图3所示,其中的写控制逻辑实现 。其中写控制逻辑分别产生两个片选信号实现对两个存储器交替按字(16bit) 进行写,读控制逻辑对两个存储器按双字(32bit) 同时读,可以实现两端读写数据宽度的不同。
地址产生逻辑 ,读写地址产生利用相同的地址产生逻辑,在不同的时钟和使能信号控制下实现地址的增加。写地址产生器用CE1 作为允许增控制信号,读地址产生器用rd - en 作为允许增控制信号来实现地址的产生。
异步FIFO的FPGA实现
由于FIFO是一种RAM的结构,在大多数参考资料中对RAM 的描述都是建立在数组存取的基础上的。在大多数EDA软件中,对VHDL硬件描述语言的编译都是通过综合器来完成的,综合器将VHDL转变成物理可形成的电路格式。然而遗憾的是,综合器对数组的综合一般是将其转变成寄存器的结构。可编程器件中的寄存器个数是有限的,而FIFO是一种基于RAM的器件,需要有大量的存储空间,也就会用掉大量的寄存器。所以,当直接用数组的形式来描述FIFO结构时,综合后的结构都会非常庞大。
幸运的是,XILINX FPGA器件提供的片内的RAM可直接使用,而不必使用寄存器来构成存储空间,从而大大提高了芯片的利用率。在XILINX FPGA产品中,根据型号的不同,提供了两种RAM 结构: 分布式RAM和BLOCK RAM。
分布式RAM 存在于所有的XILINX FPGA器件中,而对于BLOCK RAM,只有最新的SPARTAN VETEX系列中才提供。分布式RAM 存储器是由CLB 中的RAM结构实现的(LUT),每个CLB 最多可以组成32×1或16×2 容量的RAM。
BLOCK RAM存储器按列排列,左边从0列开始,每隔12 列CLB 排列一个BLOCK RAM存储器。每个BLOCK RAM是一个完全同步的双端口RAM,每个端口都有独立的控制信号,非常适合于FIFO器件的编写。
其中XCV1000E的Block SelectRAM共有96块BLOCK RAM ,这种嵌入式的块RAM每块含有4096-bit存储单元,用户可以根据需要灵活配置。
单个块RAM 所存储的数据宽度最高可为16位,可以多个块RAM级连以构成更大的数据宽度,最多可有64个块级连构成1024位的数据存储器。
用两种方法使用FPGA资源情况的比较。
由表2 可以看出,基于寄存器FIFO在综合后用掉了VirtexTM-E器件大量的SLICES资源,而充分考虑FPGA器件结构,用其自带的存储器BLOCK RAM来设计,则仅用掉1%的SLICES资源,两厢一比较,明显后一种设计可以充分节省现有的FPGA资源,设计出容量更大的存储器,且更经济、有效。
结束语
由于现在ADC的精度和速度是一对矛盾,高速度难以做到高精度,所以采集到的数据位数较低,而后端处理器的处理位数越来越高。现在的DSP一般都可以做到32位,因此,如何实现高速ADC和DSP的接口,提高系统的实时性是数据采集系统普遍关注的问题。文中针对自己设计的高速数据采集通道的硬件平台,提出了一种新型的存储器设计思想,输入输出数据宽度不同的高速FIFO缓存,并根据所选用的FPGA器件特点,选择了资源占用最少、效率最高的实现方法,解决了高速数据采集通道数据容量大、实时性要求高的问题。对其他高速采集系统同样具有参考价值。
参考文献:
[1].TMS320C6701 datasheethttp://www.dzsc.com/datasheet/TMS320C6701+_1077796.html.
[2].ROMdatasheethttp://www.dzsc.com/datasheet/ROM_1188413.html.
[3].XCV1000Edatasheethttp://www.dzsc.com/datasheet/XCV1000E_903776.html.
来源:零八我的爱0次