转载:从底层结构开始学习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 @(*)begincase({A1,A0})2'b00: Y = D0; 2'b01: Y = D1; 2'b10: Y = D2; 2'b11: Y = D3; default:;endcaseendendmodule用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 @(*)begincase({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 endendmodule門級電路:
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 @(*)begincase({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 endendmodule門級電路:
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的資源進行級聯來實現。
總結
以上是生活随笔為你收集整理的转载:从底层结构开始学习FPGA(4)— MUX多路选择器(Multiplexer)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MC1.12.2开服教程
- 下一篇: 烟雨黑帽SEO动态寄生虫程序全站更新快照