异步数据的致命陷阱
0赞异步数据的致命陷阱
还是在当年,当年,Bingo还小的时候,那时候还年轻,搞不通边沿检测的东东,相关博文如下所示:
http://www.cnblogs.com/crazybingo/archive/2010/07/30/1789008.html
http://www.cnblogs.com/crazybingo/archive/2011/07/26/2117149.html
怀念一下10年暑假的记录:
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; //上升沿
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
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以及前后博文。
最后,谨记:时序的完美,不仅仅是功能的正确