ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

数字设计入门:德摩根定律、补码、卡诺图与CMOS门级优化

数字设计入门:德摩根定律、补码、卡诺图与CMOS门级优化

简介:《数字设计原理与实践》第四版习题答案文档,面向学习数字电路与逻辑设计的本科生、备考读者及需要核对课后练习的自学者,可用于梳理数字电路、数制转换、编码与控制器等基础知识点,并辅助排查解题思路。压缩包内共1个docx文件,约68KB,内容以章节习题参考答案和解题过程为主,覆盖逻辑门与真值表、进制互转、补码与反码、状态编码及CMOS电路分析等典型题目,并附有部分逻辑图与推导结果。文档已有1220人学习,适合在复习阶段对照教材逐章练习:既能核对八进制、十六进制与十进制转换答案,也能参考与门和或门等价简化、控制器编码计数、噪声容限计算等过程,理解数字设计的基本原理与分析方法。对需要查漏补缺、验证课后练习或准备课程考试的读者,这份答案可作为教材配套的对照材料,帮助定位易错步骤并整理常用解题套路。

1. 反相器包绕的与门为什么等于或门:一个反直觉的起点

《数字设计原理与实践 第四版 答案》第 1 章的第一道题,就抛出了一个反直觉的结论:一个 2 输入与门,每个输入和输出都串一个反相器,列完真值表你会发现,它和 2 输入或门的功能完全一样。很多人的第一反应是“信号全反了怎么还等于或门”,这背后是数字设计里最容易被轻视的一条定理——德摩根定律。搞懂它,你就理解了为什么“逻辑等价”不等于“电路相同”,也理解了后面所有化简、完全集合、CMOS 门级设计为什么都建立在同一套代数之上。这份答案把数制、编码、卡诺图、控制器一路铺开,但这道题是最好的入口,先把这个反直觉的点吃透,后面才不容易踩坑。

2. 数制与编码:补码为什么能把减法变成加法

数字设计的第一层功夫不在画电路,而在“数怎么表示”。同一个数值,用原码、反码还是补码,决定了后面的加法器能不能复用、溢出判断能不能一眼看出。很多人背下了“补码等于反码加一”,却说不清这个“加一”到底补的是什么,结果一到负数范围、溢出判断、状态编码这些地方就开始翻车。

2.1 进制转换的位权本质:八进制和十六进制为什么是二进制的分支

任何进制数展开都是位权求和:$N = \sum d_i \cdot r^i$,$r$ 是基数,$d_i$ 是第 $i$ 位数字。二进制基数是 2,八进制是 8,十六进制是 16,而 $8 = 2^3$、$16 = 2^4$,这意味着八进制每一位恰好对应 3 个二进制位,十六进制每一位恰好对应 4 个二进制位。所以进制之间的转换不需要做除法取余,只需要按位分组。

以答案里的1234₈为例,八进制每一位单独展开成 3 位二进制:

# 八进制 -> 二进制:每位展开为 3 位,不足补前导零 def oct_to_bin(s): return ''.join(format(int(ch), '03b') for ch in s) # 二进制 -> 十六进制:先右对齐补齐到 4 的倍数,再每 4 位一组 def bin_to_hex(s): pad = (-len(s)) % 4 s = '0' * pad + s return ''.join(format(int(s[i:i+4], 2), 'X') for i in range(0, len(s), 4)) print(oct_to_bin('1234')) # 1010011100 print(bin_to_hex('1010011100')) # 29C

oct_to_bin里format(int(ch), '03b')的03是关键:它强制补足 3 位,否则数字 1 会变成1而不是001,整个分组就错位了。bin_to_hex先用(-len(s)) % 4算出左侧要补几个零,保证长度是 4 的倍数,再切片转十六进制。答案里那一长串174637₈ = 1111100110011111₂ = F99F₁₆,本质就是这两步的组合,中间那步二进制只是过渡,真正起作用的是“3 位一组、4 位一组”的映射关系。

小数部分方向反过来:从小数点往右,八进制每 3 位、十六进制每 4 位一组。答案里7436.11₈ = 111100011110.001001₂ = F1E.24₁₆,整数部分往左分组、小数部分往右分组,两边独立处理,最后用小数点拼回去。这个“左右分组”的方向感,是后面所有转换题不出错的前提。

