0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

xilinx FPGA中oddr,idelay的用法详解

电子设计 来源:CSDN 作者:同年纪_ 2020-11-25 14:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

我们知道xilinx FPGA的selectio中有ilogic和ologic资源,可以实现iddr/oddr,idelay和odelay等功能。刚入门时可能对xilinx的原语不太熟练,在vivado的tools-> language templates中搜索iddr idelay等关键词,可以看到A7等器件下原语模板。复制出来照葫芦画瓢,再仿真一下基本就能学会怎么用了。

1. oddr

oddr和iddr都一样,以oddr为例,先去templates里把模板复制出来。


Add simulation source,建立一个简单的仿真文件。

module simu_oddr(
 
    );
        
    reg clk = 1'd0;
    always
    forever #2 clk = ~ clk;
       ODDR #(
       .DDR_CLK_EDGE("OPPOSITE_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'd1), // 1-bit clock enable input
       .D1(1'd1), // 1-bit data input (positive edge)
       .D2(1'd0), // 1-bit data input (negative edge)
       .R(1'd0),   // 1-bit reset
       .S(1'd0)    // 1-bit set
    );
    
endmodule

ODDR的使用方法在selectoi中的参考手册ug471中127页开始有说明,使用这些资源首先要参考的都是官方的资源手册。


简单说明:

CE是使能,C是时钟,在时钟的上升沿下降沿分别输出D1和D2,Q是输出,S/R是复位,R = 1 Q输出0,S= 1,Q输出1,默认情况应该两个都等于0 ,两个都等于1时,输出0。"OPPOSITE_EDGE" or "SAME_EDGE" 手册中也有说明,指明采样时刻不同,具体有什么应用上区别我也不知道。


通过仿真,就可以看到输出是什么情况,在上升沿输出1,下降沿输出0,还可以看到输出有一点滞后。iddr和oddr在rgmii的接口中就可以方便地接收数据,转为gmii。一般情况要注意下时钟和数据的对齐问题,采样时钟可以相位往后一点,90° 1//4周期,输出的时候时钟也相应地滞后一点,就根据实际情况来,125M的DDR还是很容易采样稳定的。


2.idelay

在ug471告诉我们,只有hp bank才有odelay,在ug475中说明哪些系列有hp bank,简单说hp bank速度快很多,支持odelay,电压只能1.2V- 1.8V。其中A7全系是没有odelay的,K7才有(保留意见,简单看了一下),所以在language templates中搜索odelay是没有A系列的原语的。



idelay作用就是实现输入延迟,实际中应该有更明确的用法,这里只是我自己学习时的一些介绍。同样在ug471中对idelay也有介绍,有固定延时,可变延时,使用时都要例化idelay ctrl,延时的精度就可idelay ctrl的接入时钟有关。一个bank 只有1个idelay ctrl,同一个bank 要用idelay或者odelay,延时精度是一样的,虽然可以idelay ctrl可以接200Mhz,300Mhz,但同一个bank只能接1个,也只需要例化一次。多个bank要用idelay时,就要例化多次。

`timescale 1ns / 1ps
 
module s(
 
    );
    
    reg clk = 1'd0;
    always
    forever #2.5 clk = ~ clk;
    
    
     (* IODELAY_GROUP = "idelay" *)
       IDELAYCTRL IDELAYCTRL_inst (
       .RDY(),       // 1-bit output: Ready output
       .REFCLK(clk), // 1-bit input: Reference clock input
       .RST(1'd0)        // 1-bit input: Active high reset input
    );
 
    
    reg clk2 = 1'd0;
    always @(posedge clk)
        clk2 <= ~clk2;
    
    
    wire DATAOUT;
    
       (* IODELAY_GROUP = "idelay" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
    
       IDELAYE2 #(
          .CINVCTRL_SEL("FALSE"),          // Enable dynamic clock inversion (FALSE, TRUE)
          .DELAY_SRC("IDATAIN"),           // Delay input (IDATAIN, DATAIN)
          .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
          .IDELAY_TYPE("FIXED"),           // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
          .IDELAY_VALUE(31),                // 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("DATA")          // DATA, CLOCK input signal
       )
       IDELAYE2_inst (
          .CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output
          .DATAOUT(DATAOUT),         // 1-bit output: Delayed data output
          .C(1'd1),                     // 1-bit input: Clock input
          .CE(1'd0),                   // 1-bit input: Active high enable increment/decrement input
          .CINVCTRL(1'd0),       // 1-bit input: Dynamic clock inversion input
          .CNTVALUEIN(1'd0),   // 5-bit input: Counter value input
          .DATAIN(1'd0),           // 1-bit input: Internal delay data input
          .IDATAIN(clk2),         // 1-bit input: Data input from the I/O
          .INC(1'd0),                 // 1-bit input: Increment / Decrement tap delay input
          .LD(1'd0),                   // 1-bit input: Load IDELAY_VALUE input
          .LDPIPEEN(1'd0),       // 1-bit input: Enable PIPELINE register to load data input
          .REGRST(1'd0)            // 1-bit input: Active-high reset tap-delay input
       );
 
endmodule

这里例化了一个idelay ctrl,是属于idelay group的,这个声明还没有研究过有什么用,不知道是不是指定idelay2和哪个ctrl是绑定的。idelay ctrl端口很简单,仿真时复位rst接0就好了,实际中推荐接输入时钟的pll lock引脚取反,保证在时钟锁定前(lock = 0)idelay ctrl处于复位状态。

idelay2中按推荐配置,从DATAIN还是从IDATAIN输入区别为是内部延时还是从IO输入,FIXED固定延时,idelay value先输入0,,时钟是200M,其他全部接0。此处,idelay的作用就是把IDATAIN的信号接入ilogic中,延时0个tap再从DATAOUT输出。可变延时的使用说明ug471上都有,还没学习,有需要了再去看。

idelay 有0-31个tap,分割200M的半个周期2.5ns,每个tap就是2.5ns/32 = 0.078125 ns

value = 0 可以看到输出延迟了0.6ns,value = 10时,延时了1.38ns。 0.078125 * 10 + 0.6 = 1.38125,大体相近的。



其实oddr,idelay这些资源应该用起来都比较简单,可能我实际中就用了一下oddr/iddr,也没有觉得有多少难以调试的地方,本文简单介绍了这2个原语的使用方法,从复制原语,看手册介绍到仿真,其他原语也是类似的,学会如何去学习最重要。

文末再介绍一下generate,一样的在tools -> language templates中搜索。

   genvar ;
   generate
      for (=0;  <; =+1)
      begin: 

用这个可以很方便地例化出多个相似的模块。

       genvar i; //genvar i;也可以定义到generate语句里面
       generate
              for(i=0;i<10;i=i+1)
              begin:mymodule
                     assign a[i]=reg[i];
              end
       endgenerate
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1656

    文章

    22288

    浏览量

    630386
  • Xilinx
    +关注

    关注

    73

    文章

    2192

    浏览量

    129966
  • Vivado
    +关注

    关注

    19

    文章

    847

    浏览量

    70479
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用Xilinx 7系列FPGA的四位乘法器设计

    (Shinshu University)研究团队的最新设计,一个专为 Xilinx 7 系列 FPGA 量身打造的 4 位乘法器使用了仅 11 个 LUT + 2 个 CARRY4 块,关键路径延迟达到 2.75 ns。这是一
    的头像 发表于 11-17 09:49 2781次阅读
    使用<b class='flag-5'>Xilinx</b> 7系列<b class='flag-5'>FPGA</b>的四位乘法器设计

    Xilinx FPGA串行通信协议介绍

    Xilinx FPGA因其高性能和低延迟,常用于串行通信接口设计。本文深入分析了Aurora、PCI Express和Serial RapidIO这三种在Xilinx系统设计关键的串
    的头像 发表于 11-14 15:02 1940次阅读
    <b class='flag-5'>Xilinx</b> <b class='flag-5'>FPGA</b>串行通信协议介绍

    请问如何将蜂鸟E203移植到Xilinx NEXYS A7 FPGA 开发板上?

    如何将蜂鸟E203移植到Xilinx NEXYS A7 FPGA 开发板上?有参考教程吗?小白求教 主要是引脚分配,我这边有移植到Xilinx Artix-7 系列XC7A100T-fgg484的案
    发表于 11-11 07:44

    一文详解xilinx 7系列FPGA配置技巧

    本文旨在通过讲解不同模式的原理图连接方式,进而配置用到引脚的含义(手册上相关引脚含义有四、五页,通过本文理解基本上能够记住所有引脚含义以及使用场景),熟悉xilinx 7系列配置流程,以及设计原理图时需要注意的一些事项,比如flash与FPGA的上电时序。
    的头像 发表于 08-30 14:35 8935次阅读
    一文<b class='flag-5'>详解</b><b class='flag-5'>xilinx</b> 7系列<b class='flag-5'>FPGA</b>配置技巧

    鸿蒙Stage模型与FA模型详解

    【HarmonyOS 5】鸿蒙Stage模型与FA模型详解 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 在HarmonyOS 5的应用开发
    的头像 发表于 07-07 11:50 632次阅读

    【HarmonyOS 5】鸿蒙的UIAbility详解(三)

    【HarmonyOS 5】鸿蒙的UIAbility详解(三) ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 本文是鸿蒙的UIAbility
    的头像 发表于 06-14 22:32 490次阅读

    XILINX XCZU67DR FPGA完整原理图

    电子发烧友网站提供《XILINX XCZU67DR FPGA完整原理图.pdf》资料免费下载
    发表于 05-30 15:29 3次下载

    Xilinx Shift RAM IP概述和主要功能

    Xilinx Shift RAM IP 是 AMD Xilinx 提供的一个 LogiCORE IP 核,用于在 FPGA 实现高效的移位寄存器(Shift Register)。该
    的头像 发表于 05-14 09:36 841次阅读

    详解Xilinx的10G PCS PMA IP

    如果要在XilinxFPGA上使用万兆以太网通信,大致有三种方法构建协议栈。第一种使用GTX等Serdes作为底层的PHY,上层通过HDL实现构建MAC和IP层,这种方式难度会比较大,底层需要完成PHY层的设计,最终我想通过这种方式实现万兆以太网的搭建。
    的头像 发表于 04-18 15:16 1591次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>Xilinx</b>的10G PCS PMA IP

    ZYNQ FPGA的PS端IIC设备接口使用

    zynq系列FPGA,都会自带两个iic设备,我们直接调用其接口函数即可运用。使用xilinx官方提供的库函数,开发起来方便快捷。
    的头像 发表于 04-17 11:26 1756次阅读
    ZYNQ <b class='flag-5'>FPGA</b>的PS端IIC设备接口使用

    电力电子的坐标变换详解

    电力电子的坐标变换详解 clark变换&park变换
    发表于 02-17 15:28 1次下载

    xilinx FPGA IOB约束使用以及注意事项

    xilinx FPGA IOB约束使用以及注意事项 一、什么是IOB约束 在xilinx FPGA,IOB是位于IO附近的寄存器,是
    的头像 发表于 01-16 11:02 1496次阅读
    <b class='flag-5'>xilinx</b> <b class='flag-5'>FPGA</b> IOB约束使用以及注意事项

    【米尔-Xilinx XC7A100T FPGA开发板试用】Key-test

    硬件: 一Xilinx XC7A100T FPGA开发板 二12V电源适配器 三下载器 四 win10笔记本 软件: 一Vivado (指导手册有详细的安装下载流程) 二官方按键示例工程 按键示例
    发表于 01-09 16:08

    ADS54J64EVM开发板可以配套使用哪些Xilinx FPGA开发板呢?

    个 FMC 连接器,该连接器也可与领先的FPGA制造商提供的许多开发套件兼容。 那么问题来了,TI的这两个AD开发板到底能不能直接用在Xilinx FPGA的其他通用开发板上,例如 KC705/VC707/VCU108? 急,在
    发表于 12-20 10:18

    基于Xilinx ZYNQ7000 FPGA嵌入式开发实战指南

    电子发烧友网站提供《基于Xilinx ZYNQ7000 FPGA嵌入式开发实战指南.pdf》资料免费下载
    发表于 12-10 15:31 39次下载