它的目的可以一言以蔽之:将组合逻辑产生的输出信号"同步"到时钟节拍上,从而大幅提升电路的稳定性和可预测性。
- 消除毛刺(Glitch Filtering)
• 组合逻辑输出(如 po_cola_comb 和 po_money_comb )在电平跳变时可能产生瞬态毛刺。
• 通过在时钟上升沿采样并锁存输出,可以滤除这些毛刺,确保输出信号的稳定性。
- 时序同步(Timing Synchronization)
• 状态机的组合逻辑输出可能因路径延迟不同而出现亚稳态(Metastability)风险。
• 锁存器在时钟边沿统一更新输出,使信号变化与系统时钟同步,满足建立/保持时间要求。
- 时序路径可控性
• 锁存后输出信号的延迟固定为一个时钟周期,便于静态时序分析(STA)。
• 若直接输出组合逻辑,时序路径可能跨越多个时钟域,增加时序收敛难度。
复杂可乐机例子
状态机输出
assign po_cola = ((current_state == TWO_HALF) && (key_half || key_one)) ||
((current_state == THREE) && (key_half || key_one));
assign po_money = (current_state == THREE) && (key_half || key_one);
解决
主模块解决
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
po_cola <= 1'b0;
po_money <= 1'b0;
end else begin
po_cola <= po_cola_comb; // 锁存组合逻辑输出
po_money <= po_money_comb;
end
end