CN101753288A - 基于过采样的时钟数据恢复和串并转换电路 - Google Patents

基于过采样的时钟数据恢复和串并转换电路 Download PDF

Info

Publication number
CN101753288A
CN101753288A CN200910219463A CN200910219463A CN101753288A CN 101753288 A CN101753288 A CN 101753288A CN 200910219463 A CN200910219463 A CN 200910219463A CN 200910219463 A CN200910219463 A CN 200910219463A CN 101753288 A CN101753288 A CN 101753288A
Authority
CN
China
Prior art keywords
data
clock
module
ckm
recovery
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN200910219463A
Other languages
English (en)
Inventor
邓军勇
蒋林
曾泽沧
吕菱
刘钊远
张晋
周晏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Xi'an Post & Telecommunication College
Original Assignee
Xi'an Post & Telecommunication College
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Xi'an Post & Telecommunication College filed Critical Xi'an Post & Telecommunication College
Priority to CN200910219463A priority Critical patent/CN101753288A/zh
Publication of CN101753288A publication Critical patent/CN101753288A/zh
Pending legal-status Critical Current

Links

Images

Abstract

一种用于高速串行收发器接收端的基于过采样的时钟数据恢复和串并转换电路,包括锁相环模块、数据空间过采样模块、边沿检测与数据恢复模块、判决模块、时钟恢复模块、时钟分频模块和SerDes模块。数据空间过采样模块利用锁相环模块输出的16相等间隔时钟对连续3个字节的24位数据进行采样,存放在16组、每组24个寄存器中。相邻两组寄存器的相应位进行异或以完成边沿检测,检测结果分组相加,那么距离数值最大的一组数据对应的采样时钟最远的时钟可作为恢复时钟,由该时钟采样的数据可作为恢复数据,将该时钟8分频后对恢复数据分字节同步,即完成时钟数据恢复和串并转换。本发明结构清晰、性能较高,工作可靠。

Description

基于过采样的时钟数据恢复和串并转换电路
技术领域
本发明涉及一种高速收发器的时钟数据恢复电路,特别是涉及一种用于高速串行收发器中的接收端的基于过采样的时钟数据恢复和串并转换电路,属于通信专用集成电路设计技术领域。
背景技术
高速串行数据收发器在高速双向数据传输系统,如千兆以太网、光纤传输网络、高速网络路由和无线基站等中有着广泛应用,具体表现在为电路板之间、电路板和处理器之间、板上的处理器和外设之间以及芯片和背板之间的通信提供高速接口。电信业务和互联网业务的迅猛发展进一步加大了对高速高性能收发器芯片的需求。
然而,在收发器的接收端接收并放大的数据不同步且含有噪声。为了保证对数据后续处理的同步,时钟等时序信息必须从数据中提取出来,而且必须对数据进行“重定时”以消除传输过程中积累的抖动(噪声)。这一时钟提取和数据重定时的过程就称为“时钟数据恢复”(CDR,Clock and Data Recovery),同时为了便于后续处理,往往需要对数据进行串并转换。
为了进行同步操作,比如对随机数据进行解复用和重定时,接收器必须产生时钟。时钟恢复电路通过对数据进行检测产生周期性的时钟,并由该时钟对数据进行重定时。时钟恢复电路产生的时钟必须满足三个重要条件:(1)时钟的频率必须与数据速率一致、或者与解复用后的数据速率一致;(2)时钟必须与数据有一个确定的相位关系,从而保证对数据的采样在最佳采样点进行,确切地说,时钟沿应与每个数据脉冲的中心对齐,这样采样的位置距离相邻的前一个和后一个数据跳变沿都最远,于是相对于抖动和其他的时序不确定性而言就提供了最大的裕度;(3)因为时钟的抖动是数据抖动的主要“贡献者”,因此时钟的抖动必须足够小。这三条原则是CDR电路设计的基础。
CDR电路的设计,经历了由最初的仅仅采用锁相环和判决电路的简单CDR电路、以及基于锁相环(PLL,Phase Locked Loop)和压控振荡器(VCO,VoltageControlled Oscillator)由粗调环路和细调环路构成的双环CDR结构,到目前的新双环CDR结构,该电路仍然是基于PLL/VCO的,但这里的PLL/VCO单独构成一个环路,只负责向具体完成时钟数据恢复的第二个环路提供一系列不同相位的参考时钟,并不直接参与时钟数据恢复工作,由于若由PLL/VCO环路提供任意相位的参考时钟,不仅导致PLL/VCO环路的结构复杂、功耗加大,同时也会加剧时钟数据恢复环路中控制电路的规模和复杂度,因此应由第二个环路根据鉴相结果对不同相位的时钟进行某种操作,如插值、选择等,生成恰当相位的时钟。
目前,在新双环CDR电路设计中,时钟产生工作是这样完成的:
参照图1,时钟恢复的完成首先选择一对相邻相位的时钟来定义插值的相位间隔,相邻的时钟相位呈正交关系。相位插值的结果是输出一个与输入数据相位对齐的参考时钟ReCk,插值操作可以在数字域或模拟域完成。模拟方法由于可以提供连续的相位插值,因而具有较好的抖动性能,而数字方法则存在量化误差。为了覆盖360°的插值范围,整个360°的插值范围被离散地划分为4个象限,参照图2(A),每个象限的插值范围是90°。当插值向量从一个象限转移到另一个象限时,一个时钟就被它的互补时钟所代替。为了降低抖动和相位不连续性,这种替换必须在不影响环路的情况下完成,可以利用一个象限边界控制单元来保证时钟的替换仅发生在时钟混频权重为0的时候。这样就实现了时钟相位象限的平滑转移。然而由于各种负面因素的存在,比如相位边界控制单元的偏移,会使得时钟替换并不是发生在混频权重精确为0的时刻。这样就会产生如图2(B)所示的相位阶跃,从而导致抖动性能的下降。同时,此类电路还需要额外电路单独完成数据的串并转换工作。
发明内容
本发明的目的是:针对现有问题,提出一种结构简单、时钟数据恢复与串并转换同步完成的基于过采样的时钟数据恢复和串并转换电路。
本发明的目的是这样实现的:一种用于高速串行收发器接收端的基于过采样的时钟数据恢复和串并转换电路,包括一个锁相环模块(U0)、一个数据空间过采样模块(U1)、一个边沿检测与数据恢复模块(U2)、一个判决模块(U3)、一个时钟恢复模块(U4)、一个时钟分频模块(U5)和一个SerDes模块(U6);
数据空间过采样模块(U1)利用锁相环模块(U0)输出的16相等间隔的、与输入数据同频的时钟cki,i=1,2,...,16对串行输入的连续3个字节的24位数据进行采样,得到16×24个数据cki_bj,i=1,2,...,16,j=1,2,...,24,存放在16组、每组24个寄存器中;
边沿检测与数据恢复模块(U2)将采样数据按照相邻两组寄存器的相应位进行异或以完成边沿检测,其中第一组数据ck1_bj,j=1,2,...,24要与上一次采样数据的最后一组的相应位进行异或运算,最后一组数据ck16_bj,j=1,2,...,24需要保留至下一轮采样并在下一轮运算中表示为ck0_bj,j=1,2,...,24;异或运算的结果有16×24个,表示为cki_i+1_dj,i=0,1,2,...,15,j=1,2,...,24;
判决模块(U3)将从边沿检测与数据恢复模块(U2)送入的16×24个异或结果分组相加,得到结果表示为cntk,k=1,2,...,16;对16个加法运算结果cntk,k=1,2,...,16进行比较,选出数值最大的一个cntk对应的k值送入时钟恢复模块(U4);
时钟恢复模块(U4)按照(k+8)%16=m的原则从输入的16相等间隔的时钟cki,i=1,2,...,16中选择出ckm,此即为最佳采样时钟,可作为恢复时钟;恢复时钟ckm被送入时钟分频模块(U5)和边沿检测与数据恢复模块(U2);边沿检测与数据恢复模块(U2)将由ckm采样的数据ckm_bj,m=1,2,...,16,j=1,2,...,24作为恢复数据送入串并转换SerDes模块(U6);
时钟分频模块(U5)将时钟ckm进行8分频,并由该分频后时钟在串并转换SerDes模块(U6)中对恢复数据ckm_bj,m=1,2,...,16,j=1,2,...,24分字节进行同步得到3个字节的数据ckm_b[1:8]、ckm_b[9:16]、ckm_b[17:24],并依次送出,均表示为ckm_b[1:8],此即为并行恢复数据。
这样就完成了时钟数据恢复和串并转换工作,本发明在完成数据重定时的过程中,因为空间过采样电路采用了16相时钟进行采样,那么相位的调整步伐可以达到数据周期的1/16,满足数据重定时的精度要求。本发明结构清晰、且时钟数据恢复与串并转换可以同步完成,从而减小了电路复杂度,缓解了控制电路的压力,提升了电路性能,保证了电路的可靠工作。
附图说明
图1是传统的时钟恢复系统框图;
图2(A)、(B)分别是模拟相位插值和象限转移时的相位不连续性示意图;
图3是本发明的电路模块图。
具体实施方式
下面结合附图具体介绍本发明所采用的技术方案和工作原理。
一种用于高速串行收发器接收端的基于过采样的时钟数据恢复和串并转换电路,包括一个锁相环模块U0、一个数据空间过采样模块U1、一个边沿检测与数据恢复模块U2、一个判决模块U3、一个时钟恢复模块U4、一个时钟分频模块U5和一个SerDes模块U6;
首先说明电路各模块的接口信号。本发明的电路信号流图如图3所示。其模块输入输出接口说明如表1所示;数据空间过采样模块(U1)输入输出接口说明如表2所示;边沿检测与数据恢复模块(U2)的输入输出接口说明如表3所示;判决模块(U3)的输入输出接口说明如表4所示;时钟恢复模块(U4)的输入输出接口说明如表5所示;时钟分频模块(U5)的输入输出接口说明如表6所示;串并转换SerDes模块(U6)的输入输出接口说明如表7所示。
表1,模块接口信号说明
  信号名称   信号说明   含义
  ck[1:16]   IN   输入的16相、等相位间隔的采样时钟。
  data   IN   串行输入数据。
  rst   IN   全局复位信号。
  ckm   OUT   恢复时钟。
  ckm_b[1:8]   OUT   串并转换后的8位并行数据。