2.2 符号数值、反码、补码:三种表示法的设计取舍

有符号数在二进制里怎么存,历史上出现过三种方案,每一种都是对“减法怎么实现”这个问题的不同回答。

符号数值法最直观:最高位当符号位,0 正 1 负,其余位放绝对值。+25 是00011001,-42 是10101010。问题是它有两个零(00000000和10000000),而且做减法时硬件必须先比较绝对值大小、再决定谁减谁、最后补符号,电路复杂度直接翻倍。

反码法把负数定义为“正数按位取反”。-42 的绝对值 42 是00101010,取反得11010101。它解决了取负的运算问题,但零依然有两个(00000000和11111111),而且减法仍然要处理“循环进位”这个尾巴。

补码法在反码基础上再加一:-42 的反码11010101加一得11010110。这一步“加一”把两个零合并成了一个,同时让减法彻底变成加法——$A - B = A + (-B)_{补}$,硬件只需要一个加法器。答案里 -6 的补码是11111010,-111 的补码是10010001,验证方法就是“原码取反加一”,或者反过来“补码取反加一取负”。

用代码把三种表示并排看会更清楚:

def to_sign_magnitude(n, bits=8): if n >= 0: return format(n, '0{}b'.format(bits)) return '1' + format(-n, '0{}b'.format(bits - 1)) def to_ones_complement(n, bits=8): if n >= 0: return format(n, '0{}b'.format(bits)) return format((1 << bits) - 1 - (-n), '0{}b'.format(bits)) def to_twos_complement(n, bits=8): if n >= 0: return format(n, '0{}b'.format(bits)) return format((1 << bits) + n, '0{}b'.format(bits)) for n in (25, 120, 82, -42, -6, -111): print(n, to_sign_magnitude(n), to_ones_complement(n), to_twos_complement(n))

to_twos_complement里(1 << bits) + n是补码的数学定义:负数 $n$ 的 $bits$ 位补码等于 $2^{bits} + n$。比如 -42 在 8 位下是 $256 - 42 = 214$,二进制正好11010110。这个定义比“取反加一”更好记,也更好用——它直接说明了补码是一个模 $2^{bits}$ 的循环系统,负数就是“绕一圈”的正数。

补码胜出的根本原因不在表示本身,而在它能被同一套加法电路处理。符号数值和反码都需要额外的判断逻辑,补码不需要。这是数字设计里第一次出现“用表示法换电路复杂度”的取舍,后面卡诺图化简、完全集合、CMOS 门级优化,走的都是同一条思路。

2.3 溢出的判定:为什么两个负数相加得正数就翻车

补码的模运算有一个副作用:结果超出表示范围时会“绕回”到另一端,这就是溢出。答案里给了四组 8 位补码加法,其中两组溢出、两组不溢出,判断依据不是看最高位有没有进位,而是看符号位的变化。

规则很简洁:两个同号数相加,如果结果的符号位和操作数符号位不同,就发生了溢出。01011101 + 00110001 = 10001110,两个正数相加得负数,溢出;01100001 + 00011111 = 10000000,同样两个正数相加得负数,溢出。反过来11010100 + 11101011 = 10111111,两个负数相加仍是负数,没溢出。

为什么这条规则成立?因为补码的符号位同时承担“数值最高位”的角色。两个正数相加,真实和如果超过 $2^{bits-1}-1$,就会进位到符号位,把符号位从 0 顶成 1,结果看起来变成负数。两个负数相加同理,真实和低于 $-2^{bits-1}$ 时,符号位被“借”走,结果看起来变成正数。同号相加才可能溢出,异号相加永远不会溢出,因为异号的和一定落在两个操作数之间。

用程序验证这条规则比手算可靠:

def is_overflow(a, b, bits=8): s = a + b lo, hi = -(1 << (bits - 1)), (1 << (bits - 1)) - 1 return not (lo <= s <= hi) print(is_overflow(93, 49)) # True,对应 01011101 + 00110001 print(is_overflow(97, 31)) # True,对应 01100001 + 00011111 print(is_overflow(-44, -21)) # False,对应 11010100 + 11101011

lo和hi分别是 $bits$ 位补码能表示的最小值和最大值,超出就溢出。注意这里判断的是“真实和”,而不是“截断后的结果”,因为截断本身就会把溢出信息吃掉,只有拿真实和去比范围才可靠。

