xilinx FPGA中oddr,idelay的用法详解

发布时间:2024-01-31  

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

本文引用地址:

1.

和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.

在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:
         
      end
   endgenerate

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

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


文章来源于:电子产品世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    拉高约多长时间。 三、配置管脚读取 按照图0中步骤,经历过上面两个步骤后,接下来就是进行配置模式采集。配置模式采集也很好理解,就是当INIT_B信号拉高后读取M2,M1......
    这个选项的作用是什么? Bit Swapping是指字节内位的交换。除非使用 PROMGen -spi 选项或 SPI 配置模式的 write_cfgmem -interface spi1|spi2......
    驱动ESP8266模块获取数据,并显示在底板的数码管上。 解析:要通过ESP8266实现WIFI通信有多种方式,本实验采用方式:FPGA驱动ESP8266模块,将ESP8266配置成SoftAP模式同时配置......
    中设定的16个IO引脚接收来自于74ALVC164245的16位三态总线收发器的数据,FPGA.VS[2:0]三引脚全部拉高,配置为快速读写模式,可以提高采样速率。Spartan-6系列FPGA中,配置模式......
    Hands表示:“系统开发商通常会在系统部署后,利用FPGA的灵活性来增强系统功能。我们在保持MachXO3D灵活性的基础上,增加了一个安全配置模块,由此推出了业界首个符合美国国家标准与技术研究所(NIST......
    STM32单片机GPIO的配置模式;1. 操作GPIO的意义 我们在学习单片机的时候,一般都是从操作GPIO开始的,很多单片机学习的教程第一课就是点亮发光二极管或者是流水灯。所以对于初学者而言,及时......
    等工业环境中可实现稳定运行,主控MCU丰富外设接口支持伺服电机系统一体化设计。 APM32F407 低压伺服驱动器方案特点: • 速度控制模式:通过按键设定目标速度,电机转速稳定在目标速度; • 位置模式模式:通过......
    有四种:收发模式配置模式、空闲模式和关机模式。nRF24L01的工作模式由PWR_UP、CE、TX_EN和CS三个引脚决定,如表。 收发模式:nRF24L01的收发模式有ShockBurstTM......
    可校准 多达6通道运放 灵活的配置模式 PGA增益可调整 内部输出到ADC 运放参数—失调电压 失调电压Vos:运放开环使用时,让运放直流输出为0时在运放输入端的直流电压差;25度时......
    机则需要根据功率选择合适的接线方式。确保所有连接都已正确安装并且固定牢固。 三.进入参数设置模式 要调整ABB变频器的输出频率,首先需要将其设置为参数设置模式。以下是两种常见的进入参数设置模式的方法: 方法一:使用键盘快捷键 1......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>