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

LVDS系列10:Xilinx 7系可编程输入延迟(三)

这节继续讲解IDELAYE2和IDELAYCTRL的VARIABLE模式、VAR_LOAD模式和VAR_LOAD_PIPE模式的仿真测试;

 VARIABLE模式使用:
VARIABLE模式需要使用INC和CE端口控制抽头值的递增递减变化;
测试代码如下:
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;
reg ce=0;
reg cinvctrl=0;
reg [4:0] cntvaluein=0;
reg inc=0;
reg ld=0;
reg ldpipeen=0;
reg regrst=0;

// 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 -------------------------------------------------
always @(posedge clk) begin
if (rst) begin
inc <= 0;
ce <= 0;
end
else if (load_trg==1) begin
inc <= 1;
ce <= 1;
end
else begin
inc <= 0;
ce <= 0;
end
end

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(“VARIABLE”), // 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(clk), // 1-bit input: Clock input
.CE(ce), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(cinvctrl), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(cntvaluein), // 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(inc), // 1-bit input: Increment / Decrement tap delay input
.LD(ld), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(ldpipeen), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(regrst) // 1-bit input: Active-high reset tap-delay input
);
endmodule

将inc和ce设置为,当load_trg拉高一次,load_trg每隔100ns触发一次,就触发一个时钟周期的inc=1和ce=1,
在这里插入图片描述
可以看到上图,load_trg到来一次,cntvalueout实时抽头值就增加1,到31后,再次递增则就又回到了0,在这里插入图片描述
且从上图可以看到,抽头值为30时,延时时间也正确;

将inc和ce设置为,当load_trg拉高一次,就触发一个时钟周期的inc=0和ce=1,且将IDELAY_VALUE参数设置为20,
在这里插入图片描述
从上图可以看到,IDELAY_VALUE参数设置为20后,原语上电默认的抽头值为20,当每次loag_trg到来,抽头值递减,从20递减到0,当抽头值为0后,再一次递减则又回到31;

之前load_trg是间隔100ns拉高一个clk时钟周期,现在这次将load_trg一直保持为高,
在这里插入图片描述
可以看到,ce保持为1,inc保持0,cntvalueout每个clk时钟周期就变化一次,在这里插入图片描述
具体到上图中,抽头值显示在clk(100M)连续两个周期从8变到7的情况下,查看在抽头值8时延时为1.224ns,抽头值为7时延时为1.146,其中1.224=0.6ns+878ps,1.146=0.6ns+778ps,都符合抽头值对应的延时;在这里插入图片描述
且在该模式下,这里将ce拉高后触发ld拉高,可以看到,ld在VARIABLE模式下拉高后,将会把抽头值重置为IDELAY_VALUE设置的值,这里设置的值为20;

 VAR_LOAD模式使用:
VAR_LOAD模式使用LD、CNTVALUEIN端口控制抽头值,同时也可以使用INC和CE端口控制抽头值的递增递减变化;
在上一个模式的基础上,修改ld和cntvaluein的控制:
always @(posedge clk) begin
if (rst) begin
inc <= 0;
ce <= 0;
end
else if (load_trg==1) begin
inc <= 0;
ce <= 0;
end
else begin
inc <= 0;
ce <= 0;
end
end

always @(posedge clk) begin
if (rst) begin
ld <= 0;
cntvaluein <= 0;
end
else if (load_trg1) begin
ld <= 1;
cntvaluein <= cntvaluein + 1;
end
else begin
ld <= 0;
end
end
每个load_trg触发使用ld和cntvaluein加载一次抽头值,
在这里插入图片描述
在这里插入图片描述
可以看到在ld使能后的下一个clk时钟周期,cntvaluein就加载成功,cntvalueout输出的抽头值就变为了cntvaluein的值;
修改下inc和ce的逻辑,可以看到在VAR_LOAD模式下inc和ce能够工作;
在这里插入图片描述
当inc和ld两种控制逻辑同时使能时,修改控制代码如下:
always @(posedge clk) begin
if (rst) begin
inc <= 0;
ce <= 0;
end
else if (load_trg
1) begin
inc <= 1;
ce <= 1;
end
else begin
inc <= 0;
ce <= 0;
end
end

always @(posedge clk) begin
if (rst) begin
ld <= 0;
cntvaluein <= 0;
end
else if (load_trg==1) begin
ld <= 1;
cntvaluein <= cntvaluein + 8;
end
else begin
ld <= 0;
end
end
在这里插入图片描述
从上图中可以看到,VAR_LOAD模式下,inc=1/ce=1和ld同时使能时,ld控制的cntvaluein端口值成功写入,inc/ce的递增操作未生效,说明在该模式下ld控制的优先级较高,但是在使用改模似时,尽量避免出现控制逻辑冲突的情况;

 VAR_LOAD_PIPE模式使用:
