当前位置: 首页 > news >正文

LVDS系列9:Xilinx 7系可编程输入延迟(二)

使用IDELAYE2的同时,还必须要例化IDELAYCTRL原语,IDELAYCTRL原语为IDELAYE2原语提供时钟参考,同时持续校准各个延迟抽头,减少外部环境和器件对于延迟精度的影响;

 IDELAYCTRL框图
在这里插入图片描述
 IDELAYCTRL例化模板:
(* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
IDELAYCTRL IDELAYCTRL_inst (
.RDY(RDY), // 1-bit output: Ready output
.REFCLK(REFCLK), // 1-bit input: Reference clock input
.RST(RST) // 1-bit input: Active high reset input
);

 IDELAYCTRL使用:
RST:高电平异步复位,在上电配置后需复位,复位需要在参考时钟REFCLK稳定情况下至少52ns复位;
REFCLK:参考时钟,范围按上一节IDELAYE2的参考时钟范围190.0-210.0, 290.0-310.0选取即可,支持200MHz和300MHz,其中范围有加减10M的范围是原语允许的波动,且该时钟必须由全局BUFG或水平BUFH时钟缓冲器进行驱动;
RDY:准备就绪信号,高有效,指示IDELAY和ODELAY校准完毕。REFCLK如果出现异常如保持一个周期的1或0,RDY就会拉低,此时就需要重新复位该原语;

时序如下图所示:
在这里插入图片描述
RST复位后,等待一段时间,RDY拉高,表示校准完毕,当REFCLK出现持续的异常高时,RDY拉低。

 IDELAYE2延时精度:
延时精度指延时抽头值每个tap表示的延迟时间,可以按下列式子计算:
在这里插入图片描述
T_tap = 1s/(322REFCLK)
当提供200MHz的参考时钟:
T_tap= 1000000000000ps/(322200000000) = 78.125ps ≈ 78ps
当提供300MHz的参考时钟:
T_tap= 1000000000000ps/(322300000000) = 52.083ps ≈ 52ps
这表示每递增(不环绕的情况下)一个抽头值,数据线的延迟比上一个抽头值的延迟时间增加78ps或52ps;

IDELAY延时值:
IDELAY延时 = 延时基准T_base + 抽头值tap_num*T_tap
其中延时基准T_base一般为600ps,表示数据线只要通过IDELAY原语,即使抽头值为0,也会被延时600ps;

 IDELAYE2和IDELAYCTRL仿真测试:

 Testbench代码:
Testbench简单生成测试的输入数据和参考时钟,后续在测试模块中修改参数和逻辑去查看原语的各种使用细节;
tb代码:
`timescale 1ns / 1ps

module tb;
reg clk_200m;
reg clk_300m;
reg clk;
reg rst;
reg load_trg;
reg data1;
reg data2;
wire dout;

initial begin
clk_200m = 0;
clk_300m = 0;
clk = 0;
rst = 1;
#200
rst = 0;
end

always #5 clk = ~clk;
always #(2.5) clk_200m = ~clk_200m;
always #(1.667) clk_300m = ~clk_300m;

initial begin
data1 = 0;
data2 = 0;
while(1)begin
#10
data1 = $random();
data2 = $random();
end
end

initial begin
load_trg = 0;
while(1)begin
#100
@(posedge clk)
load_trg = 1;
@(posedge clk)
load_trg = 0;
end
end

top_7series_idelay inst_top_7series_idelay (
.clk_ref_200m (clk_200m),
.clk_ref_300m (clk_300m),
.clk (clk),
.rst (rst),
.load_trg (load_trg),
.idatain (data1),
.datain (data2),
.dout (dout)
);

endmodule

 FIXED模式使用:

Fixed模式下的测试模块代码:
module top_7series_idelay(
input wire clk_ref_200m,
input wire clk_ref_300m,
input wire clk,
input wire rst,
input wire load_trg,
input wire idatain,
input wire datain,
output wire dout
);
wire idelayctrl_rdy;
wire [4:0] cntvalueout;
// idelayctrl -------------------------------------------------
IDELAYCTRL IDELAYCTRL_inst (
.RDY(idelayctrl_rdy), // 1-bit output: Ready output
.REFCLK(clk_ref_200m), // 1-bit input: Reference clock input
.RST(rst) // 1-bit input: Active high reset input
);

// idelaye2 -------------------------------------------------
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(0), // 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(dout), // 1-bit output: Delayed data output
.C(0), // 1-bit input: Clock input
.CE(0), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(0), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(0), // 5-bit input: Counter value input
.DATAIN(datain), // 1-bit input: Internal delay data input
.IDATAIN(idatain), // 1-bit input: Data input from the I/O
.INC(0), // 1-bit input: Increment / Decrement tap delay input
.LD(0), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(0), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(0) // 1-bit input: Active-high reset tap-delay input
);
Endmodule

此时idelayctrl使用外部的rst复位,当rdy拉高后我们查看延时情况;
此时使用IDATAIN端口的数据进行延时,选择200M参考时钟,其他模式的控制此时端口不用关注,因为fixed模式不使用动态控制;
在这里插入图片描述
可以看到上图中,此时IDELAY_VALUE设置为0,此时cntvalueout为0,表示此时原语正在工作的抽头值为0,idatain和dout的两个上升沿间隔了0.6ns,也就是之前所讲的200M的延时基准;
在这里插入图片描述
上图为将IDELAY_VALUE参数设置为30(0x1e),此时cntvalueout为0x1e,可以看到此时的idatain和dout的延时为2.94ns=0.6ns+30*78ps,与理论的延时时间相符;

如果将IDELAYCTRL模块的参考时钟改为300M的clk_ref_300m,将IDELAYE2的REFCLK_FREQUENCY参数改为300.0;
在这里插入图片描述
上图为IDELAY_VALUE参数设置为0的情况,可以看到300M参考时钟的情况下,延时基准还是保持为0.6ns;
在这里插入图片描述
上图为300M参考下,将IDELAY_VALUE参数设置为30(0x1e),可以看到此时的idatain和dout的延时为2.16ns=0.6ns+30*52ps,与理论的延时时间相符;

其他的VARIABLE模式、VAR_LOAD模式和VAR_LOAD_PIPE模式在下一节继续进行讲解;

本文章由威三学社出品
对课程感兴趣可以私信联系

相关文章:

  • 深度学习-数值稳定性和模型初始化
  • 【C语言】C语言结构体:从基础到高级特性
  • 反爬系列 IP 限制与频率封禁应对指南
  • Python:简介,Python解释器安装,第一个Python程序,开发环境(PyCharm安装和配置、Sublime安装和配置)
  • 如何借助ETL数据集成工具实现数据一致性?
  • 正则表达式学习指南
  • 离线部署kubernetes
  • 使用localStorage的方式存储数据,刷新之后,无用户消息,需要重新登录,,localStorage 与 sessionStorage 的区别
  • 深度学习前沿 | TransNeXt:仿生聚合注意力引领视觉感知新时代
  • [Mac] 使用homebrew安装miniconda
  • 发币流程是什么,需要多少成本?
  • Sass的学习
  • SiamMask中的分类分支、回归分支与Mask分支,有何本质差异?
  • Java大师成长计划之第2天:面向对象编程在Java中的应用
  • Vue实战(08)解决 Vue 项目中路径别名 `@` 在 IDE 中报错无法识别的问题
  • Python爬虫实战:移动端逆向工具Fiddler调试详解
  • Python 爬虫实战 | 企名科技
  • 【产品经理从0到1】原型及Axure介绍
  • 前端项目搭建集锦:vite、vue、react、antd、vant、ts、sass、eslint、prettier、浏览器扩展,开箱即用,附带项目搭建教程
  • http协议、全站https
  • 释新闻|印度宣布“掐断”巴基斯坦水源,对两国意味着什么?
  • 巴基斯坦最近“比较烦”:遣返阿富汗人或致地区局势更加动荡
  • 专访|攸佳宁:手机只是矛盾导火索,重要的是看见孩子的内心
  • 神舟二十号载人飞船成功飞天,上海航天有何贡献?
  • 国防部:“台独”武装摆练纯属搞心理安慰,怎么演都是溃败的死局
  • 著名哲学家、中山大学哲学系原系主任李锦全逝世