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专栏

相关推荐
幼儿园老大*44 分钟前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
ctrey_1 小时前
2024-11-4 学习人工智能的Day21 openCV(3)
人工智能·opencv·学习
啦啦右一1 小时前
前端 | MYTED单篇TED词汇学习功能优化
前端·学习
霍格沃兹测试开发学社测试人社区2 小时前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask
今天我又学废了2 小时前
Scala学习记录,List
学习
王俊山IT2 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
Mephisto.java3 小时前
【大数据学习 | kafka高级部分】kafka中的选举机制
大数据·学习·kafka
南宫生4 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法