想象一下一所管理严格的学校:组合电路就像墙上的值日表——今天谁扫地被打印得清清楚楚,可它完全不记得昨天谁扫过;时序逻辑电路则像班级日志——它记着昨天发生了什么,每天都根据“昨天的记录+今天的新安排”来更新自己。让这一切有序运转的,是全校统一的上下课铃声(时钟信号);在铃声响起那一刻做出记录动作的,是各种“岗位”(触发器);而“铃响前必须坐好、铃响后不许乱动”的考场纪律,就是建立时间和保持时间。当你理解了这套“学校作息制度”,你就能看懂CPU如何记住指令、电梯控制器如何记住楼层、手机里的状态机如何切换运行模式——时序逻辑电路是所有智能硬件的记忆骨架。

岗位关联

学懂时序逻辑,你才算真正理解了“硬件如何记住事情”——这是数字IC设计、FPGA开发、嵌入式系统工程师的必修地基,也是面试中数字电路考点的核心。

目录
  1. 可视化演示
  2. 1. 时序电路概述
  3. 2. 时钟与触发机制
  4. 3. 锁存器原理
  5. 4. 触发器类型
  6. 5. 状态方程
  7. 6. 时序约束
  8. 7. 状态机设计基础
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

1. 时序电路概述

教室墙上贴着一张值日表,它只根据“今天是周几”这个当前输入告诉你今天谁扫教室,它完全不知道昨天发生过迟到还是表扬——这就是组合逻辑。而班级日志不同,它翻开的第一行永远写着昨天的事,今天记什么,要参考昨天的记录再结合今天的新情况。时序逻辑电路就是那本班级日志:输出不仅取决于当前输入,还取决于电路之前记住的状态。

把“昨天的记录”变成电路,靠的是反馈回路:把电路的某个输出“绕个弯”接回自己的输入端。就像老师让你写完作文后回头读一遍再修改,改完再读一遍,直到满意——输出会影响下一次的输入,形成一条环形的自我修正链。有了反馈,信息才能在一圈一圈的循环中“留下来”,这便构成了存储。

要让全班几十个人在同一时间翻开日记、在同一时间落笔,需要统一的节拍——时钟信号。墙上挂钟的秒针每跳动一次,大家同步记录一次;时钟每产生一个脉冲,电路就统一更新一次状态。这种全体跟随同一个节拍工作的电路,叫做同步时序系统。它把“大家各记各的”变成“全校按同一节奏活动”,这是现代数字芯片几乎所有电路的组织方式。

回头看,组合电路那张值日表没有记忆,所以它处理不了任何需要“看历史”的任务;时序逻辑这本班级日志,因为有了反馈回路和统一时钟,才能记住昨天、计算明天。闹钟响了,新的一天开始,$Q_n$ 更新成 $Q_{n+1}$——这就是硬件世界里最朴素的“记忆”。

Qn+1=f(Xn,Qn)Q_{n+1} = f(\mathbf{X}_n, Q_n)
这个式子概括了时序逻辑的本质:下一个时刻的状态 $Q_{n+1}$ 由当前输入 $\mathbf{X}_n$ 和当前状态 $Q_n$ 共同决定——“明天记什么,看今天的安排,也看昨天记了什么”。
  1. 次态符号 $Q_{n+1}$表示下一个时钟脉冲到来后,电路将要进入的新状态,“明天的日记内容”。
    Qn+1Q_{n+1}
  2. 输入集合 $\mathbf{X}_n$当前周期来自外部的所有输入信号,“今天新发生的安排”。
    Xn\mathbf{X}_n
  3. 当前状态 $Q_n$此刻触发器里保存的值,“昨天留下的记录”。
    QnQ_n
  4. 状态转移函数 $f$由门电路组成的映射规则,决定看到什么就记什么、还是保持不变,“老师的批注规则”。
    f(Xn,Qn)f(\mathbf{X}_n, Q_n)

2. 时钟与触发机制

学校门口有两种工作人员:门卫和哨兵。门卫的性格是“透明”的——只要放行信号一直高着,外面的人流就源源不断涌进校门;哨兵则不同,他只在哨声响起的那一瞬间抬头瞥一眼,其余时间无论门口多吵都纹丝不动。前者叫电平触发,后者叫边沿触发。

