转载:从底层结构开始学习FPGA(4)— MUX多路选择器(Multiplexer)

本文转载自CSDN博主「孤独的单刀」的原创文章,原文链接:https://wuzhikai.blog.csdn.net/article/details/124764526

一、什么是MUX

  多路选择器MUX是一个多输入、单输出的组合逻辑电路,一个n输入的多路选择器就是一个n路的数字开关,可以根据通道选择控制信号的不同,从n个输入中选取一个输出到公共的输出端。

  4选1的多路开关电路模型如下所示

  其真值表如下:


二、FPGA内部的MUX

  在 FPGA 底层,MUX也是作为一种基本的逻辑单元而存在。下图是 FPGA 的一个基本逻辑单元 —— SLICEL,可见其是由LUT、MUX、CARRY4和FF组成。

  通过使用不同LUT6和MUX的组合级联,就可以实现想要的位数的MUX了。

  首先需要说明的是,若只实现MUX2、MUX3、和MUX4是不需要使用到FPGA的MUX资源的,只需要使用LUT6即可。关于LUT6:从底层开始学习FPGA(1)—— LUT查找表

  不妨先写个MUX4的Verilog代码,再用vivado来implementation一下,看看使用了些什么资源。Verilog代码如下:

module test(
    input         A1,
    input         A0,
            
    input         D3,
    input         D2,
    input         D1,
    input         D0,
    
    output reg    Y
 
);
 
always @(*)begin
    case({A1,A0})
        2'b00:    Y = D0;        
        2'b01:    Y = D1;    
        2'b10:    Y = D2;    
        2'b11:    Y = D3;    
        default:;
    endcase
 
end
 
endmodule

  用vivado来分析一下,门级电路如下:

  嗯,就是一个标准的MUX4,与上面提出的电路图一致。再来看看会综合(synthesis)出什么东西:

    可以看到,只用了一个LUT6。然后再看看在 FPGA 上的具体实现:

  同样的,只用了一个LUT6。既然MUX4都只用一个LUT6就可以实现了,那么MUX3、MUX2就当然也只需要一个LUT6了。

  MUX4的实现使用一个LUT6,其中LUT6的4个输入作为MUX4的4个输入,而另外2个输入则作为MUX4的地址线。那么MUX5~MUX8又是如何实现?(MUX5~MUX8均采用3根地址线,可以一起讨论)。

  接下来的讨论以MUX8为例,既然一个LUT6可以实现MUX4,那么2个LUT6 + 1个MUX2就可以实现MUX8的功能了。MUX8的Verilog形式:

module test(
    input         A2,
    input         A1,
    input         A0,
    
    input         D7,
    input         D6,
    input         D5,
    input         D4,            
    input         D3,
    input         D2,
    input         D1,
    input         D0,
    
    output reg    Y
);
 
always @(*)begin
    case({A2,A1,A0})
        3'b000:    Y = D0;        
        3'b001:    Y = D1;    
        3'b010:    Y = D2;    
        3'b011:    Y = D3;    
        3'b100:    Y = D4;        
        3'b101:    Y = D5;    
        3'b110:    Y = D6;    
        3'b111:    Y = D7;        
        default:;
    endcase
end
 
endmodule

  门级电路:

  vivado综合:

  综合的结果是:2个LUT6 + 1个MUXF7。MUXF7就是一个MUX2,但是注意它的输入只能是LUT6的输出。

  映射到FPGA:

  那么从MUX8类推MUX16就很容易了:4个LUT6 + 2个MUX2 + 1个MUX2。MUX16的Verilog形式:

module test
(
    input         A3,
    input         A2,
    input         A1,
    input         A0,
 
    input         D15,
    input         D14,
    input         D13,
    input         D12,            
    input         D11,
    input         D10,
    input         D9,
    input         D8,    
    input         D7,
    input         D6,
    input         D5,
    input         D4,            
    input         D3,
    input         D2,
    input         D1,
    input         D0,
    
    output reg    Y
);
 
always @(*)begin
    case({A3,A2,A1,A0})
        4'b0000:    Y = D0;        
        4'b0001:    Y = D1;    
        4'b0010:    Y = D2;    
        4'b0011:    Y = D3;    
        4'b0100:    Y = D4;        
        4'b0101:    Y = D5;    
        4'b0110:    Y = D6;    
        4'b0111:    Y = D7;    
        4'b1000:    Y = D8;        
        4'b1001:    Y = D9;    
        4'b1010:    Y = D10;    
        4'b1011:    Y = D11;    
        4'b1100:    Y = D12;        
        4'b1101:    Y = D13;    
        4'b1110:    Y = D14;    
        4'b1111:    Y = D15;            
        default:;
    endcase
end
 
endmodule

  门级电路:

  vivado综合:

  与料想的一致,三层级结构:4个LUT6 + 2个MUXF7 + 1个MUXF8。映射到FPGA:

  再来看看上面出现的SLICEL的资源图:

  到这基本上就明白FPGA的独立MUX了:每个SLICE中都有2个MUXF7,其输入只能为LUT6的输出,而输出只能接到MUXF8;每个SLICE中都有1个MUXF8,其输入只能为MUXF7的输出。

  但是我们知道MUX2是可以用LUT6来实现的,也就是说 2个LUT6 + 1个MUXF7可以转换成2个LUT6 + 1个LUT6来实现MUX8;而4个LUT6 + 2个MUXF7+1个MUXF8可以转换成4个LUT6 + 1个LUT6来实现。

  ❓ 那么既然LUT6可以实现MUX2的功能,FPGA里为何还要有固定的MUX这种结构?

  首先可以肯定的是用LUT6来实现MUX2的效率没有固定MUX2的效率高,因为有两个输入没有利用就意味着有资源是浪费的。

  其次,每个SLICE中只有4个LUT6,如果只用LUT6来实现MUX16则需要5个LUT6,那么第5个LUT6则势必会布线到其他Slice,这样就容易造成不好布线和拥堵,且4个LUT6的输出分别到达第五个LUT6的时间会不同,到达时间不一致则容易产生毛刺。

  而对于LUT6+MUX的构造,则布线长度基本一致的,可以看下图:

  重点关注紫线,可以看到这个长度基本一致。如果要布线到另外Slice的LUT6的话,可以想象这条路径有多长和多难控制长度一致。


三、总结

  (1)每个SLICE中都有2个MUXF7 + 1个MUXF8。MUXF7 的输入只能为LUT6的输出,而输出只能接到MUXF8;MUXF8的输入只能为MUXF7的输出。

  (2)MUX4可以由LUT6来实现,每个SLICE可以实现4个独立的MUX4。

  (3)MUX8可以由2LUT6 + 1个MUXF7来实现,每个SLICE可以实现2个独立的MUX8。

  (4)MUX16可以由4LUT6 + 2个MUXF7 + 1个MUXF8来实现,每个SLICE可以实现1个独立的MUX16。

  (5)若大于16路的多路选择器则需要数个SLICE的资源进行级联来实现。

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值