文章目录

概述

    过采样就是对输入信号进行采样,采样频率是输入信号最高频率的2倍以上。
fpga在1个clk0周期内对 输入信号data 进行4次采样;分别在clk的0度、90度、180度、270度位置进行采样,
4个周期后在clk0时钟域输出采样到的并行数据;

为什么第4行第1个触发器用clk270时钟?
因为:
第1拍先实现270度位置采样;
第2拍再将270度采样后的数据,180度位置采样,(0.75的建立时间+0.25的保持时间);
第3拍再将180度位置采样后的数据,90度位置采样,(0.75的建立时间+0.25的保持时间);
第4拍将90度位置采样后的数据,0度位置采样,(0.75的建立时间+0.25的保持时间);

在这里插入图片描述

tb


    reg                 clk_ref=1               ;
    reg                 clk0   =0               ;
    reg                 clk90  =0               ;
    reg                 clk180 =0               ;
    reg                 clk270 =0               ;
    reg                 data                    ;
    
initial begin 
forever begin  clk_ref =#20 ~clk_ref;end
end       
initial begin 
forever begin  @(posedge clk_ref);   clk0 =1;#1;clk0 =0; end
end    
initial begin 
#10;
forever   begin @(posedge clk_ref); #10;  clk90 =1;#1;clk90 =0;  end
end
initial begin 
#20;
forever begin @(posedge clk_ref); #20;  clk180 =1;#1;clk180 =0;     end
end
initial begin 
#30;
forever  begin @(posedge clk_ref); #30;  clk270 =1;#1;clk270 =0;   end
end


initial begin 
data=0;
#200;
@(posedge clk270);#5;
data=1;
#200;
data=0;
#200;
$stop();
end

cdr   u0_cdr(
    .clk_ref  (clk_ref                  ),//input               clk0                    ,
    .clk0  (clk0                  ),//input               clk0                    ,
    .clk90 (clk90                 ),//input               clk90                   ,
    .clk180(clk180                ),//input               clk180                  ,
    .clk270(clk270                ),//input               clk270                  ,
    .data  (data                ) //input               data                    
);

main

`timescale 1ns/100ps
module   cdr(
    input               clk_ref                 ,
    input               clk0                    ,
    input               clk90                   ,
    input               clk180                  ,
    input               clk270                  ,
    input               data                    
);
    reg     [3:0]       data_r0=0               ;//1级延时
    reg     [3:0]       data_r1=0               ;//2级延时
    reg     [3:0]       data_r2=0               ;//3级延时
    reg     [3:0]       data_r3=0               ;//4级延时
//data_r0
always@(posedge clk0  )  data_r0[0]<= #1 data ;
always@(posedge clk90 )  data_r0[1]<= #1 data ;
always@(posedge clk180)  data_r0[2]<= #1 data ;
always@(posedge clk270)  data_r0[3]<= #1 data ;
// data_r1
always@(posedge clk0  )  data_r1[0]<= #1 data_r0[0] ;
always@(posedge clk0  )  data_r1[1]<= #1 data_r0[1] ;
always@(posedge clk90 )  data_r1[2]<= #1 data_r0[2] ;
always@(posedge clk180)  data_r1[3]<= #1 data_r0[3] ;
// data_r2
always@(posedge clk0  )  data_r2[0]<= #1 data_r1[0] ;
always@(posedge clk0  )  data_r2[1]<= #1 data_r1[1] ;
always@(posedge clk0  )  data_r2[2]<= #1 data_r1[2] ;
always@(posedge clk90 )  data_r2[3]<= #1 data_r1[3] ;
// data_r3
always@(posedge clk0  )  data_r3[0]<= #1 data_r2[0] ;
always@(posedge clk0  )  data_r3[1]<= #1 data_r2[1] ;
always@(posedge clk0  )  data_r3[2]<= #1 data_r2[2] ;
always@(posedge clk0  )  data_r3[3]<= #1 data_r2[3] ;
endmodule

波形图

在这里插入图片描述

参考

SerDes interface参考设计

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