时钟信号一般是一个方波脉冲,它周期性地在低电平(0)和高电平(1)之间跳变。所谓电平触发,指的是在时钟为高电平的整个时间段内,电路都处于“放行”状态:数据随时可以流入,像门卫一直敞着门。所谓边沿触发,指的是只关心时钟从低跳变到高的那个瞬间(上升沿),或者从高跳变到低那个瞬间(下降沿):数据只有在那个“咔嚓”瞬间被采样,其余时间一律被拒之门外。

为什么边沿触发更可靠?想象一百个班级同时靠门卫放行,只要有人晚到,门就一直开着,整个秩序就被打乱。而统一使用哨兵后,所有人都在哨声响起那一刻整齐行动,之后哪怕有人迟到,也不影响已经记录好的结果。因此同步时序系统几乎都采用边沿触发,用同一个全局时钟让所有触发器在边沿同步采样,避免数据在多个时刻“偷偷溜进来”造成的混乱。

门卫式的电平触发虽然实现简单,但容易让数据“一路畅通”地穿透电路,造成不可预测的竞争;哨兵式的边沿触发则用“只在一瞬间采样”的纪律换来了确定性。真正优秀的数字设计师,都偏爱哨兵——把每个触发器都调教成只在时钟边沿行动的可靠卫兵。

fclk=1Tclkf_{\mathrm{clk}} = \frac{1}{T_{\mathrm{clk}}}
时钟频率与周期互为倒数:铃声一分钟响 60 次,每次间隔 1 秒;时钟频率 100 MHz 意味着周期 10 ns,每个周期就是一次“哨声到下一次哨声”的完整循环。
  1. 时钟频率 $f_{\mathrm{clk}}$每秒时钟脉冲跳动的次数,可以理解成“一分钟响几次铃”,单位赫兹(Hz)。
    fclkf_{\mathrm{clk}}
  2. 时钟周期 $T_{\mathrm{clk}}$相邻两个上升沿之间的时间间隔,“两声哨响之间的等待时间”。
    TclkT_{\mathrm{clk}}
  3. 倒数关系周期越短,频率越高;频率越高,单位时间内同步采样的机会越多,“铃响得越密,节奏越快”。
    1Tclk\frac{1}{T_{\mathrm{clk}}}

3. 锁存器原理

教室里的灯有一个最原始的开关:一个按钮 S 负责开灯,另一个按钮 R 负责关灯,两个都不按时灯保持原状。这就是SR 锁存器——最基础的存储单元。它由两个交叉耦合的或非门(或与非门)组成,输出端 $Q$ 和 $\overline{Q}$ 互相接回对方的输入,形成我们前面说的反馈回路。

SR 锁存器的行为可以用一句话概括:S 置 1,R 置 0,都没按就保持。但有个禁忌——S 和 R 同时按下会进入不定态,就像同时按下“开”和“关”,灯到底是亮是灭谁也不知道,这对应了约束条件 $SR = 0$,即两个输入不能同时为 1。

为了让锁存器能被时钟统一控制,设计师加了一个“放行开关”——使能信号,得到门控锁存器。使能为高时,S 和 R 信号能通过大门控制电路,锁存器处于“透明”状态,输入什么输出就跟着变;使能为低时,大门紧闭,输出保持原样。这就好比门卫只在放行信号高时放人进门,平时把门锁得死死的。正因为它对电平高低“有求必应”,我们称其为电平敏感器件。

锁存器的“透明”既是优点也是隐患:门一直开着,数据就像人流一样随意穿过,等到门关上时里面到底是谁,取决于关门前的最后一秒。这种不确定性在复杂系统里很危险,于是我们更需要只认边沿的触发器——下一节出场的主角。

Qn+1=S+R‾ Qn(SR=0)Q_{n+1} = S + \overline{R}\,Q_n \quad (SR = 0)
这就是 SR 锁存器的特性方程:S 为 1 时无条件置位;S 为 0 且 R 为 0 时保持当前状态;R 为 1 时清零(此时 S 必须为 0)。“按开灯就亮,按关灯就灭,都不按就保持现状,禁止同时按”。
  1. 置位项 $S$S=1 时,不管原来状态如何,次态强制变为 1,“开灯按钮按下,灯必亮”。
    SS
  2. 复位取反项 $\overline{R}\,Q_n$当 S=0 时,若 R=0,则保留 $Q_n$ 原值;若 R=1,则 $\overline{R}=0$,“关灯按钮按下,灯必灭”。
    R‾ Qn\overline{R}\,Q_n
  3. 约束条件 $SR = 0$S 与 R 不能同时为 1,否则两个反馈环路互相拉扯,输出陷入不定态,“开与关同时按下是事故操作”。
    SR=0SR = 0

