惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

博客园 - longyue

[BF学院_卷1] -- 第30讲:mixTable() 总结 —— Mixer 完整控制模型 [BF学院_卷1] -- 第29讲:applyMixToMotors() —— 最终 Motor Output 生成 [BF学院_卷1] -- 第28讲:applyMixerAdjustment() —— 为什么 Mixer 需要重新分配控制权限 [BF学院_卷1] -- 第27讲:PID Output 如何进入 Mixer —— 从控制需求到 motorMix [BF学院_卷1] -- 第26讲:calculateThrottleAndCurrentMotorEndpoints() —— Mixer 如何确定油门基础范围 [BF学院_卷1] -- 第25讲:mixTable() 总览 —— Mixer 在控制循环中的位置 [BF学院_卷1] -- 第24讲:mixer_init.c —— 飞控启动时如何准备 Mixer [BF学院_卷1] -- 第23讲:Mixer 数学模型 —— motorMixer_t 如何形成 Motor Output [BF学院_卷1] -- 第22讲:Betaflight 如何描述 Mixer —— mixer.h 数据结构 [BF学院_卷1] -- 第21讲:四旋翼为什么可以通过电机控制姿态 —— Mixer 背后的物理基础 [BF学院_卷1] -- 第20讲:从 PID Output 到 Motor Command(电机指令)——为什么飞控需要 Mixer [BF学院_卷1] -- 第19讲:PID Controller(PID控制器)——飞控到底如何理解误差并控制飞机? [BF学院_卷1] -- 第18讲:PID Controller 的最后一环——为什么飞控还需要 Feedforward(前馈控制)? [BF学院_卷1] -- 第17讲:D Term(微分控制项)——飞控如何提前感知运动变化? [BF学院_卷1] -- 第16讲:I Term(积分控制项)——飞机为什么总是差一点? [BF学院_卷1] -- 第14讲:Rate Error(角速度误差)——PID 真正控制的到底是什么? [BF学院_卷1] -- 第15讲:P Term(比例控制项)——飞控是如何利用误差开始控制飞机的? [BF学院_卷1] -- 第13讲:Outer Loop 的终点——为什么还要读取 Current Angular Rate(当前角速度)? [BF学院_卷1] -- 第十二讲:Yaw Compensation(偏航补偿) [BF学院_卷1] -- 第12讲脚本 [BF学院_卷1] -- 第十一讲:Current Angular Rate(当前角速度)——飞控怎样知道飞机现在转得有多快? [BF学院_卷1] -- 第十讲:Angle Error(姿态角误差)如何变成 Desired Angular Rate(目标角速度) [BF学院_卷1] -- 第九讲:Current Angle(当前姿态角)遇见 Target Angle(目标姿态角) [BF学院_卷1] -- 第八讲:飞手打杆以后,飞控首先得到什么? [BF学院_卷1] -- 第七讲:为什么 Pitch Flip 只在 180° 看起来正确 [BF学院_卷1] -- 第7讲脚本 [BF学院_卷1] -- 第6讲:为什么 Pitch Flip 会骗人 [BF学院_卷1] -- 第6讲脚本 [BF学院_卷1] -- 第五讲:第一次修正——Pitch Flip 为什么看起来有效 [BF学院_卷1] -- 第5讲脚本 - longyue
[FPGA] 数字IC/FPGA 跨时钟域问题详解(2)深入理解亚稳态
longyue · 2025-09-11 · via 博客园 - longyue

https://mp.weixin.qq.com/s/fEoX1NFPllI699fvXHEWuw

https://mp.weixin.qq.com/s/AjJGtSi2ez0FvLIRvN0kbw

---------------------------------------------------

在数字电路中,亚稳态问题的本质是触发器(flip-flop)因输入时序不满足而导致输出呈现 “不确定” 状态(x态)。重要的是,该未知状态的影响范围可传播至后续电路,致使整个系统瘫痪。因此,亚稳态问题可以看作是一种低容限情况下的临界状态问题。形象一点,可将电路的当前状态看作是下图的(“峰顶小球”),假定山坡和小球绝对光滑,这时的小球看似静止在山顶,但随机的扰动都可能使处于峰顶的小球滑落至图中1或2的位置。

11

在数字电路中,上述的非理想外因可能是温度、辐照或静电,图中的位置1和位置0则为电路输出的0/1电平,图中的小球则可类比为双稳态器件。

