跨时钟域传递数据实例

0. 介绍

  跨时钟域传递的方法,Cummings的论文(见附录)中讲的很详细,之前自己也详细看过,除了他的论文还从网上看了一些其他人讲的关于跨时钟域的东西,以为自己已经掌握了跨时钟域的基本方法,面试、笔试完全不虚了,但是呢,前几天去某AI芯片公司二面,在跨时钟域问题上露怯,当然,面试过程全程被吊打,早已懵逼。

  问题是:有一个APB接口的计数器IP,CPU可以通过写数据,控制计数器技术到5或者10等等任意数,但是写数据和计数器接受数据的时钟是异步的,并且希望在计数器最大值切换的时候,当前计数结束才可以切换,比如最大值为10,计数到6的时候来了一个新值5,必须计数到10之后,才能替换成5,应该怎么实现这个功能,根据APB的接口具体说一下信号都是怎么给的?

1. 方法

  当时他提示我用握手信号,但我不太敢说,当时又想到通过握手信号来解决,但没有给出让他满意的方案,现在想想CPU可以将写的数据和一bit的valid信号打包成一个数据,最高位是valid信号,其他位是要写的数据,CPU先将要写的数据放到pwdata上,下一个时钟周期再让valid有效,计数器IP采样到写入的数据并保存起来,当前计数结束的时候,加载新的计数值,之后计数器IP通过prdata给CPU发一个应答信号。

2. 分析

  一开始CPU将数据放到pwdata上,待数据稳定后将pwdata最高位的valid拉高,计数器IP通过两级寄存器采样valid信号,这里可能采样出现亚稳态,采样到0,但这不影响功能,只是会使采样延迟一个周期而已。接着计数器将新的计数值保存下来,待当前计数结束之后加载新的计数值。然后通过prdata将应答传给CPU。

  这样的话似乎可以实现所需要的功能。 

附录

\1. Synthesis and Scripting Techniques for Designing MultiAsynchronous Clock Designs

\2. Simulation and Synthesis Techniques for Asynchronous FIFO Design

\3. Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchronous Pointer Comparisons


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!