4. 触发器类型

学校有几种特殊的传令岗位,每种岗位的工作规则不同。D 触发器是最忠实的传令兵:哨声(时钟边沿)响起时,上级说什么(输入 D),他就一字不差地复述给下一班(输出 Q);哨声不响时,他一个字都不说,牢牢记住上一条命令。D 触发器的特性方程简单得惊人:

JK 触发器是纪律委员,规则更全面:J 像“记过”命令,K 像“撤销”命令,两个都不发就维持现状,两个同时发就“换人”(翻转状态)。T 触发器则是电灯开关,每来一次时钟脉冲就翻一次面——亮变灭、灭变亮,专为“计数”而生。此外,它们通常还带有异步的置位(Preset)和复位(Clear)端,像紧急按钮一样可以无视时钟立刻把状态强置为 1 或 0。

岗位虽多,核心思想一致:边沿到来前它们忠于旧状态,边沿到来那一刻才听新指令。传令兵、纪律委员、开关,本质上都是“只在哨声响起时行动”的边沿触发存储器,区别只在于响应不同输入时各自的规则表。

Qn+1=DQ_{n+1} = D
含义是“时钟边沿到来时,输出直接等于输入 D”,像复读机一样精确,因此 D 触发器是数字电路里用得最广泛的“记录员”。
  1. 数据输入 $D$传令兵听到的最新命令,“上级此刻的指示”。
    DD
  2. 次态输出 $Q_{n+1}$边沿过后触发器的新状态,“传令兵复述出去的命令”。
    Qn+1Q_{n+1}
  3. 等号关系边沿时刻 D 是什么,Q 就被更新成什么,中间没有任何折扣,“原话照传”。
    Qn+1=DQ_{n+1} = D

5. 状态方程

每个岗位的“规则表”用数学写出来,就是特性方程。JK 触发器之所以被称为“全能触发器”,是因为它的规则覆盖了置位、复位、保持、翻转四种动作,而且消除了 SR 锁存器的不定态。它的特性方程是数字电路笔试和面试的常客:

由 JK 触发器可以派生出其他触发器:令 $J = K = T$,就得到 T 触发器的特性方程 $Q_{n+1} = T \oplus Q_n$(异或:T=1 翻转,T=0 保持);令 $J = D,\ K = \overline{D}$,就退化为 D 触发器。反过来,用一张激励表查每种触发器从状态 $Q_n$ 变到 $Q_{n+1}$ 所需的输入条件,就能把任意状态转移需求翻译成具体电路,这就是次态逻辑设计。规则手册在手,任何岗位都能按表办事。

Qn+1=JQn‾+K‾QnQ_{n+1} = J\overline{Q_n} + \overline{K}Q_n
J 负责置 1、K 负责置 0、两者都为 0 时保持、两者都为 1 时翻转。这个方程把四种情况压缩进一个式子,是分析时序电路的基础工具。
  1. 置位项 $J\overline{Q_n}$当 J=1 且当前状态为 0 时,次态置为 1,“记过命令生效,记录从 0 变 1”。
    JQn‾J\overline{Q_n}
  2. 保持/复位项 $\overline{K}Q_n$当 K=0 时保留当前状态;K=1 时这一项消失,“撤销命令发出,记录被清除”。
    K‾Qn\overline{K}Q_n
  3. 或运算 $+$两项任一成立,次态即为 1,“记过或未撤销都会让记录保持为 1”。
    ++
  4. 翻转特例当 J=K=1 时,若 $Q_n=0$ 则第一项使次态为 1;若 $Q_n=1$ 则第二项为 0,次态为 0——恰好翻转,“纪律委员下令换人”。
    Qn+1=Qn‾Q_{n+1} = \overline{Q_n}

6. 时序约束

考试铃声响起的那一瞬间,考场有两条铁律:铃响之前,笔袋里的笔必须已经放好(建立时间);铃响之后,笔不能再有任何多余动作(保持时间)。对触发器来说,数据输入 D 也有类似要求——上升沿到来前必须稳定一段时间,这就是建立时间 $T_{\mathrm{setup}}$;上升沿到来后 D 还必须继续稳定一段时间,这就是保持时间 $T_{\mathrm{hold}}$。违反任何一条,触发器就可能读到“半个数据”,输出进入亚稳态——既不是 0 也不是 1 的中间状态,像考场里有人趴在桌上既不像答题也不像睡觉。

