ROCCHI THE ROCK!|

Yamada_Ryo

园龄:1年4个月粉丝:3关注:5

亚稳态的概念与消除方法

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;

本文作者:Yamada_Ryo

本文链接:https://www.cnblogs.com/little55/p/18098481

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Yamada_Ryo  阅读(1044)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起