威三电子  

               威三电子

LVDS系列4:Xilinx 7系IDDR原语

2026-05-28 11:22:47

浏览:

Xilinx的7系器件指Spartan-7、Artix-7、Kintex-7、Virtex-7这几个系列,同一个系列使用的都是7系架构,它们原语的结构和使用都是

                                                  

 

         Xilinx7系器件指Spartan-7Artix-7Kintex-7Virtex-7这几个系列,同一个系列使用的都是7系架构,它们原语的结构和使用都是一致的,本节就讲解7系器件的IDDR原语。

         IDDRInput Double Data Rate)原语用于将双沿(DDR)输入信号转换为单沿(SDR)信号,一些高速信号为提高速率会使用双沿数据传输,即在时钟的上升沿和下降沿都将会携带一拍数据,IDDR就可以将其双沿信号转换为单沿信号给FPGA内部使用。

 

l  IDDR框图:

原语框图如上图所示,其中S/R为同一根线,指SetReset不能同时使用。

 

l  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(C),   // 1-bit clock input

  .CE(CE), // 1-bit clock enable input

  .D(D),   // 1-bit DDR data input

  .R(R),   // 1-bit reset

  .S(S)    // 1-bit set

);

例化共4个参数和7个端口;

 

l  IDDR例化端口:

端口如上图所示,

Q1Q2:输出的单沿信号(一般Q1对应上升沿、Q2对应下降沿);

C:驱动采样的时钟信号端口;

CE:时钟使能,使能情况下IDDR才能正常工作,置高有效;

D:来自IOB的寄存器输入双沿信号;

S/R:异步/同步的置位/复位管脚,为高有效且同一时刻只能有一个端口生效;

注意:在使用置位S和复位R端口时,两者不能同时置1有效,否则可能会导致输出状态不确定,还会有出现亚稳态时序风险导致系统异常,且两个端口同时控制还增加了逻辑复杂度,所以推荐在使用时优先R复位端口,将S置位端口置0,减少逻辑复杂度的同时避免出错,置位端口置1有效时,Q1Q2将强制输出1

 

l  IDDR例化参数:

参数DDR_CLK_EDGEIDDR的操作模式,有OPPOSITE_EDGESAME_EDGE_PIPELINEDSAME_EDGE三种值可选,默认OPPOSITE_EDGE模式;

参数INIT_Q1Q1端口初始化值,01可选,默认0

参数INIT_Q2Q2端口初始化值,01可选,默认0

参数SRTYPE:置位和复位的同步或是异步的选择,可选值SYNCASYNC

 

l  IDDR三种操作模式:

 

OPPOSITE_EDGE模式:

Q1在上升沿采样更新,Q2在下降沿采样更新,Q2的数据落后Q1半个时钟周期;

***个时钟上升沿Q1采样输出D0A,***个时钟下降沿Q1采样输出D1A,第二个时钟的上升沿采样Q1Q2组成2bit的数据{D1A,D0A}

 

SAME_EDGE模式:

Q1Q2都在上升沿更新,但是在同一个周期采样的两个数据,Q2Q1晚一个时钟周期;

Q1在***个时钟周期上升沿采样的数据D0A在***个时钟周期的上升沿采样后直接输出,Q2在***个时钟周期下降沿采样的数据D1A在第二个时钟周期的上升沿采样才输出,***个时钟周期时Q2保持不关心的无效值;

 

SAME_EDGE_PIPELINED模式:

Q1Q2在一个时钟周期内的上升沿和下降沿采样,然后在第二个时钟周期的上升沿同时输出,两者输出落后实际输入数据一个时钟周期,该方法比较常用;

 

l  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始终使能拉高,原语才正常工作,第二根黄线后时钟使能拉低,dout1dout2输出保持不再变化,原语不工作;

 

置位的效果:

黄线内set1,这时Q1Q2强制输出置1

 

复位效果:

 

上电一段时间,rst拉高复位,dout1dout2输出保持参数设置的初始化值00

 

OPPOSITE_EDGE模式:

该模式下,Q1是上升沿采样后立即更新输出,Q2是下降沿采样后立即更新输出;

可以看到上图箭头,上升沿采样din数据后dout1立即输出,下降沿采样din数据后dout2立即输出;

 

SAME_EDGE模式:

该模式下,Q1上升沿采样后立即输出,Q2下降沿采样后寄存数据等待下一个时钟周期上升沿到来后输出;

可以看到上图中的箭头,dout1上升沿采样din后立即输出,dout2下降沿采样din后还有等到下一个时钟周期上升沿才输出;

 

SAME_EDGE_PIPELINED模式:

该模式下,Q1上升沿采样后寄存,Q2下降沿采样后寄存,Q1Q2一起寄存等到下一个时钟周期上升沿到来后一起输出;

可以看到上图中的箭头,dout1上升沿采样dindout2下降沿采样din,两者的输出则是等到下一个时钟周期上升沿才一起更新输出;

 

本文章由威三学院出品

对课程感兴趣可以联系我们 

 


0
LVDS系列4:Xilinx 7系IDDR原语
Xilinx的7系器件指Spartan-7、Artix-7、Kintex-7、Virtex-7这几个系列,同一个系列使用的都是7系架构,它们原语的结构和使用都是
长按图片保存/分享

北京威三电子科技有限公司

突破技术壁垒,芯创智联领航未来

 


北京威三电子科技有限公司 版权所有
京ICP备2026012969号
 

热线:

159-2199-9232

 

图片展示

淘宝店铺:

威三科教

地址:

北京市延庆区辰龙国际6号楼406室

微信公众号:

北京威三电子科技有限公司 

热线:159-2199-9232

淘宝店铺:威三科教

地址:北京市延庆区辰龙国际6号楼406


微信公众号

图片展示
北京威三电子科技有限公司 版权所有| 京ICP备2026012969号
微信公众号
客服中心
热线电话
15921999232
上班时间
周一到周五
二维码
扫码关注
客服中心
热线电话
15921999232
上班时间
周一到周五
二维码
扫码关注
添加微信好友,详细了解产品
使用企业微信
“扫一扫”加入群聊
复制成功
添加微信好友,详细了解产品
我知道了