FPGA-亚稳态
亚稳态生产原理时序图
消除亚稳态
单比特信号从慢速时钟域同步到快速时钟域需要使用打两拍的方式消除亚稳态。第一级寄存器产生亚稳态并经过自身后可以稳定输出的概率为 70%~80%左右,第二级寄存器可以稳定输出的概率为 99%左右,后面再多加寄存器的级数改善效果就不明显了,所以数据进来后一般选择打两拍即可。另外单比特信号从快速时钟域同步到慢速时钟域还仅仅使用打两拍的方式会漏采数据,所以往往使用脉冲同步法或的握手信号法;而多比特信号跨时钟域需要进行格雷码编码(多比特顺序数才可以)后才能进行打两拍的处理,或者通过使用 FIFO、RAM 来处理数据与时钟同步的问题。亚稳态振荡时间 Tmet 关系到后级寄存器的采集稳定问题,Tmet 影响因素包括:器件的生产工艺、温度、环境以及寄存器采集到亚稳态里稳定态的时刻等。甚至某些特定条件,如干扰、辐射等都会造成 Tmet 增长。
电路模型
这里按键的输入信号 key_in 相对于 FPGA 内部信号来说是一个异步信号(key_in 的状态不依赖于时钟 Clk),如不进行处理直接将其输入使用,容易出现时序违例导致亚稳态。因此这里就需要先将信号同步到 FPGA 的时钟域内才可以供后续模块使用,常见的同步方法即使用两级触发器,也就是使用触发器对信号打两拍的方式进行与系统时钟进行同步,参考电路即如上图所示。其中key_in 为按键输入,key_in_sb 为同步后的信号。
verilog 语言描述
reg key_in_a,key_in_b;//声明同步寄存器
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)begin
key_in_a <= 1'b0;//第一个寄存器
key_in_sb <= 1'b0;//第二个寄存器
end
else begin
key_in_a <= key_in;
key_in_b <= key_in_a;
end
在一些高速设计中,也有使用三级触发器进行单 Bit 信号同步的设计,此方法只是为了提高平均故障时间(Mean Time Between Failure,MTBF),其电路为在两级触发器后再接一级触发器。