FPGA从Xilinx 的7系列学起(9)

2.8 RAM资源的应用

用户做设计的时候发现自己的设计的代码可能被识别为RAM资源,这个时候感觉很爽。有的时候啥也推断不出来,可能会影响设计的性能。

那么什么样的资源才会被设计工具推断出来呢?

单端口,真双端口,简单双端口块RAM可以推断.

RTL代码来描述希望RAM功能的,将会被工具推断为RAM的资源。

RTL描述必须有如下特点:

同步读写

每个时钟周期只有一个或两个地址被访问

同步输出复位
这就要求用户必须对自己的代码有一个非常清晰的认识才可以如此选择,一个不小心用户可能得到一个不是他想要的结果,这个对用户来说,是一个灾难性的选择。

综合策略也可以被用来帮助综合工具选择合适的资源。例如,当一个RAM可以既可以在分布式SelectRAM™存储器,又可以在BlockRAM来实现时候,可以在综合策略里面选择使用BlockRAM来选择使用的资源。

另外,切记FIFO无法被工具推断出来。

可能很多用户非常想知道如何来正确编写HDL的代码。下面就啰嗦两句HDL代码风格的事情。因为这个也关系到上面说的一些问题,让用户得到他想使用的资源。特别是新用户面临的最大挑战是确保他们使用正确的推理最远。

首先,检查用户是否正确使用了推断的资源的最佳方法之一就是用户通过综合工具原理图查看器直观的进行观察。用户使用该观察器后会发现无论用户的功能如何变化,用户使用的最基本单元,有LUT, 移位寄存器的LUT,分布式RAM和BlockRAM是没有变化的。所有Slice的资源都是可以通过综合器综合出来的。但是用户必须保证代码的正确性。这意味着,如果你是用的控制信号和底层的触发器原语需求不匹配,那么你就无法得到一个正确的触发器资源使用。可能还需要多一个LUT来帮你实现功能。同样移位寄存器的LUT不能提前赋值,不能有复位信号,而且只支持串行功能。当用户代码是并行处理,那么只会得到一个纯粹的寄存器,而不是移位寄存器,这个可能并不是用户想要的。同样多路复用器应该使用Case语句,进行逻辑运算应该使用正确的算术运算符。例如,不能既使用了异或功能,又期望综合器综合出进位逻辑资源,它是不可能实现的。一般,我们的设计都是使用工具进行推断,这几乎是所有用户的首选。他既保障易读性,又增加了代码的可重复性。然而我们有时候不得不使用例化IP来实现自己想要的功能。

XILINX提供了两种途径来完成这个例化功能。

第一是原语例化。

用户可以发现,从该库指南可以帮助用户正确使用Xilinx的原语。这也是始终是学习如何推断出相应的资源,并把它融入到用户的逻辑中的最有效的资源。

该库指南包含了XILINX的所有可能的基元和宏。所有原语和宏都详细列出并包括一个示意图,端口名(HDL实例),属性名称的功能描述,而对组件的行为的真值表描述。对使用的库指南的好处是,当一种资源的推理有时是具有挑战性的,用户可以随时例化它到他想要的原始设计中去。

Core Generator和 IP Catalog提供了很多优秀的IP资源供用户选择和使用。虽然有一些可能需要付一点费用,但是大部分IP XILINX都是提供免费使用的。这个IP有功能简单应用,也有非常复杂的IP。这个架构导向的IP中最常用的之一就是时钟管理单元的例化。使用IP Catalog可以帮助用户生成高层次的组件,这些IP对该功能进行优化,可以使用户设计的东西轻松的实现。

文章来源: FPGA那点事儿