多路选择器设计实现

一、多路选择器

多路选择器是数据选择器的别称。在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关。

二、二选一多路选择器

二选一多路选择器有两个输入数据,分别为in_a和in_b。为了确定选择那一路数据通过,还有一个选择段sel。
预想设计如下:
在这里插入图片描述
在这里插入图片描述
二选一多路选择器设计,sel为0时out输出in_a的值,sel为1时out输出in_b的值。
使用verilog代码设计如下:
第一种设计方案,使用assing赋值,三目元算符的方法:

/*
2023.7.20
二选一多路选择器设计,sel为0时out输出in_a的值,sel为1时out输出in_b的值
*/
module MUX_2_1 (
    input       wire        in_a    ,
    input       wire        in_b    ,
    input       wire        sel     ,

    output      wire        out
);

//使用assign方法直接赋值,三目运算符
assign out = sel ? in_b : in_a;




endmodule //MUX_2_1

使用此方法所设计的电路图如下:
在这里插入图片描述
第二种方案使用always语句块,if-else的方法设计:

/*
2023.7.20
二选一多路选择器设计,sel为0时out输出in_a的值,sel为1时out输出in_b的值
*/
module MUX_2_1 (
    input       wire        in_a    ,
    input       wire        in_b    ,
    input       wire        sel     ,

    output      wire        out
);

reg out_r;

// //使用always模块进行赋值
//if-else
always @(*) begin
    if(sel) begin
         out_r = in_b;
    end
     else begin
         out_r = in_a;
     end
 end
  assign out = out_r;

endmodule //MUX_2_1

使用此方法所设计的电路图如下:
在这里插入图片描述
第三种设计方案,使用always语句块,case的方法设计:

/*
2023.7.20
二选一多路选择器设计,sel为0时out输出in_a的值,sel为1时out输出in_b的值
*/
module MUX_2_1 (
    input       wire        in_a    ,
    input       wire        in_b    ,
    input       wire        sel     ,

    output      wire        out
);

reg out_r;
//case语句
always @( *) begin
    case(sel)
        0 : begin
            out_r = in_a;
        end
        1 : begin
            out_r = in_b;
        end
        default :;
    endcase
end
assign out = out_r;

endmodule //MUX_2_1

使用此方法所设计的电路图如下:
在这里插入图片描述
测试验证
为验证所设计二选一多路选择器设计是否正确,我们通过编写测试仿真代码来验证:

`timescale 1ns/1ns
module MUX_2_1_tb();
    //激励信号定义
    reg tb_in_a;
    reg tb_in_b;
    reg tb_sel;
    
    //输出信号定义
    wire tb_out;


//模拟输入
    initial begin
        tb_in_a = 0;
        tb_in_b = 0;
        tb_sel = 0;
        #1;
        tb_in_a = 0;
        tb_in_b = 0;
        tb_sel = 1;
        #1;
        tb_in_a = 1;
        tb_in_b = 0;
        tb_sel = 0;
        #1;
        tb_in_a = 1;
        tb_in_b = 0;
        tb_sel = 1;
        #1;
        tb_in_a = 0;
        tb_in_b = 1;
        tb_sel = 0;
        #1;
        tb_in_a = 0;
        tb_in_b = 1;
        tb_sel = 1;
        #1;
        tb_in_a = 1;
        tb_in_b = 1;
        tb_sel = 0;
        #1;
        tb_in_a = 1;
        tb_in_b = 1;
        tb_sel = 1;
        #1;
    end

//模块例化
 MUX_2_1  u_MUX_2_1(
    .in_a    (tb_in_a)    ,
    .in_b    (tb_in_b)    ,
    .sel     (tb_sel)     ,

    .out     (tb_out)
);


endmodule

通过观察仿真时序图可以发现,当sel信号为0时,out的输出值与in_a的值相同,当sel信号为1时,out的输出值与in_b的值相同,和我们预期所相符合。
在这里插入图片描述

三、四选一多路选择器设计

在刚才所做的二选一的多路选择器的基础上,设计一个新的四选一的多路选择器。
代码设计如下:

/*
2023.7.10
四选一多路选择器设计
*/

module MUX_4_1 (
    input   wire [3:0]      in_a,//4位的输入
    input   wire [1:0]      sel,//sel选择in_a哪一位的输出

    output  reg             out
    
);

always @( *) begin
    case (sel)
        0 : begin
            out = in_a[0];
        end
        1 : begin
            out = in_a[1];
        end
        2 : begin
            out = in_a[2];
        end
        3 : begin
            out = in_a[3];
        end
        default :;
    endcase
end

endmodule //MUX_4_1

测试文件:

`timescale 1ns/1ns

module MUX_4_1_tb();
//输入信号
reg [3:0] tb_in_a;
reg [1:0] tb_seg;
//输出信号
wire tb_out;

//模块实例化
MUX_4_1 u_MUX_4_1(
   .     in_a  (tb_in_a)  ,
   .     sel   (tb_seg)  ,

   .     out    (tb_out)
    
);

