2025-05-13 11:36:18 德国世界杯预选赛

数字集成电路设计-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

《超级动物大逃杀》怎么玩?玩法技巧分享
你的芝麻分值多少钱?各分段福利完整汇总,值得收藏!
top