HDLBits中文版,标准参考答案 | 3.1.2 Multiplexers | 多路复用器

关注 望森FPGA  查看更多FPGA资讯

这是望森的第 9 期分享

作者 | 望森
来源 | 望森FPGA

目录

1 2-to-1 multiplexer | 2 对 1 多路复用器

2 2-to-1 bus multiplexer | 2 对 1 总线多路复用器

3 9-to-1 multiplexer | 9 对 1 多路复用器

4 256-to-1 multiplexer | 256 对 1 多路复用器

5 256-to-1 4-bit multiplexer | 256 对 1 4 位多路复用器


本文中的代码都能够正常运行,请放心食用😋~

练习的官方网站是:https://hdlbits.01xz.net/

注:作者将每个练习的知识点都放在了题目和答案之后


1 2-to-1 multiplexer | 2 对 1 多路复用器

题目:

创建一个 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 2-to-1 bus multiplexer | 2 对 1 总线多路复用器

题目:

创建一个 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

3 9-to-1 multiplexer | 9 对 1 多路复用器

题目:

创建一个 16 位宽、9 选 1 的多路复用器。sel=0 选择 a,sel=1 选择 b,等等。对于未使用的情况(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'b1111_1111_1111_1111;
        endcase
    end
    
endmodule
参考答案:
module top_module (
        input [15:0] a,
        input [15:0] b,
        input [15:0] c,
        input [15:0] d,
        input [15:0] e,
        input [15:0] f,
        input [15:0] g,
        input [15:0] h,
        input [15:0] i,
        input [3:0] sel,
        output logic [15:0] out
);
 
        // Case statements can only be used inside procedural blocks (always block)
        // This is a combinational circuit, so use a combinational always @(*) block.
        always @(*) begin
                out = '1;                // '1 is a special literal syntax for a number with all bits set to 1.
                                                // '0, 'x, and 'z are also valid.
                                                // I prefer to assign a default value to 'out' instead of using a
                                                // default case.
                case (sel)
                        4'h0: out = a;
                        4'h1: out = b;
                        4'h2: out = c;
                        4'h3: out = d;
                        4'h4: out = e;
                        4'h5: out = f;
                        4'h6: out = g;
                        4'h7: out = h;
                        4'h8: out = i;
                endcase
        end
        
endmodule

4 256-to-1 multiplexer | 256 对 1 多路复用器

题目:

创建一个 1 位宽、256 对 1 的多路复用器。256 个输入全部打包成一个 256 位输入向量。sel=0 应选择 in[0],sel=1 选择 in[1] 中的位,sel=2 选择 in[2] 中的位,等等。

答案

module top_module (
        input [255:0] in,
        input [7:0] sel,
        output  out
);
 
        // Select one bit from vector in[]. The bit being selected can be variable.
        assign out = in[sel];
        
endmodule

5 256-to-1 4-bit multiplexer | 256 对 1 4 位多路复用器

题目:

创建一个 4 位宽、256 对 1 的多路复用器。256 个 4 位输入全部打包成一个 1024 位输入向量。sel=0 应选择 [3:0] 中的位,sel=1 选择 [7:4] 中的位,sel=2 选择 [11:8] 中的位,等等。

答案

module top_module (
        input [1023:0] in,
        input [7:0] sel,
        output [3:0] out
);
 
        // We can't part-select multiple bits without an error, but we can select one bit at a time,
        // four times, then concatenate them together.
        assign out = {in[sel*4+3], in[sel*4+2], in[sel*4+1], in[sel*4+0]};
 
        // Alternatively, "indexed vector part select" works better, but has an unfamiliar syntax:
        // assign out = in[sel*4 +: 4];                // Select starting at index "sel*4", then select a total width of 4 bits with increasing (+:) index number.
        // assign out = in[sel*4+3 -: 4];        // Select starting at index "sel*4+3", then select a total width of 4 bits with decreasing (-:) index number.
        // Note: The width (4 in this case) must be constant.
 
endmodule

- END -

公z号/CSDN搜索【望森FPGA】,查看更多FPGA资讯~

相关推荐文章,点击跳转:

望森FPGA的HDLBits专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

望森FPGA

谢谢你的支持,这对我很重要~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值