CrazyBingo

异步数据的致命陷阱

0
阅读(2337)

异步数据的致命陷阱

还是在当年,当年,Bingo还小的时候,那时候还年轻,搞不通边沿检测的东东,相关博文如下所示:

http://www.cnblogs.com/crazybingo/archive/2010/07/30/1789008.html

http://www.cnblogs.com/crazybingo/archive/2011/07/26/2117149.html

怀念一下10年暑假的记录:

wps_clip_image-30980

wps_clip_image-23912

1. 一级同步

当然,这些都不是俺讨论的关键,俺讨论的关键,是数据同步的重要性。。稍有不慎,满盘皆输,谁叫FPGA他太快了。。。,问题在锻炼中总结,如下,直接捕获输入信号与一级同步的信号,产生上升沿标志位,仿真傻眼了,这样子不好……

//-------------------------------------
//data sync
reg mcu_we_r;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		mcu_we_r <= 0;
	else
		mcu_we_r <= mcu_we;
end
wire sys_we = (~mcu_we_r & mcu_we) ? 1'b1 : 1'b0; //上升沿

 

wps_clip_image-11312

wps_clip_image-15154

2. 二级同步

异步时钟,肯定是数据源1级没同步的问题,陷阱啊,修改后,如下:

//-------------------------------------
//data sync
reg mcu_we_r0, mcu_we_r1;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		begin
		mcu_we_r0 <= 0;
		mcu_we_r1 <= 0;
		end
	else
		begin
		mcu_we_r0 <= mcu_we;
		mcu_we_r1 <= mcu_we_r0;
		end
end
wire sys_we = (~mcu_we_r1 & mcu_we_r0) ? 1'b1 : 1'b0; //rising edge valid

 

wps_clip_image-3726

wps_clip_image-31746

3. 必须要成的习惯

当年峰哥发给我一份testbench的PPT,看得我瞬间萌动,下载地址如下;

http://www.chinaaet.com/lib/detail.aspx?id=89867

其中很重要的提到了,fpga设计中很严谨的一点,

每一个verilog代码都必须经过严格的testbench测试

甚至一个工程,testbench的代多过了verilog代码,这个我在当年设计sram读写无冲突设计的时候已经体验过了,很痛苦但是很重要。

虽然这个比较苛刻,老工程师通常只是用脑子想想的,也许他们是没办法,也许也是那个时候fpga速度还不快,也许他们不完美哈哈,反正我推介是都仿真,甚至用示波器之前,都得先仿真,modelsim的博文,请参考http://blog.chinaaet.com/detail/25334.html以及前后博文。

最后,谨记:时序的完美,不仅仅是功能的正确