控制器状态编码里也有类似的“表示效率”问题。答案里 5 状态控制器用 3 位二进制编码,排列数是 $8 \times 7 \times 6 \times 5 \times 4 = 6720$;7 状态是 $8 \times 7 \times \cdots \times 2 = 40320$;8 状态因为 3 位只能表示 8 个码字,排列数和 7 状态相同。机械编码盘的“坏边界”则是另一个角度:$n$ 位编码盘有 $2^{n-1}$ 个坏边界,因为相邻码字如果有多位同时跳变,物理上不同位置的触点切换有先后,中间会短暂产生一个不存在的码字。这两个问题表面上是数数和排列,底层都是“编码方式和物理实现之间的错位”,跟补码溢出是同一类思维。

3. 布尔代数与卡诺图:化简背后的最小覆盖机制

逻辑函数有无数种等价写法,但落到门电路上,写法直接决定门数和延迟。布尔代数负责“证等价”,卡诺图负责“找最小”。这一章的核心不是记住几个公式,而是理解“最小覆盖”这个几何直觉——为什么圈得越大、圈得越少,电路就越省。

3.1 德摩根定理的优先级陷阱:X+Y·Z 的补为什么不是 X'·Y'+Z'

答案第 4 章有一道看起来很简单的题:根据德摩根定理,$X + Y \cdot Z$ 的补是什么?很多人会直接对所有变量取反、把与或互换,写成 $X' \cdot Y' + Z'$。这个答案错在运算顺序上:原式先算 $Y \cdot Z$,再和 $X$ 或,补运算必须尊重这个结构。

正确的推导是:

$$(X + Y \cdot Z)' = X' \cdot (Y \cdot Z)' = X' \cdot (Y' + Z') = X'Y' + X'Z'$$

第一步先把 $Y \cdot Z$ 当成一个整体,用 $(A+B)' = A'B'$;第二步对乘积项内部用 $(AB)' = A'+B'$;第三步展开。如果写成 $X'Y' + Z'$,在 $XYZ = 110$ 时原式和补式都会等于 1,这显然违反“函数和它的补不可能同时为 1”的基本性质。答案里点出的错误原因就是“没有考虑运算先后顺序”。

这个坑的教训是:德摩根定律不是“全部取反、与或互换”这么粗暴的字符串替换,它作用在“与/或”这一层结构上,而乘除优先于加减的直觉在这里同样成立——与运算优先于或运算。写补函数时先把表达式按与/或画成树,再自底向上逐层取反,比直接替换安全得多。

3.2 标准和与标准积:真值表到唯一表达

同一个真值表可以写出标准和(最小项之和)和标准积(最大项之积)两种规范形式。答案里 $F(X,Y) = \Sigma(1,2) = \Pi(0,3)$,意思是 $F$ 在输入 01 和 10 时为 1,在 00 和 11 时为 0。

标准和就是把所有输出为 1 的行写成最小项再或起来:输入 01 对应 $X'Y$,输入 10 对应 $XY'$,所以 $F = X'Y + XY'$。标准积则是把所有输出为 0 的行写成最大项再与起来:输入 00 对应 $(X+Y)$,输入 11 对应 $(X'+Y')$,所以 $F = (X+Y)(X'+Y')$。

两种形式逻辑等价,但门结构不同。标准和天然对应“与-或”两级结构,标准积对应“或-与”两级结构。答案里 4.9 的多个小题反复在两种形式之间切换,目的不是让你背公式,而是让你习惯“同一个函数可以从 1 的角度写,也可以从 0 的角度写”。当 1 的个数远多于 0 时,从 0 写标准积再取反,往往能得到更少的项。

3.3 卡诺图化简:奇异“1”单元与无关项 d 的利用

卡诺图把真值表排成格雷码方阵,相邻格子只有一个变量不同,所以几何上相邻的两个 1 可以合并消去一个变量,四个一圈消去两个,八个一圈消去三个。化简的目标不是“圈得漂亮”,而是“用最少的圈覆盖所有 1,每个圈尽量大”。

答案里反复出现“奇异 1 单元”这个概念,指的是只被一个最大圈覆盖、没有被其他圈共享的 1。它的作用是提醒你:这个 1 没有冗余覆盖,圈的选择必须包含它,否则化简结果就漏项。4.14 和 4.18 的多道题都在训练这个判断。

