ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

扇入扇出是什么?数字电路负载能力计算与FPGA高扇出优化实战

扇入扇出是什么?数字电路负载能力计算与FPGA高扇出优化实战 大二做数字电路实验那会儿我用一片74LS00搭一个三人表决器输出端顺手接了四个LED指示灯又引到下一级计数器的两个输入引脚。结果LED亮度明显不均匀计数器还偶尔乱跳。老师走过来问了一句“你算过这片的扇入扇出吗”我当时满脸疑惑后来才意识到扇入扇出是数字电路里最基础、也最容易坑人的参数。理解了它很多莫名其妙的电平异常、时序问题、FPGA布线拥塞都能一眼看穿。这篇文章想把扇入和扇出的概念、计算、查手册方法、实验测量以及高频场景下的修正一次性讲明白适合正在学数字电路的学生、刚入门的电子爱好者以及写FPGA时被max_fanout逼疯的开发工程师。1. 扇入和扇出到底在说什么1.1 从门电路的“口”说起先直观理解扇入就是一个逻辑门输入端的数量上限。74LS00是2输入与非门它的扇入就是274LS20是4输入与非门扇入是4有些CMOS门能做到8输入甚至13输入。这个参数决定了你能否把一个多变量逻辑表达式直接用一个门实现。比如你要一个6输入与门但手头只有4输入与门那就得把两个门级联起来代价是多一级延迟。扇入不是随便标的它受芯片内部的输入结构限制。TTL门的多发射极晶体管、CMOS门的串联输入级都会决定输入级能接受多少个信号同时还要保证每个输入在不同电平下都能被可靠识别。扇出是另一个方向的能力一个逻辑门输出端最多能驱动多少个下一级输入。说白了输出端不是无限能量的“电源”它提供的高电平电流和吸收的低电平电流都有上限。你可以把它理解成宿舍里的插线板插一个充电器没事插五个电暖器就跳闸。每个逻辑门输入端在工作时都会从驱动端抽取一点电流输出端的能力就那么多负载挂多了电平就会被拉偏。扇出系数就是衡量“这个输出能带多少扇入”的数值。这里要强调一个容易混淆的点扇入扇出描述的是逻辑门之间的负载能力关系不是单纯数引脚。一个2输入与非门扇入是2但它可以驱动20个同类门的输入也就是扇出系数20。扇入和扇出分别管输入侧和输出侧设计时两头都要看。1.2 扇出系数怎么算高电平一个数低电平一个数扇出系数不是查表查出来一个固定整数而是要通过数据手册里的电流参数算出来的。关键是分清拉电流和灌电流。输出高电平时输出端要向外“供”电流这个电流叫高电平输出电流IOH。对TTL来说IOH通常很小因为它的输出级上拉能力弱输出低电平时外部电流会“灌”进输出端这个电流叫低电平输出电流IOLTTL的灌电流能力通常比拉电流强得多。反过来下一级门电路输入端也有两个参数输入高电平电流IIH以及输入低电平电流IIL。驱动门带多少个负载门就要看它的输出电流能供得起多少个输入电流。计算公式很简单高电平扇出系数N_H |IOH / IIH|低电平扇出系数N_L |IOL / IIL|最终扇出系数N min(N_H, N_L)举一个经典的例子74LS00驱动同系列的74LS00。查手册典型参数IOH约-0.4mAIOL约8mA后级74LS00的IIH约20uAIIL约-0.4mA。注意IOL和IIH、IIL的方向不同计算时取绝对值就行。N_H 0.4mA / 20uA 20N_L 8mA / 0.4mA 20所以扇出系数为20。也就是说一片74LS00的输出理论上可以带20个74LS00输入端。但实际设计我从来不敢直接跑满20一般控制在10个以内原因后面会讲。CMOS的情况完全不同。CMOS门输入级是MOSFET栅极静态输入电流几乎是泄漏电流只有微安甚至纳安级别所以按直流算一个CMOS输出能带几千个CMOS负载。可是到了高频每个输入端的栅极电容都要充放电驱动能力就受电容限制了。所以CMOS电路的扇出更多是“动态扇出”要用频率和电容去估算。2. 为什么扇入扇出是数字电路设计的地基2.1 扇出过载的现场表现很多初学者觉得数字电路就是0和1电平只有高和低接多少负载都无所谓。实际上芯片输出引脚不是一个理想电压源它的内部有导通电阻驱动电流越接近上限输出电平就越容易偏移。当输出高电平被过多负载拉低低到后级输入高电平阈值VIH以下后级就无法可靠识别为1了。TTL的VIH典型是2VVOH规格往往要求不低于2.7V看起来还有0.7V的余量但如果扇出严重超限输出电压会一路掉到2V以下逻辑就乱了。我在实验室里遇到过经典的“灯亮但逻辑错”现象一个与非门输出接了8个TTL门输入再并联一个LED指示灯高电平从3.4V被拉到2.1V后级计数器频繁误触发。用示波器一看输出波形已经不再是干净的方波沿变得很缓还带毛刺。这就是扇出不足的典型症状。低电平方向也一样灌电流太多会让VOL抬升超过VIL0.8V后后级会把0误判成1。扇入过大也有问题。一个门内部如果有太多个输入端输入晶体管串联的等效电阻会变大信号传播延迟增加输出上升沿下降沿变差。所以芯片设计时不会无限增加扇入。设计电路时如果发现需要超过扇入的输入数量就必须做逻辑分解和多级级联但级联会带来额外延迟这就是“用面积换速度”的基本盘。2.2 TTL和CMOS的扇出思路完全不同TTL和CMOS的扇出处理逻辑不一样。TTL是电流驱动型输入级需要实实在在的基极电流所以计算扇出必须盯着IIH和IIL。TTL输出高电平拉电流能力弱高电平扇出往往比低电平扇出更紧张。CMOS是电压驱动型输入电流小到可以忽略但输入电容不可忽略信号翻转频率越高每个负载需要的瞬态电流越大。所以CMOS电路在低频时可以“一带多”高频时必须“少带快跑”。混合使用不同逻辑系列时扇出计算更要注意。比如用74HC00驱动74LS00HC输出高低电平电流通常在±4mA级别而74LS输入低电平电流约0.4mA按直流算至少能带10个74LS输入。反过来用74LS00驱动74HC00因为HC几乎不取静态电流理论上能带非常多但此时要优先检查电平兼容性而不是闷头堆负载。74LS的高电平输出能力偏弱直接驱动HC可能勉强最好加上拉电阻或者换成74HCT系列。我自己做项目时见到不同系列混用第一件事就是把数据手册翻出来把前级输出电流、后级输入电流列成一张表再算一遍扇出。很多板子不好好工作就是因为有人想当然“TTL带CMOS问题不大”结果高电平电压不够后级芯片一直处于临界状态时好时坏排查起来特别痛苦。3. 手把手算一次扇出从手册参数到电路设计3.1 查手册要抓的五个关键电流想要算准扇出必须学会看数据手册。很多同学拿到手册只会看逻辑功能和引脚图对电气特性表直接跳过这是不对的。与扇出直接相关的参数主要有五个IOH、IOL、IIH、IIL外加一个VOH/VOL的测试条件。我把74LS00和74HC00的典型参数整理成一张表大家可以照着这个思路去查自己用的芯片参数含义74LS00TTL74HC00CMOSVCC5VIOH输出高电平电流约-0.4mA约-4mAIOL输出低电平电流约8mA约4mAIIH输入高电平电流约20uA约±1uAIIL输入低电平电流约-0.4mA约±1uAVOH输出高电平电压典型3.4V最小2.7V约4.9VVOL输出低电平电压典型0.2V最大0.5V约0.1V输入电容每个输入引脚电容约5pF约3.5~10pF注意这些值是常见典型值不同厂家、不同批次会有差异正式设计一定要以手头芯片手册为准。我这里用典型参数是为了演示计算流程。以74LS00驱动74LS00为例计算过程如下确定驱动门输出能力IOH-0.4mAIOL8mA。确定负载门输入需求IIH20uAIIL-0.4mA。计算高电平扇出0.4mA ÷ 20uA 20。计算低电平扇出8mA ÷ 0.4mA 20。取较小值20并降额使用实际设计建议不超过10~12个。换成74HC00驱动74HC00直流扇出会大得吓人4mA除以1uA等于4000但这在工程上没有意义因为一旦频率上来电容负载会先让输出波形变烂。HC/HCT系列手册通常不直接给扇出系数就是因为它和频率强相关。3.2 高频和动态负载下的扇出修正动态扇出的核心是给输入电容充电。每个CMOS输入引脚都有几皮法到十几皮法的等效电容信号每翻转一次这些电容就要充放电一次。需要的电流可以估算为I ≈ C × ΔV × f。其中C是所有负载输入电容之和ΔV是电压摆幅f是信号翻转频率。举个例子一个74HC00输出驱动10个74HC00输入端每个输入端电容按10pF算总电容100pF信号从0到5VΔV按5V算翻转频率10MHz。那么需要的平均电流就是100pF × 5V × 10MHz 5mA。这已经超过HC输出4mA的能力了实际波形肯定会明显变缓。如果频率提高到50MHz需要的平均电流高达25mA单个HC门根本扛不住。这就是为什么FPGA里一个普通IO口带二十个引脚跑到几百兆时必然出时序问题。高速设计里扇出修正不能只算平均电流还要看瞬态电流和走线阻抗。驱动端内阻、负载电容、PCB走线电感连在一起会形成一个RC充放电回路扇出越大上升时间越长信号边沿越缓时序裕量越小。更麻烦的是扇出多会导致走线分叉形成桩线stub反射和振铃随之而来。所以业界有个不成文的经验普通信号在PCB上不要一带超过8到12个负载超过了就加缓冲器把负载分组。FPGA内部也是一样一个信号驱动几十个触发器时综合器会提示高扇出需要手动优化。4. 实验和工程中的扇入扇出处理4.1 实验课怎么测量扇出系数扇出系数不是只能看手册自己搭电路也能测。我建议初学者用74LS00做一次实测会对手册参数有更直观的感知。工具很简单一块面包板、一片74LS00、若干导线、一台万用表最好再加一台示波器。第一步把74LS00接成输出固定高电平的状态。比如把一个与非门的两个输入一个接高电平一个接低电平它输出就是高。用万用表测此时VOH应该在3.4V左右。第二步准备若干片74LS00把所有输入端都作为负载逐个并到被测输出节点上。每接一个负载测一次输出高电平。你会发现输出电压逐渐下降。下降到数据手册规定的最小VOH比如2.7V时看已经接了多少个负载这个数量就是高电平扇出系数的实测上限。低电平扇出同理把被测门输出置为低电平逐个挂负载观察VOL是否超过最大规格0.5V。测量时有个重要细节被测输出端不能再接LED、蜂鸣器、示波器探头之外的其他功能负载。LED本身就是一个大电流负载接了它会把扇出结果拉低示波器探头通常有10pF左右的输入电容对直流测量影响不大对高频测量影响很明显。想观察动态扇出就把同一个小电路输出接到一个方波源用示波器看输出波形随负载增加的变化。当边沿明显变缓、幅度下降、出现振铃说明已经接近能力极限了。4.2 FPGA开发中常说的高扇出和BGA扇出不是一回事学数字电路学到FPGA阶段会频繁遇到“fanout”这个词。大多数时候是指FPGA内部一个信号驱动的逻辑单元数量。比如一个复位信号rst_n同时驱动了两百个触发器的复位端Vivado或Quartus就会报告这是一个高扇出信号。高扇出会带来布线拥塞、延迟增大、时钟偏斜问题进而导致时序收敛困难。FPGA里限制扇出可以用综合约束。Vivado里常用的是MAX_FANOUT属性可以在XDC约束里写set_property MAX_FANOUT 16 [get_nets rst_n]综合器看到这个约束后会自动复制逻辑来降低扇出。Quartus里也可以在Assignment Editor里设置Fanout约束或者让综合器自动做寄存器复制。但依赖自动复制不是长久之计更稳妥的做法是在代码层面手动生成多份使能信号分布到不同区域降低单个信号的负载。这里必须提醒一下网上搜“fbga扇出”这个词很大概率是“FPGA扇出”的笔误。有些人在说FPGA内部高扇出优化有些人在说BGA封装PCB设计时的扇出也就是把BGA焊盘通过过孔拉线出来的过程。两者共享“fanout”这个词但含义完全不同。门电路的扇出是负载能力FPGA的扇出是逻辑复制和布线策略PCB的BGA扇出是过孔和走线规划。看到这个词先看上下文别搞混了。5. 常见问题速查表与排查技巧5.1 现象到原因的速查表工程中遇到逻辑异常怀疑跟扇入扇出有关时我一般按下面这张表快速定位现象可能原因处理建议输出高电平偏低且负载越多越低高电平扇出超限减少负载或加缓冲器/驱动器输出低电平偏高接近甚至超过VIL低电平扇出超限灌电流过大减少灌电流负载使用低电平驱动能力更强的器件信号边沿变缓波形振铃负载电容过大、扇出过多、走线分支过长减小扇出源端串联电阻匹配终端FPGA时序违例布线拥塞单一信号驱动过多寄存器加MAX_FANOUT约束手动复制寄存器不同逻辑系列混接时好时坏未按最恶劣扇出条件计算或电平不兼容查手册分别计算高低电平扇出必要时加电平转换输出端带LED后电路工作异常LED消耗了额外电流把LED用三极管或缓冲器隔离后再接这张表不是万能的但能覆盖大部分基础电路和FPGA工程里的扇出问题。遇到不确定的情况示波器永远是最好的朋友先看波形再怀疑逻辑。5.2 我的几条避坑经验最后分享几条我这几年被实际项目教训出来的经验。第一永远按最恶劣条件算扇出。手册上的典型值很好看但高温下IOH会变小低电压下驱动能力也会缩水。尤其电池供电的产品VCC降10%时输出电流可能就是原来的六七成。设计时按最差参数计算再留50%余量能省掉很多返工。第二上拉电阻、下拉电阻、LED、继电器线圈都会从输出端额外吸取电流。一个10k上拉电阻在5V下就是0.5mA的拉电流比一个TTL门的IIH大多了。不要只数门输入数量要把所有挂在输出节点上的直流负载都折成“等效输入”算进去。第三输入端悬空不等于没有负载。CMOS悬空输入会感应出不确定电平导致输出振荡、功耗上升甚至持续灌电流烧坏输入保护二极管。不用时要把输入接到确定电平这既是逻辑需要也是扇出计算的一部分。第四高速电路里扇出和时序是联动的。不要只追求“能驱动多少个门”还要关心“能不能在半个时钟周期内把波形充到识别阈值”。一个信号低扇出但走线很长和一个信号高扇出但走线很短哪个更容易出问题还真不好说。可靠的做法是在仿真里做信号完整性检查把每个分支的电容、阻抗都算进去。最后说一个我做FPGA时的实际案例一个enable信号接了二百多个触发器的时钟使能不加任何约束时综合后时序报告惨不忍睹。后来我把这个enable在四个区域内各复制了一份加上max_fanout限制再配合寄存器复制时序一下子收敛了。这也是扇出概念的工程意义它提醒你不要让一个输出承载太多东西该分组就分组该加缓冲就加缓冲。电子系统里很少有什么是“接得越多越好的”扇入扇出就是最早教会我这个道理的那一圈知识。
返回列表