天天看點

異步複位,同步釋放

        跨時鐘域(CDC)問題的一個常見又特殊的例子是異步複位。作為一個初級設計者,最好是不要使用異步複位,而總是使用同步複位。但是随着設計複雜度的提高,特别是在系統層面,總會碰到必須使用全局異步複位的情況。

        異步複位信号的問題關鍵不在于異步複位信号的assertion,而在于複位信号的解除(或釋放, release)。複位的發生是異步的并沒有什麼問題,隻要確定複位的解除是同步的就可以避免系統會出現跨時鐘域處理常見的亞穩态現象。

       一個好的做法是的系統的頂層統一地對異步複位信号進行同步處理,生成一個同步複位信号,然後在系統内部統一地使用所生成的同步複位信号。這個由異步複位信号生成同步複位信号的過程類似于其它普通信号的跨時鐘域處理,采用double-flopping方法即可。如以下例所示:

reg	s_reset_n, r_pipe;
always @(posedge CLK, negedge RST_N)
	if (!RST_N)
		{ s_reset_n, r_pipe } <= 2'b00;
	else
		{ s_reset_n, r_pipe } <= { r_pipe, 1'b1 };
           

        然後在系統内部統一地使用 

s_reset_n

 作為“異步”複位信号即可。

[Reference]

Some Simple Clock-Domain Crossing Solutions (zipcpu.com)

繼續閱讀