无关项(don't-care)是卡诺图里更微妙的部分。答案里 $F(W,X,Y,Z) = \Sigma(0,1,3,5,14) + d(8,15)$,$d$ 表示这些输入组合在实际系统中不会出现,或者出现了也不关心输出。化简时 $d$ 可以当 1 用(帮助圈变大),也可以当 0 用(不参与圈),完全看哪种选择让覆盖更省。这是一种“利用约束换面积”的设计智慧:系统本身不允许的输入,没必要为它设计确定的输出。

手动圈卡诺图容易漏,用代码枚举所有合法圈再选最小覆盖,是验证手算结果的好办法:

from itertools import combinations def minterms_from_expr(vars_count, ones): # ones 为输出为 1 的最小项编号集合 return set(ones) def can_merge(a, b): # 两个最小项只差一位时可合并 return bin(a ^ b).count('1') == 1 def find_implicants(ones, vars_count): # 简化演示:只找两两可合并的项 groups = [] for a, b in combinations(sorted(ones), 2): if can_merge(a, b): groups.append((a, b)) return groups ones = {0, 1, 3, 5, 14} print(find_implicants(ones, 4))

can_merge用异或的 1 的个数判断两个最小项是否只差一个变量,这是卡诺图相邻的代数本质。真实化简还要处理四个、八个的合并,以及无关项的取舍,但核心判断就是这个异或计数。手算时养成“先圈大圈、再补小圈、最后检查奇异 1”的顺序,比随手画圈可靠得多。

4. 完全集合与门级实现:为什么 NAND 能搭出一切

逻辑设计有一个很硬的结论:只要有 2 输入 NAND,就能搭出任何布尔函数。这不是工程技巧,而是代数结构决定的。理解“完全集合”的证明思路,你就能判断一个门族到底能不能独立成事,也能理解为什么 XNOR 看起来功能很强,却搭不出 AND。

4.1 完全集合的构造证明:NAND 怎么变出与、或、非

答案 4.39 的证明思路很干净:已知 AND、OR、INV 构成完全集合,只要证明 NAND 能分别实现这三者,NAND 就是完全集合。

实现 INV 最简单:把 NAND 的两个输入并接,$A \uparrow A = (A \cdot A)' = A'$。实现 AND:NAND 后面再串一个由 NAND 构成的 INV,$(A \uparrow B)' = ((AB)')' = AB$。实现 OR:两个输入各先过一个 INV,再送进 NAND,$(A' \cdot B')' = A + B$,最后一步正是德摩根。

这三步的实质是:NAND 自带“与+非”的复合能力,非可以自给自足,与可以通过“非非”还原,或可以通过德摩根从与和非变出来。整个证明没有引入任何新门,只靠 NAND 自身和连线。

XNOR 的失败则给出了反例。答案 4.41 指出,XNOR 一个输入接 0 可以实现 INV,但它无法“保留一个乘积项而消除另一个”。XNOR 的表达式是 $AB + A'B'$,两个乘积项是绑定的,你没法只留下 $AB$ 而扔掉 $A'B'$,所以搭不出 2 输入 AND,也就构不成完全集合。这个对比说明:完全集合的关键不是“功能多”,而是“能不能拆出基本的与、或、非”。

4.2 NOR3 和 OR2 的 CMOS 结构:P 管串联、N 管并联

到了晶体管层,逻辑门的结构有很强的规律。CMOS 反相器是 1 个 P 管上拉、1 个 N 管下拉。扩展到 NOR3,答案给的结构是“上部 3 个 P 管串联,下部 3 个 N 管并联”。

为什么是这样?NOR 的功能是“输入全 0 时输出 1”。上拉网络负责输出 1,条件是全 0,也就是三个输入都为低,对应的三个 P 管必须同时导通,所以串联;下拉网络负责输出 0,条件是任一输入为高,对应的 N 管任一导通即可,所以并联。串联对应“与”条件,并联对应“或”条件,这是 CMOS 门级设计里最基础的一条映射。

OR2 不能直接用 CMOS 搭,因为标准 CMOS 结构天然实现的是“反相”逻辑(NAND、NOR、NOT),所以答案的做法是在 NOR2 输出端级联一个 INV。这也是 CMOS 设计里常见的“反相逻辑优先”原则:先设计反相门,需要同相输出时再加一级反相。代价是多一级延迟,换来的是晶体管结构规整、尺寸好调。

