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

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

这是望森的第 9 期分享

作者 | 望森
来源 | 望森FPGA

目录

[1 2-to-1 multiplexer | 2 对 1 多路复用器](#1 2-to-1 multiplexer | 2 对 1 多路复用器)

[2 2-to-1 bus multiplexer | 2 对 1 总线多路复用器](#2 2-to-1 bus multiplexer | 2 对 1 总线多路复用器)

[3 9-to-1 multiplexer | 9 对 1 多路复用器](#3 9-to-1 multiplexer | 9 对 1 多路复用器)

[4 256-to-1 multiplexer | 256 对 1 多路复用器](#4 256-to-1 multiplexer | 256 对 1 多路复用器)

[5 256-to-1 4-bit multiplexer | 256 对 1 4 位多路复用器](#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专栏

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
ZPC82104 天前
docker 镜像备份
人工智能·算法·fpga开发·机器人
ZPC82104 天前
docker 使用GUI ROS2
人工智能·算法·fpga开发·机器人
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习