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

推荐订阅源

D
Docker
小众软件
小众软件
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
Jina AI
Jina AI
博客园 - 聂微东
S
SegmentFault 最新的问题
量子位
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页

博客园 - 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