组合逻辑电路设计---多路选择器

news2024/12/24 9:14:57

目录

1、多路选择器简介

2、硬件设计

3、实验任务

4、程序设计

4.1、模块设计

4.2、绘制波形图

4.3、编写代码

(1)assign 中条件运算符(三目运算符)实现方法:

(2)always 语句块中使用 if-else 实现方法:

(3)always 语句块中使用 case 语句的方法:

4.4、仿真验证

4.4.1、编写 TB 文件

4.4.2、仿真验证

5、RTL 原理图


组合逻辑电路设计---多路选择器

       本章开始我们将进行组合逻辑电路的设计学习,多路选择器就是一个数电比较经典入门的逻辑电路。在本章节中,我们将使用 Verilog 语言描述一个具有多路选择器功能的电路,带领大家掌握新的语法知识和基本模块框图、波形、代码设计方法,以及最后通过仿真来验证设计的可行性。

1、多路选择器简介

       多路选择器 MUX(multiplexer)是一个多输入、单输出的组合逻辑电路,一个 N 输入的多路选择器就是一个 N 路的数字开关,可以根据通道选择控制信号的不同,从 N 个输入中选取一个输出到公共的输出端。多路选择器也是 FPGA 内部的一个基本资源,主要用于内部信号的选通。简单的多路选择器还可以通过级联生成更大的多路选择器。

2、硬件设计

       开发板上,板载了 5 个按键开关以及 4 个 LED 灯。其中最左边红色按键为 PL 端复位按键,PL 端复位按键右边两个按键连接至 ZYNQ 的 PL 引脚,最右边两个按键连接至 ZYNQ 的 PS 引脚;最左边两个 LED 灯也是连接至 ZTNQ 的 PL 端,最右边两个 LED 灯连接到 PS 端。实物图如下图所示:

底板上按键的原理图如下图所示:

底板上 LED 的原理图如下图所示:

 从原理图可以看出,按键默认状态为高电平,按下后为低电平,LED 灯则为高电平点亮。我们只使用 PL 端的外设。图中的每个按键都连接了一个 10K 电阻,起到限流的作用,以防止按键被按下时电源直接接地造成电路短路。

3、实验任务

       本节的实验任务是使用 ZYNQ 开发板来设计一个简单的 2 选 1 多路选择器,主要功能是通过选通控制信号 sel 确定输入信号 in1 和 in2 哪一个信号作为输出。当选通控制信号 sel 为 1 时,输出为 A 端信号;当选通控制信号 sel 为 0 时,信号输出为 B 端信号。

4、程序设计

4.1、模块设计

        本次实验的功能是一个二选一的多路选择器,因此给模块命名为 mux2_1。模块中的输入为三个 1 位的信号,其中 in1 和 in2 为两个输入信号,sel 为输入的控制信号,out 为单 bit 的输出信号。模块图如下图所示:

根据实验任务所述,可以列出二选一多路选择器的真值表,如下表所示:

       由模块图以及真值表可知,本次实验需要三个输入信号,一个输出信号。输入端可以使用 PL 端的两个按键以及一个复位按键,输出端可以使用 PL 端的一个 LED 灯进行表示。

4.2、绘制波形图

       由真值表可以看出,当 sel 信号为 1 时,输出信号 out 等于输入信号 in1;当 sel 为 0 时,输出信号 out 等于 in2。

       通过上述分析,我们就可以根据真值表进行多路选择器输入与输出波形的绘制。其波形如下图所示:

4.3、编写代码

       实现二选一多路选择器功能的 Verilog 代码形式有很多种,这里选择三种不同的语法来实现代码的编写。

(1)assign 中条件运算符(三目运算符)实现方法:

//assign 中条件运算符(三目运算符)实现方法:
module mux2_1(
    input   in1, //输入信号 in1
    input   in2, //输入信号 in2
    input   sel, //选择控制信号 sel
    
    output  out  //输出信号 out
);

//*****************************************************
//** main code
//*****************************************************

