一种将异步时钟域转换成同步时钟域的方法 【技术领域】
本发明涉及时钟域转换技术领域,特别是指一种将异步时钟域转换成同步时钟域的方法。
背景技术
在接口芯片逻辑设计中,从接口进入芯片内部处理的信号均是以数据帧的形式传送,且相对于芯片的主处理时钟而言均为异步信号。由于不同的时钟之间会存在一定的相差或短时频率抖动,为了使芯片能够稳定工作,需要将异步信号从异步时钟域转换到同步时钟域中,以获得稳定的同步信号,之后,再进行后续处理。
由于异步信号之间的帧头通常是不对齐的,而接口芯片内部需要处理帧头完全对齐的信号,因此,在该异步信号完成时钟域的转换后,还要再做帧头对齐的处理。
下面以宽带码多分址(WCDMA)系统中的上行主、分集信号为例,具体说明将该异步信号从异步时钟域转换到同步时钟域,并实现帧头对齐的方法。
一般将异步时钟域转为同步时钟域通常采用双口RAM缓存数据的方法来实现。图1所示为现有技术中异步信号时钟域转换的实现结构图。用异步时钟信号产生双口RAM写地址,用同步时钟产生双口RAM的读地址,该双口RAM深度是根据需要容忍的短时频差范围来确定。分别将读写地址转换成对应的格雷码,再用同步时钟采样并进行比较,以判断读写地址之间的距离是否小于可能发生读、写冲突地最小距离,即“危险距离”,如果是,则将读地址跳转180度,即将读地址跳转到离当前位置最远的地址后,再执行读操作;否则不必调整读地址,直接执行读操作。这样读出来的数据是稳定且正确的,且屏蔽了异步时钟与本地同步时钟之间的相位差以及短暂的频率抖动。
上述读地址跳转180度的方法为:设读地址为r_add,RAM深度为a,当r_add>=a/2,且读写地址之间小于危险距离时,读地址跳转到r_add-a/2处;当r_add<a/2,且读写地址之间小于危险距离时,读地址跳转到r_add+a/2处。例如,假设写地址为13,读地址为11,“危险距离”定为3,RAM深度为16,由于|13-11|<3,且11>16/2=8,因此读地址需要调整到11-16/2=3。
一般实现两路数据帧头对齐处理是采用2级双口RAM的方法。图2所示为现有技术的以上行主、分集帧头为例实现帧头对齐的结构图。为了说明方便,假定帧长为8,双口RAM深度为16。由于要满足帧头对齐的要求,因此必须确知帧头在双口RAM中的具体位置,为方便帧头对齐的处理,双口RAM深度通常取帧长的整数倍。对于主、分集数据,此时已被转换到同步时钟域中,因此,对主、分集帧头分别进行模2计数,根据帧头计数结果对相应的地址发生计数器进行置位,其具体置位规则如下:帧头计数值为0且相应帧头到来时,将相应地址发生计数器置为8;帧头计数值为1且相应帧头到来时,将相应地址发生计数器置为0,该经过置位的地址发生计数器的值作为对应双口RAM的写地址,这样每一帧的第一个数据都是在地址0或者地址8上;双口RAM的读地址只用一个模16的计数器产生,同样地,对本地同步帧头信号进行模2计数,根据帧头计数结果对读地址计数器进行置位,其置位规则同上,这样本地同步帧头的第一个数据也总是从地址0或者地址8读出;将写地址计数器的初始值置为0,将读地址计数器的初始状态置为8,从而保证了读写地址距离在开始就相差最大,而且实现了帧头对齐的处理。
上述方法的缺陷在于:时钟域转换与帧头对齐处理需要分两个步骤完成,不能在完成时钟域转换的同时实现数据帧头对齐处理。而且实现较为复杂,不易理解且造成资源浪费。
【发明内容】
有鉴于此,本发明的目的在于提供一种将异步时钟域转换成同步时钟域的方法,在完成时钟域转换的同时,实现帧头对齐的处理。
为达到上述目的本发明的技术方案是这样实现的:
一种将异步时钟域转换成同步时钟域的方法,该方法包括以下步骤:
a、设置异步时钟域中的每个异步信号对应一个地址发生计数器,且每个异步信号的帧头信号对其所对应的地址发生计数器进行周期置位,将该经过置位的地址发生计数器的值作为每个异步信号所对应双口RAM的写地址,并根据双口RAM的写地址设置该双口RAM的写地址状态指示信号;
b、用同步时钟对异步写地址状态指示信号进行采样,得到同步写地址状态指示信号;
c、同步时钟域中设置与异步时钟域中相同数量的地址发生计数器,每个同步信号的帧头信号对其所对应的地址发生计数器进行周期置位,且该地址发生计数器的值作为每个同步信号所对应双口RAM的读地址,根据同步写地址状态指示信号,按照预先设定的规则确定读地址的判断位置,并对读地址做相应调整。
较佳地,所述周期置位进一步包括以下步骤:
设置双口RAM深度为a为帧长为K的正整数倍t,对帧头进行模t计数;
当帧头计数值小于t减1的值,且遇到帧头时,将地址发生计数器的值置为帧头计数值加1的值乘以帧长K;当帧头计数值为t减1,且遇到帧头时,将地址发生计数器的值置为0。
较佳地,所述根据双口RAM的写地址设置该双口RAM的写地址状态指示信号为:设置写地址帧头信号对应的写地址状态指示信号为高电平,且写地址状态指示信号的长度大于所对应的写地址帧头信号的长度。
较佳地,异步信号的帧长大于等于4时,步骤c所述按照预先设定的规则确定读地址的判断位置的方法为:读地址的判断位置等于n乘以帧长K再减1,且n为小于等于双口RAM深度a除以帧长K的自然数;
步骤c所述对读地址的相应调整方法为:在读地址的判断位置上判断读地址r_add与写地址w_add之间的距离是否小于等于预先设定的危险距离L,如果是,则令与该异步信号相对应的读地址等于读地址减去帧长K再加1,否则对读地址不做调整。
较佳地,所述预先设定的危险距离L小于帧长的一半。
较佳地,异步信号的帧长小于4时,
步骤c所述按照预先设定的规则确定读地址的判断位置的方法为:读地址的判断位置在n乘以帧长K再减1中以等间隔cK抽取,且n为小于等于双口RAM深度a除以帧长K的自然数;
步骤c所述对读地址的相应调整方法为:在读地址的判断位置上判断读地址r_add与写地址w_add之间的距离是否小于等于预先设定的危险距离L,如果是,则令与该异步信号相对应的读地址等于读地址减去抽取间隔cK再加1,否则对读地址不做调整。
较佳地,所述预先设定的危险距离L小于抽取间隔值的一半。
较佳地,所述异步时钟域中的异步信号为两个或两个以上。
应用本发明,直接使用同步时钟采样异步时钟域中的异步写地址状态信号,并应用预先设定的规则,在特定的读地址位置对同步时钟域中的读地址进行调整,使得在实现异步信号时钟域转换的同时,实现了不同异步数据帧之间的帧头对齐的处理。应用本发明,实现结构简单,容易理解,避免了格雷码变换等复杂处理,使得设计流程大大简化,节约了实现的逻辑资源。
【附图说明】
图1为现有技术中异步信号时钟域转换的实现结构图;
图2为现有技术的以WCDMA系统上行主、分集帧头为例实现帧头对齐的结构图;
图3为应用本发明的以WCDMA系统上行主、分集帧头为例同时实现时钟域转换及帧头对齐的结构图;
图4为应用本发明写地址判断时序关系图;
图5为应用本发明的同步时钟对异步写地址状态指示信号采样的示意图;
图6为应用本发明的读地址调整后的时序图;
【具体实施方式】
下面结合附图及具体实施例对本发明再作进一步详细的说明。
本发明的思路是:异步时钟域中的每个异步时钟信号对应一个地址发生计数器,且每个异步信号的帧头信号对其所对应的地址发生计数器进行周期置位,将该经过置位的计数器的值作为每个异步信号所对应双口RAM的写地址,并根据双口RAM的写地址设置该双口RAM的异步写地址状态指示信号;用同步时钟对异步写地址状态指示信号进行采样,得到同步写地址状态指示信号;同步时钟域中设置与异步时钟域中相同数量的地址发生计数器,每个同步信号的帧头信号对其所对应的地址发生计数器进行周期置位,该计数器的值作为其所对应双口RAM的读地址,根据同步写地址状态指示信号,按照预先设定的规则确定读地址的判断位置,并对读地址做相应调整。
根据帧头信号对计数器进行周期置位的规则为:设RAM深度为a,帧长为K,且a=tK,t为正整数,对帧头进行模t的计数,当帧头计数值为m,m<t-1且遇到帧头时,将地址发生计数器的值置为(m+1)K;当帧头计数值m为t-1,且遇到帧头时,由于计数值循环计数,因此将地址发生计数器的值置为0。
下面以WCDMA系统中的上行主、分集信号为例,具体说明其实现方式。在本实施例中,还是设定帧长为8,双口RAM的深度为16,可能发生读写冲突的最小“危险距离”为3,则t=16/8=2,由于每个RAM中只可能有两帧,因此,帧头计数值m只能为0和1。
图3所示为本实施例的实现时钟域转换及帧头对齐的结构图。在异步时钟域利用异步时钟启动两个模16的地址发生计数器(cnt16 301和cnt16302),并对主、分集帧头分别进行模2计数,根据帧头计数结果对相应的地址发生计数器进行周期置位,该经过置位的计数器的值作为与之相连的双口RAM的写地址;同时对两个双口RAM的写地址状态分别进行状态判断,以分别获取两个双口RAM的写地址状态指示信号;同步时钟对异步写地址状态指示信号分别进行采样,从而得到同步写地址状态指示信号;在同步时钟域中同步时钟驱动两个模16的地址发生计数器(cnt16 303和cnt16 304),同时对本地同步帧头进行模2计数,根据帧头计数结果对相应的地址发生计数器进行置位,该经过置位的计数器的值作为与之相连的双口RAM的读地址,根据同步写地址状态指示信号,并按照预先设定的规则对与之相对应的双口RAM读地址进行调整。下面就每一步骤具体说明:
首先,异步时钟域利用异步时钟启动两个模16的地址发生计数器cnt16301和cnt16 302,同时对主、分集帧头信号分别进行模2计数,根据帧头计数结果分别对对应的模16的地址发生计数器进行周期置位,即当帧头计数值m为0(m<t-1)且帧头到来时,将对应的模16计数器置为(0+1)×8=8,当帧头计数值m为1(m=n-1)且帧头到来时,将对应的模16计数器置为0。该经过周期置位操作后计数器的值作为两个双口RAM的写地址,同时对两个RAM的写地址状态分别进行判断,分别获得两个双口RAM的写地址状态指示信号。如图4所示,由于进来的两路异步信号帧长为8,且地址发生计数器的模为16,因此,帧头写入的位置只能是在双口RAM的地址0或者地址8上,由于每个异步信号写入两次,用两个写地址状态指示信号即写地址状态指示信号1(state_ind1)和写地址状态指示信号2(state_ind2)来分别表示这两个写入的状态,state_ind1表示写地址在第二帧的异步数据帧头附近的状态,state_ind2表示写地址在第一帧的异步数据帧头附近的状态,在本实施例中,写地址为{6,7,8,9,10}时,state_ind1为高电平,写地址为{14,15,0,1,2}时,state_ind2为高电平。
其次,用同步时钟对异步写地址状态指示信号进行采样,获取同步写地址状态指示信号。图5所示为应用本发明的同步时钟对异步写地址状态指示信号采样的示意图。由于表示异步写地址状态的帧头信号有1比特,且持续时间较长,所以可由同步时钟对该异步写地址状态指示信号直接采样,同时,由于是用同步时钟对异步时钟域中的信号采样,因此在所采集信号的边沿处会存在一定的模糊状态,即图5中的阴影部分,但由于该模糊部分只影响读地址是在这一次还是在下一次进行调整而已,而读地址一旦进行调整,则该模糊部分对于数据的正确转换没有任何影响。
最后,用同步时钟驱动两个模16的地址发生计数器cnt16 303和cnt16304,同时对本地同步帧头信号进行模2计数,根据对本地同步帧头的计数结果对其所对应的两个模16的地址发生计数器进行周期置位处理,即当帧头计数值m为0(m<n-1)且帧头到来时,将对应的模16计数器置为8((m+1)×8),当帧头计数值m为1(m=n-1)且帧头到来时,将对应的模16计数器置为0。该经置位操作后的计数器的值作为双口RAM的读地址,根据同步写地址状态指示信号对双口RAM的读地址进行调整。图6所示为应用本发明的读地址调整后的时序图。由于同步时钟域中的每个地址发生计数器与异步时钟域中的一个地址发生计数器相对应,也就是说,同步时钟域的每个地址发生计数器对应一个异步信号,其具体调整方案为:
确定读地址的判断位置,具体的确定方法是设置n为小于等于RAM深度a除以帧长K的自然数,其中,RAM深度为帧长的整数倍;读地址的判断位置为n乘以帧长再减1,即读地址的判断位置为nK-1,且n<=a/K,n为自然数。
在读地址的判断位置上判断读地址r_add与写地址w_add之间的距离是否小于等于预先设定的危险距离L,该预先设定的危险距离L需满足2L<K,如果|r_add-w_add|<=L,则令读地址等于读地址减去帧长K再加1,即令r_add=r_add-K+1,否则对该读地址不做调整。
在本实施例中,a=16,K=8,L=3,则n=2;
读地址的判断位置为8-1=7,2×8-1=15;
当读地址为7,且|w_add-7|<=3时,判断同步写地址状态指示信号1(sync_state_ind1)是否为高电平,如果是,则将与该异步信号相对应的读地址调整为r_add=7-8+1=0,否则对该读地址不做调整;
当读地址为15,且|w_add-15|<=3时,判断同步写地址状态指示信号2(sync_state_ind2)是否为高电平,如果是,则将读地址调整为r_add=15-8+1=8,否则对该读地址不做调整。
经过这样的调整后,使得从存储主、分集数据的RAM中读出的数据在完成时钟域转换的同时,实现了主、分集数据帧头对齐的处理。
上述的调整方案中的公式只适用于帧长大于等于4的情况,如果帧长小于4,则应用下面的方法确定读地址的判断位置以及读地址的调整位置。
确定读地址的判断位置时,设置n为小于等于RAM深度a除以帧长K的自然数,其中,RAM深度为帧长的整数倍,读地址的判断位置为n乘以帧长再减1,即读地址的判断位置为nK-1,且n<=a/K,n为自然数。由于帧长较短,因此,读地址的判断位置可以从K-1、2K-1、3K-1……nK-1中以等间隔cK抽取,则读地址判断的位置为cK-1、2cK-1……rcK-1,(r<n)。
在读地址的判断位置上判断读地址r_add与写地址w_add之间的距离是否小于等于预先设定的危险距离L,该预先设定的危险距离L要满足2L<ck,如果|w_add-r_add|<=L,则令与该异步信号相对应的读地址等于读地址减去抽取间隔cK的值再加1,即令r_add=r_add-cK+1,否则对读地址不做调整。
例如,设置a=16,K=2,则n=2,并设L=1,ck=4,
读地址的判断位置可为3,7,11,15;
读地址可能调整的位置为:
当|w_add-3|<=1时,r_add=3-4+1=0;
当|w_add-7|<=1时,r_add=7-4+1=4;
当|w_add-11|<=1时,r_add=11-4+1=8;
当|w_add-15|<=1时,r_add=15-4+1=12;
本发明不仅适用于异步信号为两个的情况,对于将两个以上的异步信号转换为同一时钟域并使其帧头对齐的情况同样适用。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。