Xilinx IDDR与ODDR原语的使用

这篇具有很好参考价值的文章主要介绍了Xilinx IDDR与ODDR原语的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

IDDR原语

Xilinx IDDR与ODDR原语的使用
如图所示,IDDR原语的输入输出包括D,CE,C,S,R,Q1,Q2,其中,D为输入的双倍速率的数据,即D在时钟的上升沿和下降沿都会发生切换,一个时钟周期发送2bit数据,CE为时钟使能信号,C为时钟信号,S,R为复位和置位信号,Q1,Q2为单倍速率的输出数据。
IDDR主要有三种工作模式,分别是:OPPOSITE_EDGE, SAME_EDGESAME_EDGE_PIPELINED
下面分别作一介绍:

1.OPPOSITE_EDGE

Xilinx IDDR与ODDR原语的使用
在该模式下,上升沿采样到的数据(如DOA)和下降沿采样到的数据(如D1A),可以在下一个时钟周期的上升沿从Q1,Q2端口读取。
附一张仿真的效果图:
Xilinx IDDR与ODDR原语的使用

2.SAME_EDGE

Xilinx IDDR与ODDR原语的使用
在该模式下,上升沿读取的数据,可以在下一个时钟周期的上升沿从Q1端口读取,而下降沿读取的数据,可以在下下个时钟周期的上升沿从Q2端口读取。
仿真波形如下
Xilinx IDDR与ODDR原语的使用

3.SAME_EDGE_PIPELINED

Xilinx IDDR与ODDR原语的使用
在该模式下,上升沿和下降沿捕获的数据将可以在下下个时钟周期的上升沿从Q1,Q2端口读取。
仿真波形如下:
Xilinx IDDR与ODDR原语的使用

代码

设计文件

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/12/26 19:04:39
// Design Name: 
// Module Name: top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module top(
input logic clk,
input logic rst,
input logic ddr_data_i,
output logic [1:0] sdr_data_o
    );



//      IDDR     : In order to incorporate this function into the design,
//     Verilog   : the following instance declaration needs to be placed
//    instance   : in the body of the design code.  The instance name
//   declaration : (IDDR_inst) and/or the port declarations within the
//      code     : parenthesis may be changed to properly reference and
//               : connect this function to the design.  Delete or comment
//               : out inputs/outs that are not necessary.

//  <-----Cut code below this line---->

   // IDDR: Input Double Data Rate Input Register with Set, Reset
   //       and Clock Enable.
   //       Artix-7
   // Xilinx HDL Language Template, version 2019.2

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_inst (
    .Q1(sdr_data_o[1]), // 1-bit output for positive edge of clock
    .Q2(sdr_data_o[0]), // 1-bit output for negative edge of clock
    .C(clk),   // 1-bit clock input
    .CE(1'b1), // 1-bit clock enable input
    .D(ddr_data_i),   // 1-bit DDR data input
    .R(1'b0),   // 1-bit reset
    .S(rst)    // 1-bit set
);
// End of IDDR_inst instantiation
					
					
endmodule

测试平台

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/12/26 19:18:01
// Design Name: 
// Module Name: test_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module test_tb(

    );

logic clk;
logic clk_div;
logic rst;
logic ddr_data;
logic [1:0] sdr_data;
//clk
initial begin
    clk=0;
    forever begin
        #5 clk=~clk;
    end
end
//clk_div
always_ff@(posedge clk,posedge rst)
if(rst)
    clk_div<=0;
else
    clk_div<=~clk_div;
//rst
initial begin
    rst=1;
    #100
    rst=0;
end
//ddr_data
always_ff@(posedge clk)
begin
    ddr_data<=#1 $random%2;
end
//inst
top U(
.clk(clk_div),
.rst(rst),
.ddr_data_i(ddr_data),
.sdr_data_o(sdr_data)
);
endmodule

ODDR原语

Xilinx IDDR与ODDR原语的使用
如图,ODDR和IDDR相反,它的功能是将单倍速率的数据转化成双倍速率的数据,分为OPPOSITE_EDGE模式和SAME_EDGE模式

1.OPPOSITE_EDGE模式

Xilinx IDDR与ODDR原语的使用
该模式下,上升沿读取D1数据,并在时钟周期的前半个周期输出,下降沿读取D2数据,并在时钟周期的后半个周期输出。
仿真波形如下
Xilinx IDDR与ODDR原语的使用

2.SAME_EDGE模式

Xilinx IDDR与ODDR原语的使用
该模式下,时钟周期的上升沿同时读取D1,D2数据,并在前半个时钟周期输出D1,后半个时钟周期输出D2。
仿真波形如下:
Xilinx IDDR与ODDR原语的使用

代码

设计文件

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/12/26 19:04:39
// Design Name: 
// Module Name: top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module top(
input logic clk,
input logic rst,
input logic D1,
input logic D2,
output logic Q
    );




