Xilinx IDDR及ODDR使用和仿真

平台: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;generatefor (i = 0; i<=(WIDTH-1); i = i +1) begin : adc_ch_diadc_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]                ));endendgenerate genvar j;generatefor (j = 0; j<=(WIDTH-1); j = j +1) begin : adc_ch_doadc_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                    ));endendgenerate 
//-----------------------------------------------------------
//-----------------------------------------------------------
initial
beginadc_clock   =0;adc_reset   =1;data_clk    =0;#100;adc_reset   =0;
endreg [11:0]   data_cnt;always@(posedge data_clk or posedge adc_reset)
beginif(adc_reset == 1'b1)begindata_cnt  <= 12'h0;endelse begindata_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.mzph.cn/news/775168.shtml

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

相关文章

RabbitMQ简单介绍

什么是消息队列 消息队列是一种在应用程序之间传递消息的通信模式。它提供了一种异步的、可靠的方式来处理分布式系统中的消息传递。在消息队列中&#xff0c;消息发送者&#xff08;Producer&#xff09;将消息发送到队列&#xff08;Queue&#xff09;中&#xff0c;而消息接…

网络链路层之(1)基础概念

网络链路层之(1)基础概念 Author: Once Day Date: 2024年3月27日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CSD…

HarmonyOS应用/元服务发布流程

在发布HarmonyOS应用/元服务前&#xff0c;建议您在本地进行调试&#xff0c;以查看和验证应用/元服务运行效果&#xff0c;减少发布过程中可能遇到的问题。 华为支持您使用HUAWEI DevEco Studio自动化签名的方式对应用/元服务进行调试&#xff0c;总体流程如下。 配置签名信息…

H12-831_338

多选题338、某园区部署OSPF实现网络互通&#xff0c;其中R2的LSDB如图所示。以下关于该LSDB信息的描述&#xff0c;错误的有哪些项? A.此时R4不能访间地址10.1.35.5/24&#xff0c;因为R4所在的Area l内没有泛洪R3-R5互联网段路由信息 B.Area l内无3类LSA&#xff0c;有7类1SA…

【LVGL-键盘部件,实体按键控制】

LVGL-二维码库 ■ LVGL-键盘部件■ 示例一&#xff1a;键盘弹窗提示■ 示例二&#xff1a;设置键盘模式■ 综合示例&#xff1a; ■ LVGL-实体按键控制■ 简介 ■ LVGL-键盘部件 ■ 示例一&#xff1a;键盘弹窗提示 lv_keyboard_set_popovers(kb,true);■ 示例二&#xff1a;设…

前端 CSS 经典:grid 栅格布局

前言&#xff1a;Grid 布局是将容器划分成"行"和"列"&#xff0c;产生单元格&#xff0c;然后将"项目"分配给划分好的单元格&#xff0c;因为有行和列&#xff0c;可以看作是二维布局。 一 术语 1. 容器 采用网格布局的区域&#xff0c;也就是…

Chakra UI:重塑React组件开发的未来

随着前端开发技术的不断演进&#xff0c;React已经成为了一个不可或缺的开源JavaScript库&#xff0c;用于构建用户界面。然而&#xff0c;虽然React提供了构建用户界面的强大工具&#xff0c;但在组件的可访问性、可重复使用性和可组合性方面仍存在挑战。Chakra UI正是一个为解…

上位机图像处理和嵌入式模块部署(qmacvisual区域提取)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在图像处理中&#xff0c;有两部分比较重要&#xff0c;一个是区域分割&#xff0c;一个是区域提取。区域分割&#xff0c;比较好理解&#xff0c;…

MFC标签设计工具 图片控件上,移动鼠标显示图片控件内的鼠标xy的水平和垂直辅助线要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小 源码

需求&#xff1a;要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小 我生成标签时&#xff0c;需要对齐和 调文字字体大小。这工具微调 能快速知道位置 和字体大小。 标签设计(点击图片&#xff0c;上下左右箭头移动 或-调字体) 已经够用了&#xff0c;滚动条还没完…

Jmeter 从登录接口提取cookie 并 跨线程组调用cookie (超详细)

文章目录 一、开始前的准备二、 业务场景介绍三、从登录接口提取cookies四、跨线程组调用cookies 一、开始前的准备 1、安装Jmeter&#xff0c;参考文章&#xff1a;JMeter 3.1 和JMeterPlugin的下载安装 2、设置配置文件使Cookie管理器保存cookie信息。 修改apache-jmeter-x…

PPT没保存怎么恢复?3个方法(更新版)!

“我刚做完一个PPT&#xff0c;正准备保存的时候电脑没电自动关机了&#xff0c;打开电脑后才发现我的PPT没保存。这可怎么办&#xff1f;还有机会恢复吗&#xff1f;” 在日常办公和学习中&#xff0c;PowerPoint是制作演示文稿的重要工具。我们会在各种场景下使用它。但有时候…

目标检测+车道线识别+追踪

一种方法&#xff1a; 车道线检测-canny边缘检测-霍夫变换 一、什么是霍夫变换 霍夫变换&#xff08;Hough Transform&#xff09;是一种在图像处理和计算机视觉中广泛使用的特征检测技术&#xff0c;主要用于识别图像中的几何形状&#xff0c;尤其是直线、圆和椭圆等常见形状…

ssm小区车库停车系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm小区车库停车系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

持续集成与版本控制的相关概念

目录 一、持续集成 1.1 持续集成基本概念 1.1.1 持续集成的含义 1.1.1.1 持续集成流程是依赖产品版本迭代和版本分支而产生的 1.1.1.2 持续集成流程中包含的内容 1.1.2 传统打包模式说明 1.1.2.1 传统打包模式概述 1.1.2.2 传统打包模式问题 1.1.3 持续集成模式 1.1.…

day70 Mybatis使用mapper重构xml文件重新修改商品管理系统

day67 基于mysql数据库jdbcDruidjar包连接的商品管理用户购物系统-CSDN博客 1多表操作 2动态SQL 项目中使用的为商品管理系统的表 一 查询商品信息 编号&#xff0c;名称&#xff0c;单价&#xff0c;库存&#xff0c;类别 1表&#xff1a;商品表&#xff0c;类别表 n对1…

java图书管理系统(简易)

实现的基本功能&#xff1a; 登录时&#xff0c;需要输入姓名&#xff0c;然后选择作为管理者还是普通用户。选择成功后选择想要实现的功能。管理者的目录下方有有五个功能&#xff0c;而普通用户有4个功能&#xff0c;如下图 首先我们要建立Book这个类&#xff0c;里面包含书…

sqlite跨数据库复制表

1.方法1 要将 SQLite 数据库中的一个表复制到另一个数据库&#xff0c;您可以按照以下步骤操作&#xff1a; 备份原始表的SQL定义和数据&#xff1a; 使用 sqlite3 命令行工具或任何SQLite图形界面工具&#xff0c;您可以执行以下SQL命令来导出表的SQL定义和数据&#xff1a…

算法打卡day19

今日任务&#xff1a; 1&#xff09;235. 二叉搜索树的最近公共祖先 2&#xff09;701.二叉搜索树中的插入操作 3&#xff09;450.删除二叉搜索树中的节点 235. 二叉搜索树的最近公共祖先 题目链接&#xff1a;235. 二叉搜索树的最近公共祖先 - 力扣&#xff08;LeetCode&…

Adobe推出20多个,企业版生成式AI定制、微调服务

3月27日&#xff0c;全球多媒体领导者Adobe在拉斯维加斯召开“Summit 2024”大会&#xff0c;重磅推出了Firefly Services。 Firefly Services提供了20 多个生成式AI和创意API服务&#xff0c;支持企业自有数据对模型进行定制、微调&#xff0c;同时可以与PS、Illustrator、Ex…

华为开源自研AI框架昇思MindSpore应用案例:梯度累加

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、案例实现 梯度累加的训练算法&#xff0c;目的是为了解决由于内存不足&#xff0c;导致Batch size过大神经网络无法训练&#xff0c;或者网络模型过大无法加载的OOM&#xff08;Out Of Memory&#xff…