Xilinx IDDR及ODDR使用和仿真

news2024/11/27 0:33:17

平台:Vivado2018

官方相关文档,ug471_7Series_SelectIO.pdf

关于IDDR与ODDR


Input DDR Resource(IDDR)


外部的数据在时钟的上下沿同时传输数据,我们可以使用IDDR原语将输入的单bit数据转化为2bit的数据输出。同时数据速率变为原来的二分之一。

端口介绍

Q1,Q2数据输出
C时钟输入
CE时钟使能
D数据输入(DDR)
S/R同步、异步和复位引脚

IDDR属性

DDR_CLK_EDGE设置相对于时钟边沿的 IDDR 工作模式,拥有OPPOSITE_EDGE (default), SAME_EDGE, SAME_EDGE_PIPELINED三种模式
INIT_Q1、INIT_Q2设置Q1、Q2初始值
SRTYPE相对于时钟 (C) 的设置/复位类型

模式介绍

OPPOSITE_EDGE Mode模式

通过时钟上升沿输出Q1下降沿输出Q2。

SAME_EDGE模式
数据呈现到同一时钟边沿上的FPGA逻辑中。先输出D0A,在输出一对D1A和D2A。

SAME_EDGE_PIPELINED模式
数据呈现到相同时钟边沿的FPGA逻辑中。与SAME_EDGE模式不同的是,数据在第二个时钟周期输出一对数据。

Output DDR Overview (ODDR)

与IDDR相反的是,ODDR将内部的2bit数据,转换为单bit数据输出。数据速率变为原来的二倍。

端口介绍

Q数据输出(DDR)
C时钟输入
CE时钟使能
D数据输入
S/R同步、异步和复位引脚

ODDR属性

DDR_CLK_EDGE设置相对于时钟边沿的 ODDR 工作模式,拥有O OPPOSITE_EDGE (default), SAME_EDGE两种模式
INIT设置 Q 端口的初始值
SRTYPE相对于时钟 (C) 的设置/复位类型

模式介绍

OPPOSITE_EDGE Mode
时钟的两个边沿 (CLK) 都用于以两倍的吞吐量从 FPGA 逻辑捕获数据。


SAME_EDGE Mode
数据可以呈现给同一时钟边沿。

参考代码IDDR

// *********************************************************************************/
// Project Name :
// Author       : i_huyi
// Email        : i_huyi@qq.com
// Creat Time   : 2024/3/27 11:27:39
// File Name    : .v
// Module Name  : 
// Called By    :
// Abstract     :
//
// CopyRight(c) 2020, xxx xxx xxx Co., Ltd.. 
// All Rights Reserved
//
// *********************************************************************************/
// Modification History:
// 1. initial
// *********************************************************************************/
// *************************
// MODULE DEFINITION
// *************************
`timescale 1 ns / 1 ps
module adc_interface_iob_dly#(
parameter   U_DLY = 1
                                        )
                                        (
//
input   wire            adc_data_n      ,
input   wire            adc_data_p      ,
output  wire            adc_data_rise   ,
output  wire            adc_data_fall   ,
output  wire            data_lvds_out   ,
//system
input   wire            adc_clock       ,
input   wire            adc_reset       


                                        );
//--------------------------------------
// localparam
//--------------------------------------

//--------------------------------------
// register
//--------------------------------------

//--------------------------------------
// wire
//--------------------------------------

//--------------------------------------
// assign
//--------------------------------------

//------------------------------------------------------------
//------------------------------------------------------------
IBUFDS #(
	.DIFF_TERM                    ("TRUE"                       ),// Differential Termination
	.IBUF_LOW_PWR                 ("FALSE"                      ),// Low power="TRUE", Highest performance="FALSE" 
	.IOSTANDARD                   ("LVDS"                       )// Specify the input I/O standard
) IBUFDS_inst (
	.O                            (data_lvds_out                ),// Buffer output
	.I                            (adc_data_p                   ),// Diff_p buffer input (connect directly to top-level port)
	.IB                           (adc_data_n                   )// Diff_n buffer input (connect directly to top-level port)
);
//------------------------------------------------------------
//------------------------------------------------------------
IDDR #
  	(
  	.DDR_CLK_EDGE                 ("SAME_EDGE_PIPELINED"        ),// "OPPOSITE_EDGE", "SAME_EDGE"
                                                                  //    or "SAME_EDGE_PIPELINED"
  	.INIT_Q1                      (1'b0                         ),// Initial value of Q1: 1'b0 or 1'b1
  	.INIT_Q2                      (1'b0                         ),// Initial value of Q2: 1'b0 or 1'b1
  	.SRTYPE                       ("SYNC"                       )// Set/Reset type: "SYNC" or "ASYNC"
  	)
IDDR_i
  	(
  	.Q1                           (adc_data_rise                ),// 1-bit output for positive edge of clock
  	.Q2                           (adc_data_fall                ),// 1-bit output for negative edge of clock
  	.C                            (adc_clock                    ),// 1-bit clock input
  	.CE                           (1'b1                         ),// 1-bit clock enable input
  	.D                            (data_lvds_out                ),// 1-bit DDR data input
  	.R                            (adc_reset                    ),// 1-bit reset
  	.S                            (1'b0                         )// 1-bit set
  	);
//------------------------------------------------------------
//------------------------------------------------------------
endmodule

参考代码ODDR

// *********************************************************************************/
// Project Name :
// Author       : i_huyi
// Email        : i_huyi@qq.com
// Creat Time   : 2024/3/27 11:40:24
// File Name    : .v
// Module Name  : 
// Called By    :
// Abstract     :
//
// CopyRight(c) 2020, xxx xxx xxx Co., Ltd.. 
// All Rights Reserved
//
// *********************************************************************************/
// Modification History:
// 1. initial
// *********************************************************************************/
// *************************
// MODULE DEFINITION
// *************************
`timescale 1 ns / 1 ps
module adc_interface_out#(
parameter   U_DLY = 1
                                        )
                                        (
//
input   wire            adc_data_n      ,
input   wire            adc_data_p      ,
output  wire            adc_dq_p        ,
output  wire            adc_dq_n        ,
//system
input   wire            adc_clock       ,
input   wire            adc_reset       
                                        );
