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://xiahunao.cn/news/2905443.html

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

相关文章

基于java+springboot+vue实现的宠物领养救助平台(文末源码+Lw+ppt)23-363

摘 要 宠物领养救助平台采用B/S架构&#xff0c;数据库是MySQL。网站的搭建与开发采用了先进的java进行编写&#xff0c;使用了springboot框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。主要功能包括&#xff1a;个人信息修改&#xff0c;对用户、…

N5230A安捷伦N5230A网络分析仪

181/2461/8938产品概述&#xff1a; Agilent N5230A 网络分析仪提供了速度和精度的卓越组合&#xff0c;用于测量多端口和平衡组件&#xff0c;例如高达 50 GHz 的滤波器、双工器和射频模块&#xff08;取决于选件&#xff09;。Agilent N5230A 分析仪的自动端口扩展功能可自动…

物联网实战--入门篇之(一)物联网概述

目录 一、前言 二、知识梳理 三、项目体验 四、项目分解 一、前言 近几年很多学校开设了物联网专业&#xff0c;但是确却地讲&#xff0c;物联网属于一个领域&#xff0c;包含了很多的专业或者说技能树&#xff0c;例如计算机、电子设计、传感器、单片机、网…

小米汽车正式发布:开启智能电动新篇章

随着科技的不断进步&#xff0c;汽车产业正经历着前所未有的变革。智能电动汽车作为这一变革的重要方向&#xff0c;正吸引着越来越多的目光。在这个充满机遇和挑战的时代&#xff0c;小米汽车凭借其卓越的技术实力和深厚的市场底蕴&#xff0c;终于迈出了坚实的一步。今天&…

C语言 | qsort()函数使用

目录&#xff1a; 1.qsort介绍 2.使⽤qsort函数 排序 整型数据 3.使⽤qsort函数 排序 结构体数据 4. qsort函数的模拟实现冒泡排序 qsort()函数 是一个 C语言编译器函数库自带的排序函数&#xff0c; 它可以对指定数组&#xff08;包括字符串&#xff0c;二维数组&#x…

最新2024年增强现实(AR)营销指南(完整版)

AR营销是新的最好的东西&#xff0c;就像元宇宙和VR营销一样。利用AR技术开展营销活动可以带来广泛的利润优势。更不用说&#xff0c;客户也喜欢AR营销&#xff01; 如果企业使用AR&#xff0c;71%的买家会更多地购物。40%的购物者准备在他们可以在AR定制的产品上花更多的钱。…

unity3d for web

时光噶然 一晃好多年过去了&#xff08;干了5年的u3d游戏&#xff09;&#xff0c;记得最后一次使用的版本好像是 unity 2017。 那个是 unity3d for webgl 还需要装个插件。用起来很蛋疼。 最近做一个小项目 在选择是用 Layabox 还是 cocosCreate 的时候 我想起了老战友 Uni…

HTTP,Servlet

HTTP 概念&#xff1a;HyperTextTransferProtocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 HTTP协议特点&#xff1a; 1.基于TCP协议&#xff1a;面向连接&#xff0c;安全 2.基于请求-响应模型的&#xff1a;一次请求对应一次响应 …

iOS网络抓包工具在移动应用开发中的关键作用与应用

摘要 本文将深入探讨iOS平台上常用的网络抓包工具&#xff0c;包括Charles、克魔助手、Thor和Http Catcher&#xff0c;以及通过SSH连接进行抓包的方法。此外&#xff0c;还介绍了克魔开发助手作为iOS应用开发的辅助工具&#xff0c;提供的全方面性能监控和调试功能。 在iOS应…

【塑料烧杯】PTFE带把手耐强酸碱四氟烧杯可灵活加工

PTFE烧杯&#xff0c;也叫四氟烧杯&#xff0c;需在石棉网上使用&#xff0c;不可直接接触明火、传热性能好、耐腐蚀、内壁光滑。搭配防腐电热板、赶酸电热板后期赶酸使用效果更佳。 可灵活加工各种规格形状四氟烧杯&#xff0c;也可以单独配盖子。 PTFE 规格参考&#xff1a;…

