在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2426|回复: 9

[求助] 实时相关算法的FPGA实现

[复制链接]
发表于 2015-8-30 20:22:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
各路大神好,现在我要用FPGA(现成的Xilinx VC707开发板)实现一个实时相关算法,即对两路数据序列进行移位相关,具体见下图。 图中有两个寄存器组(长度为L=256、512、1024...),其中竖着的寄存器组里存放着构造好的数据(数据位宽10bits)。上面的寄存器组用于数据缓存,每个clk周期内实现两个寄存器组内对应位置点数据的乘积,并求出所有乘积值的累加和(product_sum),并将此累加和数据与固定的数值阈值进行比较,若大于阈值,则存储data序列中相应的数据位置点;否则,放弃该product_sum。每个clk周期移入移出一个数据值(对应图中上面的寄存器组)。由于此算法处理的是前面模块推送的实时数据,所以对实时性要求比较高,每一次的计算延时不能太多。  我之前尝试的结果不太好,一直思路受限。所以,eetop的IC/FPGA高手们,能不能提供一些思路,这个算法该怎么实现(或能不能实现)?  先谢谢啦! frame_sync.png
发表于 2015-8-30 22:16:17 | 显示全部楼层
回复 1# leedlut


   可以设计成pipeline,data可以用两个memory(这里用FIFO说明)串联缓存:计算乘积累加用FIFO_A流水计算,计算完后data写入FIFO_B,得到比较结果后再看是否需要将FIFO_B中的数据写入到RAM,需要就写入不需要就清空。end.
 楼主| 发表于 2015-8-31 10:38:17 | 显示全部楼层
回复 2# harry_hust
你好harry_hust, 如果用memory进行缓存的话,无法做到一个clk访问所有的缓存数据(L个数据),所以,求出一个product_sum,即使用pipeline的话,也会需要很多周期。而data数据一直在推送,恐怕前后速率上无法达到匹配。
发表于 2015-8-31 20:33:13 | 显示全部楼层
回复 3# leedlut


    这L个数据也是同时输入FPGA的吗?(我个人认为应该不会是同时给进来的,没有这么多的接口。。)    其实实时计算并不是说不能有延迟,或者延迟只有1个cycle,只要满足指标要求都是实时的。
    另外,L个数据同时计算也带来很大的功耗,如果码率很大的话还得考虑散热问题。
    所以我觉得这个应该还可以进一步优化。
 楼主| 发表于 2015-9-1 15:44:12 | 显示全部楼层
本帖最后由 leedlut 于 2015-9-1 15:45 编辑

回复 4# harry_hust     首先,感谢harry_hust对本帖的关注!
     事实上,我上面提到的data数据已经是FPGA内的数据,data数据从前面的一个模块输出到这个相关算法的处理模块。简单的说,这个算法就是要从这个data数据流中找到一个固定长度(L),每一帧数据的帧头(是否找到就是用上面图中提到的方法进行判决)。 这个算法也可以形象的描述为:有一个固定长度的窗(如我上面说的长度为L的寄存器组),而且这个窗是固定的,而data数据是随clk不断流经这个窗的,每走一个clk周期,这个窗里的数据是不断更新的(移位过程)。 因为不知道帧头到底什么时候会出现,那么,就需要在每一次窗里的数据有更新时,都进行判决确认。
     还有就是,你提到的实时计算允许有一定的延时,只要满足指标就行。 这我是同意的, 但就这个算法来说,data数据的数据率大概在25MHz/s,之前,我也有考虑按你上面提到的方法进行处理,用memory进行数据缓存,但考虑到memory每个cycle 只能读写一次,而且无法做到我上面提到的数据移位操作, 那么无论用不用pipeline,都会拖慢处理速度(因为我觉得算法的特性在于多数据的同时处理,而memory虽可以用于缓存,但是它使得数据的读写变得串行化,所以感觉有些不匹配。个人见解~~~)。

     关于L个数据同时计算,这是我最先考虑到的实现方式,但正如你所说,同时计算在实现时会带来大功耗问题、散热问题及FPGA布局布线资源大量消耗的问题(因为做个东西不是用于实际的产品,而是带有一定的实验性质的,所以更关注能否实现。),所以,这样做(我暂时想到的寄存器组)的话,最担心的就是布线资源不够用。  从目前程序的综合结果来说,感觉还是有些问题,没有综合出想要的structure。 当然,鉴于水平有限,可能还是有理解不到位的地方。 所以欢迎高手能提出不一样的见解!
发表于 2015-9-1 21:35:56 | 显示全部楼层
回复 5# leedlut


   照你所说,那L个乘法是不可避免了,累加也不可避免会有(1+2+...+2^(L-1))个加法。   如果资源足够的话,你可以将data寄存N级(N为乘法开始到compare结束的cycle数),这样也可以流水了。

   另外,如果仅是实验用的话,可以仅做仿真,而不必到FPGA上跑。

   希望这些对你有帮助。
发表于 2015-9-2 09:02:32 | 显示全部楼层
几百个乘法器。。。,帧头不是固定数,那计算量很多啊
发表于 2015-9-2 09:22:04 | 显示全部楼层
挺复杂,学习一下,多谢了
 楼主| 发表于 2015-9-2 09:22:09 | 显示全部楼层
回复 7# wddnjust


  嗯,计算量是很大。
 楼主| 发表于 2015-9-2 09:27:26 | 显示全部楼层
回复 6# harry_hust


   嗯,正在尝试用流水线去做。 还有就是,这个虽然是实验性质的,还是有具体实物系统的,只是目前主要考虑系统的实现,对成本和功耗不是那么敏感~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-23 09:18 , Processed in 0.022193 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表