AD9253 LVDS 高速ADC驱动开发

news2025/4/13 12:37:51

1、查阅AD9253器件手册

2、查阅Xilinx xapp524手册

3、该款ADC工作在125Msps下,14bit - 2Lane - 1frame 模式。

对应:data clock时钟为500M DDR mode。data line rate:1Gbps。frame clock:1/4 data clock

具体内容:下文的参考博客写的很清楚,我就不详细写了。参考博客clock align模块不完整,本文新增这个模块。

`timescale 1ns / 1ps

module bit_clk_align(
    input  i_clk_p,
    input  i_clk_n,
    input  i_clk_200m,
    input  i_reset,
    output o_bitclk_align_done,
    output o_bitclk_Monclk,
    output o_bitclk_Refclk

);

//------------------ variable declare ------------------
localparam PHASE_ADJ_FAILED  =  1; // 0: OK   1:FAILED

wire s_BitClk_MonClkOut;
wire s_BitClk_RefClkOut;
wire s_bitclk;
wire s_idelayctrl_rdy;
wire s_bitclk_align_ena;
wire s_IntBitClk;
wire [07:00]s_bitclk_para;
wire [04:00]s_cntvalueout;
reg  r_idelay_ce    = 1;
reg  r_idelay_inc   = 1;

reg  [3:0]r_clk_div_reset   = 4'hf;    // high active
wire s_clk_div_reset;
reg  r_phase_adj_status   = 0;
reg  r_bitclk_align_done   = 0;
reg  [03:00] r_adj_cnt = 0;
reg  [03:00] r_bitclk_align_state = 0;
reg  [01:00] s_iserdesout_dly_cnt = 0;



//------------------ main body of code ------------------
assign  o_bitclk_Monclk  =  s_BitClk_MonClkOut;
assign  o_bitclk_Refclk  =  s_BitClk_RefClkOut;

// generate iserdes reset
always@(posedge s_BitClk_RefClkOut)begin
    r_clk_div_reset   <= r_clk_div_reset   >> 1;
end
assign s_clk_div_reset = (|r_clk_div_reset);

//
// state:  adjust local clock phase align to input clk
//
assign s_bitclk_align_ena = s_idelayctrl_rdy && (~i_reset);
always@(posedge s_BitClk_RefClkOut)begin
    case(r_bitclk_align_state)
        0:begin
            r_idelay_ce  <= 0;
            r_idelay_inc <= 0;
            r_phase_adj_status <= 0;
            r_bitclk_align_done <= 0;
            
            if(s_bitclk_align_ena)begin
                r_bitclk_align_state <= 1;
            end
        end
        1:begin
            //wait iserdes Q8~Q1 output stablely
            r_idelay_ce  <= 0;
            r_idelay_inc <= 0;
            if(s_iserdesout_dly_cnt >= 2)begin
                s_iserdesout_dly_cnt <= 0;
                r_bitclk_align_state <= r_bitclk_align_state + 1;
            end
            else begin
                s_iserdesout_dly_cnt <= s_iserdesout_dly_cnt + 1;
            end
        end
        2:begin
            // search first patarn
            // 8'h00 - rising clk align
            // 8'hff - falling clk align
            if(s_bitclk_para == 8'h00)begin
                r_bitclk_align_state <= 3;
            end
            else begin
                if(s_cntvalueout == 31)begin
                    // phase adjust flow failed
                    r_idelay_ce  <= 0;
                    r_idelay_inc <= 0;
                    r_phase_adj_status <= PHASE_ADJ_FAILED;
                end
                else begin
                    r_idelay_ce  <= 1;
                    r_idelay_inc <= 1;
                    r_bitclk_align_state <= 1;
                end
            end
        end
        3:begin
            // find datain: riding edge
            if(s_bitclk_para != 8'h00)begin
                r_bitclk_align_state <= 5;
            end
            else begin
                if(s_cntvalueout == 31)begin
                    // phase adjust flow failed
                    r_idelay_ce  <= 0;
                    r_idelay_inc <= 0;
                    r_phase_adj_status <= PHASE_ADJ_FAILED;
                end
                else begin
                    r_idelay_ce  <= 1;
                    r_idelay_inc <= 1;
                    r_bitclk_align_state <= 4;
                end
            end
        end
        4:begin
            //wait iserdes Q8~Q1 output stablely
            r_idelay_ce  <= 0;
            r_idelay_inc <= 0;
            if(s_iserdesout_dly_cnt >= 2)begin
                s_iserdesout_dly_cnt <= 0;
                r_bitclk_align_state <= 3;
            end
            else begin
                s_iserdesout_dly_cnt <= s_iserdesout_dly_cnt + 1;
            end
        end
        5:begin
            // adjust s_cntvalueout: -1
                r_idelay_ce  <= 1;
                r_idelay_inc <= 0;
                r_bitclk_align_state <= 6;
        end
        6:begin
                r_idelay_ce  <= 0;
                r_idelay_inc <= 0;
                r_bitclk_align_done  <= 1;
                r_bitclk_align_state <= 6;
        end

        default:r_bitclk_align_state = 0;
    endcase
end

assign  o_bitclk_align_done  =  r_bitclk_align_done;



//
//
//
IBUFDS #(
    .IOSTANDARD("LVDS_25")     // Specify the input I/O standard
 ) IBUFDS_inst (
    .O(s_bitclk),  // Buffer output
    .I(i_clk_p),  // Diff_p buffer input (connect directly to top-level port)
    .IB(i_clk_n) // Diff_n buffer input (connect directly to top-level port)
 );


 (* IODELAY_GROUP = "bitclk_group" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
 IDELAYCTRL IDELAYCTRL_inst (
    .RDY(s_idelayctrl_rdy),       // 1-bit output: Ready output
    .REFCLK(i_clk_200m), // 1-bit input: Reference clock input
    .RST(1'b0)        // 1-bit input: Active high reset input
 );

 IDELAYE2 #(
    .CINVCTRL_SEL("FALSE"),          // Enable dynamic clock inversion (FALSE, TRUE)
    .DELAY_SRC("IDATAIN"),           // Delay input (IDATAIN, DATAIN)
    .HIGH_PERFORMANCE_MODE("TRUE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
    .IDELAY_TYPE("VARIABLE"),           // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
    .IDELAY_VALUE(0),                // Input delay tap setting (0-31)
    .PIPE_SEL("FALSE"),              // Select pipelined mode, FALSE, TRUE
    .REFCLK_FREQUENCY(200.0),        // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
    .SIGNAL_PATTERN("CLOCK")          // DATA, CLOCK input signal
  )
  IDELAYE2_inst (
    .CNTVALUEOUT(s_cntvalueout), // 5-bit output: Counter value output
    .DATAOUT(s_IntBitClk),         // 1-bit output: Delayed data output
    .C(s_BitClk_RefClkOut),                     // 1-bit input: Clock input
    .CE(r_idelay_ce),                   // 1-bit input: Active high enable increment/decrement input
    .CINVCTRL(1'b0),       // 1-bit input: Dynamic clock inversion input
    .CNTVALUEIN(5'd0),   // 5-bit input: Counter value input
    .DATAIN(1'b0),           // 1-bit input: Internal delay data input
    .IDATAIN(s_bitclk),         // 1-bit input: Data input from the I/O
    .INC(r_idelay_inc),                 // 1-bit input: Increment / Decrement tap delay input
    .LD(0),                   // 1-bit input: Load IDELAY_VALUE input
    .LDPIPEEN(1'b0),       // 1-bit input: Enable PIPELINE register to load data input
    .REGRST(0)            // 1-bit input: Active-high reset tap-delay input
  );


  BUFIO BUFIO_inst (
    .O(s_BitClk_MonClkOut), // 1-bit output: Clock output (connect to I/O clock loads).
    .I(s_IntBitClk)  // 1-bit input: Clock input (connect to an IBUF or BUFMR).
 );


 BUFR #(
    .BUFR_DIVIDE("4"),   // Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8" 
    .SIM_DEVICE("7SERIES")  // Must be set to "7SERIES" 
 )
 BUFR_inst (
    .O(s_BitClk_RefClkOut),     // 1-bit output: Clock output port
    .CE(1),   // 1-bit input: Active high, clock enable (Divided modes only)
    .CLR(0), // 1-bit input: Active high, asynchronous clear (Divided modes only)
    .I(s_IntBitClk)      // 1-bit input: Clock buffer input driven by an IBUF, MMCM or local interconnect
 );



 ISERDESE2 #(
    .DATA_RATE         ("SDR"), // DDR, SDR
//    .DATA_RATE         ("DDR"), // DDR, SDR
    .DATA_WIDTH        (8), // Parallel data width (2-8,10,14)
    .DYN_CLKDIV_INV_EN ("FALSE"), // Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE)
    .DYN_CLK_INV_EN    ("FALSE"), // Enable DYNCLKINVSEL inversion (FALSE, TRUE)
    // INIT_Q1 - INIT_Q4: Initial value on the Q outputs (0/1)
    .INIT_Q1           (1'b0),
    .INIT_Q2           (1'b0),
    .INIT_Q3           (1'b0),
    .INIT_Q4           (1'b0),
    .INTERFACE_TYPE    ("NETWORKING"), // MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE
 //   .IOBDELAY          ("IBUF"), // NONE, BOTH, IBUF, IFD
    .IOBDELAY          ("NONE"), // NONE, BOTH, IBUF, IFD
    .NUM_CE            (1), // Number of clock enables (1,2)
    .OFB_USED          ("FALSE"), // Select OFB path (FALSE, TRUE)
    .SERDES_MODE       ("MASTER"), // MASTER, SLAVE
    // SRVAL_Q1 - SRVAL_Q4: Q output values when SR is used (0/1)
    .SRVAL_Q1          (1'b0),
    .SRVAL_Q2          (1'b0),
    .SRVAL_Q3          (1'b0),
    .SRVAL_Q4          (1'b0)
)
ISERDESE2_inst1(
    .O            (), // 1-bit output: Combinatorial output
    // Q1 - Q8: 1-bit (each) output: Registered data outputs
    .Q1           (s_bitclk_para[0]),
    .Q2           (s_bitclk_para[1]),
    .Q3           (s_bitclk_para[2]),
    .Q4           (s_bitclk_para[3]),
    .Q5           (s_bitclk_para[4]),
    .Q6           (s_bitclk_para[5]),
    .Q7           (s_bitclk_para[6]),
    .Q8           (s_bitclk_para[7]),
    // SHIFTOUT1, SHIFTOUT2: 1-bit (each) output: Data width expansion output ports
    .SHIFTOUT1    (),
    .SHIFTOUT2    (),
    .BITSLIP      (0), // 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to
    // CLKDIV when asserted (active High). Subsequently, the data seen on the Q1
    // to Q8 output ports will shift, as in a barrel-shifter operation, one
    // position every time Bitslip is invoked (DDR operation is different from
    // SDR).
    // CE1, CE2: 1-bit (each) input: Data register clock enable inputs
    .CE1          (1'b1),
    .CE2          (1'b0),
    .CLKDIVP      (1'b0), // 1-bit input: TBD
    // Clocks: 1-bit (each) input: ISERDESE2 clock input ports
    .CLK          (s_BitClk_MonClkOut), // 1-bit input: High-speed clock
    .CLKB         (0), // 1-bit input: High-speed secondary clock
    .CLKDIV       (s_BitClk_RefClkOut), // 1-bit input: Divided clock
    .OCLK         (1'b0), // 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY"
    // Dynamic Clock Inversions: 1-bit (each) input: Dynamic clock inversion pins to switch clock polarity
    .DYNCLKDIVSEL (1'b0), // 1-bit input: Dynamic CLKDIV inversion
    .DYNCLKSEL    (1'b0), // 1-bit input: Dynamic CLK/CLKB inversion
    // Input Data: 1-bit (each) input: ISERDESE2 data input ports
    .D            (s_bitclk), // 1-bit input: Data input
//    .DDLY         (s_IntBitClk), // 1-bit input: Serial data from IDELAYE2
    .DDLY         (0), // 1-bit input: Serial data from IDELAYE2
    .OFB          (1'b0), // 1-bit input: Data feedback from OSERDESE2
    .OCLKB        (1'b0), // 1-bit input: High speed negative edge output clock
//    .RST          (i_reset), // 1-bit input: Active high asynchronous reset
    .RST          (s_clk_div_reset ), // 1-bit input: Active high asynchronous reset
    // SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports
    .SHIFTIN1     (1'b0),
    .SHIFTIN2     (1'b0)
);


// note:ISERDES/OSERDES需要复位,才会生效。
// 虽然支持异步复位,但是推荐用CLKDIV这个时钟来进行同步复位,或采用异步复位同步释放。
// 即.RST          (i_reset), // 1-bit input: Active high asynchronous reset
// i_reset可以替换为由s_BitClk_RefClkOut来内部逻辑产生s_clk_div_reset 。

endmodule

补充知识:

  • OSERDES2原语

  • ISERDES2原语

参考博客:

LVDS接口程序设计框架及仿真_lvds接口仿真-CSDN博客

xilinx原语详解及仿真——OSERDESE2 - 知乎 (zhihu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pycharm2024.3.5版本配置conda踩坑

配置解释器是conda时&#xff0c;死活选不到自己的环境 看了很多&#xff0c;都是说要选scripts下的conda.exe 都没用 主要坑在于这是新版的pycharm 是配置condabin 下的 conda.bat 参考&#xff1a;PyCharm配置PyTorch环境(完美解决找不到Conda可执行文件python.exe问题) …

【异常处理】Clion IDE中cmake时头文件找不到 头文件飘红

如图所示是我的clion项目目录 我自定义的data_structure.h和func_declaration.h在unit_test.c中无法检索到 cmakelists.txt配置文件如下所示&#xff1a; cmake_minimum_required(VERSION 3.30) project(noc C) #设置头文件的目录 include_directories(${CMAKE_SOURCE_DIR}/…

14 - VDMA彩条显示实验

文章目录 1 实验任务2 系统框图3 硬件设计4 软件设计 1 实验任务 本实验任务是PS端写彩条数据至DDR3内存中&#xff0c;然后通过PL端的VDMA IP核将彩条数据通过HDMI接口输出显示。 2 系统框图 本实验是用HDMI接口固定输出1080P的彩条图&#xff0c;所以&#xff1a; rgb2lc…

PromptUp 网站介绍:AI助力,轻松创作

1. 网站定位与核心功能 promptup.net 可能是一个面向 创作者、设计师、营销人员及艺术爱好者 的AI辅助创作平台,主打 零门槛、智能化的内容生成与优化。其核心功能可能包括: AI艺术创作:通过输入关键词、选择主题或拖放模板,快速生成风格多样的数字艺术作品(如插画、海报…

金能电力:配电房为什么离不开绝缘胶板

在当今电力系统日益复杂、对供电稳定性与安全性要求极高的时代&#xff0c;每一个细节都关乎着电力供应的顺畅以及工作人员的生命安全。而配电房里常常被大家忽视的绝缘垫&#xff0c;实则起着至关重要的 “守护” 作用。今天&#xff0c;金能电力就来给大家详细讲讲配电房为什…

Python 深度学习实战 第1章 什么是深度学习代码示例

第1章&#xff1a;什么是深度学习 内容概要 第1章介绍了深度学习的背景、发展历史及其在人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;中的地位。本章探讨了深度学习的定义、其与其他机器学习方法的关系&#xff0c;以及深度学习在近年来取得的成…

【HD-RK3576-PI】VNC 远程桌面连接

在当今数字化时代&#xff0c;高效便捷的操作方式是技术爱好者与专业人士的共同追求。对于使用 HD-RK3576-PI微型单板计算机的用户而言&#xff0c;当面临没有显示屏的场景时&#xff0c;如何实现远程操作桌面系统呢&#xff1f;别担心&#xff0c;VNC 远程桌面连接将为你解决这…

电梯广告江湖的终局:分众 “吃掉” 新潮,是救赎还是迷途?

文 / 大力财经 作者 / 魏力 导言&#xff1a;商业世界的底层运行法则&#xff0c;从来都是能量流动的自然映射。宇宙第一性原理和运行法则是&#xff0c;能量大的吸引能量小的。电梯里的战争与和平&#xff0c;从对抗到合并&#xff0c;成为中国商业竞争史中关于博弈与进化的…

如何在 CentOS 7 系统上以容器方式部署 GitLab,使用 ZeroNews 通过互联网访问 GitLab 私有仓库,进行代码版本发布与更新

第 1 步&#xff1a; 部署 GitLab 容器​ 在开始部署 GitLab 容器之前&#xff0c;您需要创建本地目录来存储 GitLab 数据、配置和日志&#xff1a; #创建本地目录 mkdir -p /opt/docker/gitlab/data mkdir -p /opt/docker/gitlab/config mkdir -p /opt/docker/gitlab/log#gi…

第1章 对大型语言模型的介绍

人类正处在一个关键转折点。自2012年起&#xff0c;基于深度神经网络的人工智能系统研发进入快速通道&#xff0c;将这一技术推向了新高度&#xff1a;至2019年底&#xff0c;首个能够撰写与人类文章真假难辨的软件系统问世&#xff0c;这个名为GPT-2&#xff08;生成型预训练变…

Quartus II的IP核调用及仿真测试

目录 第一章 什么是IP核&#xff1f;第二章 什么是LPM&#xff1f;第一节 设置LPM_COUNTER模块参数第二节 仿真 第三章 什么是PLL&#xff1f;第一节 设置ALTPLL&#xff08;嵌入式锁相环&#xff09;模块参数第二节 仿真 第四章 什么是RAM&#xff1f;第一节 RAM_1PORT的调用第…

JDK(Java Development Kit)从发布至今所有主要版本 的详细差异、新增特性及关键更新的总结,按时间顺序排列

以下是 JDK&#xff08;Java Development Kit&#xff09;从发布至今所有主要版本 的详细差异、新增特性及关键更新的总结&#xff0c;按时间顺序排列&#xff1a; 1. JDK 1.0 (1996) 发布年份&#xff1a;1996年1月23日关键特性&#xff1a; Java首次正式发布。核心语言特性…

通过websocket给服务端发送订单催单提醒消息

controller层 GetMapping("/reminder/{id}")public Result Remainder(PathVariable("id") Long id){orderService.remainder(id);return Result.success();} 实现类 Overridepublic void remainder(Long id) {Orders ordersDB orderMapper.getById(id);…

c++ 表格控件 UltimateGrid 控件实例

控件区域&#xff1a; 使用效果&#xff1a; 代码如下&#xff1a; void MyUGCtrl::OnSetup() { m_nButtonIndex AddCellType(&m_button); SetNumberCols(6); AppendRow(); CUGCell cell; int rows, cols; int row 0; // 头部 int nHeaderRow -1; …

使用 VcXsrv 在 Windows 10 上运行 Ubuntu 图形界面

VcXsrv 是一款用于 Windows 的开源 X 服务器&#xff0c;它允许在 Windows 系统上显示 Linux 的图形应用程序。当在 Windows 10 上安装并正确配置 VcXsrv 后&#xff0c;通过设置 WSL2 中的DISPLAY环境变量&#xff0c;使其指向运行 VcXsrv 的 Windows 主机的 IP 地址&#xff…

LSTM-SVM长短期记忆神经网络结合支持向量机组合模型多特征分类预测/故障诊断,适合新手小白研究学习(Matlab完整源码和数据)

LSTM-SVM长短期记忆神经网络结合支持向量机组合模型多特征分类预测/故障诊断&#xff0c;适合新手小白研究学习&#xff08;Matlab完整源码和数据&#xff09; 目录 LSTM-SVM长短期记忆神经网络结合支持向量机组合模型多特征分类预测/故障诊断&#xff0c;适合新手小白研究学习…

Autoware源码总结

Autoware源码网站 项目简介 教程 Autoware的整体架构如下图&#xff0c;主要包括传感器sensing、高精地图map data、车辆接口vehicle interface、感知perception&#xff08;动态障碍物检测detection、跟踪tracking、预测prediction&#xff1b;交通信号灯检测detection、分类c…

QT聊天项目DAY01

1.新建初始项目 2.修改UI格式 运行效果 3.创建登录界面 设计登录界面UI 设计布局 调整布局间距 往水平布局中拖入标签和文本输入框 更换控件名称并固定高度 添加窗口部件 往现有的资源文件中导入图片 添加水平布局 4.设置登陆界面为主窗口的核心组件 #pragma once#include &l…

论文精度:基于LVNet的高效混合架构:多帧红外小目标检测新突破

论文地址:https://arxiv.org/pdf/2503.02220 目录 一、论文背景与结构 1.1 研究背景 1.2 论文结构 二、核心创新点解读 2.1 三大创新突破 2.2 创新结构原理 2.2.1 多尺度CNN前端 2.2.2 视频Transformer设计 三、代码复现指南 3.1 环境配置 3.2 数据集准备 3.3 训…

ORM查询的补充

一&#xff0c;ORM查询的补充&#xff1a; 1&#xff0c;连接查询&#xff1a; 反向查询: 先介绍一下什么是正向查询&#xff0c;比如我们之前的数据表之间建立的一对多的关系&#xff0c;我们通过文章找到相应的作者是属于正向查询的&#xff08;由多到一&#xff09;&…