//      ODDR     : In order to incorporate this function into the design,
//     Verilog   : the following instance declaration needs to be placed
//    instance   : in the body of the design code.  The instance name
//   declaration : (ODDR_inst) and/or the port declarations within the
//      code     : parenthesis may be changed to properly reference and
//               : connect this function to the design.  Delete or comment
//               : out inputs/outs that are not necessary.

//  <-----Cut code below this line---->

   // ODDR: Output Double Data Rate Output Register with Set, Reset
   //       and Clock Enable.
   //       Artix-7
   // Xilinx HDL Language Template, version 2019.2

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(clk),   // 1-bit clock input
    .CE(1'b1), // 1-bit clock enable input
    .D1(D1), // 1-bit data input (positive edge)
    .D2(D2), // 1-bit data input (negative edge)
    .R(1'b0),   // 1-bit reset
    .S(rst)    // 1-bit set
);

// End of ODDR_inst instantiation
					
				
					
					
endmodule

测试文件文章来源地址https://www.toymoban.com/news/detail-470359.html

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/12/26 19:18:01
// Design Name: 
// Module Name: test_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module test_tb(

    );

logic clk;
logic clk_n;
logic clk_div;
logic rst;
logic D1,D2;
logic Q;
//clk
initial begin
    clk=0;
    forever begin
        #5 clk=~clk;
    end
end
//clk_n
assign clk_n=~clk;
//clk_div
always_ff@(posedge clk,posedge rst)
if(rst)
    clk_div<=0;
else
    clk_div<=~clk_div;
//rst
initial begin
    rst=1;
    #100
    rst=0;
end
//D1
always_ff@(posedge clk)
    D1<=#1 $random%2;
//D2
always_ff@(posedge clk_n)
    D2<=#1 $random%2;
//
top U(
.clk(clk),
.rst(rst),
.D1(D1),
.D2(D2),
.Q(Q)
);
endmodule