表2,数据空间过采样模块(U1)接口信号说明
信号名称   信号说明   含义
ck[1:16]   IN   输入的16相、等相位间隔的采样时钟。
data   IN   串行输入数据。
信号名称   信号说明   含义
cki_bj,i=1,2,...,16,j=1,2,...,24 OUT   过采样电路利用时钟ck[1:16]对连续输入的3个字节的24位数据进行采样的结果。
表3,边沿检测与数据恢复模块(U2)的接口信号说明
  信号名称   信号说明   含义
  cki_bj,i=1,2,...,16,j=1,2,...,24 IN   过采样电路利用时钟ck[1:16]对连续输入的3个字节的24位数据进行采样的结果。
  ckm   IN   输入的恢复时钟。
  ckm_bj,j=1,2,...,24 OUT   恢复后数据。
  cki_i+1_dj,i=0,1,2,…,15,j=1,2,…,24 OUT   相邻两组采样寄存器的相应位进行边沿检测的结果
表4,判决模块(U3)的接口信号说明
信号名称   信号说明  含义
cki_i+1_dj,i=0,1,2,…,15,j=1,2,…,24 IN  相邻两组采样寄存器的相应位进行边沿检测的结果
k   OUT  距离数据边沿最近的采样时钟的编号,取值范围1~16。
表5,时钟恢复模块(U4)的接口信号说明
  信号名称   信号说明  含义
  ck[1:16]   IN  输入的16相、等相位间隔的采样时钟。
  k   IN  距离数据边沿最近的采样时钟的编号,取值范围1~16。
  ckm OUT  根据k值按照(k+8)%16计算得出的最佳采样时钟,即恢复时钟。
表6,时钟分频模块(U5)的接口信号说明
  信号名称   信号说明   含义
  ckm   IN   恢复时钟。
  ckm_div8   OUT   对时钟ckm进行8分频后的时钟。
表7,串并转换SerDes模块(U6)的接口信号说明
信号名称   信号说明   含义
ckm_div8   IN   对时钟ckm进行8分频后的时钟。
ckm_bj,j=1,2,...,24 IN   恢复后数据。
ckm_b[1:8]   OUT   恢复后的并行数据。
参照图3,数据空间过采样模块U1利用锁相环模块U0输出的16相等间隔的、与输入数据同频的时钟cki,i=1,2,...,16对连续3个字节的24位数据进行采样,得到16×24个数据cki_bj,i=1,2,...,16,j=1,2,...,24,存放在16组、每组24个寄存器中。
边沿检测与数据恢复模块U2将采样数据按照相邻两组寄存器的相应位进行异或以完成边沿检测,其中第一组数据ck1_bj,j=1,2,...,24要与上一次采样数据的最后一组的相应位进行异或运算,最后一组数据ck16_bj,j=1,2,...,24需要保留至下一轮采样并在下一轮运算中表示为ck0_bj,j=1,2,...,24;异或运算的结果有16×24个,表示为cki_i+1_dj,i=0,1,2,...,15,j=1,2,...,24;具体运算公式为:
ck 1 _ b 1 ⊕ ck 0 _ b 1 = ck 0 _ 1 _ d 1 ;
ck 2 _ b 1 ⊕ ck 1 _ b 1 = ck 1 _ 2 _ d 1 ;
ck 3 _ b 1 ⊕ ck 2 _ b 1 = ck 2 _ 3 _ d 1 ;
ck 4 _ b 1 ⊕ ck 3 _ b 1 = ck 3 _ 4 _ d 1 ;
ck 5 _ b 1 ⊕ ck 4 _ b 1 = ck 4 _ 5 _ d 1 ;
ck 6 _ b 1 ⊕ ck 5 _ b 1 = ck 5 _ 6 _ d 1 ;
ck 7 _ b 1 ⊕ ck 6 _ b 1 = ck 6 _ 7 _ d 1 ;
ck 8 _ b 1 ⊕ ck 7 _ b 1 = ck 7 _ 8 _ d 1 ;
ck 9 _ b 1 ⊕ ck 8 _ b 1 = ck 8 _ 9 _ d 1 ;
ck 10 _ b 1 ⊕ ck 9 _ b 1 = ck 9 _ 10 _ d 1 ;
ck 11 _ b 1 ⊕ ck 10 _ b 1 = ck 10 _ 11 _ d 1 ;
ck 12 _ b 1 ⊕ ck 11 _ b 1 = ck 11 _ 12 _ d 1 ;
ck 13 _ b 1 ⊕ ck 12 _ b 1 = ck 12 _ 13 _ d 1 ;
ck 14 _ b 1 ⊕ ck 13 _ b 1 = ck 13 _ 14 _ d 1 ;
ck 15 _ b 1 ⊕ ck 14 _ b 1 = ck 14 _ 15 _ d 1 ;
ck 16 _ b 1 ⊕ ck 15 _ b 1 = ck 15 _ 16 _ d 1 ; . . . . . .
ck 1 _ b 24 ⊕ ck 0 _ b 24 = ck 0 _ 1 _ d 24 ;
ck 2 _ b 24 ⊕ ck 1 _ b 24 = ck 1 _ 2 _ d 24 ;
ck 3 _ b 24 ⊕ ck 2 _ b 24 = ck 2 _ 3 _ d 24 ;
ck 4 _ b 24 ⊕ ck 3 _ b 24 = ck 3 _ 4 _ d 24 ;
ck 5 _ b 24 ⊕ ck 4 _ b 24 = ck 4 _ 5 _ d 24 ;
ck 6 _ b 24 ⊕ ck 5 _ b 24 = ck 5 _ 6 _ d 24 ;
ck 7 _ b 24 ⊕ ck 6 _ b 24 = ck 6 _ 7 _ d 24 ;
ck 8 _ b 24 ⊕ ck 7 _ b 24 = ck 7 _ 8 _ d 24 ;
ck 9 _ b 24 ⊕ ck 8 _ b 24 = ck 8 _ 9 _ d 24 ;
ck 10 _ b 24 ⊕ ck 9 _ b 24 = ck 9 _ 10 _ d 24 ;
ck 11 _ b 24 ⊕ ck 10 _ b 24 = ck 10 _ 11 _ d 24 ;
ck 12 _ b 24 ⊕ ck 11 _ b 24 = ck 11 _ 12 _ d 24 ;
ck 13 _ b 24 ⊕ ck 12 _ b 24 = ck 12 _ 13 _ d 24 ;
ck 14 _ b 24 ⊕ ck 13 _ b 24 = ck 13 _ 14 _ d 24 ;
ck 15 _ b 24 ⊕ ck 14 _ b 24 = ck 14 _ 15 _ d 24 ;
ck 16 _ b 24 ⊕ ck 15 _ b 24 = ck 15 _ 16 _ d 24 ;
判决模块U3将从边沿检测与数据恢复模块U2送入的16×24个异或结果分组相加,得到结果表示为cntk,k=1,2,...,16;具体运算表示为:
cnt1=ck0_1_d1+ck1_2_d1+ck2_3_d1+ck3_4_d1+
      ck4_5_d1+ck5_6_d1+ck6_7_d1+ck7_8_d1+
      ck8_9_d1+ck9_10_d1+ck10_11_d1+ck11_12_d1+
      ck12_13_d1+ck13_14_d1+ck14_15_d1+ck15_16_d1;
