时序逻辑电路

本页目录

同样看到输入为 1,序列检测器可能是在等第一个 1,也可能刚收到 10、正准备确认 101。它必须保存历史中与未来判断有关的信息,这就是状态。时序逻辑的核心是状态保持;时钟是同步设计组织状态变化的方式,并不是所有时序电路都必须有时钟。

要理解的问题本篇入口关键区别
数据何时能穿过存储元件锁存器与触发器透明窗口与采样边沿
为什么慢下来仍可能出错建立、保持与偏斜最长路径和最短路径
如何记住输入历史寄存器、计数器、FSM状态含义与更新条件
异步输入怎样接入亚稳态与 CDC电平可靠性与消息完整性
上电怎样进入确定状态复位与启动复位生效和释放时序

从反馈存储到 D 触发器

交叉耦合的门电路可形成两个稳定状态。以高有效 NOR 型 SR 锁存器为例,方程为 Q=¬(R+Q̄)、Q̄=¬(S+Q)。S=1 会先强制 Q̄=0,反馈使 Q=1;S 回到 0 后,反馈仍能维持这个状态。

SRNOR 型 SR 锁存器行为
00保持原状态
10置位,Q=1
01复位,Q=0
11两个输出均为 0,失去互补关系;同时解除后结果不确定

NAND 型常用低有效输入,禁止组合与表中相反,不能把两种输入极性混用。上电也不天然决定反馈锁存在哪一态;若系统需要确定初值,应采用明确的初始化或复位机制。

D 锁存器用数据 D 和使能 E 避免正常操作中的 SR 禁止组合。高有效使能时,E=1 期间 Q 在传播延迟后跟随 D,E=0 后保持最后锁存值。这种“透明”是功能,不是故障;但如果连接方式允许数据在同一透明窗口穿过多级,就必须分析穿透和锁存器时序,不能直接套用边沿触发流水线规则。

正沿 D 触发器在时钟上升沿采样,随后经过 tCQ 才更新 Q。其余时间,在异步置位/清零等控制不生效时保持。器件也有负沿型号;数据手册中的时钟符号、反相泡和功能表决定具体行为。TI:SN74HC74 正沿 D 触发器

−tsetup+tholdCLKDQtCQ图示采样值为 1采样不是瞬间魔法:D 要覆盖采样窗口,Q 随后才更新窗口为正建立/保持时间的模式図;参数应查对应器件、供电和温度,图中宽度不代表比例。

建立时间要求 D 在采样沿前稳定,保持时间要求沿后继续稳定。违反这些要求意味着结果不再有正常时序保证:可能捕获旧值、新值,也可能进入亚稳态,不能断言每次违规都会发生亚稳态,更不能把亚稳态定义为必然振荡。它可能表现为输出迟迟不能达到可用逻辑电平,或后续不同接收单元做出不同判断。

JK 触发器在有效边沿依据 J/K 执行保持、置位、复位或翻转;J=K=1 时翻转。T 触发器的更新式为 Q_next=Q⊕T,可用 D 触发器加异或逻辑实现。这里的“翻转一次”依赖具体触发结构与时序,不能把边沿触发结论直接套到任意透明反馈电路。

寄存器和计数器:每一拍用的是旧状态

n 个触发器共享时钟构成 n 位寄存器。带使能的寄存器在 en=1 时装入新数据,否则保持;用数据选择实现保持,通常比随意把 en 与时钟做 AND 更容易正确约束。真正的时钟门控需要无毛刺门控结构或器件专用资源。

同步二进制计数器可写为 en ? Q+1 : Q,位宽决定模数。同步表示各位由同一时钟采样,不意味着各个 Q 的物理变化绝对同时。行波计数器则用前级输出驱动后级时钟,存在逐级延迟,解码时更容易看到中间码。

BCD 一位十进制数使用四位编码 0000~1001;三位二进制递增序列不是 BCD。模 10 计数器还需规定非法状态 1010~1111 的行为,例如下一拍回到 0000。Gray 码相邻合法计数只改变一位,但仍需正确寄存、同步和布线约束,不能由“只变一位”直接推出跨域绝对安全。

移位寄存器同时采样旧的相邻位。以四位寄存器右端输入串行 bit 为例,Q_next=((Q<<1)|bit)&0xF,依次输入 1、0、1、1,状态为 0001、0010、0101、1011。并行输出是在每拍整体更新,不是软件循环中逐个改位产生的连锁结果。

// 同步高有效复位;reset 和 en 均属于 clk 时钟域。
always_ff @(posedge clk) begin
    if (reset)
        q <= '0;
    else if (en)
        q <= {q[2:0], serial_in};
