多路选择器设计实现

news2024/11/26 4:47:15

文章目录

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

一、多路选择器

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

二、二选一多路选择器

二选一多路选择器有两个输入数据,分别为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]的值相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【从删库到跑路】MySQL数据库的索引(一)——索引的结构(BTree B+Tree Hash),语法等

🎊专栏【MySQL】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 🥰欢迎并且感谢大家指出小吉的问题 文章目录 🍔概述🍔索引结构⭐B-Tree多路平衡查找树🏳️‍&a…

【分布式事务】CAP定理和Base理论

文章目录 1、事务的ACID原则2、分布式服务案例3、CAP定理4、Base理论5、分布式事务模型 1、事务的ACID原则 所有的事务都要满足ACID原则,在单体架构中,只有一个服务,这个服务访问一个数据库,场景简单。基于数据库本身的特性&…

React 组件使用

React 组件是一个 js 函数,函数可以添加 jsx 标记 当前页使用组件,基本使用 注意:组件的名称,第一个字母一定要大写,否则会报错 import { createRoot } from "react-dom/client"; import "./index.c…

深度学习(30)—— DeformableDETR(1)

深度学习(30)—— DeformableDETR(1) 原本想在一篇文章中就把理论和debug的过程都呈现,但是发现内容很多,所以就分开两篇,照常先记录理论学习过程,然后是实践过程。 注:…

Flutter学习—— Vscode创建项目

目录 一、Vscode创建项目 二、补充五种项目类型 Application: Module 模块开发, Package开发 Plugin 插件开发 Skeleton 骨架开发 一、Vscode创建项目 1.快捷键 CtrlShiftP 打开命令面板,选择新项目 2.选择需要开发的项目类型 Application 应用开…

勾股dev部署

1.克隆项目 项目的地址: https://gitee.com/gouguopen/dev?_fromgitee_search#-%E5%BC%80%E6%BA%90%E5%8A%A9%E5%8A%9B 可以采用git clone https://gitee.com/gouguopen/dev.git 或者使用下载压缩包的形式 2.进入项目的根目录 cd gougudev 3.下载php依赖 需要…

三种策略改进的沙猫群优化算法(MSCSO),与白鲸、蜣螂、麻雀等多种算法进行比较,MATLAB代码...

沙猫群优化算法(sand cat swarm optimiza⁃ tion,SCSO)是 2022年提出的元启发式优化算法,该算法灵感来源于沙猫的捕食行为,沙猫群会通过搜索阶段和捕食阶段获得食物。其中算法额外使用自适应的rG和R以达到搜索阶段和捕食阶段的无缝 切换。该算法具有寻优…

刷题日记09《图论基础》

图的存储结构 对于图结构而言,常见的存储结构主要有两种:邻接表和邻接矩阵: 邻接表很直观,我把每个节点 x 的邻居都存到一个列表里,然后把 x 和这个列表关联起来,这样就可以通过一个节点 x 找到它的所有相邻…

java 8树结构返回前端

接口&#xff1a; EntityResult getOrgReal(Map<String, Object> mapParam); 实现类&#xff1a; PMethodHandle(runMethodName "TQmsZjxmzbImpl.getOrgReal", timeout 600) Override public EntityResult getOrgReal(Map<String, Object> mapParam…

vs2015 工程组织与动态加载

10.Visual Studio动态加载_哔哩哔哩_bilibili 1.工程组织 ① researcher.cpp #include "nn/nn.h"#include "nn/factory.h" #include "nn/factory_impl/factory_impl.h"#include <iostream>int main() {int ret 0;factory_i* fct new f…

Invalid bound statement (not found),springboot扫描不到jar包中mapper文件的问题处理

参考这位大佬的博客&#xff1a;Invalid bound statement (not found)&#xff0c;springboot扫描不到jar包中mapper文件的问题处理_springboot扫描不到mapper_Jamesharden13的博客-CSDN博客 classpath:和classpath*:的区别_classpath和classpath*区别_明快de玄米61的博客-CSD…

JavaWeb课程设计项目实战(06)——项目编码实践3

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 在本教程教程中&#xff0c;我们实现学生列表的显示。 Student 请在bean包下创建Student类&#xff0c;代码如下&#xff1a; package com.cn.bean; /*** 本文作者&#…

MIMIC数据库申请流程

MIMIC是一个公开的临床数据库&#xff0c;之前查找了很多资料&#xff0c;在这里记录一下整个申请流程。 一、CITI证书 要申请mimic数据库的使用权限&#xff0c;首先需要有CITI证书&#xff0c;这是一个国际知名的网络训练课程&#xff0c;其中就有用于健康资讯隐私及保护 (…

Spring 用了哪些设计模式

关于设计模式&#xff0c;如果使用得当&#xff0c;将会使我们的代码更加简洁&#xff0c;并且更具扩展性。本文主要讲解Spring中如何使用策略模式&#xff0c;工厂方法模式以及Builder模式。 策略模式 关于策略模式的使用方式&#xff0c;在Spring中其实比较简单&#xff0c…

408-2009

一、选择题&#xff08;2 分/题&#xff09; 1.为解决计算机主机与打印机之间速度不匹配问题&#xff0c;通常设置一个打印数据缓冲区&#xff0c;主机将要输出的数据一次写入该缓冲取&#xff0c;而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是______。 A.栈 …

iOS--编译连接的过程_2

文章目录 iOS编译&#xff08;一&#xff09;编译器前端 编译器后端执行一次XCode build的流程 IPA包的内容二进制文件的内容iOS Link Map File文件说明1. Link Map File 是什么2. Link Map File 有什么用3. 生成 Link Map File查看Link Map File1&#xff09;路径部分计算机系…

Linux进程间通信(fifo有名管道)

文章目录 前言一、有名管道概念讲解二、命令行创建fifo三、非命令行创建fifo四、fifo和管道对比总结 前言 上篇文章我们讲解了无名管道&#xff0c;这篇文章我们就来讲解一下有名管道。 一、有名管道概念讲解 有名管道(fifo) 有名管道&#xff08;FIFO&#xff09;是一种命…

jmeter请求重试实现思路

文章目录 一、背景二、尝试的解决方案三、最终解决方案&#xff1a;jmeter retrier插件&#xff01; 一、背景 最近系统需要压测一些活动&#xff0c;场景是新建抽奖活动之后&#xff0c;每隔2s查询1次&#xff08;最多3次&#xff0c;3次后还是失败就算失败&#xff09;&…

linux学成之路(基础篇)(二十)rsync服务器

目录 前言 一、概述 监听端口 二、特点 快捷 安全 三、数据的同步方式 四、rsync传输方式 本地传输 远程传输 守护进程 五、命令 作为远程命令 作为rsync服务 选项 六、配置文件 全局配置 模块配置 守护进程传输 七、rsyncinotfy实时同步 一、服务端 二、…

Qgis二次开发-QgsMapLayer(加载矢量、栅格图层)

1.简介 QgsMapLayer是所有地图层类型的基类&#xff0c;这是所有地图层类型(矢量&#xff0c;栅格)的基类&#xff0c;首先定义一个QgsMapCanvas地图画布&#xff0c;然后画布上添加图层&#xff0c;使用以下方法设置图层集合。 //设置当前图层集合 void setLayers (const QL…