cnt2=ck0_1_d2+ck1_2_d2+ck2_3_d2+ck3_4_d2+
      ck4_5_d2+ck5_6_d2+ck6_7_d2+ck7_8_d2+
      ck8_9_d2+ck9_10_d2+ck10_11_d2+ck11_12_d2+
      ck12_13_d2+ck13_14_d2+ck14_15_d2+ck15_16_d2;
cnt3=ck0_1_d3+ck1_2_d3+ck2_3_d3+ck3_4_d3+
      ck4_5_d3+ck5_6_d3+ck6_7_d3+ck7_8_d3+
      ck8_9_d3+ck9_10_d3+ck10_11_d3+ck11_12_d3+
      ck12_13_d3+ck13_14_d3+ck14_15_d3+ck15_16_d3;
cnt4=ck0_1_d4+ck1_2_d4+ck2_3_d4+ck3_4_d4+
      ck4_5_d4+ck5_6_d4+ck6_7_d4+ck7_8_d4+
      ck8_9_d4+ck9_10_d4+ck10_11_d4+ck11_12_d4+
      ck12_13_d4+ck13_14_d4+ck14_15_d4+ck15_16_d4;
cnt5=ck0_1_d5+ck1_2_d5+ck2_3_d5+ck3_4_d5+
      ck4_5_d5+ck5_6_d5+ck6_7_d5+ck7_8_d5+
      ck8_9_d5+ck9_10_d5+ck10_11_d5+ck11_12_d5+
      ck12_13_d5+ck13_14_d5+ck14_15_d5+ck15_16_d5;
cnt6=ck0_1_d6+ck1_2_d6+ck2_3_d6+ck3_4_d6+
      ck4_5_d6+ck5_6_d6+ck6_7_d6+ck7_8_d6+
      ck8_9_d6+ck9_10_d6+ck10_11_d6+ck11_12_d6+
      ck12_13_d6+ck13_14_d6+ck14_15_d6+ck15_16_d6;
cnt7=ck0_1_d7+ck1_2_d7+ck2_3_d7+ck3_4_d7+
      ck4_5_d7+ck5_6_d7+ck6_7_d7+ck7_8_d7+
      ck8_9_d7+ck9_10_d7+ck10_11_d7+ck11_12_d7+
      ck12_13_d7+ck13_14_d7+ck14_15_d7+ck15_16_d7;
cnt8=ck0_1_d8+ck1_2_d8+ck2_3_d8+ck3_4_d8+
      ck4_5_d8+ck5_6_d8+ck6_7_d8+ck7_8_d8+
      ck8_9_d8+ck9_10_d8+ck10_11_d8+ck11_12_d8+
      ck12_13_d8+ck13_14_d8+ck14_15_d8+ck15_16_d8;
cnt9=ck0_1_d9+ck1_2_d9+ck2_3_d9+ck3_4_d9+
      ck4_5_d9+ck5_6_d9+ck6_7_d9+ck7_8_d9+
      ck8_9_d9+ck9_10_d9+ck10_11_d9+ck11_12_d9+
      ck12_13_d9+ck13_14_d9+ck14_15_d9+ck15_16_d9;
cnt10=ck0_1_d10+ck1_2_d10+ck2_3_d10+ck3_4_d10+
       ck4_5_d10+ck5_6_d10+ck6_7_d10+ck7_8_d10+
       ck8_9_d10+ck9_10_d10+ck10_11_d10+ck11_12_d10+
       ck12_13_d10+ck13_14_d10+ck14_15_d10+ck15_16_d10;
cnt11=ck0_1_d11+ck1_2_d11+ck2_3_d11+ck3_4_d11+
       ck4_5_d11+ck5_6_d11+ck6_7_d11+ck7_8_d11+
       ck8_9_d11+ck9_10_d11+ck10_11_d11+ck11_12_d11+
       ck12_13_d11+ck13_14_d11+ck14_15_d11+ck15_16_d11;
cnt12=ck0_1_d12+ck1_2_d12+ck2_3_d12+ck3_4_d12+
       ck4_5_d12+ck5_6_d12+ck6_7_d12+ck7_8_d12+
       ck8_9_d12+ck9_10_d12+ck10_11_d12+ck11_12_d12+
       ck12_13_d12+ck13_14_d12+ck14_15_d12+ck15_16_d12;
cnt13=ck0_1_d13+ck1_2_d13+ck2_3_d13+ck3_4_d13+
       ck4_5_d13+ck5_6_d13+ck6_7_d13+ck7_8_d13+
       ck8_9_d13+ck9_10_d13+ck10_11_d13+ck11_12_d13+
       ck12_13_d13+ck13_14_d13+ck14_15_d13+ck15_16_d13;
cnt14=ck0_1_d14+ck1_2_d14+ck2_3_d14+ck3_4_d14+
       ck4_5_d14+ck5_6_d14+ck6_7_d14+ck7_8_d14+
       ck8_9_d14+ck9_10_d14+ck10_11_d14+ck11_12_d14+
       ck12_13_d14+ck13_14_d14+ck14_15_d14+ck15_16_d14;
cnt15=ck0_1_d15+ck1_2_d15+ck2_3_d15+ck3_4_d15+
       ck4_5_d15+ck5_6_d15+ck6_7_d15+ck7_8_d15+
       ck8_9_d15+ck9_10_d15+ck10_11_d15+ck11_12_d15+
       ck12_13_d15+ck13_14_d15+ck14_15_d15+ck15_16_d15;
cnt16=ck0_1_d16+ck1_2_d16+ck2_3_d16+ck3_4_d16+
       ck4_5_d16+ck5_6_d16+ck6_7_d16+ck7_8_d16+
       ck8_9_d16+ck9_10_d16+ck10_11_d16+ck11_12_d16+
       ck12_13_d16+ck13_14_d16+ck14_15_d16+ck15_16_d16;
对16个加法运算结果cntk,k=1,2,...,16进行比较,选出数值最大的一个cntk对应的k值送入时钟恢复模块U4;
时钟恢复模块U4按照(k+8)%16=m的原则从输入的16相等间隔的时钟cki,i=1,2,...,16中选择出ckm,此即为最佳采样时钟,可作为恢复时钟;恢复时钟ckm被送入时钟分频模块U5和边沿检测与数据恢复模块U2;边沿检测与数据恢复模块U2将由ckm采样的数据ckm_bj,m=1,2,...,16,j=1,2,...,24作为恢复数据送入串并转换SerDes模块U6;
时钟分频模块U5将时钟ckm进行8分频,并由该分频后时钟在串并转换SerDes模块U6中对恢复数据ckm_bj,m=1,2,...,16,j=1,2,...,24分字节进行同步得到3个字节的数据ckm_b[1:8]、ckm_b[9:16]、ckm_b[17:24],并依次送出,一次送出8位数据,均表示为ckm_b[1:8],此即为并行恢复数据。
传统的硬件电路设计通常采用电路图方式来详细描述电路的设计结构。用电路图方式描述硬件电路的结构是硬件设计的第二代设计工具,随着科学技术的迅猛发展,硬件描述语言(HDL)已经成为第三代硬件设计工具。所以该电路采用verilog硬件描述语言加以实施。
电路的Verilog语言描述:
module CDR(ck1,ck2,ck3,ck4,ck5,ck6,ck7,ck8,ck9,ck10,ck11,ck12,ck13,ck14,ck15,ck16,rst,data,ckm,ckm_b);
//the definitions of basic I/O ports
input ck1,ck2,ck3,ck4,ck5,ck6,ck7,ck8,ck9,ck10,ck11,ck12,ck13,ck14,ck15,ck16,rst,data;
output ckm;
output reg[7:0]ckm_b;
reg[23:0]
ck1_b,ck2_b,ck3_b,ck4_b,ck5_b,ck6_b,ck7_b,ck8_b,ck9_b,ck10_b,ck11_b,ck12_b,ck13_b,ck14_b,ck15_b,ck16_b;
reg[23:0]ck1_b_tmp,ck2_b_tmp,ck3_b_tmp,ck4_b_tmp,ck5_b_tmp,ck6_b_tmp,ck7_b_tmp,ck8_b_tmp,ck9_b_tmp,ck10_b_tmp,ck11_b_tmp,ck12_b_tmp,ck13_b_tmp,ck14_b_tmp,ck15_b_tmp,ck16_b_tmp;
reg[4:0]cnt_tier;
reg[23:0]n_buffer;
reg[3:0]state;
//complete the sampling of input serial data with 16-phase clock
always@(posedge ck1 or negedge rst)
  if(!rst)
    ck1_b<=24’h000000;
  else
    ck1_b<={ck1_b[22:0],data};
