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

1.3再深入一点的了解CLB

这个图有点大,但是太经典了,搞得我不得不放弃扔掉它的想法。是不是有人已经看迷糊了。那咱就慢慢的清晰呗。有时候也不一定要一开始明白,如果一开始明白,那么会越来越糊涂。

那么这个是啥?这个就是一个Slice,这个Slice由几部分组成,4个六输入查找表,很多的复用器(multiplexers),一条自下而上的进位链(这个进位链被连接到四个触发器上的),8个FF的(4个的FF/Latches, 4个辅助的FF)。看看这个图的好处就来了,我不需要给大家指出那里是啥了,一目了然。

如果大家不收藏我的文章,那么大家就把这个图好好的保留一下。这个图就是你设计到底层,想直接用原语设计的时候的九阳真经了。

1.3.1 聊一聊LUT
查找表LUT也有时也被称为函数发生器(这个概念有点大,但是我觉得还是比较贴切的,因为你所有的功能都是由它来实现的)。一个LUT的能力是受限于输入的个数的限制,而不是逻辑的复杂性。只要他在Slice内部进行相关的功能,那么通过LUT的延迟是恒定的,无论你实现的什么样的逻辑功能。--不过我还是不建议大家取用Slice作为一个延时器的来进行设计。

每个Slice包含一个6输入LUT,可以也被分成两个5输入LUT。那么这样的应用就允许资源被分解,来帮助保证最大芯片利用率。我觉得每一个人必须了解的LUT的输入限制的性质。很明显,如果你的组合逻辑有七个输入,那么会发生什么呢?由于LUT有六个输入,那么综合工具肯定是需要添加第二个LUT来串联第一个LUT。这又会造成什么呢?这肯定是极大地增加与该路径相关联的延迟,进而影响你设计的最大频率,有时候你设计出来的产品能够跑到多高的频率影响你的设计最终能不能成功的应用,影响你的产品在同类产品的竞争力。当然也不是跑得越高越好,频率越高动态功耗就越高,功耗太高也不是很好的结果,那么结论就是运行频率适量就好,但是潜在的运行频率还是越高越好,你进可攻退可守。

再来扯一扯一个6输入LUT可以也被分成两个5输入LUT的事情。那个时候很多人的书上都讲了这个事情,但是就是一句话,我也是云里雾里的。今天我不知道是不是该把这个事情捋清楚。后来,我想还是捋一捋吧,毕竟这个东西还是能够让人同样跟我一样云里雾里的。

不知道大家看了我的图,清晰了没有。他的两个5输入的查找表的一个前提是5个输入是必须相同的。如果没有这个前提,那么他的结论是不正确的。那么很多书上讲的都是结论,没讲前提。我就把前提给扒出来了。希望对大家理解这句话有帮助。那么,理解这个的好处是什么呢?LUT本身是可以实现任何输入的组合函数。但是我们肯定希望用最少的资源。那么如果能把自己的设计用别人1/2的资源来实现了,功耗和成本一定让你的老板非常喜欢你。

1.3.2 聊一聊Mux
在最上面的图中,我们看到了许多多路复用器,他的功能很明显是把LUT的输出连接到一起,然后形成不同的功能。以下四句话,请大家先记住,然后我再来用图一个个解释解释。
1. 一个LUT能够实现1个4选1的复用器,一个Slice能够实现4个4选1的复用器。
2. 两个LUT能够实现1个8选1的复用器,一个Slice能够实现2个8选1的复用器。
3. 四个LUT能够实现1个16选1的复用器,一个Slice能够实现1个16选1的复用器。

专用的F7AMUX, F7BMUX和 F8MUX三种选择器和LUT一起可以形成更多输入的选择器。每个Slice包含两个F7MUXes,它们和该组的两个LUT的输出一起可以创建和8比1多路复用器。每Slice还包含一个F8MUX。相结合的F7MUXes的输出,可以使一个16比1的MUX。这些MUX输出可以连接到该Slice的触发器/锁存器,可以和其他Slice一起组成能力更强的复用器。这些专用多路复用器用来提高大多路复用速度和节省设计所需要的资源的。

