本文转载自:十年老鸟的CSDN博客
前言
最近买了几本书,对知识进行细节方面查漏补缺,从0分到90分容易,从90分到95分难。主要记录一些自认为有用,但平时又没有用到的一些小知识点或者技巧,包括例如一些新奇的设计、一些忽略的报表分析或者约束等等,也许不关注这些东西,工程也能正常编译和使用,但为了更加精益求精,还是要广泛吸收其他人的一些总结和经验,才能不断进步。
在这篇文章中提到的XPM_CDC模板,以前我从来没关注过,直到看到这本书中写到,因此记录下来,准备研究看看
ASYNC_REG
在异步跨时钟域场合,对于控制信号(通常位宽为1bit)常使用双触发器的方式完成跨时钟域操作。如图所示。对于图中标记的1和2的触发器,需要使用综合属性ASYNC_REG,其目的有两个:表明1触发器接收的数据来自与接收时钟异步的时钟域;表明2触发器是同步链路上的触发器。这样就能保证1/2触发器在布局时会被放置在同一个SLICE内,从而减少线延迟对时序的影响
在实际工程中,1和2触发器往往会被设计者忘记标记ASYNC_REG。一个好的解决方法是使用Xilinx提供的XPM_CDC模板来避免遗忘,相应的代码如图所示。可以看到,这里只需要实例化xpm_cdc_single即可,无需标记ASYNC_REG(该属性已被标记)
结论:
(1)ASYNC_REG用于单bit信号采用双(或多)触发器实现异步跨时钟域的场合,此时所有用于同步的触发器都要标记ASYNC_REG。
(2)可使用Xilinx提供的XPM_CDC模板避免遗忘标记ASYNC_REG
高效设计异步跨时钟域电路
单bit异步跨时钟域电路
对于同步跨时钟域电路,由于时钟之间有明确的相位关系,因此可通过时序约束明确建立时间需求,保证电路正常工作。对于异步跨时钟域电路,由于发送时钟与接收时钟之间没有明确的相位关系,因此,需要通过电路本身保证数据被稳定地传输。Xilinx提供了单bit跨时钟域时钟电路设计流程,可减小设计开发的难度。
多bit异步跨时钟域电路
对于多bit异步跨时钟域电路,首先,需要明确数据是否已经处于稳定状态,不会再翻转。例如,由clka驱动的4个触发器,其输入端口是固定数值(0或1),其输出端口连接到由clkb驱动的4个触发器,那么此时并不需要跨时钟域电路。又或者,由clka驱动的4个触发器,其输入端由外部CPU提供,只在上电时给数据,之后保持不变,那么此时也不需要跨时钟域电路。其次,判断是否每个时钟周期都要传输数据,如果是,则需要用到XPM_FIFO_ASYNC;如果不是,则明确数据是否需要缓存,如果需要,则仍需要使用XPM_FIFO_ASYNC,否则就要检查数据是否是个计数器,如果是,就需要用到XPM_CDC_GRAY,如果不是,则明确所有bit是否要求在同一时钟周期内到达,如果是,则需要用到XPM_CDC_HANDSHAKE;否则,就需要用到XPM_CDC_ARRAY_SINGLE。整个流程如图所示。
以上所有的模板都位于:
后续还需添加一些实例