如何分析FPGA的片上资源使用情况


一、如何得到LUT与REG的使用比例 riple

        我们先看一个FPGA工程的编译结果报告:

844cd6a0dd9314bbb3e60ab4e7b99652.png

        在这个报告中,我们可以看到如下信息:
        Total logic elements 24071/24624(98%): 该芯片中共有24624个LE资源,其中的98%在这个工程的这次编译中得到了使用。 riple
        Total combinational functions 21612/24624(88%): 该芯片的24624个LE资源中,88%用于实现组合逻辑。 riple
        Dedicated logic registers 8858/24624(36%): 该芯片的24624个LE资源中,36%用于实现寄存器,即时序逻辑。 riple
        就是从上述信息中,我得到了组合逻辑与时序逻辑的使用比例——21612/8858 = 2.4:1。 riple

二、一份更详细的资源利用率报告 riple

        在这个报告中,有一点可能会令人困惑:为什么Total combinational functions与Dedicated logic registers之和(30470)大于Total logic elements(24071),甚至大于该芯片的总资源(24624)。我们再来看一份更详细的资源使用报告——Fitter Resource Usage Summary:

0c9f88f83cf7c82ef3008faff9057b4b.png

        这份报告包含很多信息,在这里我们只需要关心Total logic elements一项。Total logic elements 24071/24624(98%)由三种使用情况不同的LE资源组成:仅用于实现组合逻辑的LE(Combinational with no register 15213),仅用于实现时序逻辑的LE(Register only 2459),同时用于实现组合逻辑和时序逻辑的LE(Combinational with a register 6399)。 riple

三、从Resource Property Editor看LE的使用情况 riple
        在进一步分析这些数据之前,我们有必要回顾一下FPGA的基本组成元素LE(Logic Element)的结构和功能。以Altera的Cyclone III系列FPGA芯片为例,其LE内部结构如下图所示:

ec9a6a7f72c1e5730bf944422fc16327.png

        这个LE同时用于实现组合逻辑和时序逻辑,其中蓝色部分为组合逻辑(一个4输入LUT),其中黄色高亮部分为时序逻辑(一个D触发器)。 riple
        我们再来看一个更有趣的LE:

93c636ea1dfd4c4efa7b8ecd75d9d49b.png

        这个LE也同时用于实现组合逻辑和时序逻辑,与上一幅图不同的地方在于,这里的组合逻辑(4输入LUT)与时序逻辑(REG)并没有连接关系。组合逻辑从COMBOUT直接输出,时序逻辑从REGOUT输出。这种互不相关的组合逻辑与时序逻辑共用同一个LE的情况很特殊,这是采用了Register Packing资源优化技术之后的实现方式。如果没有采用这一资源优化技术,就要用两个LE来分别实现相应的组合逻辑和时序逻辑。 riple
        明白了上面这两幅图,大家也能由此类推,想象出仅用于实现组合逻辑的LE(Combinational with no register)和仅用于实现时序逻辑的LE(Register only)该是什么样子。 riple

四、“数字终于对(凑)上了!” riple
        我们回到前面关于资源利用率分析的部分。有了上面介绍的知识,大家应该能够把资源利用率报告中三种使用情况不同的LE区分开了。 riple
        我们把“同时用于实现组合逻辑和时序逻辑的LE(6399)”分别加到“仅用于实现组合逻辑的LE(15213)”和“仅用于实现时序逻辑的LE(2459)”上面,就可以得到“全部组合逻辑”(Total combinational functions = 6399 + 15213 = 21612)和“全部寄存器”(Dedicated logic registers = 6399 + 2459 = 8858)两个数值了。这两个数值就是第一幅图中关于资源利用率的汇总报告结果,它们的比例恰好就是2.4:1。 riple
        由于6399这个数字被使用了两次,所以我们最初关于“Total combinational functions与Dedicated logic registers之和(30470 = (6399 + 15213) + (6399 + 2459))大于Total logic elements(24071 = 6399 + 15213 + 2459)”的困惑也得到了解答。 riple

五、总结 riple
        由于FPGA设计中用到的组合逻辑与时序逻辑的数量不均衡,部分LE会仅用于实现组合逻辑或时序逻辑;进一步,由于布局位置的限制,单独实现组合逻辑或时序逻辑的两个LE可能不能合并到一个LE中实现。所以,在资源利用率报告中会出现三种使用情况不同的LE。 riple
        由于过长的组合逻辑链(级联的LUT)会引入较大的延时,而时序逻辑(REG)能够把较长的组合逻辑链分割成较短的组合逻辑链,有效地缩短关键路径和次关键路径的长度,进而提高该FPGA设计的整体时序性能,所以组合逻辑与时序逻辑的使用比例可以作为评价一个FPGA设计时序性能的辅助参数。 riple
        过于复杂的组合逻辑也会占用多个LE。我们在编写HDL代码的时候,不能单独把减少Register的使用量作为节省资源的手段,而应该兼顾组合逻辑与时序逻辑,根据目标PLD器件的底层结构,编写组合逻辑和时序逻辑比例符合PLD器件资源比例的代码。 riple

5aabb9ea032d2d31a74f9f2b865ccb20.png

点个在看你最好看

### 如何优化FPGA设计以降低DSP资源占用率 在FPGA设计中,减少DSP资源的使用可以通过多种方法实现。以下是几种常见的优化策略: #### 1. 数据位宽调整 通过分析信号路径中的动态范围需求,可以适当减小数据位宽来节省DSP资源。对于某些应用来说,可能不需要全程保持高精度计算[^2]。 例如,在滤波器设计中,如果输入数据位宽为16位而乘法器支持18×18操作,则多余的两位可能会浪费资源。因此,应根据实际需求裁剪不必要的高位或低位。 ```python def adjust_data_width(input_bits, required_precision): """ 调整数据宽度至满足所需精度最小值。 参数: input_bits (int): 输入数据原始位宽。 required_precision (float): 所需相对误差对应的最低有效位数。 返回: int: 新的数据位宽。 """ new_width = max(8, round(math.log(required_precision / math.pow(2, -input_bits), 2))) return new_width ``` #### 2. 使用对称结构简化运算 当处理线性相位 FIR 滤波器时,利用其系数对称特性可显著减少一半的乘法次数。这不仅降低了 DSP 的负担还提高了整体吞吐量[^2]。 假设当前使用的是一组非对称系数 {c0,c1,...cn} ,那么转换成对称形式后只需存储 n/2 或更少数量级的有效参数即可完成相同功能。 #### 3. 减低采样频率 降低系统的主工作时钟速度会直接影响到每秒钟所能执行的最大指令数目以及相应消耗掉多少硬件单元实例化出来作为流水管线阶段之间的缓冲寄存器阵列部分。虽然这样做可能导致延迟增加但是却能极大地缓解压力从而达到节约目的[^2]。 #### 4. 并行度权衡 合理规划任务间的并行程度也是至关重要的一步。过度追求极致并发往往会引入额外开销比如更多的加法树节点或者更深的记忆体访问链路等等反而得不偿失;相反适度放宽约束条件允许一定程度串行运行或许反而是更好的选择之一[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值