4.3 从逻辑式到晶体管数:BUT 门的圈-圈优化

答案 6.31 和 6.32 的 BUT 门是整份材料里最能体现“表达式决定晶体管数”的例子。原始最小积之和是:

$$Y_1 = A_1B_1A_2' + A_1B_1B_2'$$ $$Y_2 = A_2B_2A_1' + A_2B_2B_1'$$

如果直接按二级与-或结构实现,每个乘积项要一个与门,最后再或,晶体管用量大约 40 只。但把表达式重新提取公因子:

$$Y_1 = (A_1B_1) \cdot (A_2B_2)'$$ $$Y_2 = (A_2B_2) \cdot (A_1B_1)'$$

结构立刻变了:先算 $A_1B_1$ 和 $A_2B_2$ 两个与项,再各自取反,最后交叉与。用圈-圈逻辑(先求反、再反一次)实现:

$$Y_1 = ((A_1B_1)' + (A_2B_2)')'$$ $$Y_2 = ((A_2B_2)' + (A_1B_1)')'$$

这两个式子共享中间项 $(A_1B_1)'$ 和 $(A_2B_2)'$,晶体管用量降到 20 只。答案明确写了“原设计中晶体管用量为 40 只”,优化后减半。

这个例子的意义不在省了 20 只管子,而在于它揭示了一个设计事实:逻辑等价的表达式,在门级和晶体管级的代价可能差一倍。卡诺图求的是“最小积之和”,但最小积之和不一定是最小晶体管数;多输出函数还要考虑共享子表达式。真正的门级优化需要在“表达式层”和“结构层”之间来回看,而不是化简完就结束。

# 共享子表达式示意:两个输出复用同一个中间项 a1b1 = A1 and B1 a2b2 = A2 and B2 y1 = a1b1 and not a2b2 # 复用 a1b1 y2 = a2b2 and not a1b1 # 复用 a2b2

代码里a1b1和a2b2各算一次、两个输出共用,对应的就是硬件里两个中间节点被多处扇出。门级优化的核心动作,就是把重复出现的子表达式提取成共享节点。

5. 常见问题排查:数制转换、补码与卡诺图化简里的 5 个血泪坑

这一章不按知识点组织,按“出错现场”组织。下面五条都是做这类题时反复出现的翻车点,每条都按“现象、原因、解决”拆开。看懂它们,比多做十道同类型题更省时间。

5.1 进制转换分组错位:八进制转二进制少补了前导零

现象:把1234₈转成二进制写成1010011100是对的,但把174637₈写成11111001100111111,位数多了一位,后面转十六进制怎么都对不上。

原因:八进制每位对应 3 位二进制,但数字 1 展开成1而不是001,高位少补了零,整个串的长度就不是 3 的倍数,分组边界整体偏移。

解决:转换前先确认“每位固定 3 位”,用format(int(ch), '03b')强制补零;转十六进制前先检查二进制串长度是不是 4 的倍数,不是就在左侧补零。养成“先对齐、再分组”的顺序,不要边转边猜。

5.2 补码溢出只看最高进位:把没溢出的算成溢出

现象:11010100 + 11101011最高位有进位,就判定为溢出,但答案说没有溢出。

原因:补码加法的最高位进位和“溢出”不是一回事。最高位进位只说明结果超出了 $bits$ 位能装的范围,但补码是模运算,这个进位会被自然丢弃;真正的溢出是“符号位被数值进位顶翻”,要看次高位到符号位的进位和符号位自身进位是否一致。

解决:用“同号相加结果异号”判断,或者用真实和去比 $[-2^{bits-1}, 2^{bits-1}-1]$ 的范围。不要盯着最高进位看,那个进位在补码里本来就是设计好要被丢掉的。

5.3 卡诺图没按格雷码排:相邻格其实不相邻

现象:卡诺图上明明画了两个相邻的 1,合并后却和答案对不上,或者化简结果多出一个变量。

原因:卡诺图的行列必须按 00、01、11、10 的格雷码顺序排,保证几何相邻的格子只差一个变量。如果按普通二进制 00、01、10、11 排,几何相邻的格子可能差两个变量,圈在一起就是错的。