always@(posedge ck2 or negedge rst)
  if(!rst)
    ck2_b<=24’h000000;
  else
    ck2_b<={ck2_b[22:0],data};
always@(posedge ck3 or negedge rst)
  if(!rst)
    ck3_b<=24’h000000;
  else
    ck3_b<={ck3_b[22:0],data};
always@(posedge ck4 or negedge rst)
  if(!rst)
    ck4_b<=24’h000000;
  else
    ck4_b<={ck4_b[22:0],data};
always@(posedge ck5 or negedge rst)
  if(!rst)
    ck5_b<=24’h000000;
  else
    ck5_b<={ck5_b[22:0],data};
always@(posedge ck6 or negedge rst)
  if(!rst)
    ck6_b<=24’h000000;
  else
    ck6_b<={ck6_b[22:0],data};
always@(posedge ck7 or negedge rst)
  if(!rst)
    ck7_b<=24’h000000;
  else
    ck7_b<={ck7_b[22:0],data};
always@(posedge ck8 or negedge rst)
  if(!rst)
    ck8_b<=24’h000000;
  else
    ck8_b<={ck8_b[22:0],data};
always@(posedge ck9 or negedge rst)
  if(!rst)
    ck9_b<=24’h000000;
  else
    ck9_b<={ck9_b[22:0],data};
always@(posedge ck10 or negedge rst)
  if(!rst)
    ck10_b<=24’h000000;
  else
    ck10_b<={ck10_b[22:0],data};
always@(posedge ck11 or negedge rst)
  if(!rst)
    ck11_b<=24’h000000;
  else
    ck11_b<={ck11_b[22:0],data};
always@(posedge ck12 or negedge rst)
  if(!rst)
    ck12_b<=24’h000000;
  else
    ck12_b<={ck12_b[22:0],data};
always@(posedge ck13 or negedge rst)
  if(!rst)
    ck13_b<=24’h000000;
  else
    ck13_b<={ck13_b[22:0],data};
always@(posedge ck14 or negedge rst)
  if(!rst)
    ck14_b<=24’h000000;
  else
    ck14_b<={ck14_b[22:0],data};
always@(posedge ck15 or negedge rst)
  if(!rst)
    ck15_b<=24’h000000;
  else
    ck15_b<={ck15_b[22:0],data};
always@(posedge ck16 or negedge rst)
  if(!rst)
    ck16_b<=24’h000000;
  else
    ck16_b<={ck16_b[22:0],data};
//
always@(posedge ckm or negedge rst)
if(!rst)
  begin
     cnt_tier<=5’b00000;
     n_buffer<=24’h000000;
  end
else if(cnt_tier==5’d23)
 begin
      cnt_tier<=5’b00000;
      n_buffer<=ck16_b;
 end
 else cnt_tier<=cnt_tier+5’b1;
always@(posedge ckm or negedge rst)
if(!rst)
  begin
     ck1_b_tmp<=24’h000000;
     ck2_b_tmp<=24’h000000;
     ck3_b_tmp<=24’h000000;
     ck4_b_tmp<=24’h000000;
     ck5_b_tmp<=24’h000000;
      ck6_b_tmp<=24’h000000;
      ck7_b_tmp<=24’h000000;
      ck8_b_tmp<=24’h000000;
      ck9_b_tmp<=24’h000000;
      ck10_b_tmp<=24’h000000;
      ck11_b_tmp<=24’h000000;
      ck12_b_tmp<=24’h000000;
      ck13_b_tmp<=24’h000000;
      ck14_b_tmp<=24’h000000;
      ck15_b_tmp<=24’h000000;
      ck16_b_tmp<=24’h000000;
   end
else if(cnt_tier==5’d0)
   begin
      ck1_b_tmp<=ck1_b;
      ck2_b_tmp<=ck2_b;
      ck3_b_tmp<=ck3_b;
      ck4_b_tmp<=ck4_b;
      ck5_b_tmp<=ck5_b;
      ck6_b_tmp<=ck6_b;
      ck7_b_tmp<=ck7_b;
      ck8_b_tmp<=ck8_b;
      ck9_b_tmp<=ck9_b;
      ck10_b_tmp<=ck10_b;
      ck11_b_tmp<=ck11_b;
      ck12_b_tmp<=ck12_b;
      ck13_b_tmp<=ck13_b;
      ck14_b_tmp<=ck14_b;
      ck15_b_tmp<=ck15_b;
      ck16_b_tmp<=ck16_b;
   end
wire[23:0]
ck1_d,ck2_d,ck3_d,ck4_d,ck5_d,ck6_d,ck7_d,ck8_d,ck9_d,ck10_d,ck11_d,ck12_d,ck13_d,ck14_d,ck15_d,ck16_d;
assign ck1_d=n_buffer^ck1_b_tmp;
assign ck2_d=ck1_b_tmp^ck2_b_tmp;
assign ck3_d=ck2_b_tmp^ck3_b_tmp;
assign ck4_d=ck3_b_tmp^ck4_b_tmp;
assign ck5_d=ck4_b_tmp^ck5_b_tmp;
assign ck6_d=ck5_b_tmp^ck6_b_tmp;
assign ck7_d=ck6_b_tmp^ck7_b_tmp;
assign ck8_d=ck7_b_tmp^ck8_b_tmp;
assign ck9_d=ck8_b_tmp^ck9_b_tmp;
assign ck10_d=ck9_b_tmp^ck10_b_tmp;
assign ck11_d=ck10_b_tmp^ck11_b_tmp;
assign ck12_d=ck11_b_tmp^ck12_b_tmp;
assign ck13_d=ck12_b_tmp^ck13_b_tmp;
assign ck14_d=ck13_b_tmp^ck14_b_tmp;
assign ck15_d=ck14_b_tmp^ck15_b_tmp;
assign ck16_d=ck15_b_tmp^ck16_b_tmp;
reg[4:0]cnt1,cnt2,cnt3,cnt4,cnt5,cnt6,cnt7,cnt8,cnt9,cnt10,cnt11,cnt12,cnt13,cnt14,cnt15,cnt16;
//the statistics of XOR results for the decicison of sampling clock which is farest to the eyediagram center
always@(posedge ckm or negedge rst)
 if(!rst)
   begin
    cnt1<=5’b0;
    cnt2<=5’b0;
    cnt3<=5’b0;
    cnt4<=5’b0;
    cnt5<=5’b0;
    cnt6<=5’b0;
    cnt7<=5’b0;
    cnt8<=5’b0;
    cnt9<=5’b0;
    cnt10<=5’b0;
    cnt11<=5’b0;
    cnt12<=5’b0;
    cnt13<=5’b0;
    cnt14<=5’b0;
    cnt14<=5’b0;
    cnt16<=5’b0;
   end
 else if(cnt_tier==5’d0)
  begin
    cnt1<=5’b0;
    cnt2<=5’b0;
    cnt3<=5’b0;
    cnt4<=5’b0;
    cnt5<=5’b0;
    cnt6<=5’b0;
    cnt7<=5’b0;
    cnt8<=5’b0;
    cnt9<=5’b0;
    cnt10<=5’b0;
    cnt11<=5’b0;
    cnt12<=5’b0;
    cnt13<=5’b0;
    cnt14<=5’b0;
    cnt14<=5’b0;
    cnt16<=5’b0;
   end
 else
    begin
     cnt1<=ck1_d[0]+ck1_d[1]+ck1_d[2]+ck1_d[3]+ck1_d[4]+ck1_d[5]+ck1_d[6]+ck1_d[6]+ck1_d[8]+ck1_d[9]+ck1_d[10]+ck1_d[11]+ck1_d[12]+ck1_d[13]+ck1_d[14]+ck1_d[15];
     cnt2<=ck2_d[0]+ck2_d[1]+ck2_d[2]+ck2_d[3]+ck2_d[4]+ck2_d[5]+ck2_d[6]+ck2_d[6]+ck2_d[8]+ck2_d[9]+ck2_d[10]+ck2_d[11]+ck2_d[12]+ck2_d[13]+ck2_d[14]+ck2_d[15];
     cnt3<=ck3_d[0]+ck3_d[1]+ck3_d[2]+ck3_d[3]+ck3_d[4]+ck3_d[5]+ck3_d[6]+ck3_d[6]+ck3_d[8]+ck3_d[9]+ck3_d[10]+ck3_d[11]+ck3_d[12]+ck3_d[13]+ck3_d[14]+ck3_d[15];
     cnt4<=ck4_d[0]+ck4_d[1]+ck4_d[2]+ck4_d[3]+ck4_d[4]+ck4_d[5]+ck4_d[6]+ck4_d[6]+ck4_d[8]+ck4_d[9]+ck4_d[10]+ck4_d[11]+ck4_d[12]+ck4_d[13]+ck4_d[14]+ck4_d[15];
     cnt5<=ck5_d[0]+ck5_d[1]+ck5_d[2]+ck5_d[3]+ck5_d[4]+ck5_d[5]+ck5_d[6]+ck5_d[6]+ck5_d[8]+ck5_d[9]+ck5_d[10]+ck5_d[11]+ck5_d[12]+ck5_d[13]+ck5_d[14]+ck5_d[15];
