数字电路核心:从逻辑门到CMOS与非门,构建现代芯片的基石

发布时间:2026/8/1 17:19:46

数字电路核心:从逻辑门到CMOS与非门,构建现代芯片的基石 1. 从“开关”到“逻辑”数字电路的核心世界观如果你刚开始接触数字电路可能会被一堆“与门”、“或门”、“触发器”的符号和真值表搞得头大。但别急我们不妨先退一步想想数字电路到底在解决一个什么问题。本质上它处理的不是连续变化的电压或电流而是“有”和“无”、“真”和“假”、“1”和“0”这两种状态。这个看似简单的二元世界却是构建我们整个数字信息时代的基石从你手机里的处理器到路由器里的芯片无一不是由亿万计的这些基本“开关”组合而成。所以学习数字电路第一步不是去背公式而是建立一种“逻辑思维”。你需要习惯用“是/否”、“开/关”的眼光去看待问题。比如一盏灯要亮可能需要同时满足“开关A闭合”且“开关B闭合”这就是一个“与”的逻辑或者满足“开关A闭合”或“开关B闭合”任一条件即可这就是“或”的逻辑。数字电路的学习就是学习如何用具体的电子器件晶体管来实现这些抽象的逻辑关系并把它们组合起来完成更复杂的任务比如计算、存储、判断。这篇笔记我们就来深入聊聊这些构成复杂系统的基本积木——逻辑门电路以及它们如何从理论走向实际的芯片。2. 基础逻辑门不只是符号更是物理现实当我们画出“与门AND”、“或门OR”、“非门NOT”这些符号时它们代表的是一类具有特定输入输出关系的电路。理解它们绝不能停留在真值表更要明白其背后的物理实现和电气特性这是理论联系实际的关键。2.1 晶体管的开关本质一切逻辑的物理基础现代数字电路几乎都基于MOS晶体管金属-氧化物半导体场效应晶体管。你可以把它想象成一个由电压控制的水龙头开关。以最常用的N型MOS管为例它的栅极G就像水龙头的旋钮源极S和漏极D是水流的入口和出口。当栅极电压为低比如0V代表逻辑0时水管是关闭的源漏之间电阻极大几乎没有电流相当于开关断开。当栅极电压为高比如电源电压VDD代表逻辑1时水管打开源漏之间导通电阻很小相当于开关闭合。P型MOS管则相反高电平关断低电平导通。正是利用这两种晶体管互补的特性我们才能构建出高效、低功耗的逻辑门。注意这里说的“高电平”和“低电平”是一个范围而不是一个精确值。例如在5V供电系统中0V到0.8V可能被识别为低电平2V到5V被识别为高电平中间是未定义区域。这是数字电路抗干扰能力的基础也是设计时必须考虑的“噪声容限”。2.2 CMOS与非门NAND的深度拆解为什么它是万能积木在众多逻辑门中CMOS互补MOS结构的与非门NAND具有至高无上的地位。它被称为“通用逻辑门”因为仅使用与非门就可以实现与、或、非所有基本逻辑功能。我们来看看一个两输入CMOS与非门的具体结构和工作原理这能帮你真正理解数字电路的运作。一个两输入CMOS与非门由4个MOS管组成两个P型MOS管PMOS并联在上拉网络两个N型MOS管NMOS串联在下拉网络。输入A和B分别控制两个管子。当A0 B0时两个NMOS串联都因为栅极为低电平而关闭下拉通路断开。两个PMOS并联都因为栅极为低电平而导通上拉通路接通。输出端通过导通的PMOS连接到电源VDD因此输出Y 1高电平。当A0 B1时控制A的NMOS关闭尽管控制B的NMOS导通但由于串联只要有一个关闭下拉通路就断开。控制A的PMOS导通控制B的PMOS关闭但并联的PMOS只要有一个导通上拉通路就接通。输出Y 1。当A1 B0时情况与上一条对称下拉通路因B控制的NMOS关闭而断开上拉通路因A控制的PMOS关闭但B控制的PMOS导通而接通。输出Y 1。当A1 B1时两个NMOS栅极均为高电平全部导通下拉通路接通。两个PMOS栅极均为高电平全部关闭上拉通路断开。输出端通过导通的NMOS连接到地GND因此输出Y 0低电平。总结其逻辑只有所有输入都为1时输出才为0。这正好是“与”运算后再“非”一下即“与非”。CMOS结构的美妙之处在于在任何稳定的逻辑状态下从VDD到GND的直流通路总是被断开的要么上拉断开要么下拉断开只有在状态切换的瞬间才有短暂的导通电流。这使得CMOS电路在静态时功耗极低主要功耗产生于状态切换时对寄生电容的充放电。2.3 其他基本门电路变体与衍生理解了与非门其他门电路就很好推导了。或非门NORCMOS实现是上拉PMOS串联下拉NMOS并联。逻辑是只有所有输入为0时输出才为1。它同样是通用逻辑门。与门AND一个与非门后面级联一个非门反相器即可实现。或门OR一个或非门后面级联一个非门即可实现。异或门XOR实现“相异为1相同为0”的逻辑。可以用基本门组合Y A·B A·B。它的CMOS直接实现比组合门更晶体管高效但结构稍复杂。在实际芯片设计中标准单元库会提供这些门电路的各种驱动强度驱动电流能力和引脚形态的版本供设计者按需调用。3. 组合逻辑电路用逻辑门搭建功能模块当我们将基本的逻辑门像搭积木一样连接起来并且电路的输出只取决于当前的输入组合与历史状态无关时我们就得到了组合逻辑电路。分析和设计组合逻辑是数字电路的核心技能。3.1 从真值表到逻辑表达式分析与设计的第一步假设我们需要设计一个三人投票电路超过半数即两人或三人同意则提案通过。设三人为A、B、C同意为1反对为0输出F通过为1否决为0。 首先列出真值表ABCF00000010010001111000101111011111然后找出所有输出F1的行写出对应的最小项输入变量相与。例如第四行A0 B1 C1对应的最小项是 ABC。将所有F1的最小项相加或运算就得到了逻辑表达式F ABC ABC ABC ABC这个表达式是“与-或”形式也称为积之和SOP形式。它可以直接用与门和或门实现。3.2 逻辑化简卡诺图Karnaugh Map的实战技巧上面的表达式有四项看起来有点复杂。我们可以用卡诺图进行化简。卡诺图是一种图形化的化简工具特别适合4变量及以下的逻辑化简。 对于三变量F(A B C)卡诺图是2x4的格子。将真值表中F1的项填入图中对应位置AB为行C为列注意格雷码顺序BC 00 01 11 10 ---------------- A 0 | 0 | 0 | 1 | 0 | |----------------| 1 | 0 | 1 | 1 | 1 | ----------------然后画圈包围相邻的“1”格相邻包括上下、左右、以及首尾相连。目标是圈尽可能大圈数尽可能少。圈住中间两个“1”对应ABC011和111这个圈消去了变量A因为A在圈内既有0也有1得到 BC。圈住下面一行右侧两个“1”对应ABC110和111这个圈消去了变量C得到 AB。圈住下面一行中间两个“1”对应ABC101和111这个圈消去了变量B得到 AC。 化简后的表达式为F AB AC BC。 这个结果非常直观只要任意两人同意AB或AC或BC提案就通过。化简后的电路只需要三个两输入与门和一个三输入或门比化简前节省了资源。3.3 常用中规模组合逻辑器件在实际工程中我们很少从晶体管或门电路开始搭建一切。更多的是使用封装好的、功能明确的中规模集成电路MSI或通过硬件描述语言HDL调用标准模块。这些模块本身就是组合逻辑的经典应用。编码器Encoder将2^N个输入线通常只有一条为有效电平编码成N位二进制码输出。例如8线-3线优先编码器当多个输入同时有效时只对优先级最高的进行编码。译码器Decoder编码的逆过程。将N位二进制输入码“翻译”成2^N个输出线中的一个有效。例如3线-8线译码器常用于存储器的地址选通或数字显示驱动。数据选择器MUX Multiplexer从多路数据输入中选择一路送到输出选择由控制信号地址线决定。它是一个非常灵活的逻辑函数发生器理论上任何组合逻辑都可以用MUX配合固定电平实现。数值比较器Comparator比较两个二进制数的大小或是否相等。加法器Adder半加器、全加器、串行进位加法器、超前进位加法器CLA。这是算术运算的基础。理解全加器如何用两个半加器和一个或门构成是理解更复杂运算器的起点。实操心得在FPGA或ASIC设计中虽然你用Verilog写一句assign F (AB) | (AC) | (BC);综合工具会自动把它映射到门电路。但如果你心中没有化简后的清晰结构在遇到时序问题、面积优化或需要手动实例化特定门电路时就会缺乏直觉。手动画过卡诺图你对逻辑的理解会深刻得多。4. 时序逻辑电路引入时间维度与记忆功能组合逻辑的“失忆症”限制了它的能力。很多应用需要电路能“记住”过去的状态比如计数器、状态机、寄存器。这就需要引入时序逻辑电路。其特点是输出不仅取决于当前的输入还取决于电路原来的状态。4.1 时序逻辑的基石锁存器与触发器这是数字电路中最容易混淆也最关键的概念之一。它们都是能够存储1位二进制数据0或1的基本单元。锁存器Latch电平敏感器件。当使能信号如时钟CLK为有效电平比如高电平期间输出Q会跟随输入D变化相当于透明状态。当使能信号无效时Q锁存在使能信号跳变无效前瞬间的D值。问题在使能有效期间如果输入D变化输出Q会跟着变这可能导致后续逻辑产生毛刺或错误动作。因此在同步时序电路中锁存器使用较少容易产生时序难以分析的问题。触发器Flip-Flop FF边沿敏感器件。最常见的是D触发器。它只在时钟CLK的特定边沿上升沿或下降沿瞬间将输入D的值捕获并传送到输出Q并在下一个时钟边沿到来之前无论D如何变化Q都保持不变。这个特性至关重要它像是一个严格的“采样-保持”开关将连续时间的数据流离散化为整个同步数字系统提供了统一的节奏基准。踩坑实录早期我试图用组合逻辑的输出来直接驱动一个异步控制信号结果系统极不稳定。后来才明白几乎所有现代同步设计都要求使用触发器来寄存所有模块的输出信号。这保证了信号在进入下一个逻辑模块时是稳定且与时钟同步的避免了竞争和冒险。记住这个原则“寄存器输出”。4.2 同步时序电路的分析状态机是核心一个典型的同步时序电路由两部分组成组合逻辑网络和触发器组。触发器存储当前状态组合逻辑根据当前状态和输入计算下一个状态和输出。 分析时序电路通常遵循以下步骤写出驱动方程即每个触发器输入端的逻辑表达式对于D触发器就是D端的表达式。写出状态方程将驱动方程代入触发器的特性方程对于D触发器Q* D即次态等于当前的D得到每个触发器次态的逻辑表达式。列出状态转换表根据状态方程和输出方程枚举所有可能的当前状态和输入组合计算出次态和输出。画出状态转换图或时序图状态转换图更直观显示所有状态跳转路径时序图则能清晰展示信号随时间的变化尤其适合分析特定输入序列下的行为。例如分析一个简单的2位二进制加法计数器。它有两个触发器Q1和Q0。其驱动方程可能是D0 Q0 D1 Q1 XOR Q0。这意味着每个时钟上升沿Q0翻转一次而当Q0为1时下一个时钟沿Q1翻转。通过列表或画图你会看到状态从00-01-10-11-00循环实现了计数功能。4.3 有限状态机FSM设计从想法到电路有限状态机是描述和控制时序系统行为的强大工具。设计FSM一般分为几步抽象出状态根据问题描述确定系统有哪几种不同的“模式”或“情况”。例如一个简单的串行数据检测器检测输入序列中的“1101”状态可以是S0初始/未匹配 S1收到了‘1’ S2收到了‘11’ S3收到了‘110’。画出原始状态图标明每个状态以及在不同输入条件下会跳转到哪个状态并注明输出。状态化简检查是否有等价状态在所有输入组合下输出相同且次态相同或等价合并它们以减少所需触发器数量。状态编码给每个状态分配一个唯一的二进制码如00 01 10 11。编码方式顺序编码、格雷码、独热码会影响后续组合逻辑的复杂度和电路速度。独热码One-Hot用一个触发器代表一个状态组合逻辑简单但触发器用量大在FPGA中常用。确定触发器类型和数量根据状态数选择触发器数量2^n 状态数。D触发器最常用。导出输出方程和驱动方程根据编码后的状态转换表用卡诺图或逻辑公式化简法求出每个触发器D端和电路输出端的逻辑表达式。画出电路图或编写HDL代码。5. 硬件描述语言与可编程逻辑现代设计方法今天几乎没有人再用手工绘制晶体管或门级电路图来设计复杂芯片了。硬件描述语言HDL和可编程逻辑器件如FPGA已成为标准。5.1 Verilog/VHDL初窥用代码描述硬件以Verilog为例它看起来像软件编程语言但思维模式截然不同。你是在描述一个硬件电路的结构或行为。描述组合逻辑使用assign连续赋值语句。例如assign F (A B) | (A C) | (B C);这行代码直接对应了我们之前化简的投票电路综合工具会自动生成与门和或门网络。描述时序逻辑使用always过程块并敏感于时钟边沿。这是描述触发器的关键。always (posedge clk or posedge rst) begin if (rst) begin q 1‘b0; // 异步复位高电平有效 end else begin q d; // 每个clk上升沿将d的值锁存到q end end注意这里用的是非阻塞赋值它模拟了所有触发器在时钟边沿同时动作的硬件并行特性与软件的顺序执行有本质区别。这是Verilog学习中最关键的思维转换点之一。5.2 FPGA设计流程概览从代码到比特流当你写好HDL代码后如何让它变成在FPGA芯片里运行的电路呢大致流程如下设计输入编写Verilog/VHDL代码或用原理图。功能仿真前仿真使用仿真工具如ModelSim验证代码的逻辑功能是否正确。此时不考虑任何门延迟和布线延迟。综合综合工具如Synplify Vivado/Quartus内置综合器将HDL代码翻译成由基本逻辑门、触发器、存储器等组成的网表。这个过程会进行逻辑优化。实现包括翻译、映射、布局布线。映射将综合后的网表映射到目标FPGA芯片的特定硬件资源上如查找表LUT、触发器、BRAM、DSP块。布局布线确定每个逻辑单元在芯片上的具体位置并用芯片内部的连线资源将它们连接起来。这一步对最终电路的性能和稳定性影响巨大。时序仿真后仿真使用布局布线后产生的精确延迟信息进行仿真验证电路在真实时序条件下是否能正常工作如建立时间、保持时间是否满足。生成配置文件比特流并下载将布局布线后的结果生成一个二进制文件通过JTAG或其它接口下载到FPGA芯片中配置其内部的连接和功能电路就开始运行了。5.3 查找表LUT与FPGA架构理解FPGA之所以“可编程”核心在于其大量的可配置逻辑块CLB。而CLB的核心又是查找表LUT。一个N输入的LUT本质上是一个2^N x 1位的静态存储器SRAM。当你写assign out (a b) | c这样的代码综合工具会计算a b c所有8种输入组合下out的值0或1然后将这8个结果值预先写入一个3输入LUT对应的SRAM单元。电路运行时输入a b c作为地址线直接选中SRAM中存储的对应结果输出。所以FPGA是用“查表”的方式来实现组合逻辑的。现代FPGA的LUT通常是4输入、6输入甚至更多并且一个CLB内还包含触发器、快速进位链等资源共同构成强大的可编程 fabric。6. 数字电路中的非理想效应与设计考量理论是完美的但实际电路会遇到各种非理想情况。理解这些是成为合格工程师的必经之路。6.1 时序分析的生命线建立时间与保持时间这是时序逻辑设计中最核心的两个时序参数关乎电路能否可靠工作。建立时间Tsu在时钟有效边沿如上升沿到来之前数据输入D必须保持稳定的最短时间。保持时间Th在时钟有效边沿到来之后数据输入D必须继续保持稳定的最短时间。可以把触发器想象成一个严格的会议记录员。时钟边沿是“记录时刻”。建立时间要求你在记录时刻之前的一小段时间Tsu就把要记录的信息数据D准备好并稳定地放在他面前。保持时间要求你在记录时刻之后的一小段时间Th内不能立刻把信息拿走因为他需要时间把信息写下来。如果违反了这两个时间要求记录员可能记录到错误的信息亚稳态导致系统功能错误。系统最大时钟频率受限于最长的组合逻辑路径延迟从上一个触发器输出经过中间组合逻辑到下一个触发器输入的总时间必须小于时钟周期减去Tsu。而保持时间违规通常发生在时钟偏移Clock Skew较大或组合逻辑路径延迟极短的情况下需要通过插入缓冲器增加延迟来修复。6.2 毛刺Glitch的产生与消除毛刺是组合逻辑电路中由于输入信号变化到达到达不同门电路的路径延迟不同在输出端产生的短暂错误脉冲。例如在一个由与门和或门构成的简单电路中当两个输入信号同时向相反方向变化时由于走线延迟差异可能在极短时间内出现所有与门条件都不满足的情况导致输出出现一个“尖刺”。消除方法增加冗余项在卡诺图中通过画圈覆盖所有相邻的“1”本质就是消除因输入变量变化速度不同产生的冒险。输出端加滤波电容在低速场合简单的RC低通滤波可以滤除窄毛刺但会恶化边沿。同步设计这是最根本、最可靠的方法。用时钟边沿触发的触发器去采样组合逻辑的输出。只要毛刺不出现在时钟边沿的建立/保持时间窗口内就不会被捕获。这就是为什么强调要将组合逻辑的输出进行寄存Register Output的原因。6.3 时钟域与亚稳态处理当一个信号从一个时钟域比如CLK_A传送到另一个时钟域CLK_B时这个信号相对于CLK_B是异步的。异步信号可能在任何时候发生变化如果它变化的时间点非常接近CLK_B的采样边沿就极有可能导致接收端的触发器进入亚稳态——输出既不是0也不是1而是一个中间电平并且需要很长时间才能随机稳定到0或1。亚稳态的传播会导致系统功能混乱。处理异步信号的标准方法使用同步器。最常见的是两级触发器同步器。always (posedge clk_b or posedge rst_b) begin if (rst_b) begin sync_reg1 1b0; sync_reg2 1b0; end else begin sync_reg1 async_signal; // 第一级触发器 sync_reg2 sync_reg1; // 第二级触发器 end end assign synced_signal sync_reg2; // 使用同步后的信号第一级触发器有概率进入亚稳态但给予它一个完整的CLK_B周期时间在第二级触发器采样之前来稳定下来。第二级触发器采样到稳定信号的概率就大大增加。两级同步器虽然不能完全消除亚稳态概率趋近于0但能将系统失效间隔时间MTBF提高到可接受的水平。对于控制信号两级同步通常足够对于多比特数据总线则需要用到握手协议或异步FIFO等更复杂的技术。

相关新闻