VAR_LOAD_PIPE模式,使用LDPIPEEN将CNTVALUEIN端口值加载到流水线寄存器中,再使用LD端口将流水线寄存器中的抽头值加载到线上使用,同时也可以使用INC和CE端口控制抽头值的递增递减变化;

测试代码:
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;
reg ce=0;
reg cinvctrl=0;
reg [4:0] cntvaluein=0;
reg inc=0;
reg ld=0;
reg ldpipeen=0;
reg regrst=0;
reg [3:0] ldpipeen_dly;

// idelayctrl -------------------------------------------------

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

always @(posedge clk) begin
if (rst) begin
inc <= 0;
ce <= 0;
end
else if (load_trg==1) begin
inc <= 0;
ce <= 0;
end
else begin
inc <= 0;
ce <= 0;
end
end

always @(posedge clk) begin
if (rst) begin
ldpipeen <= 0;
end
else if (load_trg==1) begin
ldpipeen <= 1;
end
else begin
ldpipeen <= 0;
end
end

always @(posedge clk) begin
if (rst) begin
cntvaluein <= 0;
end
else if (ldpipeen==1) begin
cntvaluein <= cntvaluein + 1;
end
end

always @(posedge clk) begin
if (rst) begin
ld <= 0;
end
else if (ldpipeen_dly[3]==1) begin
ld <= 1;
end
else begin
ld <= 0;
end
end

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(“VAR_LOAD_PIPE”), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
.IDELAY_VALUE(0), // Input delay tap setting (0-31)
.PIPE_SEL(“TRUE”), // 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(clk), // 1-bit input: Clock input
.CE(ce), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(cinvctrl), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(cntvaluein), // 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(inc), // 1-bit input: Increment / Decrement tap delay input
.LD(ld), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(ldpipeen), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(regrst) // 1-bit input: Active-high reset tap-delay input
);
endmodule
在这里插入图片描述
从上图中可以看出,黄线处,ldpipeen拉高把cntvaluein端口值4存入流水线寄存器,然后过了几个周期,ld拉高后,cntvalueout才变为4,符合该模式的时序要求;在这里插入图片描述
如果修改下逻辑,不要每次拉高ldpipeen都拉高一次ld,多使用ldpipeen加载几次数据到流水线寄存器,然后再拉高ld加载寄存器中的值,
效果如上图所示,ldpipeen端口拉高了几次去寄存,最后图中三次ld拉高,实际加载到线上的抽头值为3、7、11,都是在拉高ld前的最后一次ldpipeen拉高寄存的值,说明ldpipeen使能后加载到寄存器里的值会被新值覆盖,最后ld加载时以最新的值为准。

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

相关文章:

  • 大模型在肝硬化腹水风险预测及临床方案制定中的应用研究
  • IIS服务器提示ERR_HTTP2 PROTOCOL ERROR解决方案
  • 前缀树(Trie)(字典树)
  • 深度对比:Objective-C与Swift的RunTime机制与底层原理
  • 用JavaScript构建3D程序
  • 2025-4-27-C++ 学习 数组(2)
  • awk之使用详解(Detailed Explanation of Using AWK)
  • 数据库小技巧-使用开窗函数矫正数据库指定列部分列值重复的数据
  • 数字图像处理 -- 眼底图像血管分割方法
  • (八)RestAPI 毛子(Unit Testing)
  • 爬虫学习笔记(二)--web请求过程
  • 如何获取按关键字搜索京东商品详情(代码示例)
  • Modbus总线协议智能网关协议转换案例解析:提升系统兼容性
  • 导入使用 Blender 创建的 glTF/glb 格式的 3D 模型
  • 激光测距仪,精准测量的利器
  • C++ 可调用实体 (详解 一站式)
  • 在Linux系统中安装MySQL,二进制包版
  • STL标准模板库
  • 设备指纹护航电商和金融反欺诈体系建设
  • delphi使用sqlite3
  • 人到中年为何腰围变粗?科学家发现腹部脂肪增加的细胞元凶
  • 王毅会见俄罗斯外长拉夫罗夫
  • 杜前任宁波中院代理院长,卸任宁波海事法院院长
  • 清华姚班,正走出一支军团
  • 特朗普将举行集会庆祝重返白宫执政百日,被指时机不当
  • 巴印在克什米尔发生交火