LVDS系列4:Xilinx 7系IDDR原语

发布于:2025-03-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

Xilinx的7系器件指Spartan-7、Artix-7、Kintex-7、Virtex-7这几个系列,同一个系列使用的都是7系架构,它们原语的结构和使用都是一致的,本节就讲解7系器件的IDDR原语。
IDDR(Input Double Data Rate)原语用于将双沿(DDR)输入信号转换为单沿(SDR)信号,一些高速信号为提高速率会使用双沿数据传输,即在时钟的上升沿和下降沿都将会携带一拍数据,IDDR就可以将其双沿信号转换为单沿信号给FPGA内部使用。
IDDR框图:

在这里插入图片描述
原语框图如上图所示,其中S/R为同一根线,指Set和Reset不能同时使用。
IDDR例化:
IDDR #(
.DDR_CLK_EDGE(“OPPOSITE_EDGE”), // “OPPOSITE_EDGE”, “SAME_EDGE” or “SAME_EDGE_PIPELINED”
.INIT_Q1(1’b0), // Initial value of Q1: 1’b0 or 1’b1
.INIT_Q2(1’b0), // Initial value of Q2: 1’b0 or 1’b1
.SRTYPE(“SYNC”) // Set/Reset type: “SYNC” or “ASYNC”
) IDDR_inst (
.Q1(Q1), // 1-bit output for positive edge of clock
.Q2(Q2), // 1-bit output for negative edge of clock
.C©, // 1-bit clock input
.CE(CE), // 1-bit clock enable input
.D(D), // 1-bit DDR data input
.R®, // 1-bit reset
.S(S) // 1-bit set
);
例化共4个参数和7个端口;

IDDR例化端口:

在这里插入图片描述

在这里插入图片描述
端口如上图所示,
Q1、Q2:输出的单沿信号(一般Q1对应上升沿、Q2对应下降沿);
C:驱动采样的时钟信号端口;
CE:时钟使能,使能情况下IDDR才能正常工作,置高有效;
D:来自IOB的寄存器输入双沿信号;
S/R:异步/同步的置位/复位管脚,为高有效且同一时刻只能有一个端口生效;
注意:在使用置位S和复位R端口时,两者不能同时置1有效,否则可能会导致输出状态不确定,还会有出现亚稳态时序风险导致系统异常,且两个端口同时控制还增加了逻辑复杂度,所以推荐在使用时优先R复位端口,将S置位端口置0,减少逻辑复杂度的同时避免出错,置位端口置1有效时,Q1、Q2将强制输出1;
IDDR例化参数:
在这里插入图片描述
参数DDR_CLK_EDGE:IDDR的操作模式,有OPPOSITE_EDGE、SAME_EDGE_PIPELINED、SAME_EDGE三种值可选,默认OPPOSITE_EDGE模式;
参数INIT_Q1:Q1端口初始化值,0、1可选,默认0;
参数INIT_Q2:Q2端口初始化值,0、1可选,默认0;
参数SRTYPE:置位和复位的同步或是异步的选择,可选值SYNC、ASYNC;

IDDR三种操作模式:

OPPOSITE_EDGE模式:
在这里插入图片描述
Q1在上升沿采样更新,Q2在下降沿采样更新,Q2的数据落后Q1半个时钟周期;
第一个时钟上升沿Q1采样输出D0A,第一个时钟下降沿Q1采样输出D1A,第二个时钟的上升沿采样Q1和Q2组成2bit的数据{D1A,D0A};
SAME_EDGE模式:
在这里插入图片描述
Q1、Q2都在上升沿更新,但是在同一个周期采样的两个数据,Q2比Q1晚一个时钟周期;
Q1在第一个时钟周期上升沿采样的数据D0A在第一个时钟周期的上升沿采样后直接输出,Q2在第一个时钟周期下降沿采样的数据D1A在第二个时钟周期的上升沿采样才输出,第一个时钟周期时Q2保持不关心的无效值;
SAME_EDGE_PIPELINED模式:
在这里插入图片描述
Q1、Q2在一个时钟周期内的上升沿和下降沿采样,然后在第二个时钟周期的上升沿同时输出,两者输出落后实际输入数据一个时钟周期,该方法比较常用;
IDDR仿真:
被测试模块:
只例化测试一个IDDR原语;
module top_7series_iddr(
input wire clk,
input wire rst,
input wire set,
input wire clk_en,
input wire din,
output wire dout1,
output wire dout2
);

IDDR #(
.DDR_CLK_EDGE(“SAME_EDGE_PIPELINED”), // “OPPOSITE_EDGE”, “SAME_EDGE” or “SAME_EDGE_PIPELINED”
.INIT_Q1(1’b0), // Initial value of Q1: 1’b0 or 1’b1
.INIT_Q2(1’b0), // Initial value of Q2: 1’b0 or 1’b1
.SRTYPE(“SYNC”) // Set/Reset type: “SYNC” or “ASYNC”
) IDDR_inst (
.Q1(dout1), // 1-bit output for positive edge of clock
.Q2(dout2), // 1-bit output for negative edge of clock
.C(clk), // 1-bit clock input
.CE(clk_en), // 1-bit clock enable input
.D(din), // 1-bit DDR data input
.R(rst), // 1-bit reset
.S(set) // 1-bit set
);
endmodule

testbench:
产生40ns的时钟,产生时钟边沿对齐数据中心的双沿随机数据;
`timescale 1ns / 1ps
module tb;
reg clk;
reg rst;
reg set;
reg data;
reg clk_en;
wire dout1;
wire dout2;

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

always #20 clk = ~clk;

initial begin
data = 0;
#10
while(1)begin
#20
data = $random();
end
end

initial begin
clk_en = 0;
#200
clk_en = 1;
#2000
clk_en = 0;
end

initial begin
set = 0;
#1000
set = 1;
#200
set = 0;
end

top_7series_iddr inst_top_7series_iddr (
.clk(clk),
.rst(rst),
.set(set),
.clk_en(clk_en),
.din(data),
.dout1(dout1),
.dout2(dout2)
);

endmodule
仿真结果:
时钟使能的效果:
在这里插入图片描述
从上图可以看出,两根黄线内clk_en始终使能拉高,原语才正常工作,第二根黄线后时钟使能拉低,dout1、dout2输出保持不再变化,原语不工作;
置位的效果:
在这里插入图片描述
黄线内set置1,这时Q1、Q2强制输出置1;
复位效果:
在这里插入图片描述
上电一段时间,rst拉高复位,dout1、dout2输出保持参数设置的初始化值00
OPPOSITE_EDGE模式:
在这里插入图片描述
该模式下,Q1是上升沿采样后立即更新输出,Q2是下降沿采样后立即更新输出;
可以看到上图箭头,上升沿采样din数据后dout1立即输出,下降沿采样din数据后dout2立即输出;
SAME_EDGE模式:
在这里插入图片描述
该模式下,Q1上升沿采样后立即输出,Q2下降沿采样后寄存数据等待下一个时钟周期上升沿到来后输出;
可以看到上图中的箭头,dout1上升沿采样din后立即输出,dout2下降沿采样din后还有等到下一个时钟周期上升沿才输出;
SAME_EDGE_PIPELINED模式:
在这里插入图片描述
该模式下,Q1上升沿采样后寄存,Q2下降沿采样后寄存,Q1Q2一起寄存等到下一个时钟周期上升沿到来后一起输出;
可以看到上图中的箭头,dout1上升沿采样din,dout2下降沿采样din,两者的输出则是等到下一个时钟周期上升沿才一起更新输出;