在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2699|回复: 5

[求助] 求助ADS42LB69器件采样代码的问题

[复制链接]
发表于 2019-6-26 16:41:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 christeas 于 2019-7-1 11:05 编辑

先说一下背景,FPGA是Xilinx Kintex UltraScale KU040,我这边要用到ADS42LB69这个AD器件,想使用的采样率为200MHz,但是由于管脚又受到限制,因此只能用QDR模式来做,这里可以看到QDR模式的时序,其中是用4根线传16bit的数据,每根线要传4bit,所以AD过来的数据是800MHz,需要缓存并拼成200MHz的数据送出去。

3.bmp

我把AD调成发送的数据从0-65535递增以方便定位,正确的通道波形如下,是个递增的斜线。 4.bmp

但是有些通道的波形很奇怪,用vivado看到出来的波形如下,这个通道很乱。

1.bmp

还有一些通道看着是有一定规律的,比如这个。
5.bmp
这个通道的数,7-4bit一直是和15-12bit一样,其他的bit还比较正常。
2.bmp

另外还有其他通道偶尔冒一个毛刺,说明可能某bit产生跳变。

我把我采数的代码贴上来,大家帮我看看是不是我代码写的有问题,不适合高速处理;还是说时序有问题?如果时序有问题,我应该怎么处理?这方面经验比较少,各位大神帮帮忙。


其中ad_clk对应DxCLK,ad_frm对应DxFRAME,输入CLKIN为200MHz,直接连到AD,上面使用vivado抓的数是data_adclk
module ad42lb69qdr_data_reg(
    input                    clk_4x,//800M
    input                    clk_1x,//200M
    input                    ad_clk,//400M DCLK
    input                    ad_frm,//200M FRM
    input              [3:0] ad_data_in,
    output     reg    [15:0] ad_data_out
    );


    // register declaration
    // reg channel a
    reg               ad_clk_reg0;
    reg               ad_clk_reg1;
    reg               ad_frm_reg0;
    reg               ad_frm_reg1;
    reg         [3:0] ad_data_reg0=4'b0000;
    reg         [3:0] ad_data_reg1=4'b0000;
    reg               ad_data_en_clk4x=1'b0;
    reg signed [15:0] data_adclk=15'd0;
    reg         [3:0] tmp_ad_data_out1=4'd0;
    reg         [3:0] tmp_ad_data_out2=4'd0;
    reg         [3:0] tmp_ad_data_out3=4'd0;
    reg         [3:0] tmp_ad_data_out4=4'd0;
    reg               tmp_ad_data_en =1'd0;
    reg               tmp_ad_data_en_reg =1'd0;
   
    reg               ad_rd_en=1'b0;
    reg         [3:0] ad_rd_cnt=4'd0;
   
    wire        [15:0]  ad_data_fifoout;
   
    always@(posedge ad_clk)
    begin
        if(ad_frm)
        begin
            tmp_ad_data_out4[3:0]   <= ad_data_in[3:0];
            data_adclk              <= {tmp_ad_data_out4[3:0],
                                       tmp_ad_data_out3[3:0],
                                       tmp_ad_data_out2[3:0],
                                       tmp_ad_data_out1[3:0]};
        end
        else
        begin
            tmp_ad_data_out2[3:0]   <= ad_data_in[3:0];
        end
    end
    always@(negedge ad_clk)
    begin
        if(ad_frm)
        begin
            tmp_ad_data_out3[3:0]   <= ad_data_in[3:0];
            tmp_ad_data_en          <= 1'b0;
        end
        else
        begin
            tmp_ad_data_out1[3:0]   <= ad_data_in[3:0];
            tmp_ad_data_en          <= 1'b1;
        end
    end
   
    always@(posedge clk_4x)
    begin
        if(ad_rd_cnt==4'd3)
        begin
            ad_rd_cnt   <=  4'd0;
            ad_rd_en    <=  1'b1;
        end
        else
        begin
            ad_rd_cnt   <=  ad_rd_cnt + 4'd1;
            ad_rd_en    <=  1'b0;
        end
        ad_data_out     <=  ad_data_fifoout;
    end

// fifo缓存到另一个时钟域送出
    fifo_generator_0    fifo_ad(
    .srst(1'b0),
    .wr_clk(ad_clk),
    .rd_clk(clk_4x),
    .din(data_adclk),
    .wr_en(tmp_ad_data_en),
    .rd_en(ad_rd_en),
    .dout(ad_data_fifoout),
    .full(),
    .empty(),
    .wr_rst_busy(),
    .rd_rst_busy()
    );

endmodule
上面是采数模块的代码,然后我在外面是通过把差分信号合并成单路后直接连到这个模块的,外面是用原语将差分转的单端:
    IBUFDS cha_1 (.I (cha_frm_p), .IB (cha_frm_n), .O (cha_frm));
    IBUFDS cha_2 (.I (cha_data0_p), .IB (cha_data0_n), .O (cha_data[0]));
    IBUFDS cha_3 (.I (cha_data1_p), .IB (cha_data1_n), .O (cha_data[1]));
    IBUFDS cha_4 (.I (cha_data2_p), .IB (cha_data2_n), .O (cha_data[2]));
    IBUFDS cha_5 (.I (cha_data3_p), .IB (cha_data3_n), .O (cha_data[3]));

这几个信号的IOSTANDARD全部设置的LVDS


 楼主| 发表于 2019-6-27 08:34:44 | 显示全部楼层
不要沉啊,各位觉得我还缺什么资料和信息的,都可以说,我看到了就补充,我现在被卡在这完全动不了了
发表于 2019-6-27 09:41:14 | 显示全部楼层
估计需要用FPGA特殊的IO cell做。
到800MHZ,是不是应该用LVDS的IO啊。
 楼主| 发表于 2019-6-28 08:54:36 | 显示全部楼层


asic_service 发表于 2019-6-27 09:41
估计需要用FPGA特殊的IO cell做。
到800MHZ,是不是应该用LVDS的IO啊。


管脚上是用的LVDS的IO。代码里面有什么需要特殊处理的么?
发表于 2019-6-28 16:01:50 | 显示全部楼层
xilinx 有特殊的IO cell处理高速信号,直接调用这些cell。
Xilinx网站搜索:selectIO

推荐个数字前端设计深度入门课程,可以看看:
http://bbs.eetop.cn/thread-854132-1-1.html
 楼主| 发表于 2019-7-1 10:44:52 | 显示全部楼层


asic_service 发表于 2019-6-28 16:01
xilinx 有特殊的IO cell处理高速信号,直接调用这些cell。
Xilinx网站搜索:selectIO


好的,谢谢,我去学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-18 06:36 , Processed in 0.023917 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表