1 基本概念与历史沿革
1.1 数字系统与模拟系统的对比
数字系统以离散的、二值化的信号(通常为0和1)进行信息处理和传输,而模拟系统处理连续变化的物理量(如电压、电流、温度)。数字系统抗噪声能力强,易于存储和复制,并且可以通过逻辑运算实现复杂功能;模拟系统在处理真实世界信号时更直接,但容易受噪声干扰且难以集成。两者的典型代表分别是计算机(数字)和音频放大器(模拟)。在电子设计中,数字系统正在逐步侵蚀模拟系统的传统领地,但模拟电路在高速通信和传感器接口中仍不可或缺。
1.2 逻辑设计的抽象层次
逻辑设计采用分层抽象来管理复杂性,从最顶层的功能描述到底层的物理实现,逐步细化。
1.2.1 行为级
行为级描述关注电路“做什么”而非“如何做”,使用算法、流程图或硬件描述语言(如Verilog的always块)来表达功能。例如,描述一个加法器时仅需写出“A + B = S”,不涉及具体的门级实现。这一层次适合早期的功能验证和架构探索。
1.2.2 结构级
结构级描述明确指定了电路由哪些基本元器件(如逻辑门、触发器、模块)构成及其互连关系。它相当于电子世界的“电路图”,工程师可以在这里选择具体的门类型和连线方式。结构级描述是可综合的,能直接映射到硬件。
1.2.3 物理级
物理级涉及晶体管的几何布局、连线宽度、层叠结构等实际制造参数。设计者在这里考虑时序、功耗、面积等物理约束。物理级设计通常由EDA工具自动完成,但在高性能或低功耗应用中仍需手工干预。
1.3 逻辑设计的发展简史
1.3.1 从继电器到真空管
19世纪末至20世纪初,继电器被用于电话交换机和早期的机电计算机(如Zuse Z3)。继电器开关速度慢(毫秒级),且机械触点易磨损。真空管的出现(如ENIAC,1945年)将开关速度提升至微秒级,但真空管体积大、功耗高、寿命短。尽管如此,真空管仍然是第一代电子计算机的核心。
1.3.2 集成电路时代的降临
1947年晶体管的发明带来了革命。1960年代初期,分立晶体管组成的逻辑电路被集成到单个硅片上,形成了小规模集成电路(SSI,每个芯片几个门)。随后,中规模(MSI)、大规模(LSI)和超大规模(VLSI)集成电路相继出现。1971年Intel 4004微处理器标志着逻辑设计进入系统级集成时代。如今,数十亿晶体管可封装在一个芯片上,逻辑设计从门级上升到架构级,但底层原理依旧坚不可摧。
2 布尔代数与逻辑门
2.1 布尔代数的基本公理与定理
2.1.1 变量、常量与基本运算
布尔代数中变量只能取0或1。常量也是0或1。基本运算包括与(AND,记作·或∧)、或(OR,记作+或∨)和非(NOT,记作¬或上划线)。公理包括:0·0=0,0·1=0,1·1=1;0+0=0,0+1=1,1+1=1;¬0=1,¬1=0。交换律、结合律、分配律、吸收律等定理均可从公理推出。
2.1.2 德摩根定律的冷知识
德摩根定律指出:¬(A·B) = ¬A + ¬B,¬(A+B) = ¬A·¬B。冷知识是:这个定律在19世纪由英国数学家奥古斯都·德摩根提出,但直到20世纪电子计算机诞生后才大显身手。布尔代数本身在1854年由乔治·布尔创立,最初是为了研究逻辑推理,却被后世工程师用来设计处理器——如果布尔活到今天,看到自己的代数在跑《塞尔达传说》,大概会欣慰地拍拍棺材板。
2.2 基本逻辑门及其符号
2.2.1 与门、或门、非门
与门输出为1当且仅当所有输入为1;或门输出为1当至少一个输入为1;非门将输入取反。国际标准符号中,与门用矩形内写“&”,或门用矩形内写“≥1”,非门用矩形后加小圆圈。美国符号则用弯月形或三角形,但学界已经逐渐统一为矩形符号。
2.2.2 复合门:与非、或非、异或、同或
与非门是与门加非门(输出与门取反),或非门是或门加非门。异或门输出为1当两个输入不同;同或门则是异或的非,输出为1当两个输入相同。这些复合门在实际设计中更常用,因为用与非门可以构建任何逻辑(与非门是通用门),从而简化芯片制造工艺。
2.3 逻辑函数的表示与化简
2.3.1 真值表与逻辑表达式
真值表列出所有输入组合下的输出值。从真值表可以写出最小项之和(SOP)或最大项之积(POS)的标准表达式。例如,3变量函数F(A,B,C)=Σm(1,2,5)对应三个最小项的和。
2.3.2 卡诺图法(抓“1”小游戏)
卡诺图是二维真值表,通过几何相邻单元合并来化简逻辑。规则:将相邻的1(或0)圈成2的幂次方块,每个方块对应一个简化乘积项。卡诺图适用于最多4-6个变量,超过则很难手工操作。整个过程好比在棋盘上寻找连续的一串“1”,圈得越大越好,但不能违规(勿圈非矩形或非2的幂次)。这个“抓1小游戏”是数字电路课上的必备技能。
2.3.3 奎因-麦克拉斯基算法(长除法不香吗?)
当变量较多(大于5)或需要自动化简时,使用奎因-麦克拉斯基算法。该算法通过比较最小项找出所有质蕴含项,再选择覆盖全部最小项的质蕴含项集。它是卡诺图的一种数值化、可编程的等价形式。有趣的是,该算法实际上就是“长除法”的变种——通过逐次合并相邻项,最终化简出最简表达式。很多学生感到无聊,但相比手工卡诺图熬夜圈圈,算法至少能让电脑替你加班。
3 组合逻辑设计
3.1 编码器与译码器
3.1.1 优先编码器(谁先抢到谁说话)
优先编码器将多个输入信号转换为二进制编码,且当多个输入同时有效时,优先级最高的输入被编码。例如,8-3优先编码器(如74HC148)中,输入7的优先级最高,输入0最低。它就像一个电话总机:同时响起多部电话时,只有最重要的人(最高优先级)先被接通。优先编码器广泛应用于中断控制器和键盘扫描。
3.1.2 二-十进制译码器与七段数码管
二-十进制译码器(如74LS47)将4位BCD码转换为驱动七段数码管的信号。七段数码管有a~g七个发光段,译码器根据输入数字点亮对应段,显示0~9。这个设计让工程师无需手动计算每个数字的段亮灭——也算是早年间的“人工智能”了,虽然它完全不懂什么是“数字美”。
3.2 多路选择器与多路分配器
3.2.1 数据选择器(信号世界的“人肉交换机”)
多路选择器(MUX)根据选择信号从多个输入中选取一个输出,相当于一个旋转开关。常见的有2选1、4选1、8选1等。数据选择器几乎出现在所有数字系统中,比如CPU寄存器堆的读写端口、总线仲裁等。它也可以用来实现任意逻辑函数——将输入变量作为选择信号,数据输入接常数或变量组合,就能输出所需布尔函数。这是教科书上最爱讲的“MUX万能实现法”。
3.3 算术运算单元
3.3.1 半加器与全加器
半加器对两个1位二进制数求和,产生和(Sum)与进位(Carry)。全加器增加了一个进位输入,可以处理多位数加法中的低进位。两个半加器和一个或门可以构成一个全加器——这是数字设计中最经典的结构复用。
3.3.2 超前进位加法器(告别串行龟速)
串行进位加法器(行波进位加法器)的进位逐级传递,速度受限于最长路径(N级门延迟)。超前进位加法器通过额外逻辑提前计算所有进位,使加法仅需3~4级门延迟,无论位数多少。代价是硬件复杂度随位数平方增长,所以实际CPU中通常采用4位或8位超前进位模块,再级联组合(如进位选择加法器)。这种“用面积换速度”的思想贯穿整个数字设计。
3.3.3 乘法器的简单实现(长按竖式键)
二进制乘法模仿十进制竖式:将被乘数与乘数的每一位相乘,再移位相加。最简单的乘法器是移位加乘法器:每次检测乘数最低位,若为1则加被乘数,然后被乘数左移一位,重复直到所有乘数位处理完毕。这种实现面积小但速度慢。现代CPU采用Wallace树乘法器或Booth编码乘法器,通过并行压缩来加速。但无论如何,原理还是你小学学的竖式——只是用0和1重写了一遍。
3.4 数值比较器
数值比较器比较两个二进制数的大小,输出A>B、A=B、A<B。基本方法是逐位比较:从高位到低位,一旦发现某位不等,即可判定大小。4位比较器可以用两级逻辑实现。有趣的是,比较器经常和加法器共享电路——因为A > B等价于A - B > 0,而减法可以用加法(补码)实现。所以很多设计把比较器直接当作加法器的“副业”。
3.5 三态门与总线结构(不上班就高阻)
三态门除了输出0和1外,还有第三种状态——高阻(Z),此时输出相当于断开。多个三态门的输出可以连到同一根总线上,但同一时刻只能有一个门使能,其他门处于高阻,否则就会发生“抢线冲突”(两个门同时输出不同电平会短路烧毁)。三态门是构建数据总线、双向引脚和多路复用系统的基础。简单说,三态门好比会议室的麦克风:只有一个人能说话(使能),其他人必须闭嘴(高阻),否则就会“音频啸叫”。
4 时序逻辑设计
4.1 锁存器与触发器
4.1.1 SR锁存器的比赛问题(谁先置位?)
SR锁存器由两个交叉耦合的与非门(或或非门)构成。当S=0、R=0时输出保持;S=0、R=1时置位,S=1、R=0时复位。但若S和R同时从有效电平变为无效,就会出现“竞争”——两个门同时抢着决定输出,最终结果取决于制造工艺的细微差异。这种无法预测的状态称为亚稳态。在工程中,SR锁存器必须避免同时置位和复位,否则就成了“谁先置位谁赢”的悬疑比赛。
4.1.2 D锁存器与电平敏感
D锁存器解决了SR锁存器的输入约束,只需一个数据输入D和一个使能信号EN。当EN=1时,输出跟随D;EN=0时,输出保持。D锁存器是电平敏感的——它在EN有效期间透明传输数据。这种透明性在时序分析中容易造成毛刺传播,因此现代设计更偏爱边沿触发的触发器。
4.1.3 边沿触发的D触发器(正派主角)
边沿触发的D触发器仅在时钟上升沿(或下降沿)采样输入D,其余时间输出不变。它由两个D锁存器级联(主从结构)或采用脉冲触发方式构成。D触发器是数字系统中的“正派主角”——所有同步电路都在它忠实的采样下有序工作。它就像一个守时的门卫:只在整点换班时刻更新名单,其他时间保持稳定。
4.1.4 JK触发器和T触发器的八卦
JK触发器是SR触发器的升级版:J(置位)和K(复位)同时为1时,输出翻转。T触发器则只有一个输入T,当T=1时翻转,T=0时保持。JK和T触发器在教科书上很常见,但在现代ASIC设计中几乎被D触发器取代。它们的存在更多是为了让学生理解计数器的原理。工程师们私下调侃:JK触发器是“教科书特供”,D触发器才是工业界的“大哥”。
4.2 寄存器与移位寄存器
4.2.1 并行寄存器(8位同居宿舍)
并行寄存器由一组D触发器共享同一时钟,同时存储多位数据。8位寄存器就是8个D触发器住在一个“宿舍”里,统一听从时钟铃声(上升沿)作息。寄存器是CPU中最基础的存储单元,用于暂存指令、地址和数据。
4.2.2 串入串出、串入并出(排队转身)
移位寄存器能将数据逐位移动。串入串出(SISO)是单线输入、单线输出,数据像一个队列依次通过;串入并出(SIPO)则将串行输入转换为并行输出,适合接收串行通信数据。反过来,并入串出(PISO)将并行数据转为串行发送。移位寄存器就像火车站台:串行是单行道,并行是多车道同时上下客。
4.3 计数器
4.3.1 同步计数器(齐步走)
同步计数器中所有触发器共用同一时钟,因此每个周期所有触发器同时动作。同步计数器的运行像一支训练有素的军队:每个士兵(触发器)都知道下一步是行进、翻倍还是归零,由统一的时钟号令指挥。同步计数器工作频率高,但硬件复杂度略高。
4.3.2 异步计数器(带节奏的波纹)
异步计数器中,触发器的时钟连接至前一级的输出,因此进位像波纹一样传播。例如,二进制异步计数器(行波计数器)中,每个触发器只在前一级跳变时翻转,导致整个计数器需要多个阶段才能稳定。异步计数器结构简单但速度慢,且容易产生毛刺。它的特性就像一群鸭子跟着头鸭游——头鸭一动,后面才跟着动,看起来很有节奏,但传播速度远不如齐步走。
4.3.3 模N计数器(数到N就翻篇)
模N计数器计数值从0到N-1,然后回零。例如模10计数器(BCD计数器)用于数字时钟的秒位。设计模N计数器可以用同步清零或同步置数实现:在计数值达到N-1的下一周期清零。这种“数到N就翻篇”的机制是数字时钟、分频器、状态机中的基本单元。
4.4 有限状态机
4.4.1 状态图、状态表与状态分配(给状态起个名字)
有限状态机(FSM)由一组状态和转移条件定义。状态图用圆圈表示状态、箭头表示转移;状态表以表格形式列出当前状态、输入和下一状态、输出。状态分配则用二进制编码给每个状态一个唯一编号(例如S0=00, S1=01, S2=10)。这个“起名字”过程看似简单,但错误的编码可能导致额外的逻辑或时序问题。
4.4.2 米利型与摩尔型(输出看输入还是看状态?)
米利型FSM的输出不仅取决于当前状态,还取决于当前输入;摩尔型FSM的输出仅取决于当前状态。米利型响应更快(输入变化立即影响输出),但容易产生毛刺;摩尔型更稳定,时序简单。两者之间的争论像“甜粽子还是咸粽子”一样历史悠久——实际上,设计者根据具体需求选择,也可以混合使用。
4.4.3 状态机设计实例(红绿灯的哲学)
一个典型的十字路口红绿灯状态机包括:主干道绿灯、主干道黄灯、支路绿灯、支路黄灯,共四个状态。转移条件通常基于定时器(例如绿灯持续30秒,黄灯3秒)和传感器(支路是否有车等待)。这个例子体现了FSM的精髓:状态是“哲学思考”的进程,每时刻只能处于一种“哲学状态”,根据条件决定下一步走向何方。设计者需要小心处理亚稳态(比如传感器干扰导致短时间误触发),否则路口会出现“全红”或“全绿”的混乱。
5 硬件描述语言
5.1 VHDL与Verilog的异同(宗教战争)
VHDL(VHSIC Hardware Description Language)诞生于美国国防部需求,语法严谨、冗长、类似Ada;Verilog诞生于商业背景,语法简洁、类似C。两者都能描述数字电路,但工程师圈子中常年存在“信仰之战”:VHDL信徒认为其强类型检查避免错误,Verilog阵营嘲笑VHDL就像“把作文写成法律条文”。实际上,两者可以互相转化,现代工具也支持混合仿真。最终结论:用的人多的就是好语言——目前Verilog在工业界更流行,VHDL在国防和航空领域仍有拥趸。
5.2 行为建模与结构化建模
5.2.1 always块与process敏感列表
在Verilog中,always块用于描述时序或组合逻辑。敏感列表列出触发always块的事件(如posedge clk用于时序,@(*)用于组合逻辑)。VHDL中的process与之对应,敏感列表写在process关键词后的括号中。注意:敏感列表漏写可能导致仿真与综合不一致(例如always @(a or b)若忘记加c,则c变化时块不执行,产生类似锁存器的行为)。敏感列表的正确书写是新手必须跨过的门槛。
5.2.2 组合逻辑与时序逻辑的描述准则
组合逻辑用阻塞赋值(=)描述,时序逻辑用非阻塞赋值(<=)描述。这条准则是防止产生意外锁存器和竞争冒险的法宝。违反规则会导致仿真结果与综合结果“打架”。例如:在同一个always块中混合阻塞和非阻塞赋值,或对同一变量多处赋值,可能生成出人意料的触发器和锁存器——硬件设计中的“幽灵”。
5.3 仿真与综合
5.3.1 编写testbench(给代码配个保姆)
Testbench是一个专门用于仿真验证的顶层模块,它生成时钟、施加激励、检查输出。编写testbench相当于给设计的代码请了个“全自动保姆”,让它按预定的时间表喂激励、收结果,并自动判断是否出错。现代验证方法学(UVM)甚至让testbench自我进化,但本质上还是给硬件用软件模式“做体检”。
5.3.2 综合陷阱:给你个隐含锁存器你要不要?
综合器将HDL代码映射为门级网表。最容易踩的坑是:在组合逻辑always块中未对所有分支赋值,导致综合出隐含锁存器(latch)。例如:if-else if-else语句中缺少else,或case语句缺少default且所有组合未全覆盖。综合器会认为“未定义状态下保持原值”,从而悄悄插入一个锁存器。这种“好意”往往导致设计功能错误和时序问题。所以工程师常说:“检查你的if-else,否则综合器送你一个免费锁存器。”
6 设计优化与可测试性
6.1 面积优化
6.1.1 资源共享与逻辑复用
面积优化旨在减少芯片面积(降低成本)。共享资源指将多个功能模块相同的运算单元合并,例如两个加法器在不同时间工作,就只用一个加法器加多路选择器。逻辑复用则是通过状态机或流水线让同一硬件在不同周期完成不同任务。这种“抠门”式优化让设计者在功能不变的情况下把硅片面积压缩到极致。
6.1.2 流水线(拆解长路径,提升逼格)
流水线将长组合逻辑路径拆分为多个寄存器隔离的短段,每段在一个时钟周期内完成。代价是增加延迟(latency),但提升吞吐量(throughput)。现代CPU的指令流水线有十几级,看起来像工业流水线:每个工人(级)只做一小步,最终产品(指令结果)以更高频率流出。流水线不仅优化了面积(通过复用每级的硬件),还大幅提升了频率——它把组合逻辑的“慢性子”变成了“多段接力跑”。
6.2 速度优化
6.2.1 关键路径分析与重定时
关键路径是组合逻辑中延迟最长的路径,它决定了系统最大时钟频率。分析关键路径后,可以通过重定时(retiming)将部分逻辑从不平衡的路径中挪到另一侧,从而缩短最差路径。例如将寄存器前移或后移,使各段延迟更均衡。这有点像把一队跑步的人中拖后腿的调到前面,让整体速度提升。
6.3 功耗优化
6.3.1 门控时钟(省电第一招)
门控时钟在电路不工作时关闭时钟信号,从而消除触发器翻转的功耗。方法是添加一个使能信号和门控单元(如AND门或锁存器+AND)。这是最有效的低功耗技术之一——因为动态功耗与时钟翻转率成正比,关闭时钟等于切断功耗的“水龙头”。门控时钟让芯片进入“休眠模式”时不消耗无谓的电量,如同关掉不用的房间照明。
6.3.2 操作数隔离(不让信号乱跑)
操作数隔离是在不需要的模块输入处插入锁存器或门控,阻止无效信号传播。例如,一个乘法器只在特定操作时才开启输入,其他时候输入被强制为0,这样乘法器内部就不会做无用的翻转。操作数隔离就像给办公室每个工位装一个百叶窗:没人上班时拉下来,省电。
6.4 可测试性设计
6.4.1 扫描链(给电路装个体检仪)
扫描链技术将普通触发器替换为具有扫描功能的扫描触发器,这些扫描触发器串联成一条移位寄存器链。测试模式下,通过扫描链输入测试向量,捕获电路内部状态,再输出到芯片引脚。这相当于给芯片装了一个“全身CT扫描仪”,可以检测出制造缺陷。几乎所有的现代数字芯片都包含扫描链。
6.4.2 内建自测试(让芯片自己骂自己)
内建自测试(BIST)在芯片内部集成测试模式生成器和响应分析器,使芯片能自行运行测试并报告是否故障。例如,存储器BIST能自动产生地址和写数据,再读出比较数。如果数据对不上,BIST会输出“fail”信号——这时芯片等于在骂自己“我坏了”。BIST减少了对外部测试设备的依赖,是汽车电子、航天等领域不可或缺的技术。
7 现代逻辑设计技术与趋势
7.1 可编程逻辑器件
7.1.1 PAL、GAL、CPLD(童年回忆)
PAL(可编程阵列逻辑)是早期的可编程器件,用熔丝或EPROM结构实现与阵列、或阵列固定;GAL(通用阵列逻辑)是PAL的升级,可多次编程,且输出宏单元可配置。CPLD(复杂可编程逻辑器件)由多个GAL模块通过互连矩阵组成,适合中小规模设计。这些器件曾是大学生数字电路实验课的主角,如今虽被FPGA压制,但在简单胶合逻辑(glue logic)领域仍有用武之地。对于老一辈工程师来说,PAL和GAL就是他们的“童年回忆”——那时的编程器比现在手机还大。
7.1.2 FPGA(当代网红,莱迪思也要参战)
FPGA(现场可编程门阵列)由可配置逻辑块(CLB)、可编程互连和I/O组成。用户可以像搭积木一样用HDL设计任意逻辑,再通过烧写配置文件“固化”到芯片。FPGA在通信、人工智能、高速数据处理等领域大放异彩。主流厂商有Xilinx(现为AMD)、Intel(原Altera)、Lattice(莱迪思)等。Lattice近年凭借低功耗、小封装产品在边缘计算市场占有一席之地,参战激烈。FPGA是“当代网红”,它让硬件设计变得像软件一样灵活,同时也让很多软件工程师开始学Verilog。
7.2 高层次综合(用C语言写硬件?)
高层次综合(HLS)允许设计师用C/C++/SystemC等高级语言描述算法,然后由工具自动生成RTL代码。它极大地提高了设计效率,尤其适合复杂的数字信号处理和计算机视觉应用。但代价是生成的RTL质量通常不如手工编码,且在时序、面积控制上不够精细。HLS的流行让很多人惊呼“终于可以用C写硬件了”,但老派工程师则认为这是在“用软件思维玷污硬件圣殿”。无论如何,HLS正在成为快速原型设计的标准方法。
7.3 异步逻辑设计(挣脱时钟的奴隶制)
传统同步逻辑依赖全局时钟协调所有电路,但时钟分布网络在深亚微米工艺下越来越难以设计(时钟 skew、功耗)。异步逻辑设计没有全局时钟,通过握手协议(请求-应答)实现数据传递,理论上具有低功耗、高速、抗辐射等优点。然而,异步逻辑的设计和验证工具相对匮乏,且易出现死锁和竞争。多年来,它一直被视为“未来趋势”,但始终未能大规模普及。尽管如此,一些特殊领域(如智能卡、高可靠性航空航天系统)已成功应用异步设计。它试图让电路“挣脱时钟的奴隶制”,但能否真正“解放”硬件,还需要更成熟的EDA生态。