除了这两个窗口,数据在电路里传播也需要时间:触发器从看到时钟边沿到输出真正变化要花 $T_{\mathrm{cko}}$,中间经过的组合逻辑要花 $T_{\mathrm{logic}}$。把这些时间串起来,就得到时钟周期必须满足的不等式:

让所有路径都满足这个不等式,电路才能在目标频率下可靠工作,这叫做时序收敛。数字芯片设计师每天都在跟这几个时间打交道:流水线切得太深,逻辑延迟变小但寄存器增多;频率拉得太高,时序就收不拢——就像把课间从十分钟压缩到一分钟,全校都会乱套。

Tclk≥Tcko+Tlogic+TsetupT_{\mathrm{clk}} \ge T_{\mathrm{cko}} + T_{\mathrm{logic}} + T_{\mathrm{setup}}
一句话:下一声铃响之前,新数据必须已经“跑完全程并在考场坐好”。如果时钟周期太短,数据还在路上就被要求采样,电路就会算出错误结果。
  1. 输出延迟 $T_{\mathrm{cko}}$时钟边沿到触发器输出真正改变的时间,“老师喊起立,学生真正站起来要花的时间”。
    TckoT_{\mathrm{cko}}
  2. 逻辑传播延迟 $T_{\mathrm{logic}}$数据穿过中间组合电路的总耗时,“数据从教室这头传到那头的路程时间”。
    TlogicT_{\mathrm{logic}}
  3. 建立时间 $T_{\mathrm{setup}}$边沿到来前数据必须提前稳定的最短时间,“铃响前必须坐好的提前量”。
    TsetupT_{\mathrm{setup}}
  4. 不等式时钟周期必须不小于三者之和,否则数据无法按时稳定,“铃响太密,学生永远来不及坐好”。
    Tclk≥Tcko+Tlogic+TsetupT_{\mathrm{clk}} \ge T_{\mathrm{cko}} + T_{\mathrm{logic}} + T_{\mathrm{setup}}

7. 状态机设计基础

如果用一个总表安排学校的一天——上课、自习、吃饭、休息、放学——每到一个时间点就切换到下一个阶段,这张总表就是有限状态机。状态机是时序逻辑的集大成者:它以触发器存“现在处于哪个阶段”(状态),以组合逻辑决定“看到什么条件就切到哪个阶段”(状态转移)。电梯停在几楼、自动售货机找零几步、CPU 执行到哪条指令,背后都是状态机。

设计状态机通常分四步。第一步画状态图:每个圆圈是一个状态,箭头上的标记是转移条件,一眼看清所有可能路径。第二步做状态编码:给每个状态分配二进制编号,状态数 $N$ 与所需触发器数 $m$ 的关系如下:

第三步列出状态转移表:把状态图的信息逐行翻译成当前状态+输入条件→次态、输出的表格,这是程序员的“需求文档”。第四步把转移表映射到触发器激励输入上,就得到最终电路。至此,从一本班级日志开始,我们一路走到了能设计完整“学校作息总表”的水平——这就是时序逻辑电路基础的全貌。

m=⌈log⁡2N⌉m = \lceil \log_2 N \rceil
状态多到 2 的幂次之间时,取上界:8 个状态需要 3 个触发器,9 个状态则需要 4 个——“半个触发器买不到,只能多买一个”。
  1. 状态数 $N$状态图里圆圈的总个数,“作息表里一共几个阶段”。
    NN
  2. 以 2 为底的对数 $\log_2 N$需要多少位二进制才能数得过来,“每个触发器存 1 bit,能区分两种状态”。
    log⁡2N\log_2 N
  3. 上取整 $\lceil \cdot \rceil$结果不是整数时向上取整,“9 个状态需要 4 位,宁可多一位也不能少”。
    ⌈⋅⌉\lceil \cdot \rceil
  4. 触发器数量 $m$最终需要的触发器个数,“安排几个哨兵分别记住状态的一位”。
    mm

AI 应用场景

场景 1:CPU 流水线中的时序收敛

阶段:数字IC设计/验证(时序分析)

