数字集成电路设计-10-关于采用两级触发器实现双时钟域信号同步方法的分析与验证
引言
实现双时钟域数据的交换,最常见的方法就是采用双时钟的异步fifo。但是对于单根信号线,如果仍然采用异步fifo就显得非常stupid,这时,往往通过两级触发器来实现同步。
那么,两级触发器是如何实现同步的呢?本小节就做一个简单的分析和验证。
1,一段代码
下面是我刚刚从ORPSoC的工程里看到的一段代码:
//'ddr2_writeback_done':generate in ddr2_if_clk domain
always @(negedge ddr2_if_clk)
if (ddr2_rst)
ddr2_writeback_done <= 0;
else if (ddr2_writeback_done_wb_sync2)
ddr2_writeback_done <= 0;
else if (ddr2_write_state_shr[6])
ddr2_writeback_done <= 1;
//'ddr2_writeback_done' sync to 'wb_writeback_done' in wb_clk domain
always @(posedge wb_clk)
if (wb_rst)
begin
wb_writeback_done_sync <= 0;
wb_writeback_done_sync2 <= 0;
end
else
begin
wb_writeback_done_sync <= ddr2_writeback_done;
wb_writeback_done_sync2 <= wb_writeback_done_sync;
end
assign wb_writeback_done = !wb_writeback_done_sync2 & wb_writeback_done_sync;
//use 'wb_writeback_done' in wb_clk domain
always @(posedge wb_clk)
if (wb_rst)
do_writeback <= 0;
else if (wb_writeback_done)
do_writeback <= 0;
else if (start_writeback)
do_writeback <= 1;
这段代码就可以实现两个时钟域(wb_clk和ddr2_if_clk)间ddr2_writeback_done信号的同步。
2,编写test case
为了更清晰的展示其具体的同步过程,我写了一个简单的test case。
a,可综合的sync.v:
/*
* file name :sync.v
* author :Rill
* date :2014-04-12
*/
module sync
(
input clk_a,
input rst_a,
input en