cnt6<=ck6_d[0]+ck6_d[1]+ck6_d[2]+ck6_d[3]+ck6_d[4]+ck6_d[5]+ck6_d[6]+ck6_d[6]+ck6_d[8]+ck6_d[9]+ck6_d[10]+ck6_d[11]+ck6_d[12]+ck6_d[13]+ck6_d[14]+ck6_d[15];
cnt7<=ck7_d[0]+ck7_d[1]+ck7_d[2]+ck7_d[3]+ck7_d[4]+ck7_d[5]+ck7_d[6]+ck7_d[6]+ck7_d[8]+ck7_d[9]+ck7_d[10]+ck7_d[11]+ck7_d[12]+ck7_d[13]+ck7_d[14]+ck7_d[15];
cnt8<=ck8_d[0]+ck8_d[1]+ck8_d[2]+ck8_d[3]+ck8_d[4]+ck8_d[5]+ck8_d[6]+ck8_d[6]+ck8_d[8]+ck8_d[9]+ck8_d[10]+ck8_d[11]+ck8_d[12]+ck8_d[13]+ck8_d[14]+ck8_d[15];
cnt9<=ck9_d[0]+ck9_d[1]+ck9_d[2]+ck9_d[3]+ck9_d[4]+ck9_d[5]+ck9_d[6]+ck9_d[6]+ck9_d[8]+ck9_d[9]+ck9_d[10]+ck9_d[11]+ck9_d[12]+ck9_d[13]+ck9_d[14]+ck9_d[15];
cnt10<=ck10_d[0]+ck10_d[1]+ck10_d[2]+ck10_d[3]+ck10_d[4]+ck10_d[5]+ck10_d[6]+ck10_d[6]+ck10_d[8]+ck10_d[9]+ck10_d[10]+ck10_d[11]+ck10_d[12]+ck10_d[13]+ck10_d[14]+ck10_d[15];
cnt11<=ck11_d[0]+ck11_d[1]+ck11_d[2]+ck11_d[3]+ck11_d[4]+ck11_d[5]+ck11_d[6]+ck11_d[6]+ck11_d[8]+ck11_d[9]+ck11_d[10]+ck11_d[11]+ck11_d[12]+ck11_d[13]+ck11_d[14]+ck11_d[15];
cnt12<=ck12_d[0]+ck12_d[1]+ck12_d[2]+ck12_d[3]+ck12_d[4]+ck12_d[5]+ck12_d[6]+ck12_d[6]+ck12_d[8]+ck12_d[9]+ck12_d[10]+ck12_d[11]+ck12_d[12]+ck12_d[13]+ck12_d[14]+ck12_d[15];
cnt13<=ck13_d[0]+ck13_d[1]+ck13_d[2]+ck13_d[3]+ck13_d[4]+ck13_d[5]+ck13_d[6]+ck13_d[6]+ck13_d[8]+ck13_d[9]+ck13_d[10]+ck13_d[11]+ck13_d[12]+ck13_d[13]+ck13_d[14]+ck13_d[15];
cnt14<=ck14_d[0]+ck14_d[1]+ck14_d[2]+ck14_d[3]+ck14_d[4]+ck14_d[5]+ck14_d[6]+ck14_d[6]+ck14_d[8]+ck14_d[9]+ck14_d[10]+ck14_d[11]+ck14_d[12]+ck14_d[13]+ck14_d[14]+ck14_d[15];
cnt15<=ck15_d[0]+ck15_d[1]+ck15_d[2]+ck15_d[3]+ck15_d[4]+ck15_d[5]+ck15_d[6]+ck15_d[6]+ck15_d[8]+ck15_d[9]+ck15_d[10]+ck15_d[11]+ck15_d[12]+ck15_d[13]+ck15_d[14]+ck15_d[15];
cnt16<=ck16_d[0]+ck16_d[1]+ck16_d[2]+ck16_d[3]+ck16_d[4]+ck16_d[5]+ck16_d[6]+ck16_d[6]+ck16_d[8]+ck16_d[9]+ck16_d[10]+ck16_d[11]+ck16_d[12]+ck16_d[13]+ck16_d[14]+ck16_d[15];
end
always@(posedge ckm or negedge rst)
 if(!rst)
   begin
      state<=4’b0000;
   end
 else if(cnt_tier==5’d23)
   begin
if((cnt1>cnt2)&&(cnt1>cnt2)&&(cnt1>cnt2)&&(cnt1>cnt5)&&(cnt1>cnt6)&&(cnt1>cnt7)&&(cnt1>cnt8)&&(cnt1>cnt9)&&(cnt1>cnt10)&&(cnt1>cnt11)&&(cnt1>cnt12)&&(cnt1>cnt13)&&(cnt1>cnt14)&&(cnt1>cnt15)&&(cnt1>cnt16))
         state<=4’b0000;
      else
if((cnt2>cnt1)&&(cnt2>cnt2)&&(cnt2>cnt2)&&(cnt2>cnt5)&&(cnt2>cnt6)&&(cnt2>cnt7)&&(cnt2>cnt8)&&(cnt2>cnt9)&&(cnt2>cnt10)&&(cnt2>cnt11)&&(cnt2>cnt12)&&(cnt2>cnt13)&&(cnt2>cnt14)&&(cnt2>cnt15)&&(cnt2>cnt16))
         state<=4’b0001;
      else
if((cnt2>cnt1)&&(cnt2>cnt2)&&(cnt2>cnt2)&&(cnt2>cnt5)&&(cnt2>cnt6)&&(cnt2>cnt7)&&(cnt2>cnt8)&&(cnt2>cnt9)&&(cnt2>cnt10)&&(cnt2>cnt11)&&(cnt2>cnt12)&&(cnt2>cnt13)&&(cnt2>cnt14)&&(cnt2>cnt15)&&(cnt2>cnt16))
         state<=4’b0010;
      else
