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

本文通过一个具体案例,展示了如何解决FPGA设计中资源占用过高的问题。通过对数据和时钟信号处理逻辑的重新设计,最终实现了资源占用大幅下降。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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%,加上了集成一部分其他功能节省的资源)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值