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 应选择 in0,sel=1 选择 in1 中的位,sel=2 选择 in2 中的位,等等。

答案

复制代码
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专栏

相关推荐
浔溺1 分钟前
al+大数据每日学习笔记36
大数据·笔记·学习
传奇开心果编程15 分钟前
【Xilem基础语法学与练】第8课:条件渲染(one_of)
学习·rust·前端框架
小雪崩22 分钟前
嵌入式学习 day44:51单片机入门
嵌入式硬件·学习·51单片机
浔溺34 分钟前
al+大数据每日学习笔记35
大数据·笔记·学习
kyrie_sakura1 小时前
MySQL学习笔记4 -- select的7大子句,子查询
笔记·学习·mysql
UIU1141 小时前
补码运算与整数溢出(上
学习·c#·补码·补码运算
词却2 小时前
OpenCV学习:人脸识别
人工智能·opencv·学习
xqqxqxxq3 小时前
AI Agent学习:第四章小结及八道思考题(李博杰《深入理解 AI Agent》第四章观后总结)
大数据·人工智能·学习
泛联新安3 小时前
FPGA仿真加速:AccEmu正式亮相,一周的回归,一天跑完
机器学习·fpga开发·数据挖掘·回归·自动化·嵌入式软件·代码漏洞扫描
Willliam_william3 小时前
QEMU学习之路(13)— 在BusyBox中安装pciutils
学习