到了这里,关于Xilinx IDDR与ODDR原语的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】Xilinx Cordic IP 内核使用记录(输入输出数据格式介绍)及实验仿真

    Rotate 实现的功能是坐标的旋转。 输入 X, Y, Phase 输出X’, Y’ 具体实现的功能对应的数学表达形式如下: 在做FFT 复乘旋转因子时也可以用这个IP核的Rotate功能来实现。旋转因子-旋转! Translation 实现的功能是求模,以及向量的夹角 输入 X, Y 输出X’ and Phase 具体实现的功能对应

    2024年02月07日
    浏览(48)
  • 【XINLIX 原语】XILINX 原语的使用之 IBUFDS 差分转单端、OBUFDS 单端转差分

    目录 IBUFGDS IBUFDS 介绍 IBUFDS 示意图 例化方式 OBUFDS OBUFDS 介绍 OBUFDS 示意图 例化方式   在 XILINX 中有许多原语,常见的差分转单端 IBUFDS、单端转差分 OBUFDS。 IBUFDS 即专用差分输入时钟缓冲器(Dedicated Differential Signaling Input Buffer with Selectable I/O Interface) IBUFDS :在实验工程中如

    2024年02月16日
    浏览(47)
  • [计算机网络] 子网划分(详解)一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为91,150,3和15。该自治系统分配到的IP地址块为30.138.118/23。试...

    目录 题目 解题过程 (一)分析 (二)划分 (三)结果 结语   一个自治系统有5个局域网,其连接图如图所示。LAN1至LAN5上的主机数分别为91,150,3和15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块(包括前缀)。 (一)分析 根据IP地址块30.13

    2024年02月09日
    浏览(49)
  • Xilinx原语详解——IBUFDS & OBUFDS

      在使用FPGA时,往往会用到一些差分信号,比如HDMI接口,LVDS接口的ADC、显示器等等设备,而FPGA内部往往只会使用单端信号,就需要完成单端信号和差分信号的相互转换,xilinx提供了两个原语对所有IO信号实现差分和单端的转换, IBUFDS将FPGA输入的差分信号转换为单端信号

    2024年01月21日
    浏览(62)
  • xilinx原语介绍及仿真——ODELAYE2

      7系列IO模块相关的结构如图1所示,前文对IOB、IDELAYE2、ILOGIC、OLOGIC进行了讲解,还剩下ISERDESE2、OSERDESE2、ODELAYE2原语,本文对ODELAYE2进行讲解,该原语只有HP bank才有,即7系列FPGA的A7系列没有ODELAYE2结构,不能使用ODELAYE2原语。 图1 7系列IO模块(左侧HP bank,右侧HR bank)   图

    2024年02月20日
    浏览(43)
  • Xilinx FPGA ICAP原语实现多重配置

    1. FPGA可以运行几个固件 众所周知,常见的FPGA通常为SRAM结构,固件程序一般存放在外置的串行Flash中,比如SPI Flash,M25P16或N25Q128等。 FPGA启动时,一般先从SPI起始地址开始加载数据到内部的SRAM,加载完成、校验通过则会直接运行。 那么有没有可能在SPI Flash中存放两个或多个

    2024年02月02日
    浏览(55)
  • 使用重定向输入和输出创建子进程

    本主题中的示例演示了如何使用 CreateProcess 函数从控制台进程创建子进程。 它还演示了一种使用匿名管道重定向子进程的标准输入和输出句柄的技术。 请注意,命名管道还可用于重定向进程 I/O。 CreatePipe 函数使用 SECURITY_ATTRIBUTES 结构创建两个管道的读取和写入端的可继承句

    2024年02月07日
    浏览(36)
  • 使用Harmony OS控制外设——输入输出

    本节课程主要介绍如何在HiSpark WiFi IoT套件上使用Hamony OS进行编程,以及如何使用GPIO输入输出功能。 Hi3861开发板第一个示例程序演示 熟悉使用DevEco Device Tool插件进行程序烧录 熟悉串口调试工具sscom的使用 官方文档中控制核心板上LED的 led_example.c 讲解及演示 源码路径: appli

    2023年04月20日
    浏览(76)
  • 关于PID的输入输出是什么--供自己复习使用

    本人也是个新手,最近对平衡车感兴趣,所以恶补了一些关于pid的知识,下面是关于pid的文章,后续在平衡车上有进展也会出一些关于平衡车的文章。第一次写文章,有许多的不足之处,希望给位网友给予指正。 在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行

    2024年02月09日
    浏览(66)
  • 基于xilinx-MMCM输出时钟相位调整的实现

    deng@广州 2023.3.16 前言 在我们的一个应用中,采用ADC采集数据,ADC的采样时钟信号由FPGA提供。由于场景需求,需要动态调整输出时钟的相位,因此,本文主要讲述了如何使用MMCM进行动态调整输出时钟相位。 MMCM的使用方法,最好先看一下文档:ug472_7Series_Clocking.pdf 在里边有讲

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包