解决的问题:CPU 主频要跑到 3 GHz,意味着时钟周期只有约 0.33 ns。设计时如果某条组合逻辑路径的传播延迟加上建立时间超过周期,整条流水线就会采样到错误数据,芯片直接“算错”。工程师用静态时序分析工具遍历所有路径,检查 $T_{\mathrm{clk}} \ge T_{\mathrm{cko}} + T_{\mathrm{logic}} + T_{\mathrm{setup}}$ 是否成立,不满足就在路径中间插入寄存器(流水线切级)缩短单级延迟。

具体案例:某 AI 加速芯片设计团队在 7 nm 工艺下做卷积运算单元,发现乘法器路径延迟 0.9 ns 超过 1 GHz 周期预算,通过在乘法器中间插入两级流水寄存器,把每级延迟压到 0.45 ns,最终达成时序收敛并提升吞吐率。

场景 2:FPGA 跨时钟域信号同步

阶段:FPGA 开发/硬件调试

解决的问题:一颗芯片里往往有多个时钟域(比如 AI 加速器的 500 MHz 计算时钟和 100 MHz 接口时钟),信号从一个时钟域进入另一个时钟域时,很容易在触发器建立/保持时间窗口内变化,导致亚稳态。经典解法是用两级 D 触发器串联做同步器:第一级承担“冒险吸收”的风险,第二级输出稳定信号。

具体案例:某 FPGA 加速卡在做高速数据采集时,ADC 的 250 MHz 采样数据进入 FPGA 内部 200 MHz 逻辑时钟域,工程师插入两级 D 触发器同步器后,长时间运行误码率从偶发变为 0,验证了边沿触发采样和时序约束的工程价值。

场景 3:自动售货机的状态机控制

阶段:嵌入式系统设计(状态机建模)

解决的问题:自动售货机需要记住“已投入多少钱”这个历史状态,才能决定是否出货和找零。用纯组合逻辑无法实现,必须用状态机:空闲、投币、选货、找零、出货五个状态,每个状态对应一组时钟驱动的触发器存储。

具体案例:某无人售货机主控用 5 个 D 触发器和状态转移表实现投币流程:投入 5 元硬币时状态从“空闲”跳到“已投 5 元”,再投入 5 元进入“可出货”,按下货按钮后根据状态编码决定出货还是找零,整个逻辑用几十行 Verilog 即可描述。

Python 演示

python44 行
class DFlipFlop:    def __init__(self):        self.q = 0     def clock_edge(self, d):        # sample input on rising edge, keep until next edge        self.q = d        return self.q  class JKFlipFlop:    def __init__(self):        self.q = 0     def clock_edge(self, j, k):        q = self.q        if j == 1 and k == 0:      # set to 1            self.q = 1        elif j == 0 and k == 1:    # reset to 0            self.q = 0        elif j == 1 and k == 1:    # toggle            self.q = 1 - q        # j == 0 and k == 0: keep current state        return self.q  def simulate():    dff = DFlipFlop()    jk = JKFlipFlop()    n = 8    d_inputs = [0, 1, 1, 0, 0, 1, 1, 0]    jk_inputs = [(0, 0), (1, 0), (1, 0), (0, 1),                 (1, 1), (1, 1), (0, 0), (1, 0)]    print("cycle  D  Qd   J  K  Qjk")    for i in range(n):        d = d_inputs[i]        j, k = jk_inputs[i]        qd = dff.clock_edge(d)        qjk = jk.clock_edge(j, k)        print(f"{i}  {d}  {qd}   {j}  {k}  {qjk}")  if __name__ == "__main__":    simulate()
目的:用 Python 模拟 D 触发器和 JK 触发器在 8 个时钟周期内的行为,直观展示边沿触发采样与 JK 四种动作规则。
  1. self.q = d边沿到来时把输入 D 直接存入状态,对应特性方程 $Q_{n+1}=D$。
  2. elif j == 1 and k == 0: self.q = 1JK 触发器置位分支:J=1、K=0 时强制输出 1。
  3. elif j == 1 and k == 1: self.q = 1 - q翻转分支:J=K=1 时状态取反,体现了 JK 消除不定态的能力。
  4. dff.clock_edge(d)每次调用等价于一个上升沿,外部数据只有在此刻才被采样。
  5. jk_inputs = [...(元组列表)]每个周期给 JK 触发器一组 J、K 输入,模拟激励表驱动。
  6. print(f"{i} {d} {qd} {j} {k} {qjk}")以表格形式打印每个时钟周期各触发器的状态变化。

