Menu Close

数据选择器Verilog的不同设计方法

描述:数据选择器英文名称为Multiplexer,简称MUX . 从多路数据中选择其中所需要的一路数据传送到输出端的电路。也称多路选择器或多路开关,如下图:

%title插图%num

图1

第一种设计方法: RTL实现, 如下面的例子中将对应的输入D[15:0]的某一位,根据Sel的值选择输出给Y.

module mux4_16
(
    input [15:0] D,
    input [3:0]  Sel,
    output reg   Y
);

always@(*) 
begin
    Y <= 0;
    case(Sel)
    0: Y <= D[0];
    1: Y <= D[1];
    2: Y <= D[2];
    3: Y <= D[3];
    4: Y <= D[4];
    5: Y <= D[5];
    6: Y <= D[6];
    7: Y <= D[7];
    8: Y <= D[8];
    9: Y <= D[9];
    10: Y <= D[10];
    11: Y <= D[11];
    12: Y <= D[12];
    13: Y <= D[13];
    14: Y <= D[14];
    15: Y <= D[15];
    default: Y <= 1'b0;
    endcase
end
endmodule

 

第二钟方法是利用Verilog强大分析与综合工具,用向量直接索引赋值的方式实现.

module mux4_16
(
    input [15:0] D,
    input [3:0]  Sel,
    output       Y
);

assign  Y = D[Sel];
endmodule

 

第三种方法:门级描述的方法

利用数字电路中介绍的真值表,组合逻辑化简(含卡诺图),用组合逻辑门电路实现。在真值表中X表示无关项,如表中的第一项,当Sel[3:0]==0时,无论D[15:1]的值为高电平还是低电平,Y的输出只与D[0]相同,即Y选择了D[0]。

4-16 数据选择器真值表

Sel[3:0] D[15:0] Y
0 XXXXXXXXXXXXXXXXD[0] D[0]
1 XXXXXXXXXXXXXXXD[1]X D[1]
2 XXXXXXXXXXXXXXD[2]XX D[2]
3 XXXXXXXXXXXXXD[3]XXX D[3]
4 XXXXXXXXXXXXD[4]XXXX D[4]
5 XXXXXXXXXXXD[5]XXXXX D[5]
                       .

.

.

15 D[15]XXXXXXXXXXXXXXX D[15]

 

Y =  (~Sel[0] & ~Sel[1] & ~Sel[2] & ~Sel[3]) & D[0]
   + ( Sel[0] & ~Sel[1] & ~Sel[2] & ~Sel[3]) & D[1]
   + (~Sel[0] &  Sel[1] & ~Sel[2] & ~Sel[3]) & D[2]
   + ....
     ( Sel[0] &  Sel[1] &  Sel[2] &  Sel[3]) & D[15]

%title插图%num

其中mi为最小项表达式

Verilog中的描述 如下:

module mux4_16
(
    input [15:0] D,
    input [3:0]  Sel,
    output       Y
);

assign Y = (~Sel[0] & ~Sel[1] & ~Sel[2] & ~Sel[3]) & D[0]
         + ( Sel[0] & ~Sel[1] & ~Sel[2] & ~Sel[3]) & D[1]
         + (~Sel[0] &  Sel[1] & ~Sel[2] & ~Sel[3]) & D[2]
         + ....
           ( Sel[0] &  Sel[1] &  Sel[2] &  Sel[3]) & D[15];

endmodule

4. LUT直接设计法(本方法以Vivado中LUT6为例)

LUT6的原语如下,

LUT6 #(
   .INIT(64'h0000000000000000)  // Specify LUT Contents
) LUT6_inst (
   .O(O),   // LUT general output
   .I0(I0), // LUT input
   .I1(I1), // LUT input
   .I2(I2), // LUT input
   .I3(I3), // LUT input
   .I4(I4), // LUT input
   .I5(I5)  // LUT input
);

 

例:2/4 数据选择器

module mux2_4
(
    input [3:0] D,
    input [1:0]  Sel,
    output Y
);
LUT6 #(
      .INIT(64'hff_00_f0_f0_cc_cc_aa_aa)  // Specify LUT Contents
) LUT6_inst (
    .O  (Y),   		// LUT general output
    .I0	(D[0]), 	// LUT input
    .I1	(D[1]), 	// LUT input
    .I2	(D[2]), 	// LUT input
    .I3	(D[3]), 	// LUT input
    .I4	(Sel[0]), 	// LUT input
    .I5	(Sel[1])  	// LUT input
);

endmodule

 

图2所示为LUT6地址对应的真值输出。

%title插图%num

图2

 

仿真与实现:

TB文件: 该tb.v利用计数的方式实现仿真遍历.

module tb
(

);

reg CLK;

parameter PERIOD = 5;

initial 
begin
    CLK = 1'b0;
    #(PERIOD/2);
    forever
        #(PERIOD/2) CLK = ~CLK;
end

reg rst_n;
reg [15:0] D;
reg [3:0] Sel;
wire Y;

initial 
begin
    rst_n = 1'b0;
    #100 rst_n = 1'b1;
end

always@(posedge CLK or negedge rst_n)
if(!rst_n) begin
    D <= 0;
    Sel <= 0;
end
else begin
    if(Sel==15) begin
        Sel <= 0;
        D <= D + 1;
    end
    else Sel <= Sel + 1;
end

mux4_16 mux4_16_inst
(
    .D   (D),
    .Sel (Sel),
    .Y   (Y)
);

endmodule

 

该tb.v可以在Vivado 或Quartus(modelsim starter)下进行仿真.

%title插图%num

图3

图3只抓取了部分结果,从上面的结果可以看出,输出Y在图中的确按照Sel的值选取出对应的 输入D的值。

 

 

Posted in FPGA, IC, Verilog, Verilog, 数字IC, 文章

发表评论

相关链接