热度 26
2012-12-21 10:05
4553 次阅读|
0 个评论
用过 DSP_Builder 工具的朋友一定用过 Delay 模块,这个可是算法设计中必须用到的东西,它能让你的数据延时几个时钟再出现,那么在这个模块同一个 Library 中你是否注意到还有一个 Memory Delay 模块。咋一看,这两个模块貌似是一样的,因为都有 Delay ,不过再一想,既然分开存放,那肯定又有所不同。下面,跟随着笔者带你看看究竟这里面藏着什么秘密。 首先,我们来看一个实验,这个实验如下图所示。 我们对这个算法进行编译,目的是查看这两个不同的 Delay 模块综合成了什么样的电路以及消耗的资源情况怎样。 对上图资源使用情况,我们只关心两个地方就足够了,一个是 Logic Cells ,一个是 M4Ks 。 Logic Cells 是 FPGA 内部的逻辑单元,我们生成电路主要靠的就是它了; M4Ks 是 Altera 低端 FPGA 配备的内部 RAM 资源, 4K 的意思就是它的容量是 4K bits (注意这儿单位是位)。由这里可以看出 Delay1 模块消耗了 8 个 Logic Cells , Memory Delay 也消耗了 8 个 Logic Cells 。忙活了半天,原来这两个模块消耗的资源是一样的,我们再来看一下综合的电路吧。 看了上图发现,这两个模块综合成的电路都是一样的。笔者坚信,这两个模块肯定有所不同,那能不能通过综合优化选项改变综合后的电路呢,笔者更改了 Analysis Synthesis Settings 下的 Optimization Technique 。 不论采用 Speed 、 Balanced 还是 Area ,效果都是一样的。笔者又试验了两个时钟单位的延时,两个模块综合出来还是完全一样。 功夫不负有心人,当我把延时值增加到 3 时,就出现了不同效果了。 下图是延时 3 个时钟时的资源消耗情况。 看到这个图,我们终于可以高兴一下了,因为我们找出了它们的不同, Delay1 消耗了 24 个 Logic Cells ,没有用到 M4Ks ;而 Memory Delay 消耗了 5 个 Logic Cells ,同时消耗了 1 个 M4Ks 。这里就好理解为什么叫 Memory Delay 了吧,因为它需要占用 FPGA 的 RAM 资源;而 Delay 模块不占用 RAM 资源,而是消耗 Logic Cells 资源,那究竟是不是这样呢,让我接下来一探究竟吧。既然资源消耗不同,那综合出的电路也不同了,这里感兴趣的朋友可以自己试验一下。 笔者还没有放弃,继续试验,试图彻底了解它们俩兄弟。笔者又进行了 4 时钟延时的试验,结果这次更复杂了,先看看 4 时钟延时的资源消耗情况吧。 对比上面两幅图,笔者惊讶的发现,我进行 4 个 Memory Delay 的延时,结果比进行 3 个 Memory Delay 的延时,消耗的资源还要少,这里确实有些复杂。当我们看 RAM Summary 时发现, 3 个延时时生成的 RAM 是双时钟的简单双口 RAM ,而 4 个延时时声称的 RAM 是单时钟的简单双口 RAM ,这就是答案所在,究竟 Altera 为什么要那么做,笔者也不清楚。 当我把延时值进一步加到 5 时,更为奇特的事情发生了,且听笔者慢慢道来。下图是我在用 Speed 模式优化综合器时生成电路的资源消耗情况。 Delay1 模块消耗了 40 个 Logic Cells ,这里好理解, 8 位输入输出,每个延时消耗 8 个 Logic Cells ,一共 40 个。但是, Memory Bits 为什么只有 24 bits ,按道理应该是 40 bits 才对啊。当我们观察生成的电路结构时会发现, M4K 每个块输入输出口都配备有一个 D 触发器,这个触发器可以选择使用不使用,而每个 D 触发器都相当于一个延时,这样就好理解为什么是 24 bits 了吧。 而当我们用 Balance 或者 Area 选项去优化综合器时,又出现了不同的效果,且看下图。 看到了吧, Delay1 消耗了 8 个 Logic Cells 和 16 bits M4K ,而 Memory Delay 消耗了 24 bits M4K ,貌似越来越复杂了。其实当我们看了综合成的电路后就感觉不到复杂了, Delay 在利用 Memory 延时之前先进行了 1 个延时,即 8 个 Logic Cells 用作了 1 个时钟的延时,究竟为什么这样,也只有 Altera 的工程师能说清楚了。 接下来,相信大家都会像笔者一样,有接着往下做实验的冲动。有兴趣大家可以多试验几种情况,在这里给出大家一个结论,当所设定的延时值 * 数据位宽小于逻辑单元数量时,综合出来的结论都和 5 个延时值时相同;而当延时值 * 数据位宽大于逻辑单元数量时,用 Speed 优化选项编译会报错,而用 Balance 或 Area 优化选项编译时正常。 通过上面的实验,我对我们已经对 Delay 和 Memory Delay 有个清楚的认识了,但我们找出这些区别并是不完全出于兴趣,下一篇博文将会进一步说明我们怎么利用这些不同设计自己的算法,以节省 FPGA 资源。