常见误区

误区反正都能存 1 bit,锁存器就是触发器,区别只是名字不同,面试时说“锁存器(latch)也叫触发器(flip-flop)”应该没问题。

正解两者触发机制完全不同。锁存器是电平敏感——使能信号有效期间一直“透明”,输入变输出就跟着变;触发器是边沿触发——只在时钟上升沿或下降沿那一瞬间采样,其余时间死死保持。好比门卫和哨兵:门卫整个白天都放行,哨兵只在哨响时瞥一眼。在时序分析、亚稳态处理、可综合性上,二者行为差异巨大,工程上绝不能混用。

为何常见:教材里两者都画成类似的方框,都叫“存储单元”,初学者容易只看功能表忽略触发方式这个本质区别。

误区J 代表置 1、K 代表置 0,那 J=K=1 就是既置 1 又置 0,输出应该是 1,或者像 SR 锁存器一样是不定态。

正解JK 触发器设计的初衷就是消除 SR 的不定态。J=K=1 时执行的是翻转动作:当前是 0 就变 1,当前是 1 就变 0,输出 $Q_{n+1}=\overline{Q_n}$。可以想象一个双向开关:J 往一个方向拨,K 往另一个方向拨,同时拨动时开关换个方向,而不是卡死。

为何常见:人容易从 SR 锁存器的“同时按下开与关”类比过去,却没注意到 JK 的电路结构(反馈交叉)专门处理了这个冲突。

误区既然只在上升沿采样,那数据只需要在上升沿那一刻正确就可以了,之前之后随便怎么变都没关系。

正解上升沿是一个抽象概念,物理上触发器需要数据在边沿前后各稳定一小段时间:边沿前是建立时间 $T_{\mathrm{setup}}$,边沿后是保持时间 $T_{\mathrm{hold}}$。这就像考试铃响:“咔嚓”一声固然快,但老师说“现在开始答题”之前,你手里必须已经握着笔;说完之后也不能马上换动作。只要数据在这两个窗口内发生变化,输出就可能进入亚稳态。

为何常见:教科书上边沿触发波形图总把采样画成一个“点”,让人误以为物理实现也是瞬时的,忽略了实际的器件延迟。

误区频率越高处理越快,那直接把时钟倍频拉满不就性能翻倍了?反正触发器都是边沿触发,应该能同步跟上。

正解频率提升的前提是满足时序收敛约束 $T_{\mathrm{clk}} \ge T_{\mathrm{cko}} + T_{\mathrm{logic}} + T_{\mathrm{setup}}$。如果组合逻辑路径太长,周期缩短后数据在下一上升沿前根本传不到下一个触发器,采样结果就是错的,芯片功能直接失效。就像把课间从 10 分钟压到 1 分钟,学生来不及从 A 教室跑到 B 教室,下一节课就“穿越”了。提高频率要靠优化逻辑深度、调整流水线,而不是盲目超频。

为何常见:直觉上“快 = 好”,但忽略了时序约束这个硬边界,这也是初学者设计电路时序违例的常见原因。

面试题

Q1. 时序逻辑电路与组合逻辑电路最本质的区别是什么?

单选题 · easy

  • A.时序电路使用的逻辑门更多
  • B.时序电路的输出依赖当前输入和历史状态,组合电路只依赖当前输入← 正确答案
  • C.时序电路不需要电源就能工作
  • D.组合电路必须有反馈回路

答案:B。时序电路像班级日志,记录历史并影响当下;组合电路像值日表,只认当前输入。选项 B 准确概括了“记忆性”这一本质;A、D 与电路规模、反馈无关;C 是常识错误,任何电路都要电源。

Q2. D 触发器在时钟上升沿到来时会发生什么?

单选题 · easy

  • A.输出无条件取反
  • B.输出保持之前的值不变
  • C.输出采样输入 D 的值并保持到下一个边沿← 正确答案
  • D.输出变为高阻态

答案:C。D 触发器的特性方程 $Q_{n+1}=D$,传令兵只在哨响时复述命令,之后保持。选项 C 准确;A 是 T 触发器的行为;B 是边沿没到来时的行为;D 是三态门的概念,与 D 触发器无关。

Q3. 当 SR 锁存器的 S=1、R=1 同时输入时,输出状态是?

