异步复位,同步释放

        跨时钟域(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)

上一篇:Jedis事务:Cannot use Jedis when in Multi. Please use Transaction or reset jedis state.


下一篇:[Go]fmt Sprintf的格式占位符%