您好,欢迎进入山西润盛进出口有限公司!

咨询服务热线

15383419322

xilinx FPGA中oddr,idelay的用法详解

发布时间:2024-01-31 15:08人气:

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

1. oddr

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

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

modulesimu_oddr( ); regclk=1'd0; always forever#2clk=~clk; ODDR#( .DDR_CLK_EDGE("OPPOSITE_EDGE"),//"OPPOSITE_EDGE"or"SAME_EDGE" .INIT(1'b0),//InitialvalueofQ:1'b0or1'b1 .SRTYPE("SYNC")//Set/Resettype:"SYNC"or"ASYNC" )ODDR_inst( .Q(Q),//1-bitDDRoutput .C(clk),//1-bitclockinput .CE(1'd1),//1-bitclockenableinput .D1(1'd1),//1-bitdatainput(positiveedge) .D2(1'd0),//1-bitdatainput(negativeedge) .R(1'd0),//1-bitreset .S(1'd0)//1-bitset ); 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时,就要例化多次。

`timescale1ns/1ps modules( ); regclk=1'd0; always forever#2.5clk=~clk; (*IODELAY_GROUP="idelay"*) IDELAYCTRLIDELAYCTRL_inst( .RDY(),//1-bitoutput:Readyoutput .REFCLK(clk),//1-bitinput:Referenceclockinput .RST(1'd0)//1-bitinput:Activehighresetinput ); regclk2=1'd0; always@(posedgeclk) clk2<=~clk2; wireDATAOUT; (*IODELAY_GROUP="idelay"*)//SpecifiesgroupnameforassociatedIDELAYs/ODELAYsandIDELAYCTRL IDELAYE2#( .CINVCTRL_SEL("FALSE"),//Enabledynamicclockinversion(FALSE,TRUE) .DELAY_SRC("IDATAIN"),//Delayinput(IDATAIN,DATAIN) .HIGH_PERFORMANCE_MODE("FALSE"),//Reducedjitter("TRUE"),Reducedpower("FALSE") .IDELAY_TYPE("FIXED"),//FIXED,VARIABLE,VAR_LOAD,VAR_LOAD_PIPE .IDELAY_VALUE(31),//Inputdelaytapsetting(0-31) .PIPE_SEL("FALSE"),//Selectpipelinedmode,FALSE,TRUE .REFCLK_FREQUENCY(200.0),//IDELAYCTRLclockinputfrequencyinMHz(190.0-210.0,290.0-310.0). .SIGNAL_PATTERN("DATA")//DATA,CLOCKinputsignal ) IDELAYE2_inst( .CNTVALUEOUT(CNTVALUEOUT),//5-bitoutput:Countervalueoutput .DATAOUT(DATAOUT),//1-bitoutput:Delayeddataoutput .C(1'd1),//1-bitinput:Clockinput .CE(1'd0),//1-bitinput:Activehighenableincrement/decrementinput .CINVCTRL(1'd0),//1-bitinput:Dynamicclockinversioninput .CNTVALUEIN(1'd0),//5-bitinput:Countervalueinput .DATAIN(1'd0),//1-bitinput:Internaldelaydatainput .IDATAIN(clk2),//1-bitinput:DatainputfromtheI/O .INC(1'd0),//1-bitinput:Increment/Decrementtapdelayinput .LD(1'd0),//1-bitinput:LoadIDELAY_VALUEinput .LDPIPEEN(1'd0),//1-bitinput:EnablePIPELINEregistertoloaddatainput .REGRST(1'd0)//1-bitinput:Active-highresettap-delayinput ); 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

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

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

  • 联系方式
  • 传 真:
  • 手 机:15383419322
  • 电 话:15383419322
  • 地 址:山西太原市杏花岭区解放路 175 号万达中心 A 座 33 楼 3301 室
友情链接
plc控制器
自动化设备
自动化设备
伺服驱动器
在线咨询

咨询电话:

15383419322

  • 微信扫码 关注我们

Copyright © 2022-2024 山西润盛进出口有限公司 版权所有 晋ICP备2021008479号-14

晋公网安备 14010702070906号

扫一扫咨询微信客服
15383419322