文章目录
一、亚稳态简介
亚稳态的产生:一个信号在一个时钟域变化,并在另一个时钟域被采样,就会导致输出成为亚稳态。
本质上是由于违背了触发器的建立和保持时间产生的;
亚稳态的危害:导致逻辑判断错误、亚稳态传播(下一级电路同样产生亚稳态)

建立时间(Tsu,set up time):时钟有效边沿到来前,要求数据保持稳定的最小时间;
保持时间(Th, hold time):时钟有效边沿到来后,要求数据保持稳定的最小时间;
输出延迟值(Tco):规定的时钟到输出的延迟值;
决断时间(Tmet):亚稳态输出恢复到稳态所超出tco的额外的时间;
亚稳态导致触发器在原有的输出延迟tco上多出一段决断时间tmet,在这段时间之后,触发器最终由亚稳态转向稳态;
一般来说,触发器会在一个或两个时钟周期内返回稳态;
二、亚稳态窗口
具有特定时间长度的窗口,在这段时间内,输入数据与时钟均应该保持不变;

亚稳态窗口越大,进入亚稳态的概率越高;
三、平均无故障时间(MTBF)
单级触发器的平均无故障时间:
MTBF1 = e(tr/τ)/W·fc·fd
tr : 允许超出器件正常传输延迟时间的解析时间
τ: 触发器的亚稳态解析时间常数
W: 亚稳态窗口
fc: 时钟频率
fd: 异步信号边沿频率
两级触发器的平均无故障时间:
MTBF2 = e(tr1/τ)/W·fc·fd × e(tr2/τ)
若单级同步器的MTBF为40s,则两级同步器的MTBF为40 × 40 = 26.6min
可见信号经过两级触发器后,平均无故障时间明显增加,这也是多级同步器的原理;
四、亚稳态产生场景
亚稳态产生:违背时序要求
1.输入信号为异步(中断、复位)
2.时钟偏移、时钟抖动,高于容限值
3.信号在两个不同频率或者相同频率但相位、偏移不同的时钟下工作(跨时钟域)
4.组合逻辑延迟使得触发器的数据输入在亚稳态窗口内发生变化
五、解决亚稳态的技术
5.1 单比特信号跨时钟域
5.1.1 多级同步器
多级同步器的原理可参考第三节平均无故障时间的计算;
使用一个完整的时钟周期来降低亚稳态发生的概率(不能解决);
应用场景:
单/多比特数据,从慢时钟域进入到快时钟域(频率差2倍),此时不会丢失数据;
若处理的数据从快时钟域到慢时钟域 ,可能会发生数据丢失(漏采样);
输出会有Lantency,视级数而定(1级-1Lantency 2级-2Lantency);
module Multiple_stage_synchronizermodule#(
parameter integer DFF_LEVEL = 2,
parameter integer DATA_WIDTH = 1
)(
input wire clk,
input wire [DATA_WIDTH - 1:0] din,
input wire [DATA_WIDTH - 1:0] dout,
input wire nrst
);
reg [DATA_WIDTH - 1:0] din_buff [DFF_LEVEL-1:0];
assign dout = din_buff[DFF_LEVEL-1];
integer i;
always @(posedge clk or negedge nrst) begin
if (~nrst) begin
// reset
for(i=0;i<DFF_LEVEL;i=i+1)
begin
din_buff[i] <= 'b0;
end
end
else begin
for(i=1;i<DFF_LEVEL;i=i+1)
begin
din_buff[i] <= din_buff[i-1];
end
din_buff[0] <= din;
end
end
endmodule
综合电路:

5.1.2 另一种多级同步器
普通多级同步器存在的问题:
要求异步信号的脉宽必须大于时钟周期(采样不到);
要求异步信号的时钟域1时钟频率小于时钟域2(漏采);
同步器B模式:
可以从快时钟域采样信号;
不需要异步信号的脉宽大于时钟周期;
常用于中断信号、复位信号的同步;
module Multiple_stage_synchronizermoduleB(
input wire din,
input wire s_clk,
input wire en,
input wire nrst,
output wire dout
);
wire Q1_Clr;//µÚÒ»¼¶´¥·¢Æ÷¸´Î»ÐźÅ
reg Q1_out,Q2_out,Q3_out;
assign Q1_Clr = ~din & dout;
assign dout = Q3_out;
always@(posedge din,posedge Q1_Clr)
begin
if(Q1_Clr)
begin
Q1_out <= 1'b0;
end
else
begin
Q1_out <= 1'b1;
end
end
always@(posedge s_clk)
begin
if(~nrst)
begin
Q2_out <= 1'b0;
Q3_out

最低0.47元/天 解锁文章
1179

被折叠的 条评论
为什么被折叠?



