亚稳态的概念与消除方法

1、亚稳态的概念

​ 异步信号:该信号的产生与时钟上升沿无关(例如按键按下)。

​ 同步信号:每次时钟上升沿到来都会产生该信号。

​ 异步信号在输入系统的时候存在两种情况,如图 1 所示:

image-20240326105348608

图1——异步信号在输入系统时存在的两种情况

​ 上图中,系统时钟上升沿采集到异步信号 2 ,此时异步信号 2 处于不定态,对应该信号的D触发器产生了亚稳态的情况,D触发器的输出q产生震荡,震荡一段时间后变为稳定,可能为 1 ,也可能为 0 ,如图 2 所示。

image-20240326111115208

图2——D触发器处于亚稳态时的输出结果

2、亚稳态的消除方法(同步处理、数据寄存、边沿检测)

(1)同步处理

​ 如果此时,该D触发器又加了一级D1,如图 3 所示,若第一级D触发器到第二个时钟上升沿到来时还没稳定,则第二级D触发器也会处于亚稳态,如图 4 所示,

image-20240326111449617

图3——两级D触发器

image-20240326112405439

图4——两级D触发器处于亚稳态时的输出结果

​ 虽然两级D触发器无法保证最终的输出结果是否正确,但至少不会让信号处于不定态,能保证第二级D触发器输出结果是稳定的,所以在处理异步信号时,经常对输入信号加入两级D触发器进行同步

​ 对于异步信号Rs232_Rx而言,加入两个同步寄存器 s0_Rs232_Rx,s1_Rs232_Rx,进行亚稳态的消除,如下列代码所示:

//对异步信号进行同步处理(加入一个两级D触发器,对异步信号Rs232_Rx消除其亚稳态)
reg s0_Rs232_Rx,s1_Rs232_Rx;    //两个同步寄存器(消除亚稳态)
reg tmp0_Rs232_Rx,tmp1_Rs232_Rx;    //两个暂存寄存器(数据寄存)

//对异步信号进行同步处理(加入一个两级D触发器,对异步信号Rs232_Rx消除其亚稳态)
always@(posedge Clk or negedge Rst_n)
    if(!Rst_n)begin
        s0_Rs232_Rx <= 1'b0;
        s1_Rs232_Rx <= 1'b0;
    end
else begin	//两级D触发器
    s0_Rs232_Rx <= Rs232_Rx;
    s1_Rs232_Rx <= s0_Rs232_Rx;
end

(2)数据寄存

​ 同时,使用两级D触发器存储两个相邻时钟上升沿时Rs232_Rx信号(已同步到系统时钟域中)的电平状态,如下列代码所示:

//数据寄存(使用D触发器存储两个相邻时钟上升沿时外部输入信号(已同步到系统时钟域中)的电平状态)
always@(posedge Clk or negedge Rst_n)
    if(!Rst_n)begin
        tmp0_Rs232_Rx <= 1'b0;
        tmp1_Rs232_Rx <= 1'b0;
    end
else begin  //两级D触发器
    tmp0_Rs232_Rx <= s1_Rs232_Rx;
    tmp1_Rs232_Rx <= tmp0_Rs232_Rx;
end

(3)边沿检测

​ 通过检测同步后的Rs232_Rx信号是否产生了下降沿,来检测起始位。

​ 注意 temp0_Rs232_Rx 信号、temp1_Rs232_Rx 信号的先后顺序:temp0_Rs232_Rx后、temp1_Rs232_Rx先

//边沿检测(通过检测检测同步后的Rs232_Rx信号是否产生了下降沿,来检测起始位)
//temp0_Rs232_Rx后、temp1_Rs232_Rx先
wire neg;
assign neg = !temp0_Rs232_Rx & temp1_Rs232_Rx;
posted @ 2024-03-27 11:00  Yamada_Ryo  阅读(891)  评论(0编辑  收藏  举报