原创 【博客大赛】多路复用器优化之Mux背景及分类(4)

2014-3-3 14:10 2256 20 20 分类: FPGA/CPLD 文集: ALTERA FPGA

       隐含式多路复用器

 

       利用ALTERA器件内部逻辑结构可以实现一些隐式多路复用器,比如在我们使用同步复位、同步加载以及时钟使能的时候,或许就会被综合成这种隐式多路复用器。由于同步加载、清零以及使能在一个LAB内部都是共用的,所以只有在LAB内所有LE使用相同加载、清零或使能的时候这些信号才非常有用,而实际上这种情况也经常发生。

 

         前面我们知道一个2:1多路复用器就要消耗一个LE,下面我们给出隐式多路复用器如何在一个LE中实现3:1和4:1等多路复用器的。

 

4628.jpg

图1:使用单个LE实现3:1多路复用器

 

         如图1所示,就是使用一个LE实现了3:1多路复用器,其中查找表实现了2:1,另外一个输入从DATA3进行,使用同步加载来实现选择线功能。

 

4628.jpg

图2:只用一个LE实现4:1多路复用器

 

         如图2所示,只使用了一个LE就实现一个4:1多路复用器。我们从图17就可以看到查找表的所有输入已经都被占用了,所以这时候无法再提供额外的输入。但是如果多路复用器如果有某个输入固定为0,那么如图2所示,就可以使用同步清零作为这个输入,如此就只用一个LE实现了一个4:1多路复用器。

 

         最后我们来一种在单个LE实现的5:1多路复用器,其VHDL代码如下所示:

PROCESS (clk, reset)

BEGIN

IF reset=’1’ THEN

  z <= 0;

ELSIF rising_edge(clk) THEN

  IF enable=’1’ THEN

    IF sclear THEN

      z <= 0;

    ELSIF sload THEN

      z <= d2;

    ELSE

      IF sel=’1’ THEN

        z <= d1;

      ELSE z <= d0;

      END IF;

    END IF;

  END IF;

END IF;

END PROCESS;

 

      上述代码中使用了IF-ELSE语句实现异步复位、同步时钟使能以及同步清零和同步加载,剩下的核心就是一个2:1多路复用选择器。根据前面的分析,同步加载和清零可以综合成多路复用器,所以至少可以得到前面博文所示的4:1多路复用器,那么综合器最后会如何处理时钟使能呢?答案是实现一个5:1多路复用器,而且只需使用一个LE,实现的结构如图3所示。

 

4628.jpg

图3:使用单个LE实现5:1多路复用器

 

         需要注意的是和图2一样,该多路复用器有一个输入固定为0,而且在时钟使能为0时,复用器的输出反馈到第五个输入。

 

         接下来我们来看看如何使用这类多路复用器,图4展示了利用上述3:1多路复用器可以更有效地实现更大的12:1多路复用器,效率和使用之前介绍的线性多路复用器相当。

 

4628.jpg

图4:利用3:1多路复用器更有效地实现更大多路复用器

 

         图4是采用了同步加载端口,如果同时还采用同步复位端口,那么我们就可以实现如图5所示的12:1多路复用器。这种结构中,所有3:1复用器是同时复位,而不是单独某一个,这样可以使用一个或门来组合最终输出,而不像图20那样需要使用一个4:1多路复用器。一个或门可以放置到一个LE中,而一个4:1多路复用器则需要两个LE,这样图21所示的12:1多路复用器就只需5个LE。这个效率甚至高于之前讨论的线性Mux,相比二进制Mux则更是节约了38%的资源。

 

4628.jpg

图5:采用同步复位实现更有效实现多路复用器

 

         当然,要实现图5所示的多路复用器,设计者必须要将意图体现在代码中。通过上面分析,建议大家多使用上述这种所谓的隐含多路复用器,原因在于这种多路复用器依赖于寄存器功能,当多路复用器的输出经过寄存后,就非常利于使用。

文章评论0条评论)

登录后参与讨论
我要评论
0
20
关闭 站长推荐上一条 /2 下一条