目前在很多数据采集的场合,都要用到FPGA,主要作用是对数据进行一些处理,缓存,然后通过计算机总线(比如PCI总线或其他一些工业控制总线)上传到主机。这里就涉及到一个上传速度的问题,FPGA的程序如果设计不当,将会大大影响效率。
这片FPGA通常由这几个模块组成:数据宽度转换模块,缓存控制模块和接口控制逻辑模块。
数据宽度转换模块靠近FPGA的数据输入端,主要是转换数据传送的位宽,要使传到FPGA的数据尽量转换成与计算机总线数据宽度相同,以便提升速率。比如对于A/D转换后的8位数据,要通过32位的PCI总线上传,就要先把8位数据转换为32位的数据,这样可以最大限度地利用PCI总线的带宽。
接口控制逻辑模块靠近计算机的总线端,主要是对总线接口芯片的local端的信号进行控制,以达到通过接口芯片上传到主机的目的。比如对PCI接口芯片PCI9054而言,设计者就要读一下9054的datasheet,选定它的工作模式,然后按照该模式的时序图进行控制逻辑模块的设计,这部分可以用状态机来实现,比如s0 是idle状态,s1是读状态,s2是写状态等等,然后确定这些状态之间转换的条件即可。这部分一定要小心设计,要把datasheet中的时序图搞明白,不然如果设计不当,从主机上抓数据的时候很容易导致主机挂起而死机。
缓存控制模块是介于数据宽度转换模块和接口控制逻辑模块之间的,也是我重点要谈的一部分。在不同的应用场合,数据格式也不同,不过一般都是一帧一帧传输的,一帧数据的起始有帧头,有些也有帧尾还有其他校验位之类的,原理上都差不多。比较通常的做法是,FPGA把接收到的数据先存储在它外挂的RAM(一般采用SRAM)中,RAM的容量正好等于一帧数据的大小,存满RAM之后,再通过接口芯片进行上传。如果FPGA外挂一片RAM的话,要等到它存满之后才能开始上传工作,这会让效率打折扣,对一些要求高速传输的场合会造成影响。在这里介绍一种乒乓帧技术,可以大大提升传输速度。
所谓乒乓帧,就是FPGA外挂的两片RAM。FPGA可以先通过缓存控制模块将前端传来的数据写入一片RAM,同时控制接口逻辑模块将另一片RAM的数据上传到主机,实现了读写可以同时进行,这样就节省了很多PCI总线的等待时间,使效率大大提高,可以满足一些高速传输的应用。乒乓帧的实现也比较简单,可以用数据的帧头或者帧尾做控制出发信号,因为一帧数据完全写入一片RAM的标志是本帧帧尾或者下帧帧头的到来,捕捉到这个帧头或者帧尾就可以向接口芯片发出ready信号,表示数据准备好了,可以把数据上传了,然后上传的同时下一帧数据就可以写入另一片RAM。如此反复,直到数据传完,就如同打乒乓球一样,乒乓帧的说法正是由此而来。
总之,要看你的应用,如果对带宽要求不高,可以只用一片RAM,这样可以节省成本。但速度要求高一些的应用来说,最好采用乒乓帧的做法,会为你省去很多麻烦,让你的设计比较轻松就能满足要求。
文章评论(0条评论)
登录后参与讨论