initial begin
    tb_in_a = 4'b0001;//输出1
    tb_seg = 0;
    #1;
    tb_in_a = 4'b1000;//输出0
    tb_seg = 0;
    #1;
    tb_in_a = 4'b0100;//输出0
    tb_seg = 0;
    #1;
    tb_in_a = 4'b1001;//输出0
    tb_seg = 1;
    #1;
    tb_in_a = 4'b1110;//输出1
    tb_seg = 1;
    #1;
    tb_in_a = 4'b0010;//输出1
    tb_seg = 1;
    #1;
    tb_in_a = 4'b0011;//输出0
    tb_seg = 2;
    #1;
    tb_in_a = 4'b0100;//输出1
    tb_seg = 2;
    #1;
    tb_in_a = 4'b1011;//输出1
    tb_seg = 3;
    #1;
    tb_in_a = 4'b0111;//输出0
    tb_seg = 3;
    #1;
    tb_in_a = 4'b1100;//输出1
    tb_seg = 3;
    #1;
end


endmodule

通过仿真,观察波形图:
在这里插入图片描述
从图中可以观察到,当sel信号为0时,out的输出值与in_a[0]的值相同;当sel信号为1时,out的输出值与in_a[1]的值相同;当sel信号为2时,out的输出值与in_a[2]的值相同;当sel信号为3时,out的输出值与in_a[3]的值相同。

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一 、实验目的 1. 进一步掌握数字电路课程所学的理论知识。 2. 了解数字电路设计的基本思想和方法,学会科学分析和解决问题。 3. 熟悉几种常用集成数字芯片,并掌握其工作原理,进一步学会使用其进行电路设计。 4. 培养认真严谨的工作作风和实事求是的工作态度。 二 、设计题目与思路 本次数字电路课程设计我选择的题目是“多路彩灯控制器”。 这个系统的主要功能是: 1.自动控制多路彩灯按预设的花型进行变换; 2、花型种类不少于三种,花型自拟; 3.分别用快慢两种节拍实现花型变换。 4.选择:用可编辑逻辑器件实现。 三、总体方案的设计与选择 1.总体方案的设计 经过分析问题及初步的整体思考,拟定以下二种方案: 方案一:总体电路共分三大块。第一块实现花型的演示;第二块实现花型的控制及节拍控制;第三块实现时钟信号的产生。 主体框图如下: 方案二:在方案一的基础上将整体电路分为四块。第一块实现花型的演示;第二块实现花型的控制;第三块实现节拍控制;第四块实现时钟信号的产生。并在部分电路的设计上与方案一采用了完全不同的方法,如花型的控制。 主体框图如下: 2.总体方案的选择 方案一与方案二最大的不同就在,前者将花型控制与节拍控制两种功能融合在一起,是考虑到只要计数器就可以实现其全部功能的原因,且原理相对简单。如此设计,其优点在于:设计思想比较简单。元件种类使用少,且都较熟悉易于组装电路。缺点则是:中间单元电路连线过于繁多,容易出错。且可能出现线与线关系。要避免这些,则势必造成门电路使用过多。导致电路不稳定,抗干扰能力下降。 而后者则将以上两种功能分开设计,各单元电路只实现一种功能。其优点在于:电路设计模块化,易于检查电路,对后面的电路组装及电路调试带来方便。缺点则是:节拍控制电路采用可编辑逻辑电路,原理相对复杂,不易理解。花型控制电路简单,花型也比较简单。 基于以上原因,加上为了成功的实现课程设计,我选择了连线少,易于组装和调试的方案二。 四、 单元电路的设计 1.花型演示电路 由二片移位寄存器194级联实现。其八个输出信号端连接八个发光二极管,用其输出信号控制发光二级管的亮灭实现花型演示。
好的,我明白了。首先,需要了解一下8421BCD码的编码规则,它是一种4位二进制数字码,表示0-9的十个十进制数字。每个数字的编码是唯一的,如下所示: | 十进制数字 | 8421BCD编码 | | ---------- | ----------- | | 0 | 0000 | | 1 | 0001 | | 2 | 0010 | | 3 | 0011 | | 4 | 0100 | | 5 | 0101 | | 6 | 0110 | | 7 | 0111 | | 8 | 1000 | | 9 | 1001 | 根据这个规则,我们可以设计一个8421BCD非法码检测电路。具体实现可以使用一个74LS151多路选择器和一些逻辑门。 首先,将8421BCD码的四位输入分别接到74LS151的A、B、C、D输入端,将A、B、C、D输入端的使能端(G2A、G2B)接地,将多路选择器的输出端(Y)接回到逻辑门的输入端,逻辑门的输出端为非法码检测电路的输出端。 然后,根据8421BCD码的编码规则,非法码组合有以下几种情况: 1. A、B、C、D输入端都为1,这个组合不是8421BCD码的任何一个数字。 2. A、B、C、D输入端都为0,这个组合代表数字0,不是非法码组合。 3. A、B、C、D输入端只有一位为1,这个组合代表数字1-9中的一个,不是非法码组合。 因此,我们只需要检测第一种情况,即A、B、C、D输入端都为1的组合,就可以判断是否为非法码组合。根据74LS151多路选择器的真值表,我们可以得到以下逻辑公式: 非法码检测电路输出端 = A' * B' * C' * D' 其中,符号'表示取反运算。 这个电路可以用以下电路图来表示: ![非法码检测电路电路图](https://img-blog.csdnimg.cn/20210630155954965.png) 希望这个回答能够帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值