[Verilog19]HDLBits习题_Multiplexers

HDLBits习题讲解_Multiplexers

多路选择器

  • 多路选择器(Multiplexer)简称多路器,它是一个多输入、单输出的组合逻辑电路,在数字系统中有着广泛的应用。它可以根据地址码(选择码)的不同,从多个输入数据流中选取一个,让其输出到公共的输出端。

2-to-1 multiplexer

  • 题目要求,实现一个位宽为1的2-1的多路选择器。当sel=0,选择a,当sel=1,选择b。代码如下:
module top_module( 
    input a, b, sel,
    output out ); 
	assign out = sel?b:a;
endmodule

2-to-1 bus multiplexer

  • 题目要求,实现一个位宽为100的2-1的多路选择器。当sel=0,选择a,当sel=1,选择b。代码如下:
module top_module( 
    input [99:0] a, b,
    input sel,
    output [99:0] out );
	assign out = sel?b:a;
endmodule

9-to-1 multiplexer

  • 题目要求,创建一个位宽为16的9-1的多路选择器。sel=0选择a, sel=1选择b,以此类推。对于未使用的sel值(sel=9~15),将所有输出位设置为1。代码如下:
module top_module( 
    input [15:0] a, b, c, d, e, f, g, h, i,
    input [3:0] sel,
    output [15:0] out );

    always @(*) begin
        case(sel)
            4'd0: out = a;
            4'd1: out = b;
            4'd2: out = c;
            4'd3: out = d;
            4'd4: out = e;
            4'd5: out = f;
            4'd6: out = g;
            4'd7: out = h;
            4'd8: out = i;
            default:out = 16'hffff;
        endcase
    end 
endmodule

256-to-1 multiplexer

  • 题目要求,创建一个位宽为1的256-1的多路选择器。256个输入都被打包成一个256位的输入向量。sel=0表示选择in[0],sel=1表示选择in[1],以此类推。代码如下:
module top_module( 
    input [255:0] in,
    input [7:0] sel,
    output out );
    assign out = in[sel];
endmodule

不确定位置的位切片

  • 有时候,我们需要切片的位置,并不是一个确定的位置,而是需要将某位输入经过一定运算后得到。但对于:运算符,要求:两边的数字均为一个确定值。故我们需要使用:+或:-运算符进行不确定位置的切片,具体语法如下:
reg [31:0] a =32'haabbccdd; 
reg [3:0] b,c;
reg [2:0] byte_addr;//外部输入的byte地址
//从输入地址的byte的第4位开始,向上截取4位赋值给b
assign b[3:0] = a[byte_addr+4 +: 4]
//从输入地址的byte的第7开始,向下截取4位赋值给b
assign b[3:0] = a[byte_addr+7 -: 4]

256-to-1 4-bit multiplexer

  • 题目要求,创建一个位宽为4的256-1的多路选择器。256个4位输入都被打包成一个1024位的输入向量。sel=0选择in[3:0],sel=1选择in[7:4],sel=2选择in[11:8],以此类推。代码如下:
module top_module( 
    input [1023:0] in,
    input [7:0] sel,
    output [3:0] out );
    assign out =in[sel*4 +: 4] ;//切片位置开始向上切片4位
endmodule

参考:
HDLBits
HDLBits答案(7)_Verilog多路选择器