在FPGA或ASIC设计中,触发器(flip-flop)是一类边沿触发的双稳态器件,其能够实现状态保持状态切换,并赋予数字电路“记忆能力”。由于组成触发器的逻辑门具备物理时延,因此触发器需要预留足够的时间窗口,确保自己能准确采样输入信号,这里的时间窗口即对应下图中的Setup Time 和 Hold Time

22

哪些场景会发生亚稳态现象?

数据或复位控制信号 处于采样窗口外时即会出现亚稳态现象,比如下面这几种情况:

      • 异步信号检测
      • 跨时钟域数据传输
      • 复位电路

复位电路能够确保设计中的触发器(flip-flop)并置为 “确定” 状态,如SoC的上电启动地址

若复位过程发生亚稳态,则系统在初始化阶段便发生故障。

从操作时序的角度看,复位信号的动作包括施加释放两方面。

一、复位信号的凹陷脉宽时间

所谓的凹陷脉宽时间,指的是复位信号被施加后持续的时间段,该时间段的起点相对于时钟采样沿通常是异步的(如POR复位、按键复位),该时间段的终点为复位被撤销的时刻(如POR的电容充电后、按键被松开)。

这里的复位凹陷脉宽时间与时钟脉宽的概念相似,但由于复位信号通常会持续多个时钟周期,因此一般无需在约束中对复位信号的凹陷脉宽时间进行检查

二、复位信号的恢复时间及撤销时间

与数据采样过程的建立时间和保持时间窗口类似,触发器对复位信号的撤销同样有着严格的时间间隔要求(相对于时钟采样沿)

22

  • 恢复时间(recovery time)
    • 在释放复位后,能保证触发器(的输出状态)在下一个时钟采样沿恢复为置位状态的最小时间间隔。
  • 撤销时间(removal time)
    • 在释放复位前,能保证触发器(的输出状态)在下一个时钟采样沿稳定为复位状态的最小时间间隔

需要注意的是,removal time和recovery time描述的都是复位信号的上升沿(即复位释放时刻)与时钟采样沿的关系

三、不同类型复位电路及其亚稳态

3.1 异步复位

对于异步复位,对应综合出的电路及对应的RTL代码如下图所示

22

always @(posedge clk or negedge rst_n)
begin
       if(!rst_n)   a <= 1’b0;
       else         a <= b;
end

若异步复位的释放时间处于removal timerecovery time之间,则会导致亚稳态现象产生,即触发器的输出在经过决断时间后稳定为“不确定” 状态

22

3.2 同步复位

同步复位的电路实现是将复位信号与数据相与作为触发器的输入,但在复位释放过程中仍可能会发生亚稳态现象。

always @(posedge clk)
begin
       if(!rst_n) a <= 1’b0;
       else         a <= b;
end

22

如上图所示的同步复位电路,由于复位信号与数据相与,当复位释放时刻处于该触发器的数据采样窗口(Tsetup 或 Thold内),相当于数据不满足建立时间或保持时间要求,也会产生亚稳态。

除此之外,同步复位的缺点还包括:

1) 大多数逻辑器件的目标库内的DFF都只有异步复位端口,当适用同步复位时,综合器就会在寄存器的数据输入端插入组合逻辑,消耗更多的逻辑资源;

2)  同步复位依赖于时钟,如果电路中的时钟信号出现问题,无法完成复位。

3)  对复位信号的脉冲宽度有要求,必须大于指定的时钟周期,由于线路上的延迟,可能需要多个时钟周期的复位脉冲宽度,且很难保证复位信号到达各个寄存器的时序;

3.3 异步复位、同步释放

所谓的异步复位、同步释放的表现为:

    • 复位施加与时钟边沿无关;
    • 复位释放过程(由0->1)与时钟边沿同步;

22

module sync_async_reset ( 
        input    clk, 
        input    rst_i, 
        input    data_a, 
        input    data_b, 
        output   out_a, 
        output   out_b
 ); 

reg     d1, d2;
reg     d3, d4;
assign  out_a = d3;
assign  out_b = d4;
assign  rst_o = d2;

always @ (posedge clock, negedge rst_i) begin
        if (!rst_i) begin               
            d1 <= 1'b0;                  
        end 
        else begin                
            d1 <= 1'b1;                  
end
    end
        always @(posedge clock, negedge rst_i) begin
                 if(irst_i) begin
                        d2 <= 1'b0;                  
        end 
        else begin                
            d2 <= d1;                  
        end
    end

    always @ (posedge clock, negedge rst_o) begin 
        if (!rst_o) begin             
            d3 <= 1'b0;            
d4 <= 1'b0;
        end 
        else begin         
            d3 <= data_a;               
            d4 <= data_b;
        end
    end
 endmodule