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 天前
ArkWeb实战学习笔记04-JavaScript与Native通信
笔记·学习·harmonyos
li星野1 天前
RAG优化系列:HyDE(假设文档嵌入)——让LLM先写答案再检索
python·学习
知识分享小能手1 天前
Flask入门学习教程,从入门到精通,Flask智能租房——用户中心知识点详解(9)
python·学习·flask
魔法阵维护师1 天前
从零开发游戏需要学习的c#模块,第三十一章(技能冷却系统 —— 范围爆炸)
学习·游戏·c#
试剂界的爱马仕1 天前
《古董局·终局5:潮生》第 4 章:藤田的棋局
人工智能·学习
searchforAI1 天前
我的Obsidian知识库,现在可以自动剪藏笔记到本地了
人工智能·笔记·学习·音视频·ai工具·obsidian·视频总结
周末也要写八哥1 天前
Visual C++6.0下载安装流程及PDF学习手册资源
c++·学习·pdf
坤坤藤椒牛肉面1 天前
C++学习--类和对象
学习
楼田莉子1 天前
C++20新特性:Range库
开发语言·c++·后端·学习·c++20
坏孩子的诺亚方舟1 天前
FPGA神经网络数学基础0
人工智能·神经网络·线性代数·fpga开发