数字集成电路设计-10-关于采用两级触发器实现双时钟域信号同步方法的分析与验证

本文分析了使用两级触发器在数字集成电路设计中实现双时钟域信号同步的方法,通过代码和仿真验证了其工作原理。讨论了快时钟同步到慢时钟可能的信号丢失问题以及慢时钟同步到快时钟的可行性。
摘要由CSDN通过智能技术生成

引言

实现双时钟域数据的交换,最常见的方法就是采用双时钟的异步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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值