//--------------------------------------
// localparam
//--------------------------------------

//--------------------------------------
// register
//--------------------------------------

//--------------------------------------
// wire
//--------------------------------------
wire            Q                       ;
//--------------------------------------
// assign
//--------------------------------------
OBUFDS #(
    .IOSTANDARD                   ("LVDS18"                     ),// Specify the output I/O standard
    .SLEW                         ("SLOW"                       )// Specify the output slew rate
   ) OBUFDS_inst                                                                                           (
    .O                            (adc_dq_p                     ),// Diff_p output (connect directly to top-level port)
    .OB                           (adc_dq_n                     ),// Diff_n output (connect directly to top-level port)
    .I                            (Q                            )// Buffer input 
   );

//------------------------------------------------------------
//------------------------------------------------------------
ODDR #(
    .DDR_CLK_EDGE                 ("SAME_EDGE"              ),// "OPPOSITE_EDGE" or "SAME_EDGE" 
    .INIT                         (1'b0                         ),// Initial value of Q: 1'b0 or 1'b1
    .SRTYPE                       ("SYNC"                       )// Set/Reset type: "SYNC" or "ASYNC" 
) ODDR_inst (
    .Q                            (Q                            ),// 1-bit DDR output
    .C                            (adc_clock                    ),// 1-bit clock input
    .CE                           (1'b1                         ),// 1-bit clock enable input
    .D1                           (adc_data_p                   ),// 1-bit data input (positive edge)
    .D2                           (adc_data_n                   ),// 1-bit data input (negative edge)
    .R                            (adc_reset                    ),// 1-bit reset
    .S                            (1'b0                         )// 1-bit set
);
//------------------------------------------------------------
//------------------------------------------------------------

//------------------------------------------------------------
//------------------------------------------------------------
endmodule

仿真tb

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/03/27 10:25:26
// Design Name: 
// Module Name: vtf_adc_interface_iob_dly
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module vtf_adc_interface_iob_dly;

reg                     adc_clock       ;
reg                     adc_reset       ;
wire 	[11:0]	        ADC_A_I_P	    ;
wire 	[11:0]	        ADC_A_I_N		;
wire 	[11:0]	        ADC_A_I_r		;
wire 	[11:0]	        ADC_A_I_f		;
reg                     data_clk        ;

wire    [11:0]          adc_dq_p        ;
wire    [11:0]          adc_dq_n        ;

//-----------------------------------------------------------
//-----------------------------------------------------------
parameter               WIDTH = 12;
//-----------------------------------------------------------
//-----------------------------------------------------------
	genvar i;
	generate
	for (i = 0; i<=(WIDTH-1); i = i +1) begin : adc_ch_di
		adc_interface_iob_dly u_iddr(
			.adc_clock                    ( adc_clock                   ),
			.adc_reset                    ( adc_reset                   ),
			.adc_data_n                   ( ADC_A_I_N[i]                ),
			.adc_data_p                   ( ADC_A_I_P[i]                ),
			.adc_data_rise                ( ADC_A_I_r[i]                ),
			.adc_data_fall                ( ADC_A_I_f[i]                )
			);
	end
	endgenerate 

	genvar j;
	generate
	for (j = 0; j<=(WIDTH-1); j = j +1) begin : adc_ch_do
		adc_interface_out u_oddr(
			.adc_data_n                   (ADC_A_I_f[j]                 ),
			.adc_data_p                   (ADC_A_I_r[j]                 ),
			.adc_dq_p                     (adc_dq_p[j]                  ),
			.adc_dq_n                     (adc_dq_n[j]                  ),
			.adc_clock                    (adc_clock                    ),
			.adc_reset                    (adc_reset                    ));
	end
	endgenerate 
//-----------------------------------------------------------
//-----------------------------------------------------------
initial
begin
        adc_clock   =0;
        adc_reset   =1;
        data_clk    =0;
        #100;
        adc_reset   =0;
end

reg [11:0]   data_cnt;

always@(posedge data_clk or posedge adc_reset)
begin
        if(adc_reset == 1'b1)begin
                data_cnt  <= 12'h0;
        end
        else begin
                data_cnt  <= data_cnt + 11'h1;
        end
end


//-----------------------------------------------------------
//-----------------------------------------------------------
//产生数据
assign  ADC_A_I_P[0] = data_cnt[0];
assign  ADC_A_I_P[1] = data_cnt[1];
assign  ADC_A_I_P[2] = data_cnt[2];
assign  ADC_A_I_P[3] = data_cnt[3];
assign  ADC_A_I_P[4] = data_cnt[4];
assign  ADC_A_I_P[5] = data_cnt[5];
assign  ADC_A_I_P[6] = data_cnt[6];
assign  ADC_A_I_P[7] = data_cnt[7];
assign  ADC_A_I_P[8] = data_cnt[8];
assign  ADC_A_I_P[9] = data_cnt[9];
assign  ADC_A_I_P[10] = data_cnt[10];
assign  ADC_A_I_P[11] = data_cnt[11];
assign  ADC_A_I_N[0] =~ADC_A_I_P[0];
assign  ADC_A_I_N[1] =~ADC_A_I_P[1];
assign  ADC_A_I_N[2] =~ADC_A_I_P[2];
assign  ADC_A_I_N[3] =~ADC_A_I_P[3];
assign  ADC_A_I_N[4] =~ADC_A_I_P[4];
assign  ADC_A_I_N[5] =~ADC_A_I_P[5];
assign  ADC_A_I_N[6] =~ADC_A_I_P[6];
assign  ADC_A_I_N[7] =~ADC_A_I_P[7];
assign  ADC_A_I_N[8] =~ADC_A_I_P[8];
assign  ADC_A_I_N[9] =~ADC_A_I_P[9];
assign  ADC_A_I_N[10] =~ADC_A_I_P[10];
assign  ADC_A_I_N[11] =~ADC_A_I_P[11];



//时钟
always  #2 adc_clock = ~adc_clock;
always  #1 data_clk = ~data_clk;


endmodule

关于IDDR的模式

SAME_EDGE_PIPELINED

SAME_EDGE

OPPOSITE_EDGE

关于ODDR

输出adc_dq_p,adc_dq_n。

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

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

相关文章

python的Web框架比较

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 之前好像写过一些关于Python的Web框架?现在再按照ASGI与原本的WSGI区分一下,顺便把框架(framework)与库(library)区分一下. 之前我也写过(或者说想过)一些类似生态以及作用的框架进行比较,大多都是看看网上评价以及s…

微服务demo(三)nacosfeign

一、feign使用 1、集成方法 1.1、pom consumer添加依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency&…

算法学习——LeetCode力扣补充篇2

算法学习——LeetCode力扣补充篇2 724. 寻找数组的中心下标 724. 寻找数组的中心下标 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右…

C语言 05 变量与常量

变量 变量就像在数学中学习的 x&#xff0c;y 一样&#xff0c;可以直接声明一个变量&#xff0c;并利用这些变量进行基本的运算&#xff0c;声明变量的格式为&#xff1a; 数据类型 变量名称 初始值;&#xff08;其中初始值可以不用在定义变量时设定&#xff09; 是赋值操作…

【python】常用函数汇总(持续更新……)

文章目录 【numpy.exp()】返回e的幂次方&#xff0c;e是一个常数为2.71828【np.dot()】矩阵相乘【np.linalg.inv()】矩阵求逆 【numpy.exp()】返回e的幂次方&#xff0c;e是一个常数为2.71828 举例&#xff1a;numpy.exp() 【np.dot()】矩阵相乘 【要点】 1、前者的列数后者…

Springboot之RESTful风格

目录 1、概述&#xff1a; 1.1、传统风格的API&#xff1a; 1.2、RESTful风格的API&#xff1a; 1.3、GET、POST、PUT、DELETE&#xff1a; 2、RESTful风格相关的注解&#xff1a; ①PathVariable&#xff0c;用来获取url中的数据&#xff1b; ②GetMapping&#xff0c;接…

Xcode删除原本的Git,再添加新的git

本文参考&#xff1a;Xcode怎么删除原本git,在重新设置新的git地址_ios xcode 删除原本git-CSDN博客 开发中会有一个问题。Xcode项目A 提交到Git服务器server1&#xff0c;此时项目A内部已经存在一个Git文件&#xff0c;与server1相关联。 此时你想将项目A提交到 另一个Git…

SSH免密登录——linux

SSH免密登录——linux 方法一一、用 ssh-key-gen 在本地主机上创建公钥和密钥二、用 ssh-copy-id 把客户端公钥追加到远程主机的 .ssh/authorized_key 上三、直接登录远程主机 方法二一、将生成的客户端公钥id_rsa.pub内容追加至目标主机.ssh/authorized_key 中参考链接 SSH免密…

论文阅读,Accelerating the Lattice Boltzmann Method(五)

目录 一、Article:文献出处&#xff08;方便再次搜索&#xff09; &#xff08;1&#xff09;作者 &#xff08;2&#xff09;文献题目 &#xff08;3&#xff09;文献时间 &#xff08;4&#xff09;引用 二、Data:文献数据&#xff08;总结归纳&#xff0c;方便理解&am…

【vue2+antvx6】报错Cannot read properties of undefined (reading ‘toUpperCase‘)

我的代码是这样的 <el-collapseref"collapse"v-model"active"accordionclass"collapseStart"change"collapsechange"><el-collapse-item:name"String(index 1)"v-for"(i, index) in List":key"in…

程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享)

程序员/后端开发方向Java 跳槽注意事项&#xff08;简历和面试经验分享&#xff09; 应届生面试经验参考&#xff1a;https://www.cnblogs.com/rainbow-1/p/16779048.html 简历&#xff1a; 1、个人感觉还是要写真话&#xff0c;包装的内容要有一定的基础&#xff0c;问起来能…

数据结构——lesson13排序之计数排序

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

高炉项目中DeviceNET到Ethernet的转换奥秘

在工业自动化的世界中&#xff0c;高炉项目中的数据通信至关重要。其中DeviceNET和Ethernet作为两种主流的网络协议&#xff0c;扮演着不可或缺的角色。它们之间的转换不仅仅是技术上的桥梁&#xff0c;更是实现信息高效传递的关键。今天&#xff0c;我们就来揭开从DeviceNET到…

解读langchain与详细步骤

langchain框架目前以python或javascript包的形式提供&#xff0c;具体来说是TypeScript。 假如你想从你自己的数据、你自己的文件中具体了解一些情况&#xff0c;它可以是一本书&#xff0c;一个pdf文件&#xff0c;一个包含专有信息的数据库。Langchain允许你将GPT-4这样的大…

Python版【植物大战僵尸 +源码】

文章目录 写在前面&#xff1a;功能实现环境要求怎么玩个性化定义项目演示&#xff1a;源码分享Map地图:Menubar.py主菜单 主函数&#xff1a;项目开源地址 写在前面&#xff1a; 今天给大家推荐一个Gtihub开源项目&#xff1a;PythonPlantsVsZombies&#xff0c;翻译成中就是…

mybatis配置文件解析

可解析标签 configuration&#xff08;配置&#xff09; properties&#xff08;属性&#xff09;settings&#xff08;设置&#xff09;typeAliases&#xff08;类型别名&#xff09;typeHandlers&#xff08;类型处理器&#xff09;objectFactory&#xff08;对象工厂&#…

改变打分方法重新计算动态规划算法比对序列

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 动态规划 概念 动态规划法离不开一个关键词&#xff0c;拆分 &#xff0c;就是把求解的问题分解成若干个子阶段&#xff0c;前一问题的结…

算法学习——LeetCode力扣动态规划篇9

算法学习——LeetCode力扣动态规划篇9 1035. 不相交的线 1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 描述 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#x…

人工智能轨道交通行业周刊-第76期(2024.3.18-3.31)

本期关键词&#xff1a;铁科智合、信号机、列车供电方式、Voice Engine、3D数字人 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…

spring-boot. 结合redis 实现消息队列

导入依赖jar包 <!-- redis 配置信息--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 实现消息监听接口 MessageListener\重写 onMessa…