单选题 · mid

  • A.确定置 1
  • B.确定置 0
  • C.保持原状态
  • D.进入不定态← 正确答案

答案:D。SR 锁存器约束条件是 $SR=0$,S 和 R 同时为 1 时两个或非门互相竞争,输出取决于制造偏差,进入不定态。就像同时按下“开”和“关”,灯的状态无法预测,因此选 D。

Q4. 某 JK 触发器当前状态 Q=0,给入 J=1、K=0,则时钟边沿后 Q 变为?

单选题 · mid

  • A.0
  • B.1← 正确答案
  • C.高阻
  • D.不定

答案:B。J=1、K=0 是置位动作,对应特性方程第一项 $J\overline{Q_n}=1$,次态强制为 1,选 B。J=K=1 才翻转,J=K=0 保持,J=0、K=1 复位。

Q5. 以下哪条是 T 触发器的特性方程?

单选题 · mid

  • A.$Q_{n+1} = T$
  • B.$Q_{n+1} = T \oplus Q_n$← 正确答案
  • C.$Q_{n+1} = T Q_n$
  • D.$Q_{n+1} = 0$

答案:B。T 触发器每来一个脉冲翻转一次:T=1 时 $Q_{n+1}=\overline{Q_n}$,T=0 时保持,合并写作 $Q_{n+1}=T\oplus Q_n$,选 B。A 像 D 触发器,C 是 D 触发器的变体,D 恒为 0 是错误选项。

Q6. 建立时间(setup time)的定义是?

单选题 · mid

  • A.时钟边沿之后数据必须保持稳定的最短时间
  • B.时钟边沿之前数据必须提前稳定的最短时间← 正确答案
  • C.触发器输出从 0 变到 1 所需的时间
  • D.一个完整时钟周期的时间

答案:B。建立时间是“铃响前必须坐好的提前量”;保持时间才是边沿后数据须保持的时长,选项 A 描述的是保持时间。C 是输出传输延迟,D 是周期定义,均不匹配。

Q7. 已知某触发器 $T_{\mathrm{cko}}=2\,\mathrm{ns}$、组合逻辑延迟 $T_{\mathrm{logic}}=5\,\mathrm{ns}$、建立时间 $T_{\mathrm{setup}}=1\,\mathrm{ns}$,则时钟周期至少为?

单选题 · mid

  • A.6 ns
  • B.7 ns← 正确答案
  • C.8 ns
  • D.3 ns

答案:B。根据 $T_{\mathrm{clk}} \ge T_{\mathrm{cko}} + T_{\mathrm{logic}} + T_{\mathrm{setup}}$,代入得 2+5+1=8 ns。选项 C 正确;A 漏算了 T_cko,B 漏算了 T_setup,D 只算了逻辑延迟。

Q8. 一个有限状态机共有 9 个状态,至少需要多少个触发器存储状态?

单选题 · mid

  • A.3
  • B.4← 正确答案
  • C.5
  • D.9

答案:B。由 $m=\lceil \log_2 N \rceil$,$\log_2 9 \approx 3.17$,向上取整得 4。3 个触发器最多编码 8 个状态,不够用;9 个触发器是浪费。选 B。

Q9. 关于锁存器(latch)的说法,正确的是?

多选题 · mid

  • A.它是电平敏感器件← 正确答案
  • B.它只在时钟边沿采样
  • C.门控锁存器在使能有效时呈透明状态← 正确答案
  • D.它和边沿触发器完全相同

答案:AC。锁存器在使能电平有效期间透明,输入直接反映到输出,A、C 正确。B 是边沿触发的行为,D 混淆了两类器件。门卫和哨兵的区别就在于此。

Q10. 下列哪些措施有助于数字电路实现时序收敛?

多选题 · hard

  • A.降低时钟频率← 正确答案
  • B.在长组合逻辑路径中插入流水线寄存器← 正确答案
  • C.增加组合逻辑的级数
  • D.缩短关键路径的传播延迟← 正确答案

答案:ABD。时序收敛要求 $T_{\mathrm{clk}} \ge T_{\mathrm{cko}} + T_{\mathrm{logic}} + T_{\mathrm{setup}}$。降低频率(A)增大周期,插入寄存器(B)切短单级 $T_{\mathrm{logic}}$,缩短延迟(D)直接压缩时间,三者都有帮助。C 增加逻辑级数会增大 $T_{\mathrm{logic}}$,反而让时序更难收敛。