//out:组合逻辑输出选择结果
//此处使用的是条件运算符(三目运算符),当括号里面的条件成立时
//执行"?"后面的结果;如果括号里面的条件不成立时,执行": "后面的结果 
assign out = (sel == 1'b1) ? in1 : in2;

endmodule

(2)always 语句块中使用 if-else 实现方法:

//++++++++++++++++++++++++++++++++++++++++++++++++
//(2)always 语句块中使用 if-else 实现方法:
module mux2_1(
    input           in1, //输入信号 in1
    input           in2, //输入信号 in2
    input           sel, //选择控制信号 sel
                    
    output   reg    out  //输出信号 out
);

//*****************************************************
//** main code
//*****************************************************

//out:组合逻辑输出选择结果
always@(*) begin //"*"为通配符,在这个模块中的任何一个输入信号或电平发生变化时
    if(sel == 1'b1) //该语句下方的模块将被执行。
        out <= in1;
    else
        out <= in2;
end

endmodule
//++++++++++++++++++++++++++++++++++++++++++++++++

(3)always 语句块中使用 case 语句的方法:

//-----------------------------------------------------
//(3)always 语句块中使用 case 语句的方法:
module mux2_1(
    input         in1, //输入信号 in1
    input         in2, //输入信号 in2
    input         sel, //选择控制信号 sel
            
    output  reg   out  //输出信号 out
);

//*****************************************************
//** main code
//*****************************************************

//out:组合逻辑输出选择结果
always@(*) begin
    case(sel)
        1'b0:
            out <= in2;
        1'b1:
            out <= in1;
        //如果 sel 的情况没有全部列举出来一定要加 default
        //因为此处 sel 只有两种情况,并且都列举了,所以 defalut 可以省略判断
        default: ;
    endcase
end

endmodule
//-----------------------------------------------------

4.4、仿真验证

4.4.1、编写 TB 文件

TestBench 是用于验证功能模块的设计是否符合预期,主要分为以下三个步骤:

  • 1、 向被测功能模块的输入接口添加激励;
  • 2、 对被测功能模块的顶层接口进行信号例化;
  • 3、 判断被测功能模块的输出是否满足设计预期。

       二选一多路选择器模块的输入端口为 in1、in2 和 sel,输出 out 是根据控制选择信号的变化,而选择输出 in1 或者 in2 的。所以我们仿真只需要对 in1、in2 和 sel 进行激励就可以得到输出信号 out 的仿真。

二选一多路选择器 TB 模块(tb_flow_led.v)代码编写如下:

//仿真验证
//编写 TB 文件
//TestBench 是用于验证功能模块的设计是否符合预期,主要分为以下三个步骤:
//1、 向被测功能模块的输入接口添加激励;
//2、 对被测功能模块的顶层接口进行信号例化;
//3、 判断被测功能模块的输出是否满足设计预期。
//二选一多路选择器模块的输入端口为 in1、in2 和 sel,
//输出 out 是根据控制选择信号的变化,而选择输出 in1 或者 in2 的。
//所以我们仿真只需要对 in1、in2 和 sel 进行激励就可以得到输出信号 out 的仿真。
//二选一多路选择器 TB 模块(tb_flow_led.v)代码编写如下:

`timescale 1ns / 1ns

module tb_mux2_1();

reg      in1;
reg      in2;
reg      sel;
wire     out;

//initial 语句是不可以被综合的,一般只在 testbench 中表达而不在 RTL 代码中表达。
initial begin //在仿真中 begin...end 块中的内容都是顺序执行的
    in1 = 1'b0; //初始状态赋值
    in2 = 1'b0;
    sel = 1'b0;
    #100 //经过 100ns 的延时
    in1 = 1'b0; //100ns 时的输入值
    in2 = 1'b0;
    sel = 1'b1;
    #100 //经过 200ns 的延时
    in1 = 1'b0; //200ns 时的输入值
    in2 = 1'b1;
    sel = 1'b0;
    #100 //经过 300ns 的延时
    in1 = 1'b0; //300ns 时的输入值
    in2 = 1'b1;
    sel = 1'b1;
    #100 //经过 400ns 的延时
    in1 = 1'b1; //400ns 时的输入值
    in2 = 1'b0;
    sel = 1'b0;
    #100 //经过 500ns 的延时
    in1 = 1'b1; //500ns 时的输入值
    in2 = 1'b0;
    sel = 1'b1;
    #100 //经过 600ns 的延时
    in1 = 1'b1; //600ns 时的输入值
    in2 = 1'b1;
    sel = 1'b1;
end

mux2_1 u_mux2_1(
    .in1    (in1    ), //输入信号 in1
    .in2    (in2    ), //输入信号 in2
    .sel    (sel    ), //选择控制信号 sel
                    
    .out    (out    )  //输出信号 out
);

endmodule

       程序中第一行代码定义的 1ns / 1ns 表示仿真单位和仿真精度都是 1ns。

       在 testbench 中端口列表为空,所以第三行模块为空,而在 initial 和 always 语句块中的变量一定是为 reg 型变量,输入的变量是需要我们手动激励的,所以一定要为 reg 型变量。而输出变量在 testbench 中一般都是为 wire 型变量。

在第十一行到第四十行使用了 initial 语句块,第十三行到第十五行首先进行对各输入信号的初始化,在初始化完成后需要对各输入端口数据进行模拟。然后每 100ns 对各输入端口进行赋值,产生的数据完成对输入端口的激励。

在完成信号的激励后,我们就可以进行测试模块的实例化,其中 mux2_1 为被实例化模块的名字, u_mux2_1 为我们实例化之后定义的名字。

4.4.2、仿真验证

接下来打开 Modelsim 软件对代码进行仿真,在运行仿真 1us 后,仿真的波形如下图所示:

       由上图可知,图 10.4.3 mux2_1 仿真波形 a 中 sel=1’b0,in2=1’b1,out=1’b1;在图 10.4.4 mux2_1 仿真波形 b 中 sel=1’b1,in1=1’b0,out=1’b0。仿真结果与我们列出的真值表结果是相对应的,大家如果有兴趣可以多选取几组波形与真值表进行对比。

5、RTL 原理图

       在完成了代码设计之后,可以通过 Vivado 软件查看 RTL 分析原理图,通过原理图可以快速掌握项目设计的架构图,方便后续对代码进行优化。在左侧导航栏点击 Schematic(位于 Flow Navigator→RTL ANALYSIS →Open Elaborated Design→Schematic),打开 RTL 原理图设计,如下图所示:

。。

       由上图可以清晰地看到代码和电路图的对应关系,RTL_MUX 是选择器,in1 和 in2 两个输入信号,根据控制选择信号 sel 的数据来进行输出选择。值得一提的是,Vivado 软件中的 RTL 分析原理图只针对 RTL 层面,并不是代码和 FPGA 器件内部资源的对应关系图,如果想要查看代码和 FPGA 内部资源的对应关系可以查看综合后的原理图,可以先对代码进行综合,然后找到 Flow Navigator→SYNTHESIS→Open Synthesized Design→Schematic,大家可以自行打开查看。

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

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

相关文章

逍遥自在学C语言 | 指针的基础用法

前言 在C语言中&#xff0c;指针是一项重要的概念&#xff0c;它允许我们直接访问和操作内存地址。 可以说&#xff0c;指针是C语言一大优势。用得好&#xff0c;你写程序如同赵子龙百万军中取上将首级&#xff1b;用得不好&#xff0c;则各种问题层出不穷&#xff0c;有种双…

.gitignore 忽略文件和目录

1. .gitignore 简介2. .gitignore 注释3. / 开头或结尾的忽略4. glob 模式匹配忽略5. .gitignore 全局忽略6. 忽略已提交到远程仓库的内容7. 使用各种框架下的忽略规则 1. .gitignore 简介 .gitignore 文件的作用就是告诉 git 哪些文件不需要添加到版本管理中&#xff08;定义…

Python如何制作图标点选验证码

本文讲解如何使用python中的opencv库来制作图标点选验证码 图标点选验证码制作起来非常简单,你只需要准备两部分数据集,数据集数量都不用很多,背景图我选择了20个左右,大小为(300, 500)左右,图标我抓取了100多个,图标大小为(40,40)左右,图标由不同大小的透明度构成…

html实现好看的个人介绍,个人主页模板1(附源码)

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 自我介绍界面1.4 项目演示界面1.5 个人成就界面1.6 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/13125310…

01-Maven 安装

一. 下载 apache官网下载 Maven&#xff1a;Maven – Download Apache Maven &#xff0c;根据需要下载不同压缩包。 二. 安装和配置 因为是压缩包不是可执行文件&#xff0c;直接将压缩包进行解压即可&#xff0c;最好放在无中文目录下解压。 1. 配置maven本地仓库 打开解压…

自然语言处理从入门到应用——静态词向量预训练模型:神经网络语言模型(Neural Network Language Model)

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 《自然语言处理从入门到应用——自然语言处理的语言模型&#xff08;Language Model&#xff0c;LM&#xff09;》中介绍了语言模型的基本概念&#xff0c;以及经典的基于离散符号表示的N元语言模型&#xff08;N-gram…

每日一道算法---数组中出现次数超过一半的数字

数组中出现次数超过一半的数字 1.题目2.思路3.代码 1.题目 链接: 数组中出现次数超过一半的数字 2.思路 【解题思路1】&#xff1a; 思路一&#xff1a;数组排序后&#xff0c;如果符合条件的数存在&#xff0c;则一定是数组中间那个数。这种方法虽然容易理解&#xff0c;但…

gcov的使用

什么是代码覆盖率&#xff1f; 代码覆盖率是对整个测试过程中被执行的代码的衡量&#xff0c;它能测量源代码中的哪些语句在测试中被执行&#xff0c;哪些语句尚未被执行。 代码覆盖率的指标种类 代码覆盖率工具通常使用一个或多个标准来确定你的代码在被自动化测试后是否得…

SQL注入第一章节

SQL注入第一章节 1.1 什么是SQL注入 SQL 注入&#xff08;Injection&#xff09; 概述 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情…

合并表格的指定列按序号排序

这里有一个Excel需求&#xff1a; 如下图所示&#xff0c;需要在序号那一列自动排序下去。 但是是合并的行&#xff0c;而且合并的行数还是不确定的&#xff0c;那怎么给他自动排序下去呢&#xff1f; 解决方法可供参考&#xff1a;使用筛选和COUNT函数完成。 1.第一步筛选 首…

Collection集合

Collection集合面试题 导学 这次课程主要涉及到的是List和Map相关的面试题&#xff0c;比较高频就是 ArrayList LinkedList HashMap ConcurrentHashMap ArrayList底层实现是数组LinkedList底层实现是双向链表HashMap的底层实现使用了众多数据结构&#xff0c;包含了数组、…

5.MySQL索引事务

文章目录 &#x1f43e;1. 索引&#x1f43e;&#x1f490;1.1 概念&#x1f490;&#x1f338;1.2 作用与缺点&#x1f338;&#x1f337;1.2.1作用&#x1f337;&#x1f340;1.2.2缺点&#x1f340; &#x1f339;1.3 使用场景&#x1f339;&#x1f33b;1.4 使用&#x1f3…

阿里云服务器官网

阿里云服务器官网&#xff1a;https://www.aliyun.com/product/ecs 阿里云服务器分为云服务器ECS、轻量应用服务器、GPU云服务器等&#xff0c;云服务器ECS是阿里云明星级产品&#xff0c;专业级云服务器&#xff0c;如下图&#xff1a; 阿里云服务器ECS 阿里云服务器网分享阿…

【论文阅读】Learing to summarize from human feedback

前言 更多关于大模型的文章可见&#xff1a;ShiyuNee/Awesome-Large-Language-Models: Papers about large language models (github.com) 该仓库持续更新 Abs 通过训练模型来向着人类偏好优化可以显著提高摘要质量。 Method High-level methodology 从一个在摘要数据集上…

剑指offer(C++)-JZ3:数组中重复的数字(算法-排序)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的&#xff0c;但不知道有几…

攻防世界-web-Web_python_template_injection

题目描述&#xff1a;只有一句话&#xff0c;翻译出来时python模板注入 1. 思路分析 1.1 什么是python模板注入&#xff1f; 做这道题之前我也不知道什么是python模板注入&#xff0c;问了下chatgpt&#xff0c;回答是这样的&#xff1a; 回答很简洁&#xff0c;举个例子&…

AUTOSAR 架构下的SPI模块的理解

一、SPI模块 1、模块简介 SPI处理程序/驱动程序为单片SPI [串行外设接口]处理程序/驱动程序提供功能和API。该软件模块包括处理和驱动功能。这种单片SPI处理器/驱动器的主要目标是充分利用每个微控制器的功能&#xff0c;并根据静态配置实现优化&#xff0c;以尽可能地满足ECU…

医疗虚拟仿真和虚拟现实有什么区别?哪个更好?

随着我们在仿真教育中越来越多地使用新技术&#xff0c;区分虚拟模式的类型很重要。虚拟仿真是一个统称&#xff0c;用来概括术语来描述各种基于仿真的体验&#xff0c;从基于屏幕的平台到沉浸式虚拟现实。然而&#xff0c;各虚拟平台在保真度、沉浸感和临场感的水平上有很大差…

java 调用 opencv 识别图片

前言 opencv 的 github 地址 opencv 官网 本文介绍如何使用 java 来调用 opencv 下载opencv opencv下载 页面根据自己电脑操作系统下载最新的安装包&#xff0c;我这里下载的是 4.7.0 版本。 &#xff08;4.7.0 版本里的 opencv-470.jar 包是使用 jdk11 编译的&#xff0c…

从0到1ES集群搭建实践

ES集群搭建实践 创建虚拟机 创建Linux新用户elastic 必须信息 使用elasticsearch账号操作&#xff1a;启动&#xff0c;关闭等 配置网卡信息 vi /etc/sysconfig/network-scripts/ifcfg-ens33TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no…