vue3 渲染一个后端返回的图片字段渲染、table表格内放置图片

一、后端直接返回图片url 当图片字段接口直接返回的是图片url&#xff0c;可以直接放到img标签上 <img v-if"thumbLoader" class"r-image-loader-thumb" :src"resUrl" /> 二、当图片字段接口直接返回的是图片Id 那么就需要去拼一下图片…

fastadmin学习05-开启debug以及配置

FastAdmin 框架提供了对 .env 环境变量配置的支持&#xff0c;并附带一个默认示例文件 .env.sample。在安装后&#xff0c;框架并不会自动启用 env 环境变量&#xff0c;需要手动将 .env.sample 复制为 .env 并进行配置。 如果不开启.env会读取database.php中的配置 下面测试…

Web Components使用(一)

在使用Web Components之前&#xff0c;我们先看看上一篇文章Web Components简介&#xff0c;其中提到了相关的接口、属性和方法。 正是这些接口、属性和方法才实现了Web Components的主要技术&#xff1a;Custom elements&#xff08;自定义元素&#xff09;、Shadow DOM&#…

浅谈WPF之属性系统

在WPF开发中&#xff0c;经常听到各种属性&#xff0c;如&#xff1a;依赖属性&#xff0c;附加属性&#xff0c;CLR属性&#xff0c;那这些不同类型的属性&#xff0c;具体又有什么作用呢&#xff1f;今天以一些简单的小例子&#xff0c;简述一下WPF开发中&#xff0c;各种属性…

STM32G473之flash存储结构汇总

STM32G4系列单片机&#xff0c;为32位的微控制器&#xff0c;理论上其内部寄存器地址最多支持4GB的命名及查找&#xff08;2的32次方&#xff0c;地址命名为0x00000000至0xFFFFFFFF&#xff09;。STM32官方对4GB的地址存储进行编号时&#xff0c;又分割成了8个block区域&#x…

【MATLAB源码-第22期】基于matlab的手动实现的(未调用内置函数)CRC循环码编码译码仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 循环码是线性分组码的一种&#xff0c;所以它具有线性分组码的一般特性&#xff0c;此外还具有循环性。循环码的编码和解码设备都不太复杂&#xff0c;且检(纠)错能力强。它不但可以检测随机的错误&#xff0c;还可以检错突发…

day72Html

常用标签&#xff1a; 分类&#xff1a; 块级标签&#xff1a;独立成行 行级标签&#xff1a;不独立成行&#xff0c;同一行可放多个行级标 注意网页显示时&#xff0c;忽略空白字符,(回车符&#xff0c;空格&#xff0c;tab制表符&#xff09; 一&#xff09;块级标签&#xf…

Linux——信号的保存与处理

目录 前言 一、信号的常见概念 1.信号递达 2.信号未决 3.信号阻塞 二、Linux中的递达未决阻塞 三、信号集 四、信号集的处理 1.sig相关函数 2.sigprocmask()函数 3.sigpending()函数 五、信号的处理时机 六、信号处理函数 前言 在之前&#xff0c;我们学习了信号…

verilog设计-cdc:多比特信号跨时钟域(DMUX)

一、前言 多比特一般为数据&#xff0c;其在跨时钟域传输的过程中有多种处理方式&#xff0c;比如DMUX&#xff0c;异步FIFO&#xff0c;双口RAM&#xff0c;握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器&#xff0c;该方…

【Pt】马灯贴图绘制过程 02-制作锈迹

目录 一、边缘磨损效果 二、刮痕效果 三、边缘磨损与刮痕的混合 四、锈迹效果 本篇效果&#xff1a; 一、边缘磨损效果 将智能材质“Iron Forge Old” 拖入图层 打开“Iron Forge Old” 文件夹&#xff0c;选中“Sharpen”&#xff08;锐化&#xff09;&#xff0c;增大“…