多位選多位的資料選擇器在進行FPGA開發時經常會用到,在編寫Verilog時往往可以直接通過case,if,generate等語句友善地實作資料選擇器,但是這種寫法很大程度脫離了基本的邏輯表達式,很多具體的邏輯實作都由編譯器替我們完成了,在檢視網表隻能看到這樣的結果:
而不清楚裡面具體的邏輯,于是在了解資料選擇器的時候我們往往會有這樣的問題:資料選擇器的底層是怎樣的?如何一步步地拓展成我們看到的樣子的?下面我們就從一個基礎的例子來了解一下資料選擇器。
1 一比特4選1資料選擇器
資料選擇器包含包含三部分:輸入信号,選擇信号和輸出信号。
首先考慮一個簡單的一位多輸入選擇器(四選一輸入D[3:0],片選信号X[1:0],輸出Y)
它的邏輯表達式可以寫作:
,對應如下表格:
Input D | Sel X | Output Y |
---|---|---|
D[3:0] | 00 | D[0] |
D[3:0] | 01 | D[1] |
D[3:0] | 10 | D[2] |
D[3:0] | 11 | D[3] |
從表達式中可以看出來,當确定某一個X的組合時,如X=00,那麼不滿足該條件的其它項都為0,最後Y的結果為
,僅與
有關。這樣就用與門和或門這樣的基本邏輯單元實作了四選一的資料選擇器。
按照上面的思想編寫Verilog代碼如下:
`timescale 1ns / 1ps
//
// Company: SUSTech
// Engineer: [email protected]
//
// Create Date: 2022/09/19 22:40:18
// Design Name: Multiplexer(1bit) 4 to 1
// Module Name: MUX
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies: None
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module MUX(
D,
X,
Y);
input wire [3:0] D;
input wire [1:0] X;
output wire Y;
assign Y = (~X[1]&~X[0]&D[0]) | (~X[1]&X[0]&D[1]) | (X[1]&~X[0]&D[2]) | (X[1]&X[0]&D[3]);
endmodule
生成的邏輯圖如下:
2 多比特4選1資料選擇器
對于多位對多位的輸入比如輸入為4bits*4,輸出為4bits,隻需要将上1比特4選一複用器按位拓展。
`timescale 1ns / 1ps
//
// Company: SUSTech
// Engineer: [email protected]
//
// Create Date: 2022/09/19 22:40:18
// Design Name: Multiplexer 4 to 1
// Module Name: MUX
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies: None
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module MUX4(
D,
X,
Y);
input wire [3:0] D [3:0];
input wire [1:0] X;
output wire [3:0] Y;
MUX mu0 (D[0],X,Y[0]); // 将1比特4選一的MUX執行個體化
MUX mu1 (D[1],X,Y[1]);
MUX mu2 (D[2],X,Y[2]);
MUX mu3 (D[3],X,Y[3]);
endmodule
// 1bit 4 to 1 multiplixer
module MUX(
D,
X,
Y);
input wire [3:0] D;
input wire [1:0] X;
output wire Y;
assign Y = (~X[1]&~X[0]&D[0]) | (~X[1]&X[0]&D[1]) | (X[1]&~X[0]&D[2]) | (X[1]&X[0]&D[3]);
endmodule
生成的網表如下 :
内部邏輯細節,就是上面的單個4選1資料選擇器的邏輯:
3 多比特多選多資料選擇器
對于8選一,隻需要将X的位數變為3位X[2:0],對于16選一,隻需要将X的位數變為4位X[3:0],以此類推。
注:使用工具為Vivado2019