亚稳态原理:输入信号的上升或下降沿与时钟信号的上升沿重合时,寄存器的输出不稳定,有两种可能出现的状态:1.尖峰之后为低电平;2.尖峰之后为高电平。
对于第一个状态(上面两个波形),reg1输出在下个时钟上升沿来到前为低电平,时钟上升沿来到后,reg2输出为低电平。
对于第二个状态(下面两个波形),reg1输出在下个时钟上升沿来到前为高电平,因此时钟上升沿来到后,第二个寄存器输出高电平,但此时对reg1来说,不存在亚稳态,所以输出低电平,再经过一个时钟上升沿,reg2输出低电平。
总的来说,经过两级寄存器,最终都会输出低电平,消除了亚稳态(reg2输出低电平)。
寄存器输出再输入下一级时一般不会出现亚稳态。
代码:
Input key;
reg [2:0] key_cync;//记得给初值,0;key_cync[2]就是消除亚稳态后的输入
always@(posedge clk)
key_sync <= {key_sync[2:1],key};
reg pedge_key;
reg nedge_key;
assign pedge_key = (key_sync[2:1] == 0’b10);
assign nedge_key = (key_sync[2:1] == 0’b01);