有哪些技术方法可以处理FPGA跨时钟域问题?
扫描二维码
随时随地手机看文章
以下内容中,小编将对FPGA跨时钟域处理技术方法进行着重介绍和阐述,希望本文能帮您增进对FPGA跨时钟域处理技术方法的了解,和小编一起来看看吧。
一、FPGA跨时钟域处理技术方法一
1、跨时钟域之间不能存在组合逻辑。 跨时钟域本身就容易产生亚稳态,如果在跨时钟域之间存在组合逻辑会大大增加竞争冒险出现的概率。 这一点在实际设计中通常会因为粗心而导致设计异常,如下边代码中的S_clr_flag_a_all信号,就是在扩展时不小心使用了组合逻辑,这种情况下由于竞争冒险,会导致跨时钟域后的b信号出现一个clk的异常电平。
此时的跨时钟域电路为:
正确的处理方法是使用时序逻辑进行扩展:
正确的电路为:
2、跨时钟域信号要集中在一个位置跨时钟域,然后再使用,不能分别跨时钟域处理。
如下图,a时钟域的a信号要在b信号内的b和b2两个位置使用,正确的处理如下:
错误的处理方式如下,这种处理方式下,由于b和b2分别做的跨时钟域,由于时钟抖动、走线路径的原因,会导致b和b2不同步,如果该信号是一个关键的控制信号,会导致系统异常,要注意避免这种情况的发生。
二、FPGA跨时钟域处理技术方法二
将ADC采样的数据写入RAM时,需要产生RAM的写地址,但我们读出RAM中的数据时,肯定不是一上电就直接读取,而是要等RAM中有ADC的数据之后才去读RAM。这就需要100MHz的时钟对RAM的写地址进行判断,当写地址大于某个值之后再去读取RAM。
在这个场景中,其实很多人都是使用直接用100MHz的时钟于RAM的写地址进行打两拍的方式,但RAM的写地址属于多bit,如果单纯只是打两拍,那不一定能确保写地址数据的每一个bit在100MHz的时钟域变化都是同步的,肯定有一个先后顺序。如果在低速的环境中不一定会出错,在高速的环境下就不一定能保证了。所以更为妥当的一种处理方法就是使用格雷码转换。
对于格雷码,相邻的两个数间只有一个bit是不一样的(格雷码,在本文中不作详细介绍),如果先将RAM的写地址转为格雷码,然后再将写地址的格雷码进行打两拍,之后再在RAM的读时钟域将格雷码恢复成10进制。这种处理就相当于对单bit数据的跨时钟域处理了。
对于格雷码与十进制互换的代码,仅提供给大家作参考:
代码使用的是函数的形式,方便调用,op表示编码或者译码,WADDRWIDTH和RADDRWIDTH表示位宽。
最后,小编诚心感谢大家的阅读。你们的每一次阅读,对小编来说都是莫大的鼓励和鼓舞。希望大家对FPGA跨时钟域处理技术方法都已经有了初步的认识,最后的最后,祝大家有个精彩的一天。