解决:画卡诺图前先把行标列标写成格雷码,圈之前默念一遍“相邻只差一位”。圈完之后用代数验证:把圈对应的乘积项写出来,代入几个边界输入看是否覆盖正确。

5.4 无关项 d 全当 1 用:圈变大了但引入了多余项

现象:带无关项的化简题,把所有 $d$ 都圈进去,结果表达式比答案多一项,或者某个本不该为 1 的输入被覆盖了。

原因:无关项的意思是“这些输入不会出现,或者输出无所谓”,它可以帮助圈变大,但不是必须圈。全当 1 用会让圈覆盖到本可以不关心的区域,反而增加项数;全当 0 用又可能错过更大的圈。

解决:先把必须覆盖的 1 圈完,再看剩下的 $d$ 能不能帮助现有圈变大,能帮就圈、不能帮就放着。判断标准是“圈变大后能否消去变量”,而不是“$d$ 有没有被覆盖”。

5.5 多级门延迟直接按级数乘:忽略了扇出和负载

现象:答案 6.10 里从输入到输出经过 6 个 NAND2,每个最大延迟 9ns,总算 54ns,但实际电路里某一段可能因为扇出大而更慢。

原因:门延迟不是常数,它和负载电容、扇出数、输入斜率都有关。答案给的是“最大时间延迟”这种器件手册参数,实际估算时如果某级扇出远大于 1,那一级的延迟会明显高于标称值。

解决:先按级数乘得到下限,再检查每一级的扇出。扇出大的节点要单独加缓冲,或者用答案里那种“最大延迟”参数做保守估计。纯逻辑深度估算只能当起点,不能当最终结论。

6. 设计取舍:逻辑图很完美,物理世界不买账

数字设计最容易被误解的一点,是把逻辑图和电路画等号。逻辑图上 0 和 1 是理想值,到了物理层,0 是一个电压范围、1 是另一个电压范围,中间还有一片“不确定区”。答案第 3 章用噪声容限、导通电阻、RC 时间常数这几个参数,把逻辑图拽回了现实。

噪声容限算的是“还剩多少余量”。高态噪声容限等于 $V_{OHmin} - V_{IHmin}$,低态等于 $V_{ILmax} - V_{OLmax}$。答案里高态阈值 3.5V、低态阈值 1.5V,查反相器特性曲线得到对应输入 2.4V 和 2.5V,于是高态容限 $3.5 - 2.5 = 1V$,低态容限 $2.4 - 1.5 = 0.9V$。这两个数不是随便算的,它们决定了电路在多嘈杂的环境里还能不能正确识别电平。容限越小,布线、电源波动、温度漂移就越容易把它吃掉。

导通电阻和驱动能力是另一组取舍。答案 3.26 用两组输出电压电流关系联立方程,解出 P 管约 151Ω、N 管约 60Ω;3.27 再用这些参数判断 820Ω 接地负载能不能驱动,算出电流 4.683mA 超过 4mA 上限,结论是不能。这里没有“理论上可以”的模糊空间,电流超了就是超了,器件的 $I_{OLmax}$ 是硬约束。

RC 时间常数则解释了“为什么门有延迟”。答案 3.68 把反相器下降过程等效成一阶电路,初态 4.45V、终态 0.2V、等效电阻 90Ω、时间常数 9ns,从 3.5V 到 1.5V 的下降时间约 9ns。公式 $\Delta t = \tau \ln(\frac{V_H - V_L}{V_{target} - V_L})$ 里,$\tau = RC$ 是电路本身决定的,阈值电压是系统决定的,两者一乘就是延迟。想快,要么减小电阻,要么减小电容,没有第三条路。

把这些参数放在一起看,会发现数字设计从头到尾都在做同一类取舍:表达式越简,门越少,但可能扇出变大;门级优化省了晶体管,但可能多一级反相延迟;提高电源电压能加快充放电,但动态功耗按 $CV^2f$ 涨。答案 3.34 明确说电源电压增加 5% 比电容增加 5% 更耗功率,就是因为功耗对电压是平方关系。

我自己的习惯是,每次看到一份化简得很漂亮的逻辑图,都强制问三个问题:最坏情况下的噪声容限还剩多少、最大扇出节点的延迟有没有单独算过、驱动电流有没有踩到器件上限。这三问不解决,逻辑图再优雅也只是纸面功夫。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表