4:1的复用器
如下图所示:每一个LUT都可以被配制成4:1的复用器。

8:1的复用器
每一个Slice有一个F7AMUX 和一个 F7BMUX,这两个复用器和LUT的输出一起形成一个支持13输入的功能,或者一个8:1的复用器。一个Slice能够实现2个8选1的复用器。

16:1的复用器
每一个Slice里面有一个F8MUX,他和F7AMUX 和 F7BMUX输出一起组成了支持27输入的组合逻辑功能或者一个16:1的复用器。一个Slice能够实现1个16选1的复用器。


1.3.3 聊一聊进位链

进位逻辑为了提高用户的算术功能而专门设置的专用硬件资源,他可以改善加法器,累加器,减法器和比较器运算速度。从图中可以看到,左边显示的Slice被分组到同一个进位链中。大家一定要注意,进位链逻辑走向垂直向上。这是必须注意,因为绝大多数设计都会广泛的使用进位链逻辑,那么用户使用的时候,最起始的bit应该被放置在进位链的底部,这样就可以节省很多的资源。当然这个和大家设计的原理图和Layout PCB的关系都很大,所以现在提倡从设计板卡的时候FPGA的工程师就必须和硬件设计工程师一同工作。以后我们会详细讲述这些事情的,不要太着急,否则很多东西还没成系统,就又开始乱糟糟的了。

1.3.4 聊一聊触发器(flip-flop)
XILINX FPGA所有的触发器都是D触发器,这个在数字电路中是最基本的概念,如果不太知道的,可以翻一下数字电路的书籍。当是温故而知新了。D触发器的特点是有一个Clock输入端,数据的翻转需要靠时钟的上升沿或者下降沿的传递来实现的。所有的D触发器都会一个使能位(CE);都会有同步或者异步的置位输入位,当上电的时候他会同步或者异步给一个置位信息,是的寄存器处于一个稳定态,这个对我们的设计帮助非常大。很多书上都说这个置位是没有意义,因为在电路中无法实现该功能,很多工程师朋友在这里都很迷惑。但是实际应用中,我已经测试过,在XILINX的FPGA中,他的作用是存在的,能够非常准确的按照你的需求来设置数据。

通过图片,很清晰的可以看到:同一个组里面的所有触发器和触发器/锁存器共享相同的控制信号。触发器的相关联的控制信号对我们的设计来说是很重要的,因为只有触发器有相同的控制信号,那么他们就可以被分配到相同的Slice中了。这意味着,如果你不管理你设计中的控制信号,控制信号的数目也是随意增加或者减少,那么你真的可能用一个Virtex7的芯片设计出来一个Artix7性能的产品,大量的资源就在你随意的代码中悄悄的溜走了。置位和复位信号用户可以根据自己的需求,配置为同步或异步的。对于同步的设计目的,Xilin的建议,除非必须异步设计,那么用户就应该设计一个同步置位或复位。这也是FPGA设计基础,用户一定要养成同步设计的习惯。为了帮助工程师们理解这些需求,我们的公众号里面专门有文章,教大家如何编写代码才是一个风格优秀的代码,大家有问题可以公众号里面询问。他们的文章精准的告诉了你的什么样编码风格很重要,并为你提供很多很好的设计实践,将帮助你获得高性能并且提高了器件利用率。

把最重要的事情再总结一下:
每一个Slice都有4个6输入的查找表和8个寄存器。
每个LUT都能够实现一个6输入的组合逻辑功能或者两个5输入的组合逻辑功能。
4个寄存器能够被用作触发器或者锁存器,4个寄存器只能被用作触发器。
每一个Slice都有进位链和复选器(MUXF7和FMUX8)。
MUXF8和FMUX7的输出搭配使用能够组合成13输入逻辑功能或者8输入的复选器。
MUXF8和FMUX7的输出搭配使用能够组合成27输入逻辑功能或者16输入的复选器。
进位链能够被用作来实现快速的加减和比较逻辑。

猜你喜欢

转载自blog.csdn.net/reborn_lee/article/details/80393675