组合逻辑电路之多路选择器:基于逻辑派平台的2选1 MUX设计与Verilog实现
组合逻辑电路之多路选择器基于逻辑派平台的2选1 MUX设计与Verilog实现很多刚开始接触FPGA和数字电路的朋友一听到“多路选择器”可能就觉得有点抽象。其实它就像咱们家里的一个手动开关控制着两个水管输入信号哪个能通到水龙头输出。今天我就带大家在“逻辑派”开发板上亲手用Verilog代码实现一个最简单的2选1多路选择器从原理到仿真手把手走一遍完整的数字设计流程。1. 多路选择器是什么为什么学它咱们先从最基础的说起。多路选择器英文叫Multiplexer简称MUX。它的功能很简单从多个输入信号里选出一个送到输出端。选择哪个由一个叫“选择信号”sel的家伙说了算。为什么它是数字电路和FPGA入门必学的第一课呢因为它太基础、太常用了。在FPGA内部MUX本身就是一种基本逻辑资源大量的数据选通、信号路由都靠它。理解了一个2选1的MUX你就掌握了组合逻辑电路设计的核心思想用输入信号和逻辑运算决定输出信号。这是后续学习更复杂电路比如加法器、状态机的基石。咱们今天要做的就是一个2输入、1输出的选择器。它的行为规则一句话就能说清当选择信号sel为0时输出X等于输入A。当选择信号sel为1时输出X等于输入B。是不是很简单接下来咱们就把它变成一个看得见、摸得着的数字模块。2. 把功能说清楚真值表与波形图在动手写代码之前咱们得先用工程师的语言把上面那句“行为规则”描述得更严谨。这里要用到两个法宝真值表和波形图。2.1 真值表穷举所有可能真值表就是把所有可能的输入组合都列出来然后写出对应的输出。对于我们的2选1 MUX有3个1位输入A, B, sel所以一共有2³8种情况。输入 A输入 B选择 sel输出 X00000100100111010010011110101111怎么看这个表呢你就盯着sel这一列。前四行sel0输出X完全跟着输入A走看A列和X列值一模一样B是什么根本不重要。后四行sel1输出X完全跟着输入B走。这个表就是我们设计电路的“标准答案”后面写的代码和做的仿真都得跟它对上。2.2 波形图让信号“动”起来真值表是静态的波形图则是动态的它能更直观地展示信号随时间变化的关系。虽然原文中提到了波形图但咱们可以想象一下画一条时间轴上面有A、B、sel和X四条波形。当sel的波形是低电平0时X的波形就和A一模一样当sel的波形跳变成高电平1时X的波形瞬间就“切换”到和B一模一样了。这就像看电视换台按一下遥控器sel变化画面X就从A频道切到了B频道。有了这两个工具我们心里就完全有数了。接下来就是最关键的环节——用Verilog硬件描述语言把它实现出来。3. 手把手编写Verilog代码终于要写代码了咱们在Gowin云源软件里新建一个Verilog文件命名为sel_2_1.v。注意模块名不能以数字开头所以我们叫sel_2_1而不是2_sel_1。module sel_2_1( input A, // 输入信号 A input B, // 输入信号 B input sel, // 选择控制信号 sel output X // 输出信号 X ); // 使用三目运算符实现多路选择器 assign X (sel 1b0) ? A : B; endmodule代码非常简短但每一行都很有讲究咱们来拆解一下模块定义第1-7行module sel_2_1(...);定义了一个叫sel_2_1的模块。括号里是它的“对外接口”就像芯片的引脚。input A, B, sel;声明了三个输入“引脚”。input表示信号方向是输入。output X;声明了一个输出“引脚”。每个声明后面的//是注释是写给咱们自己看的说明不影响电路功能。核心逻辑第10行assign X (sel 1b0) ? A : B;这是整个电路的核心用了一行“条件运算符”也叫三目运算符就搞定了。assign是连续赋值语句意味着右边表达式一有变化左边X的值立刻跟着变。这正体现了组合逻辑“输出只取决于当前输入”的特点。(sel 1b0)是一个判断条件。1‘b0表示一个1位宽的二进制数0。? A : B是条件运算符的语法。如果前面的条件为真即sel等于0那么整个表达式的值就是A如果条件为假sel等于1值就是B。所以这行代码的意思就是如果sel是0X就等于A否则X就等于B。完美对应了我们的设计需求。提示除了assign语句用always (*)块配合if-else或case语句也能实现同样功能。但对于这种简单的二选一assign加三目运算符是最简洁、最直接的写法综合出来的电路也最优化。代码写完了但它到底对不对呢咱们不能直接烧到板子上猜得先“模拟考”一下这就是仿真。4. 编写测试仿真文件仿真就是用一个专门的测试程序给咱们的设计模块输入各种信号看看输出是不是我们想要的。我们新建一个仿真文件通常命名为sel_2_1_mod.v_mod代表testbench模块。timescale 1ns / 1ns // 定义仿真时间单位1纳秒/精度1纳秒 module sel_2_1_mod(); // 测试模块 // 定义连接到待测模块的信号 reg A; // 输入A在测试中需要主动给它赋值所以用reg类型 reg B; // 输入B reg sel; // 输入sel wire X; // 输出X待测模块驱动它我们只观察所以用wire类型 // 初始化产生测试信号 initial begin // 初始化所有输入为0 A 1b0; B 1b0; sel 1b0; #200; // 等待200纳秒让电路稳定并让我们观察 // 测试用例1: A0, B1, sel0 - 应该输出 X A 0 A 1b0; B 1b1; sel 1b0; #200; // 测试用例2: A1, B0, sel0 - 应该输出 X A 1 A 1b1; B 1b0; sel 1b0; #200; // 测试用例3: A1, B1, sel0 - 应该输出 X A 1 A 1b1; B 1b1; sel 1b0; #200; // 测试用例4: A0, B0, sel1 - 应该输出 X B 0 A 1b0; B 1b0; sel 1b1; #200; // 测试用例5: A0, B1, sel1 - 应该输出 X B 1 A 1b0; B 1b1; sel 1b1; #200; // 测试用例6: A1, B0, sel1 - 应该输出 X B 0 A 1b1; B 1b0; sel 1b1; #200; // 测试用例7: A1, B1, sel1 - 应该输出 X B 1 A 1b1; B 1b1; sel 1b1; #1000; // 最后多等一会儿方便看波形 $stop; // 停止仿真 end // 例化待测试的设计模块 // 这相当于把咱们写的 sel_2_1 “芯片” 连接到这个测试电路中 sel_2_1 u_sel_2_1 ( .A(A), // 将测试模块的A信号连接到设计模块的A端口 .B(B), // 将测试模块的B信号连接到设计模块的B端口 .sel(sel), // 将测试模块的sel信号连接到设计模块的sel端口 .X(X) // 将设计模块的X输出连接到测试模块的X信号进行观察 ); endmodule这个测试文件干了啥定义测试信号用reg类型定义A、B、sel因为我们需要在测试中主动给它们赋值。输出X用wire只负责连接和观察。生成测试序列在initial begin...end块里我们按照前面真值表的顺序依次设置了8组不同的{A, B, sel}输入。每组设置后用#200延迟200纳秒让电路有足够时间反应也方便我们在波形图上区分不同时间段。例化设计模块sel_2_1 u_sel_2_1(...);这一行是关键。它把之前写的sel_2_1模块“实例化”到测试环境中并把测试信号和它的引脚一一对应连接起来。u_开头的名字是给这个实例起的名字。5. 在Gowin软件中完成仿真与查看RTL图代码和测试都准备好了现在上机操作。咱们用的是高云Gowin的FPGA设计软件。5.1 创建工程与添加文件新建一个工程芯片型号根据你的“逻辑派”开发板具体型号选择例如GW1N-LV4LQ144C6/I5。在Design窗口右键选择“New Files...”分别创建并添加我们刚写的两个文件sel_2_1.v设计文件和sel_2_1_mod.v仿真文件。重要添加后在文件管理器中右键点击仿真文件sel_2_1_mod.v选择“Disable File”或类似选项失能它。这是因为这个文件只用于仿真不能参与最终生成比特流下载到板子。5.2 运行仿真点击菜单栏的“Process” - “Add Simulation Configuration”。在弹出的窗口中将“Project Name”和“Default Library Name”都设为logical_and或其他你喜欢的名字。在“Files”标签页下添加sel_2_1.v和sel_2_1_mod.v这两个文件。点击“Compile All”编译。如果没有语法错误再点击“Run”运行仿真。如果一切正确你会看到仿真波形图。仔细对比波形在sel为低电平的时段X的波形应该和A完全一致在sel为高电平的时段X的波形应该和B完全一致。这和我们手写的真值表、以及代码的设计意图是完全吻合的。仿真通过证明我们的代码逻辑是正确的5.3 查看RTL原理图仿真验证了功能我们再来看看综合工具把我们的代码变成了什么样的电路。在工程中确保只有sel_2_1.v是使能状态。点击“Process”窗口的“Synthesize”进行综合。综合通过后点击菜单栏“Tools” - “Schematic Viewer” - “RTL Design Viewer”。软件会弹出一个电路图窗口。你看到的应该是一个非常简洁的电路两个输入信号A和B经过一个由sel信号控制的选择器可能显示为一个MUX符号输出到X。这个图形化的视图直观地告诉你你写的Verilog代码最终被翻译成了这样一个标准的数字电路模块。这对于理解代码和硬件之间的映射关系非常有帮助。注意原文提到了引脚绑定和硬件测试。由于“逻辑派”板载按键有限进行硬件测试需要外接电阻模拟按键输入操作不当有风险。作为入门教程我们强烈建议新手在完全掌握仿真验证后再考虑硬件实验。仿真环境安全、可反复调试是学习阶段最重要的工具。6. 总结与延伸恭喜你到这里你已经完成了一个完整数字逻辑模块的设计流程需求分析 - 真值表描述 - Verilog编码 - 仿真验证 - RTL视图查看。这个2选1多路选择器虽然简单但它包含了组合逻辑设计的所有核心要素。你可以尝试举一反三4选1 MUX如果有4个输入A, B, C, D需要几位选择信号sel真值表会有多少行试着写写看。用 always 块实现不用assign语句尝试用always (*)和if-else或case语句来实现同样的功能。位宽扩展如果A、B不是1位信号而是4位宽的总线input [3:0] A, B代码需要怎么改提示几乎不用改Verilog会自动按位处理。数字电路和FPGA设计就是这样从一个个简单的模块开始搭建最终构成复杂的系统。希望这个2选1 MUX能成为你探索这个精彩世界的第一块坚实的积木。

相关新闻

Dify Agent协同编排接入全链路拆解(企业级快速接入黄金路径)

Dify Agent协同编排接入全链路拆解(企业级快速接入黄金路径)

第一章:Dify Agent协同编排接入全链路拆解(企业级快速接入黄金路径)Dify Agent 的协同编排能力为企业构建可复用、可观测、可治理的智能体工作流提供了核心支撑。本章聚焦从零到一完成企业级生产环境接入的完整路径,涵盖环境准备、…

2026/7/6 14:39:51 阅读更多 →
Qwen1.5-1.8B-GPTQ-Int4效果展示:中文新闻事件时间线自动生成

Qwen1.5-1.8B-GPTQ-Int4效果展示:中文新闻事件时间线自动生成

Qwen1.5-1.8B-GPTQ-Int4效果展示:中文新闻事件时间线自动生成 想象一下,你面对一堆关于某个热点事件的新闻报道,信息零散、时间混乱,想要理清整个事件的来龙去脉,是不是感觉头大?手动整理不仅耗时耗力&…

2026/7/4 4:20:40 阅读更多 →
STM32CubeMX与AnythingtoRealCharacters2511:嵌入式图像处理方案

STM32CubeMX与AnythingtoRealCharacters2511:嵌入式图像处理方案

STM32CubeMX与AnythingtoRealCharacters2511:嵌入式图像处理方案 1. 引言:当嵌入式系统遇上AI图像转换 想象一下这样的场景:一个智能相框能够实时将动漫头像转换为逼真的真人照片,或者一个嵌入式门禁系统能够将卡通头像转换为真…

2026/7/5 0:29:36 阅读更多 →

最新新闻

date-io核心原理:为什么它能成为日期库的万能适配器?

date-io核心原理:为什么它能成为日期库的万能适配器?

date-io核心原理:为什么它能成为日期库的万能适配器? 【免费下载链接】date-io Abstraction over common javascript date management libraries 项目地址: https://gitcode.com/gh_mirrors/da/date-io date-io是一个针对JavaScript日期管理库的…

2026/7/6 18:05:50 阅读更多 →
如何在React中集成ArcGIS Maps SDK组件?完整实现指南与示例代码

如何在React中集成ArcGIS Maps SDK组件?完整实现指南与示例代码

如何在React中集成ArcGIS Maps SDK组件?完整实现指南与示例代码 【免费下载链接】jsapi-resources A collection of resources for developers using the ArcGIS Maps SDK for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/js/jsapi-resources 想在…

2026/7/6 18:05:50 阅读更多 →
为什么你的draw.io桌面版Mermaid图表无法编辑?深度解析与修复指南

为什么你的draw.io桌面版Mermaid图表无法编辑?深度解析与修复指南

为什么你的draw.io桌面版Mermaid图表无法编辑?深度解析与修复指南 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 对于许多技术爱好者和普通用户来说,dr…

2026/7/6 18:03:49 阅读更多 →
Fabric Loader高级特性:Access Widener与Tiny Remapper详解

Fabric Loader高级特性:Access Widener与Tiny Remapper详解

Fabric Loader高级特性:Access Widener与Tiny Remapper详解 【免费下载链接】fabric-loader Fabrics mostly-version-independent mod loader. 项目地址: https://gitcode.com/gh_mirrors/fa/fabric-loader 在Minecraft模组开发领域,Fabric Loade…

2026/7/6 18:01:48 阅读更多 →
基于STM32单片机的智能窗户/窗帘晾衣架/雨滴光照检测系统成品32(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于STM32单片机的智能窗户/窗帘晾衣架/雨滴光照检测系统成品32(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于STM32单片机的智能窗户/窗帘晾衣架/雨滴光照检测系统成品32(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ LCD1602液晶显示当前窗帘状态开启/关闭 显示当前模式手动/自动 手动模式:按下第二个按键电机反转表示直接打开 窗帘/晾…

2026/7/6 17:59:46 阅读更多 →
coredumpy部署指南:在CI/CD流水线中集成崩溃调试功能

coredumpy部署指南:在CI/CD流水线中集成崩溃调试功能

coredumpy部署指南:在CI/CD流水线中集成崩溃调试功能 【免费下载链接】coredumpy coredumpy saves your crash site for post-mortem debugging 项目地址: https://gitcode.com/gh_mirrors/co/coredumpy 在当今快速迭代的软件开发环境中,崩溃调试…

2026/7/6 17:59:46 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