if((cnt2>cnt1)&&(cnt2>cnt2)&&(cnt2>cnt2)&&(cnt2>cnt5)&&(cnt2>cnt6)&&(cnt2>cnt7)&&(cnt2>cnt8)&&(cnt2>cnt9)&&(cnt2>cnt10)&&(cnt2>cnt11)&&(cnt2>cnt12)&&(cnt2>cnt13)&&(cnt2>cnt14)&&(cnt2>cnt15)&&(cnt2>cnt16))
         state<=4’b0011;
      else
if((cnt5>cnt1)&&(cnt5>cnt2)&&(cnt5>cnt2)&&(cnt5>cnt2)&&(cnt5>cnt6)&&(cnt5>cnt7)&&(cnt5>cnt8)&&(cnt5>cnt9)&&(cnt5>cnt10)&&(cnt5>cnt11)&&(cnt5>cnt12)&&(cnt5>cnt13)&&(cnt5>cnt14)&&(cnt5>cnt15)&&(cnt5>cnt16))
         state<=4’b0100;
      else
if((cnt6>cnt1)&&(cnt6>cnt2)&&(cnt6>cnt2)&&(cnt6>cnt2)&&(cnt6>cnt5)&&(cnt6>cnt7)&&(cnt6>cnt8)&&(cnt6>cnt9)&&(cnt6>cnt10)&&(cnt6>cnt11)&&(cnt6>cnt12)&&(cnt6>cnt13)&&(cnt6>cnt14)&&(cnt6>cnt15)&&(cnt6>cnt16))
         state<=4’b0101;
      else
if((cnt7>cnt1)&&(cnt7>cnt2)&&(cnt7>cnt2)&&(cnt7>cnt2)&&(cnt7>cnt5)&&(cnt7>cnt6)&&(cnt7>cnt8)&&(cnt7>cnt9)&&(cnt7>cnt10)&&(cnt7>cnt11)&&(cnt7>cnt12)&&(cnt7>cnt13)&&(cnt7>cnt14)&&(cnt7>cnt15)&&(cnt7>cnt16))
         state<=4’b0110;
      else
if((cnt8>cnt1)&&(cnt8>cnt2)&&(cnt8>cnt2)&&(cnt8>cnt2)&&(cnt8>cnt5)&&(cnt8>cnt6)&&(cnt8>cnt7)&&(cnt8>cnt9)&&(cnt8>cnt10)&&(cnt8>cnt11)&&(cnt8>cnt12)&&(cnt8>cnt13)&&(cnt8>cnt14)&&(cnt8>cnt15)&&(cnt8>cnt16))
         state<=4’b0111;
      else
if((cnt9>cnt1)&&(cnt9>cnt2)&&(cnt9>cnt2)&&(cnt9>cnt2)&&(cnt9>cnt5)&&(cnt9>cnt6)&&(cnt9>cnt7)&&(cnt9>cnt8)&&(cnt9>cnt10)&&(cnt9>cnt11)&&(cnt9>cnt12)&&(cnt9>cnt13)&&(cnt9>cnt14)&&(cnt9>cnt15)&&(cnt9>cnt16))
         state<=4’b1000;
      else
if((cnt10>cnt1)&&(cnt10>cnt2)&&(cnt10>cnt2)&&(cnt10>cnt2)&&(cnt10>cnt5)&&(cnt10>cnt6)&&(cnt10>cnt7)&&(cnt10>cnt8)&&(cnt10>cnt9)&&(cnt10>cnt11)&&(cnt10>cnt12)&&(cnt10>cnt13)&&(cnt10>cnt14)&&(cnt10>cnt15)&&(cnt10>cnt16))
         state<=4’b1001;
      else
if((cnt11>cnt1)&&(cnt11>cnt2)&&(cnt11>cnt2)&&(cnt11>cnt2)&&(cnt11>cnt5)&&(cnt11>cnt6)&&(cnt11>cnt7)&&(cnt11>cnt8)&&(cnt11>cnt9)&&(cnt11>cnt10)&&(cnt11>cnt12)&&(cnt11>cnt13)&&(cnt11>cnt14)&&(cnt11>cnt15)&&(cnt11>cnt16))
         state<=4’b1010;
      else
if((cnt12>cnt1)&&(cnt12>cnt2)&&(cnt12>cnt2)&&(cnt12>cnt2)&&(cnt12>cnt5)&&(cnt12>cnt6)&&(cnt12>cnt7)&&(cnt12>cnt8)&&(cnt12>cnt9)&&(cnt12>cnt10)&&(cnt12>cnt11)&&(cnt12>cnt13)&&(cnt12>cnt14)&&(cnt12>cnt15)&&(cnt12>cnt16))
         state<=4’b1011;
      else
if((cnt13>cnt1)&&(cnt13>cnt2)&&(cnt13>cnt2)&&(cnt13>cnt2)&&(cnt13>cnt5)&&(cnt13>cnt6)&&(cnt13>cnt7)&&(cnt13>cnt8)&&(cnt13>cnt9)&&(cnt13>cnt10)&&(cnt13>cnt11)&&(cnt13>cnt12)&&(cnt13>cnt14)&&(cnt13>cnt15)&&(cnt13>cnt16))
         state<=4’b1100;
      else
if((cnt14>cnt1)&&(cnt14>cnt2)&&(cnt14>cnt2)&&(cnt14>cnt2)&&(cnt14>cnt5)&&(cnt14>cnt6)&&(cnt14>cnt7)&&(cnt14>cnt8)&&(cnt14>cnt9)&&(cnt14>cnt10)&&(cnt14>cnt11)&&(cnt14>cnt12)&&(cnt14>cnt13)&&(cnt14>cnt15)&&(cnt14>cnt16))
         state<=4’b1101;
      else
if((cnt15>cnt1)&&(cnt15>cnt2)&&(cnt15>cnt2)&&(cnt15>cnt2)&&(cnt15>cnt5)&&(cnt15>cnt6)&&(cnt15>cnt7)&&(cnt15>cnt8)&&(cnt15>cnt9)&&(cnt15>cnt10)&&(cnt15>cnt11)&&(cnt15>cnt12)&&(cnt15>cnt13)&&(cnt15>cnt14)&&(cnt15>cnt16))
         state<=4’b1110;
      else
if((cnt16>cnt1)&&(cnt16>cnt2)&&(cnt16>cnt2)&&(cnt16>cnt2)&&(cnt16>cnt5)&&(cnt16>cnt6)&&(cnt16>cnt7)&&(cnt16>cnt8)&&(cnt16>cnt9)&&(cnt16>cnt10)&&(cnt16>cnt11)&&(cnt16>cnt12)&&(cnt16>cnt13)&&(cnt16>cnt14)&&(cnt16>cnt15))
         state<=4’b1111;
   end
wire[3:0]k;
assign k=(state+4’d8)%16;
assign ckm=(k==4’b0000)?ck1:
                (k==4’b0001)?ck2:
                (k==4’b0010)?ck3:
                (k==4’b0011)?ck4:
                (k==4’b0100)?ck5:
                (k==4’b0101)?ck6:
                (k==4’b0110)?ck7:
                (k==4’b0111)?ck8:
                (k==4’b1000)?ck9:
                (k==4’b1001)?ck10:
                (k==4’b1010)?ck11:
                (k==4’b1011)?ck12:
                (k==4’b1100)?ck13:
                (k==4’b1101)?ck14:
                (k==4’b1110)?ck15:ck16;
wire[23:0]p_buffer;
assign p_buffer=(k==4’b0000)?ck1_b_tmp:
                 (k==4’b0001)?ck2_b_tmp:
                 (k==4’b0010)?ck3_b_tmp:
                 (k==4’b0011)?ck4_b_tmp:
                 (k==4’b0100)?ck5_b_tmp:
                 (k==4’b0101)?ck6_b_tmp:
                 (k==4’b0110)?ck7_b_tmp:
                 (k==4’b0111)?ck8_b_tmp:
                 (k==4’b1000)?ck9_b_tmp:
                 (k==4’b1001)?ck10_b_tmp:
                 (k==4’b1010)?ck11_b_tmp:
                 (k==4’b1011)?ck12_b_tmp:
                 (k==4’b1100)?ck13_b_tmp:
                 (k==4’b1101)?ck14_b_tmp:
                 (k==4’b1110)?ck15_b_tmp:ck16_b_tmp;
