1、亚稳态的概念
异步信号:该信号的产生与时钟上升沿无关(例如按键按下)。
同步信号:每次时钟上升沿到来都会产生该信号。
异步信号在输入系统的时候存在两种情况,如图 4 所示:
上图中,系统时钟上升沿采集到异步信号 2 ,此时异步信号 2 处于不定态,对应该信号的D触发器产生了亚稳态的情况,D触发器的输出q产生震荡,震荡一段时间后变为稳定,可能为 1 ,也可能为 0 ,如图 5 所示。
2、亚稳态的消除方法(同步处理、数据寄存、边沿检测)
(1)同步处理
如果此时,该D触发器又加了一级D1,如图 6 所示,若第一级D触发器到第二个时钟上升沿到来时还没稳定,则第二级D触发器也会处于亚稳态,如图 7 所示,
虽然两级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;
标签:异步,触发器,Rx,概念,亚稳态,信号,Rs232,消除
From: https://www.cnblogs.com/little55/p/18098481