end

非阻塞赋值描述在边沿依据旧值计算并更新寄存器。这里的 serial_in 也必须满足本时钟域采样要求;仅使用 always_ff 并不会把异步输入自动同步。

建立与保持:一个限制上限,一个限制下限

设发送时钟沿在 0 到达,接收时钟相应沿晚到 s;s>0 表示接收时钟较晚。对于单周期、正沿到正沿路径,忽略另行列出的抖动与不确定度时:

检查简化约束物理含义
建立tCQ,max+tcomb,max+tsetup ≤ T+s旧拍发出的数据要赶上下一接收沿
保持tCQ,min+tcomb,min ≥ s+thold新数据不能过早冲掉本次采样值

接收时钟晚到给建立检查更多时间,却使保持更难满足。实际工具还会区分不同边沿、时钟路径和工艺角,并计入相应不确定度;不能用一组典型延迟替代最坏条件分析。MIT:时序逻辑与约束

取教学例子 T=10 ns、s=0.5 ns、tCQ,max=1 ns、tcomb,max=7 ns、tsetup=1 ns,建立裕量为 10+0.5−1−7−1=1.5 ns。若最快路径 tCQ,min=0.2 ns、tcomb,min=0.1 ns、thold=0.2 ns,保持裕量却是 0.2+0.1−0.5−0.2=−0.4 ns,仍然失败。

把周期从 10 ns 加到 20 ns 会改善建立,不会改变这条同边沿保持约束。保持修复通常涉及最短路径延迟、时钟偏斜和布局;盲目增加所有数据路径延迟又可能破坏建立。流水线能缩短每段最长组合路径,但会增加处理延迟拍数,也要重新检查每段保持和控制对齐。

降低频率为什么救不了保持时间?

默认建立裕量为+1.5 ns,保持裕量为−0.4 ns。把周期增到20 ns,左侧保持终点仍不动。尝试增加数据路径延迟,最快数据会晚到,但最慢数据也一起晚到,因此必须重新检查两边。

正在呈现知识画面
降低频率为什么救不了保持时间?

建立看下一接收沿,保持看当前接收沿。增加周期只推迟下一沿,正偏斜则改善建立却恶化保持。

FSM:用序列 101 解释状态为什么这样设计

同步 FSM 写成 state_next=F(state,input)。Moore 输出为 G(state),Mealy 输出为 G(state,input)。两者的区别是输出依赖项,不是“一个永远没有毛刺,另一个一定更快”。Moore 若用多位状态组合译码,状态位传播延迟不同也会产生毛刺;寄存输出可改变这个时序边界。

考虑允许重叠的 101 检测器:S0 表示目前没有有用后缀,S1 表示已匹配到 1,S2 表示已匹配到 10。当 S2 收到 1,报告命中并转回 S1,因为刚收到的 1 也可成为下一个 101 的开头。

S0未匹配S1末尾为 1S2末尾为 101 / 00 / 01 / 1:命中0 / 00 / 01 / 0检测重叠序列 101:状态保存“目前匹配到哪里”箭头标注“输入 / Mealy 输出”;输入先同步到本时钟域,状态在有效时钟沿更新。
当前状态输入 0:下一状态 / 输出输入 1:下一状态 / 输出
S0S0 / 0S1 / 0
S1S2 / 0S1 / 0
S2S0 / 0S1 / 1

输入 10101 时,第三位和第五位都应命中。若命中后直接回 S0,就会丢掉重叠的第二次匹配。这是“状态保存什么信息”直接影响功能的例子。Mealy 输出可以在当前状态仍为 S2、输入稳定为 1 时经组合延迟拉高;若外部接口要求整拍稳定脉冲,应在明确采样边界寄存该结果,并记录相应延迟。

状态编码可以是二进制或 one-hot。one-hot 使用更多触发器,某些译码可能更简单,但功耗、速度和面积仍需结合目标器件判断。组合的 next-state 块要覆盖所有分支,非法状态如何恢复应明确;恢复策略也不能替代正确 CDC 或电源完整性。

亚稳态与同步器:增加恢复时间,而非保证确定延迟

异步输入相对于目标时钟可能落入采样窗口,无法靠普通同步时序约束消除。同步器让第一级先接收,给它一段恢复时间,再由目标时钟的后级采样;业务逻辑只使用末级输出。级间不应插入组合逻辑或分叉到业务接收端,布局与专用同步属性也影响可用恢复时间。