reg[2:0]div_cnt;
reg[7:0]Rcv_data1,Rcv_data2,Rcv_data3;
wire ckm_div8;
always@(posedge ckm or negedge rst)
  if(!rst)
    div_cnt<=3’b000;
  else
   begin
    div_cnt<=div_cnt+1’b1;
    case(div_cnt)
    3’b000:
            begin
              Rcv_data1[0]<=p_buffer[0];
              Rcv_data2[0]<=p_buffer[8];
              Rcv_data3[0]<=p_buffer[16];
            end
    3’b001:
            begin
              Rcv_data1[1]<=p_buffer[1];
              Rcv_data2[1]<=p_buffer[9];
              Rcv_data3[1]<=p_buffer[17];
            end
    3’b010:
            begin
              Rcv_data1[2]<=p_buffer[2];
              Rcv_data2[2]<=p_buffer[10];
              Rcv_data3[2]<=p_buffer[18];
            end
    3’b011:
            begin
              Rcv_data1[3]<=p_buffer[3];
              Rcv_data2[3]<=p_buffer[11];
              Rcv_data3[3]<=p_buffer[19];
            end
    3’b100:
            begin
              Rcv_data1[4]<=p_buffer[4];
              Rcv_data2[4]<=p_buffer[12];
              Rcv_data3[4]<=p_buffer[20];
            end
    3’b101:
            begin
              Rcv_data1[5]<=p_buffer[5];
              Rcv_data2[5]<=p_buffer[13];
              Rcv_data3[5]<=p_buffer[21];
            end
    3’b110:
            begin
              Rcv_data1[6]<=p_buffer[6];
              Rcv_data2[6]<=p_buffer[14];
              Rcv_data3[6]<=p_buffer[22];
            end
    3’b111:
            begin
             Rcv_data1[7]<=p_buffer[7];
             Rcv_data2[7]<=p_buffer[15];
             Rcv_data3[7]<=p_buffer[23];
           end
   endcase
end
assign ckm_div8=div_cnt[2];
//the output of parallel recovery data
reg[1:0]cnt_ckm_div8;
always@(posedge ckm_div8 or negedge rst)
  if(!rst)
     cnt_ckm_div8<=2’b00;
  else
    begin
      if(cnt_ckm_div8==2’b10)cnt_ckm_div8<=2’b00;
      else cnt_ckm_div8<=cnt_ckm_div8+1’b1;
    end
always@(posedge ckm_div8 or negedge rst)
  if(!rst)
    ckm_b<=8’h00;
  else
    begin
      if(cnt_ckm_div8==2’b00)ckm_b<=Rcv_data1;
      if(cnt_ckm_div8==2’b01)ckm_b<=Rcv_data2;
      if(cnt_ckm_div8==2’b10)ckm_b<=Rcv_data3;
    end
endmodule
本发明已经在保密项目“专用总线网络关键技术研究”中加以采用,经过实际测试,结果表明该电路的功能满足预期目标,可以可靠工作,实现了发明目的。

Claims (1)

1.一种用于高速串行收发器接收端的基于过采样的时钟数据恢复和串并转换电路,包括一个锁相环模块(U0)、一个数据空间过采样模块(U1)、一个边沿检测与数据恢复模块(U2)、一个判决模块(U3)、一个时钟恢复模块(U4)、一个时钟分频模块(U5)和一个SerDes模块(U6);其特征在于:
数据空间过采样模块(U1)利用锁相环模块(U0)输出的16相等间隔的、与输入数据同频的时钟cki,i=1,2,…,16对串行输入的连续3个字节的24位数据进行采样,得到16×24个数据cki_bj,i=1,2,…,16,j=1,2,…,24,存放在16组、每组24个寄存器中;
边沿检测与数据恢复模块(U2)将采样数据按照相邻两组寄存器的相应位进行异或以完成边沿检测,其中第一组数据ck1_bj,j=1,2,…,24要与上一次采样数据的最后一组的相应位进行异或运算,最后一组数据ck16_bj,j=1,2,…,24需要保留至下一轮采样并在下一轮运算中表示为ck0_bj,j=1,2,…,24;异或运算的结果有16×24个,表示为cki_i+1_dj,i=0,1,2,…,15,j=1,2,…,24;
判决模块(U3)将从边沿检测与数据恢复模块(U2)送入的16×24个异或结果分组相加,得到结果表示为cntk,k=1,2,…,16;对16个加法运算结果cntk,k=1,2,…,16进行比较,选出数值最大的一个cntk对应的k值送入时钟恢复模块(U4);
时钟恢复模块(U4)按照(k+8)%16=m的原则从输入的16相等间隔的时钟cki,i=1,2,…,16中选择出ckm,此即为最佳采样时钟,可作为恢复时钟;恢复时钟ckm被送入时钟分频模块(U5)和边沿检测与数据恢复模块(U2);边沿检测与数据恢复模块(U2)将由ckm采样的数据ckm_bj,m=1,2,…,16,j=1,2,…,24作为恢复数据送入串并转换SerDes模块(U6);
时钟分频模块(U5)将时钟ckm进行8分频,并由该分频后时钟在串并转换SerDes模块(U6)中对恢复数据ckm_bj,m=1,2,…,16,j=1,2,…,24分字节进行同步得到3个字节的数据ckm_b[1:8]、ckm_b[9:16]、ckm_b[17:24],并依次送出,均表示为ckm_b[1:8],此即为并行恢复数据。
CN200910219463A 2009-12-11 2009-12-11 基于过采样的时钟数据恢复和串并转换电路 Pending CN101753288A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN200910219463A CN101753288A (zh) 2009-12-11 2009-12-11 基于过采样的时钟数据恢复和串并转换电路

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN200910219463A CN101753288A (zh) 2009-12-11 2009-12-11 基于过采样的时钟数据恢复和串并转换电路

Publications (1)

Publication Number Publication Date
CN101753288A true CN101753288A (zh) 2010-06-23

Family

ID=42479734

Family Applications (1)

Application Number Title Priority Date Filing Date
CN200910219463A Pending CN101753288A (zh) 2009-12-11 2009-12-11 基于过采样的时钟数据恢复和串并转换电路

Country Status (1)

Country Link
CN (1) CN101753288A (zh)

