您的位置:首页 > 编程语言

如何优化FPGA资源例子——我是如何两行代码搞成800行的

2018-03-31 22:02 525 查看
15年底的一天,我的组员老lau来找我,说,老大,你让我分析的为什么那个模块资源过高的问题找到了,但是无解。
老L在华为干了4年,在我司也干了快4年,算是我的半个主力,之所以不是全主力,是因为没有自我成就驱动力。
我坐下来和他一起分析,他给我指了指,就是这两行话,这个模块的大部分资源都在这两行RTL代码上。   generate
genvar j ;
for ( j=0; j<N; j=j+1 ) begin : INFO_PROC_GEN
always@(posedge clk)
begin
dxc_tx_clk[j] = dxc_tx_clk_in[chn_map[j][6:0]];
dxc_tx_data[j] = dxc_tx_data_in[chn_map[j][6:0]];
end
end
endgenerate 很直白,也很简单的功能,将128路数据和时钟做交叉。
这个项目是将多个已有的IP整合,同时添加一部分新的功能,做一个低成本的单FPGA解决方案,是将我们原先一个机框的不同板卡的交叉等功能整合在一起变成一个单板解决方案。IP出来的是N路数据和时钟,需要将它交叉后送给另外一个IP。多路选择,mux。老L选择了最简单的语法武器,怼上去,资源飞过了天空。
老L说“没法解决,这个就是一个简单功能,你看直白写出来就是这样”。
“不能复用吗?”  “不能,异步的时钟,搞不定,即使复用了资源也省不了吧”
“好吧,一定有解决方案的。”,安慰过自己,开始干活。
省资源大法第一物理定律,带宽换资源
第一步,复用是最直接有效的,数据可以串并转换,降低单路的带宽需求
第二步,但是时钟怎么,不交叉时钟,在出口根据水位恢复时钟吗?完整的恢复时钟的逻辑足以将你复用的成果灰飞湮灭。
显然完整的恢复时钟是不现实的,因为涉及到NCO的采样率以及抖动/漂移要求,复用的资源直接就超了。
那么只有简化了,我想起了时戳,1588的时戳,咱也做的很6。
计算业务时钟和参考时钟的时钟word时间标尺的偏差(这儿的关键是位宽不能太宽,否则资源就超了),用4bit携带时钟的相对时戳信息(1bit正负,3bit相位差),累积时钟偏差(复用RAM资源,可以更宽)
最后的方案如下,整体资源降低到原先的45%(单纯替换,是原先的55%,加上了集成一部分其他功能节省的资源)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息