异步电平保持足够长第一级 DFF可能亚稳态第二级 DFF输出到本时钟域sync_out同一个目标时钟级间不插组合逻辑短布线为恢复留下时间两级同步器:给第一级更多恢复时间,业务逻辑只使用末级降低失效概率,不保证零风险;不能直接保证短脉冲被捕获,也不能让多位数据自动保持一致。

两级是常见起点,实际需要几级应结合器件特性、目标时钟、输入跳变频率和可靠性要求计算。典型模型呈 MTBF∝exp(Tresolve/τ)/(fclk·fdata) 的趋势,但常数与 τ 必须来自器件表征;不能拿一个任意 τ 算出可信寿命。多条跨域链路的失效率还会累加,单条链路的 MTBF 不是整机保证。Intel:亚稳态与同步器分析

同步结果相对异步变化可能晚不同数量的周期。同步器降低亚稳态传播概率,却不保证每个短脉冲都能被采样:例如目标时钟每 20 ns 采样一次,完全落在两次采样之间的 5 ns 脉冲会消失,即使接收触发器没有亚稳态。

没有亚稳态,也可能漏掉事件

默认5–10 ns的脉冲完全落在两沿之间,四次采样全为0。只移动它的位置,让它覆盖20 ns,结果就不同。这个例子刻意不模拟亚稳态:即使采样器完全理想,窄脉冲也可能丢失;增加同步级数不能补回它。

正在呈现知识画面
没有亚稳态,也可能漏掉事件

同步链不能恢复从未被第一级采样到的脉冲;保存事件需要合适的编码或握手。

CDC 要先确定传的是电平、事件还是数据

传输对象常见办法仍需保证的条件
长时间保持的单比特状态目标域同步链电平有足够可见时间,允许采样延迟
每次都要保留的事件请求/确认,或有速率约束的 toggle上一个事件未观察前不能覆盖;复位状态一致
一组必须一致的数据握手固定数据,或异步 FIFO数据保持到接收完成、吞吐与背压明确
单调相邻变化的指针寄存 Gray 指针再跨域位间偏斜/最大延迟约束、同步链、正确满空判断

多位数据每位各打两拍,可能得到既非旧字也非新字的混合值。例如二进制 0111→1000 时四位都变化,接收端可能看到任意组合。握手方案中,发送方先稳定数据,再通知接收方;通知跨域后接收方采样,确认返回前发送方保持数据,并约束控制与数据的相对到达时间。异步 FIFO 则把数据存储与读写域指针管理分开,适合持续流量。

Gray 编码也不是通用多位同步法:任意两组 Gray 字之间仍可能差多位。只有源端按相邻计数推进、输出经过寄存且跨域路径约束正确,才能利用每次一位变化的性质;接收端可能跳过中间计数,不能假定每一拍都只看到相邻值。

复位释放同样需要时序

同步复位在有效时钟沿生效,需要时钟工作且脉冲覆盖采样。异步复位可不等时钟立即生效,但撤销若靠近有效沿,会涉及 recovery/removal 要求。常见策略是在各自时钟域异步置复位、同步释放,并等待时钟稳定;具体器件还要考虑复位脉宽、上电初始化和专用资源。AMD:同步与异步复位

不同域可能在不同时间离开复位。跨域握手和 FIFO 必须定义此时哪些信号有效,避免把默认位变化当成新事件。按钮同步也不等于去抖:同步处理采样时序,去抖处理机械触点反复变化,通常还需稳定时间计数或其他滤波策略。

用状态轨迹核对行为

以下检查序列检测重叠、BCD 非法状态恢复、Gray 相邻性和建立/保持算例。它是离散模型检查,不模拟模拟亚稳态,也不替代 HDL 仿真、综合报告、静态时序和 CDC 分析。

from fractions import Fraction as F

state, hits = 0, []
for pos, bit in enumerate(map(int, '10101'), 1):
    hit = state == 2 and bit == 1
    if hit:
        hits.append(pos)
    state = ((0, 1), (2, 1), (0, 1))[state][bit]
assert hits == [3, 5]

for q in range(16):
    nxt = q+1 if q < 9 else 0
    assert 0 <= nxt <= 9
    assert nxt == ((q+1) % 10 if q <= 9 else 0)

gray = lambda n: n ^ (n >> 1)
for n in range(16):
    assert (gray(n) ^ gray((n+1) % 16)).bit_count() == 1

setup_slack = F(10)+F('0.5')-1-7-1
hold_slack = F('0.2')+F('0.1')-F('0.5')-F('0.2')
assert setup_slack == F('1.5') and hold_slack == F('-0.4')
assert F(20)+F('0.5')-1-7-1 > setup_slack
print('重叠检测、BCD 恢复、Gray 相邻性及建立/保持预算检查通过')

继续查阅