Cited By (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102299787A (zh) * 2011-08-25 2011-12-28 北京昆腾微电子有限公司 在高速系统级芯片电路中实现数据同步的方法和装置
CN102346219A (zh) * 2011-06-14 2012-02-08 山东电力研究院 电压源逆变器接入点电压三相软件锁相环相位检测方法
CN102510328A (zh) * 2011-12-29 2012-06-20 成都三零嘉微电子有限公司 一种高速并行接口电路
CN102710240A (zh) * 2011-03-08 2012-10-03 浙江彩虹鱼通讯技术有限公司 信号处理装置、方法、serdes 和处理器
CN102946306A (zh) * 2012-11-23 2013-02-27 中国电子科技集团公司第三十二研究所 时钟数据恢复电路结构及数字化时钟数据恢复方法
CN103346770A (zh) * 2013-07-18 2013-10-09 灿芯半导体(上海)有限公司 高速串行数据恢复的时序缓冲电路及方法
CN103475362A (zh) * 2013-09-29 2013-12-25 灿芯半导体(上海)有限公司 基于过采样的无需时钟恢复的数据恢复电路
CN104363016A (zh) * 2014-10-17 2015-02-18 青岛歌尔声学科技有限公司 一种时钟数据恢复电路和时钟数据恢复方法
CN104572543A (zh) * 2013-10-12 2015-04-29 苏州驰芯微电子科技有限公司 一种过采样高速串行接收器
CN103036670B (zh) * 2011-12-27 2015-12-02 龙迅半导体科技(合肥)有限公司 一种时钟恢复电路及并行输出电路
CN106021025A (zh) * 2016-05-24 2016-10-12 成都欧飞凌通讯技术有限公司 一种过采样数据时钟恢复的fpga实现系统及方法
CN103944583B (zh) * 2014-04-28 2017-05-10 中国人民解放军国防科学技术大学 SerDes中高速串行信号的并行化处理方法及装置
CN104038216B (zh) * 2014-06-27 2017-08-15 浙江亿邦通信科技股份有限公司 一种高速信号中提取比特同步时钟的电路
CN107329915A (zh) * 2017-05-31 2017-11-07 烽火通信科技股份有限公司 通过高速SerDes接口恢复低速数据的方法及系统
CN107920040A (zh) * 2017-11-03 2018-04-17 锐捷网络股份有限公司 码元同步方法、装置及设备
CN109302275A (zh) * 2018-09-10 2019-02-01 硅谷数模半导体(北京)有限公司 数据的输出方法及装置
CN109309637A (zh) * 2018-10-08 2019-02-05 惠科股份有限公司 传输信号的数据存储方法、装置及存储介质
CN112073169A (zh) * 2019-06-11 2020-12-11 中车株洲电力机车研究所有限公司 一种串行通讯动态位恢复装置及方法
CN113886300A (zh) * 2021-09-23 2022-01-04 珠海一微半导体股份有限公司 一种总线接口的时钟数据自适应恢复系统及芯片
CN113886315B (zh) * 2021-09-23 2024-05-03 珠海一微半导体股份有限公司 一种时钟数据恢复系统、芯片及时钟数据恢复方法

Cited By (35)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102710240A (zh) * 2011-03-08 2012-10-03 浙江彩虹鱼通讯技术有限公司 信号处理装置、方法、serdes 和处理器
CN102710240B (zh) * 2011-03-08 2016-03-02 浙江彩虹鱼通讯技术有限公司 信号处理装置、方法、serdes和处理器
CN102346219A (zh) * 2011-06-14 2012-02-08 山东电力研究院 电压源逆变器接入点电压三相软件锁相环相位检测方法
CN102346219B (zh) * 2011-06-14 2013-06-12 山东电力研究院 电压源逆变器接入点电压三相软件锁相环相位检测方法
CN102299787B (zh) * 2011-08-25 2014-03-05 北京昆腾微电子有限公司 在高速系统级芯片电路中实现数据同步的方法和装置
CN102299787A (zh) * 2011-08-25 2011-12-28 北京昆腾微电子有限公司 在高速系统级芯片电路中实现数据同步的方法和装置
CN103036670B (zh) * 2011-12-27 2015-12-02 龙迅半导体科技(合肥)有限公司 一种时钟恢复电路及并行输出电路
CN102510328B (zh) * 2011-12-29 2014-10-22 成都三零嘉微电子有限公司 一种高速并行接口电路
CN102510328A (zh) * 2011-12-29 2012-06-20 成都三零嘉微电子有限公司 一种高速并行接口电路
CN102946306B (zh) * 2012-11-23 2016-03-02 中国电子科技集团公司第三十二研究所 时钟数据恢复电路结构及数字化时钟数据恢复方法
CN102946306A (zh) * 2012-11-23 2013-02-27 中国电子科技集团公司第三十二研究所 时钟数据恢复电路结构及数字化时钟数据恢复方法
CN103346770A (zh) * 2013-07-18 2013-10-09 灿芯半导体(上海)有限公司 高速串行数据恢复的时序缓冲电路及方法
CN103475362A (zh) * 2013-09-29 2013-12-25 灿芯半导体(上海)有限公司 基于过采样的无需时钟恢复的数据恢复电路
CN103475362B (zh) * 2013-09-29 2016-01-20 灿芯半导体(上海)有限公司 基于过采样的无需时钟恢复的数据恢复电路
CN104572543B (zh) * 2013-10-12 2019-04-09 成都信息工程大学 一种过采样高速串行接收器
CN104572543A (zh) * 2013-10-12 2015-04-29 苏州驰芯微电子科技有限公司 一种过采样高速串行接收器
CN103944583B (zh) * 2014-04-28 2017-05-10 中国人民解放军国防科学技术大学 SerDes中高速串行信号的并行化处理方法及装置
CN104038216B (zh) * 2014-06-27 2017-08-15 浙江亿邦通信科技股份有限公司 一种高速信号中提取比特同步时钟的电路
CN104363016A (zh) * 2014-10-17 2015-02-18 青岛歌尔声学科技有限公司 一种时钟数据恢复电路和时钟数据恢复方法
CN106021025B (zh) * 2016-05-24 2019-03-29 成都欧飞凌通讯技术有限公司 一种过采样数据时钟恢复的fpga实现系统及方法
CN106021025A (zh) * 2016-05-24 2016-10-12 成都欧飞凌通讯技术有限公司 一种过采样数据时钟恢复的fpga实现系统及方法
CN107329915A (zh) * 2017-05-31 2017-11-07 烽火通信科技股份有限公司 通过高速SerDes接口恢复低速数据的方法及系统
CN107329915B (zh) * 2017-05-31 2019-12-10 烽火通信科技股份有限公司 通过高速SerDes接口恢复低速数据的方法及系统
CN107920040A (zh) * 2017-11-03 2018-04-17 锐捷网络股份有限公司 码元同步方法、装置及设备
CN107920040B (zh) * 2017-11-03 2021-01-05 锐捷网络股份有限公司 码元同步方法、装置及设备
CN109302275A (zh) * 2018-09-10 2019-02-01 硅谷数模半导体(北京)有限公司 数据的输出方法及装置
CN109302275B (zh) * 2018-09-10 2021-05-04 硅谷数模半导体(北京)有限公司 数据的输出方法及装置
CN109309637A (zh) * 2018-10-08 2019-02-05 惠科股份有限公司 传输信号的数据存储方法、装置及存储介质
CN109309637B (zh) * 2018-10-08 2021-06-04 惠科股份有限公司 传输信号的数据存储方法、装置及存储介质
US11206156B2 (en) 2018-10-08 2021-12-21 HKC Corporation Limited Method and apparatus for storing data of transmission signal, and computer readable storage medium
CN112073169A (zh) * 2019-06-11 2020-12-11 中车株洲电力机车研究所有限公司 一种串行通讯动态位恢复装置及方法
CN112073169B (zh) * 2019-06-11 2023-06-13 中车株洲电力机车研究所有限公司 一种串行通讯动态位恢复装置及方法
CN113886300A (zh) * 2021-09-23 2022-01-04 珠海一微半导体股份有限公司 一种总线接口的时钟数据自适应恢复系统及芯片
CN113886300B (zh) * 2021-09-23 2024-05-03 珠海一微半导体股份有限公司 一种总线接口的时钟数据自适应恢复系统及芯片
CN113886315B (zh) * 2021-09-23 2024-05-03 珠海一微半导体股份有限公司 一种时钟数据恢复系统、芯片及时钟数据恢复方法

Similar Documents

Publication Publication Date Title
CN101753288A (zh) 基于过采样的时钟数据恢复和串并转换电路
US7474720B2 (en) Clock and data recovery method and digital circuit for the same
US8804888B2 (en) Wide band clock data recovery
CN205545202U (zh) 一种数字集群通信设备时钟数据恢复电路
US20070058768A1 (en) Low jitter clock recovery circuit
US20130249719A1 (en) Scheme for balancing skew between lanes of high-speed serial digital interface
US20130163706A1 (en) Clock and Data Recovery Circuit and Parallel Output Circuit
CN102522981A (zh) 一种高速并行接口电路
CN106209341B (zh) 多通道lvds时序对齐探测器图像采集方法
CN103427798B (zh) 一种多相位时钟产生电路
CN108322214A (zh) 一种无参考时钟输入的时钟和数据恢复电路
US9154291B2 (en) Differential signal skew adjustment method and transmission circuit
US20150023458A1 (en) Clock and data recovery using dual manchester encoded data streams
CN103152155A (zh) 一种快速时钟数据恢复的方法
CN113992319B (zh) 接收机用CDR电路、Duo-Binary PAM4接收机及传输系统
US7532645B1 (en) Receiver operable to receive data at a lower data rate
EP2804322A1 (en) Systems and methods for tracking a received data signal in a clock and data recovery circuit
CN111277262B (zh) 一种时钟数据恢复电路
CN1897583A (zh) 基于“相位插值-选择”的多相正交时钟产生电路
CN1161901C (zh) 光通信系统中上行高速数据的同步接收方法与电路
CN102946306A (zh) 时钟数据恢复电路结构及数字化时钟数据恢复方法
US7209848B2 (en) Pulse stretching architecture for phase alignment for high speed data acquisition
CN110113074B (zh) 一种基于fpga的高速伪码并行捕获与跟踪方法
US10396803B2 (en) Clock and data recovery of sub-rate data
CN202406095U (zh) 一种高速并行接口电路

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C02 Deemed withdrawal of patent application after publication (patent law 2001)
WD01 Invention patent application deemed withdrawn after publication

Application publication date: 20100623