从模拟到数字:乘法器核心原理、实现与应用全解析

发布时间:2026/8/1 4:40:32
从模拟到数字:乘法器核心原理、实现与应用全解析 1. 从“神秘黑盒”到“不过如此”乘法器的祛魅之旅“乘法器”这个词听起来是不是有点唬人尤其是在电子工程、数字电路或者信号处理的领域它常常和“高速”、“高精度”、“复杂算法”这些高大上的词汇联系在一起仿佛是一个封装在芯片深处的神秘黑盒只有资深工程师才能驾驭。市面上像AD835这样的经典模拟乘法器芯片数据手册上密密麻麻的参数和曲线图更是加深了这种距离感。但今天我想和你聊聊这个所谓的“乘法器”到底是怎么一回事。我的核心观点是乘法器也不过如此这并不是说它技术含量低而是说一旦你理解了它的核心思想、基本构成和几种典型实现方式你就会发现它背后的逻辑清晰、直接完全可以从一个令人望而生畏的“黑盒”变成一个你可以理解、甚至可以自己动手搭建的“透明模块”。为什么会有这种感觉因为大多数教材和应用笔记都是从理想的数学模型或者复杂的集成电路内部结构开始讲起一下子就跳到了频域分析、非线性失真这些深水区。对于初学者或者只是想应用它的人来说这就像还没学会走路就被要求去跑马拉松。实际上无论是用于调制解调的模拟乘法器如AD835还是构成CPU核心的二进制乘法器其最根本的任务都极其单纯完成两个输入信号的乘法运算输出它们的乘积。我们完全可以从这个最朴素的需求出发一步步拆解看看为了实现这个“乘”人们都想了哪些聪明又直接的办法。当你跟着这个思路走一遍那些曾经令人头疼的“失调电压”、“带宽积”、“布斯算法”都会变得有迹可循。这篇文章我就带你抛开那些让人眼花缭乱的公式和缩写用最“人话”的方式聊聊乘法器的里里外外让你看完后能自信地说一句“哦原来就是这么回事”2. 乘法器的核心诉求我们到底要它做什么在深入电路细节之前我们必须先统一思想乘法器要解决的根本问题是什么这决定了它的形态和复杂度。2.1 信号世界的“搅拌机”模拟乘法器的使命在连续变化的模拟信号世界里乘法器就像一个高性能的“搅拌机”。它的输入是两个随时间连续变化的电压或电流信号比如一个音频信号V_A(t)和一个高频载波信号V_B(t)。它的输出V_OUT(t)理想情况下应该严格等于K * V_A(t) * V_B(t)其中K是一个常数称为标度因子通常为 0.1 或 0.2 V⁻¹ 等。这个简单的运算却是无数经典应用的基础幅度调制AM这是最直观的例子。让V_A(t)为低频的调制信号比如声音V_B(t)为高频的载波信号比如某个电台频率。乘法器的输出就是载波的幅度被调制信号实时控制的结果实现了信息的搭载。没有乘法器收音机里的广播就无法产生。混频/频率变换在收音机、手机等无线设备中需要将接收到的高频信号转换到一个固定的、更容易处理的中频。这通过将输入信号V_RF(t)与本振信号V_LO(t)相乘来实现。根据三角函数积化和差公式cos(ω_RF t) * cos(ω_LO t)会产生cos((ω_RFω_LO)t)和cos((ω_RF-ω_LO)t)两个新频率分量。通过滤波器选出差频分量就完成了降频。这是超外差接收机的核心。相位检测/鉴相器在锁相环电路中需要比较两个信号的相位差。如果两个同频信号sin(ωtφ1)和sin(ωtφ2)相乘输出会包含一个直流分量K*cos(φ1-φ2)。这个直流电压的大小就直接反映了两者的相位差用于驱动压控振荡器实现频率锁定。自动增益控制与压控放大器一个信号的幅度可以被另一个控制电压动态地缩放。此时乘法器就作为一个电压控制的可变增益放大器来工作。所以模拟乘法器的核心价值在于实现两个模拟信号的实时、连续相乘它是构建模拟信号处理系统尤其是通信系统的基石性元件。2.2 数字世界的“算盘珠”数字乘法器的角色到了离散的数字世界二进制乘法器的任务看起来更“单纯”计算两个二进制数的算术乘积。例如计算1011十进制11乘以1101十进制13得到结果10001111十进制143。但正是这种“单纯”在追求极致速度和能效的CPU、DSP、GPU内部催生了极其精巧和多样化的设计。数字乘法器是ALU算术逻辑单元的关键部件其性能直接影响处理器的整体算力。它的设计目标是在给定的芯片面积、功耗和时序约束下以最快的速度得到精确的或满足精度要求的乘积结果。从简单的移位相加到复杂的华莱士树、布斯编码算法各种技术演进都是为了优化“速度、面积、功耗”这个不可能三角。模拟与数字的桥梁有趣的是这两者并非完全割裂。像AD835这类模拟乘法器其内部也是由晶体管构成的非线性电路来实现乘法功能本质上可以看作一个“模拟计算单元”。而在一些混合信号系统中数字信号经过DAC转换后也可能需要与模拟信号进行乘法运算。理解它们的共同点和差异能帮助我们更好地在系统层面进行选型。3. 剥开集成电路的外壳模拟乘法器是如何“乘”的市面上有成品的模拟乘法器集成电路如AD834、AD835、MPY634等。我们不需要从头发明轮子但理解它们内部的大致原理对于正确使用、规避陷阱至关重要。它们通常基于一种称为“吉尔伯特单元”的核心拓扑结构。3.1 吉尔伯特单元跨导线性环的魔法吉尔伯特单元的精妙之处在于它利用双极性晶体管BJT或场效应管FET的跨导特性将乘法运算转化为电流的精密控制。其核心思想可以简化理解想象一个由四个完全相同的晶体管组成的交叉耦合结构一个“跨导线性环”。其中一对晶体管的基极或栅极接入输入信号X另一对接入输入信号Y。这四个晶体管的工作点被偏置在一个精心设计的区域。当输入信号变化时它会精确地调制流经每个晶体管的电流大小。关键来了这个电路的差分输出电流I_OUT在理想条件下与两个差分输入电压(V_X1 - V_X2)和(V_Y1 - V_Y2)的乘积成正比即I_OUT ∝ (V_X1 - V_X2) * (V_Y1 - V_Y2)。然后这个电流被后续的电路如运放构成的电流-电压转换器转换成电压输出。为什么这个结构能实现乘法深究其数学推导需要用到晶体管特性方程但我们可以做一个高度简化的定性理解每个晶体管的集电极电流与其基极-发射极电压呈指数关系。在吉尔伯特精心设计的对称结构中这种非线性的指数关系相互组合、抵消最终在输出端神奇地留下了两个输入电压的线性乘积项而高阶的非线性失真项被极大地抑制了。这就是模拟电路设计的艺术——用非线性元件构造线性运算。3.2 从理想走进现实模拟乘法器的关键参数与“坑”理解了理想模型我们才能看清现实器件的局限。数据手册上那些参数就是用来描述这些局限的。对于AD835这类器件你必须关注以下几点带宽与压摆率带宽指乘法器在小信号条件下输出随频率升高而下降3dB的频率点。它决定了你能处理多高频率的信号。AD835的-3dB带宽高达250MHz非常适合视频、中频等高速场合。压摆率指输出端电压变化的最大速率单位V/μs。当处理大信号或快速跳变的信号时压摆率可能成为限制因素导致输出波形失真。带宽描述“小信号跟踪能力”压摆率描述“大信号跳变能力”。线性度与失真理想的乘法器输出应严格是K*X*Y。但实际上总会存在一些非线性误差。数据手册会用“总谐波失真加噪声”、“线性误差”等指标来描述。在要求高的应用如精密测量中需要选择线性度更好的型号或在外部进行校准补偿。失调电压与馈通输入失调电压当两个输入端都接地输入为零时输出理论上应为零但实际上会有一个微小的直流电压这就是失调电压。它会被增益放大影响输出精度。馈通当其中一个输入为零时另一个输入的信号可能会“泄漏”到输出端。例如X输入为零Y输入有信号理想输出应为零但实际可能有很小的Y信号出现在输出端这叫Y到输出的馈通。这在高增益或要求高隔离度的应用中很讨厌。电源电压与输出摆幅乘法器需要工作在指定的电源电压下如AD835是±5V。其输出电压不可能达到电源轨通常有一个最大输出摆幅限制比如±2.5V。设计电路时必须确保输入信号的范围和标度因子K的选取能使输出始终工作在线性区内避免饱和削波。实操心得在使用像AD835这样的高速乘法器时PCB布局布线是成败的关键。电源必须用高质量的退耦电容通常是一个10μF钽电容并联一个0.1μF陶瓷电容尽可能靠近芯片电源引脚。输入输出走线要短并考虑阻抗匹配否则高频性能会大打折扣甚至自激振荡。这些细节数据手册的应用章节都会强调但新手最容易忽略。4. 自己动手搭一个分立元件乘法器电路初探虽然集成电路很方便但用分立元件搭建一个简易的乘法器电路是理解其原理的绝佳方式。这里介绍两种经典且相对容易实现的电路。4.1 对数-反对数乘法器把乘法变加法这是一种基于数学变换的思路。我们知道ln(A) ln(B) ln(A*B)。那么如果能找到一种器件其特性是对数关系的就可以利用这个性质。核心器件双极性晶体管BJT的基极-发射极电压V_BE与集电极电流I_C在很大范围内近似满足对数关系V_BE ≈ V_T * ln(I_C / I_S)其中V_T是热电压约26mVI_S是饱和电流。电路搭建思路用两个晶体管分别对两个输入电压V_X和V_Y先转换成电流I_X和I_Y取对数得到V_BE1和V_BE2。将这两个V_BE电压相加V_SUM V_BE1 V_BE2。再用第三个晶体管对这个相加后的电压取反对数指数将其转换回电流I_OUT。根据上面的公式推导最终的输出电流I_OUT将与I_X * I_Y成正比。再通过电阻将电流转换为电压。优点与局限优点概念清晰理论上能实现四象限乘法输入可正可负精度在一定范围内可以做得不错。局限严重依赖晶体管特性的一致性对温度极其敏感V_T和I_S都随温度变化。需要精心匹配晶体管对甚至使用集成在同一芯片上的晶体管阵列如MAT04来保证一致性。它更像一个原理验证电路不适合对温漂要求高的实际应用。4.2 脉冲宽度/幅度调制乘法器时间与幅度的游戏这是一种更直观、更容易用现代器件实现的方法。其核心思想是用一个输入信号去调制一个脉冲的宽度PWM或幅度PAM再用另一个输入信号去采样这个被调制的脉冲。PWM型乘法器思路将输入电压V_X转换成一个脉冲信号其脉冲宽度T_on与V_X成正比这就是一个PWM过程。将这个PWM信号作为一个高速开关的控制信号。将另一个输入电压V_Y通过这个开关。开关导通时输出为V_Y关断时输出为0。在开关的输出端接一个低通滤波器。滤波器输出的平均直流电压值就等于(T_on / T) * V_Y其中T是脉冲周期。由于T_on ∝ V_X所以平均输出电压V_OUT ∝ V_X * V_Y。优点与局限优点电路相对简单精度取决于PWM的线性度和滤波器的效果。特别适合数字系统与模拟系统的接口因为PWM很容易由单片机等数字器件产生。局限带宽受限于PWM频率和滤波器的响应速度。PWM频率必须远高于输入信号V_X和V_Y的最高频率分量否则无法准确重建。这限制了它在高频领域的应用。实操心得如果你用单片机如Arduino、STM32的PWM功能配合一个模拟开关芯片如CD4066和运放滤波器来尝试搭建会发现这是一个非常有趣的实验。它能让你直观地理解“时域”和“频域”的转换以及采样定理的重要性。注意模拟开关的导通电阻会引入误差选择导通电阻小且平坦的开关芯片很重要。5. 数字乘法器的演进从“笨办法”到“神操作”数字乘法器的世界是算法和硬件优化的竞技场。我们来看看为了更快地算出乘积工程师们都想出了哪些聪明的办法。5.1 最朴素的方法移位相加这是学习计算机组成原理时第一个接触的方法模拟我们手算乘法的过程。以两个4位无符号二进制数Aa3a2a1a0和Bb3b2b1b0为例初始化一个结果寄存器为0。从最低位开始检查乘数B的每一位b_i。如果b_i为1则将A左移i位后的值加到结果寄存器中如果为0则加0。检查完B的所有位后结果寄存器中的值就是乘积。例如1011 (11) * 1101 (13)。b01: 加1011- 结果:00001011b10: 加0000- 结果:00001011b21: 加10112 101100- 结果:00001011 00101100 00110111(55)b31: 加10113 1011000- 结果:00110111 01011000 10001111(143)为什么慢对于n位乘法它需要大约n次“检查-移位-相加”的循环。每次加法都可能产生进位传递导致关键路径延迟很长。在硬件上这需要n个时钟周期才能完成一次乘法在高速CPU中这是不可接受的。5.2 提速的关键布斯算法与部分积优化为了减少部分积的数量也就是减少需要相加的项数布斯算法应运而生。它通过观察乘数中连续的1将其转化为“加一次减一次”的操作从而减少加法次数。例如一串连续的1001110可以看作是010000 - 000010。这样就把多个加法合并成了更少的操作。现代处理器中的乘法器几乎都采用了基于布斯编码的变种。但更大的提速来自于对“加法树”的优化。移位相加产生的多个部分积需要被加起来。如何快速地把很多个数加起来阵列乘法器一种并行结构用与门生成所有部分积然后用一排排的全加器像搭积木一样把它们加起来。速度比串行的移位相加快很多但硬件复杂度门数量高且进位链仍然是延迟的主要来源。华莱士树一种革命性的方法。它不按常规的竖式加法而是用许多全加器和半加器以树状结构组织起来目标是以最短的时间最少的逻辑层级将所有部分积压缩成至多两个数例如和与进位最后用一个快速加法器如超前进位加法器将这两个数相加得到最终结果。华莱士树极大地缩短了关键路径是高性能乘法器的核心结构。5.3 现代处理器的选择融合与流水线在现代CPU和GPU中乘法器很少是孤立的。它通常与加法器融合在一起形成乘加单元。很多运算如点积、矩阵乘法、多项式求值本质上是A*B C的形式。单独的乘法和加法需要两个操作和两次舍入而乘加单元在一个硬件单元内一步完成速度更快精度也更高只进行一次舍入。此外乘法器会被深度地流水线化。即将一个乘法操作拆分成多个细小的阶段如生成部分积、压缩部分积、最终相加每个阶段由一个流水线寄存器隔开。这样虽然单个乘法操作的完成时间延迟没有减少但处理器可以像工厂流水线一样每个时钟周期都开始一个新的乘法操作从而极大地提高了吞吐率。你看到的CPU主频很高部分就得益于这种深入的流水线设计。避坑指南在FPGA上设计数字乘法器时需要特别注意时序约束。综合工具可能会根据你的代码如直接使用*运算符推断出一个乘法器。如果频率要求高必须查看综合报告中的时序分析确保乘法器的关键路径满足你的时钟周期要求。如果不满足可能需要手动实例化芯片原生的高性能DSP硬核如Xilinx的DSP48E1或者通过流水线寄存器打拍来降低组合逻辑延迟。6. 乘法器应用实战选型、设计与调试理论懂了最终要落到应用上。面对一个具体项目如何选择和用好乘法器6.1 模拟还是数字这是一个问题首先根据信号形式和应用目标做出根本性选择特性模拟乘法器 (如AD835)数字乘法器 (CPU/FPGA内部)信号类型连续时间模拟电压/电流离散数字二进制核心操作实时连续相乘V_out K*Vx*Vy二进制算术乘法速度/带宽带宽可达数百MHz甚至GHz实时无延迟速度取决于时钟频率和流水线深度有处理延迟精度受非线性、温漂、噪声限制典型精度0.1%-1%精度由位宽决定可轻松达到16位、32位甚至更高主要应用射频调制解调、混频、鉴相、压控增益通用计算、数字信号处理滤波、FFT、图形处理设计复杂度外围模拟电路设计偏置、滤波、布局要求高集成在芯片内通过编程或硬件描述语言调用简单决策流如果你的信号天生就是模拟的如天线接收下来的射频信号并且需要进行的运算是模拟域固有的如混频那么模拟乘法器是唯一选择。如果你的信号已经是数字的或者可以轻易数字化并且算法是离散的如FIR滤波那么数字乘法器是更优、更灵活的选择。6.2 模拟乘法器电路设计要点假设你选定了一款模拟乘法器IC比如AD835用于一个视频调制电路。设计时需关注电源与去耦这是高频电路的命门。必须使用低阻抗的电源层或宽走线。每个电源引脚到地之间紧贴芯片放置一个0.1μF的陶瓷电容用于滤除高频噪声和一个更大容量的钽电容如10μF用于提供瞬时电流。走线尽可能短。输入输出接口AD835是差分输入/输出但通常以单端方式使用。需要正确配置反馈电阻网络来设置标度因子K。数据手册会给出典型连接图。务必使用高精度、低温度系数的电阻如0.1%的金属膜电阻因为K的精度直接由这些电阻的比值决定。带宽与稳定性乘法器内部有高增益放大器如果输出负载电容过大可能引起相移导致振荡。可以在输出端串联一个小电阻如10-100Ω来隔离容性负载。同时检查在应用带宽内电源的去耦是否有效。失调电压校准对于直流或低频应用失调电压可能引入误差。很多乘法器提供了失调调整引脚如OFFSET X,OFFSET Y。可以通过一个电位计接入一个可调的补偿电压来手动调零。对于批量生产或高精度要求可能需要软件校准。6.3 数字乘法器的资源与优化在FPGA或嵌入式软件开发中资源评估在FPGA中一个没有优化的N位乘法器会消耗大量的查找表和触发器。例如一个16位*16位的乘法器可能消耗数百个LUT。设计时需要在速度和面积之间权衡。对于低速应用可以让工具综合成一个通用的乘法器对于高速应用必须调用器件专用的DSP Slice。定点与浮点大多数嵌入式处理器没有硬件浮点单元FPU浮点乘法靠软件模拟极其缓慢。在信号处理中大量使用定点数运算。你需要仔细确定数据的整数位宽和小数位宽在运算过程中注意中间结果的位宽扩展防止溢出和精度损失。例如两个Q15格式的定点数1位符号15位小数相乘得到的结果是Q30格式通常需要右移15位变回Q15格式。编译器优化在C代码中对于ARM Cortex-M系列带有硬件乘法器的MCU直接使用*运算符即可编译器会生成高效的乘法指令。对于没有硬件乘法器的老旧架构如某些8位单片机一个简单的乘法可能会被编译成冗长的库函数调用严重拖慢速度此时需要考虑用查表法或其它近似算法替代。一个真实的调试案例我曾用AD835做一个音频副载波调制电路输出总是有高频毛刺。用示波器看电源引脚发现即使在静态下也有几十MHz的噪声。最初以为是芯片自激折腾了半天。最后发现是示波器探头的地线夹子太长形成了一个环形天线拾取了空间噪声。改用探头自带的接地弹簧针紧贴测试点噪声立刻消失。这个教训告诉我在高频模拟电路调试中测量工具和方法本身可能就是问题的一部分。7. 超越基础乘法器的变体与前沿视野理解了基本乘法器我们可以看看它的“亲戚们”和一些有趣的发展。7.1 模拟变体乘除器、平方器、均方根检测器基于吉尔伯特单元可以衍生出其他功能模块乘除器在乘法器反馈环路中加入运放可以构造出输出等于(X*Y)/Z的电路用于模拟计算和自动控制。平方器/倍频器将同一个信号V同时连接到乘法器的两个输入端输出就是K*V^2。如果V是正弦波sin(ωt)则输出包含一个直流分量和一个2ω的倍频分量通过滤波即可得到倍频信号。均方根检测器结合平方器、低通滤波器和开方电路可以测量交流信号的真有效值这在功率测量中非常有用。7.2 数字前沿近似乘法器与存内计算为了满足人工智能、图像处理等场景对超低功耗和超高吞吐率的需求乘法器设计也在革新近似乘法器在图像、音频处理中人眼/人耳对绝对精度不敏感。近似乘法器通过有选择地简化部分积生成或压缩逻辑用极小的精度损失换取面积、功耗和速度的巨大提升。例如忽略部分低有效位的计算。存内计算这是颠覆冯·诺依曼架构的前沿方向。传统计算需要将数据从内存读到处理器乘完再写回这个过程耗能巨大。存内计算直接在存储单元如SRAM或新型非易失存储器中完成乘加运算彻底消除了数据搬运的开销能效比有望提升几个数量级特别适合神经网络这种大规模乘加运算负载。从用晶体管搭出第一个模拟乘法电路到CPU里纳秒级完成64位乘法的精密硬件再到为AI量身定制的近似与存内计算架构“乘法”这个最基础的运算驱动着一代又一代工程师去挖掘硅片的极限。回过头看它的核心目标始终没变又快又好地算出“A乘以B”。当你下次在代码里写下*或者在原理图上放置一个乘法器IC时希望你能会心一笑想起它里面那些精巧的结构和有趣的故事然后坦然地说“乘法器也不过如此”