威三电子  

               威三电子

LVDS系列3:Xilinx的IOBUFDS原语

2026-05-27 09:07:46

浏览:

前面两节讲解了差分转单端的IBUFDS原语和单端转差分的OBUFDS原语,今天来讲一个同时带有两者功能的原语IOBUFDS;         前述的IBUFDS

                                               

 

         前面两节讲解了差分转单端的IBUFDS原语和单端转差分的OBUFDS原语,今天来讲一个同时带有两者功能的原语IOBUFDS

         前述的IBUFDS原语只能接收外部差分信号,此时连接管脚为input管脚,OBUFDS只能向外部输出差分信号,此时连接管脚为output管脚,但差分信号还有可能出现IO类型,也就是inout管脚,一对差分信号,可以输入,也可以输出,此时使用IBUFDSOBUFDS就不能解决问题,需要使用到IOBUFDS原语;

         如有一个典型的例子,DDR接口中的DQS数据选通信号,就是差分双向管脚DQS_PDQS_N

该信号为双向信号,因为该信号与DQ数据采集相关,当对DDR读取时,该信号由DRAM驱动,当向DDR写入时,该信号由内存控制器驱动;

且由于DDR通信的频率速率比较高,通常达几千Mbps,且数据选通信号需要用于8/16或更多数据信号线的捕获,所以需要其在传输过程中受的影响尽可能小信号尽可能稳定,所以使用抗干扰能力更强的差分信号则成了必要;

所以该信号就需要使用IOBUFDS这样的三态双向差分信号原语;

 

l  IOBUFDS原语:

IOBUFDS为差分输入/输出缓存原语。 T 管脚上的逻辑高电平表示禁用输出缓存。

端口IOIOB:双向端口,连接到焊盘上的双向差分信号;

端口I:原语的输入端口,接收FPGA内部数据变换后从IOIOB输出;

端口O:原语的输出端口,IOIOB接收数据转换后从O端口输出到FPGA内部;

端口T:原语的输入端口,控制原语的功能模式;

 

功能模式说明:

输入模式(T=1):

IOIOB由外部设备驱动,作为差分输入信号。

内部逻辑将IOIOB的差分值(IO - IOB)转换为单端信号输出至O

例如,若IO=1IOB=0,则O=1;若IO=0IOB=1,则O=0,此时功能与IBUFDS一致。

若外部差分信号未驱动(高阻态),O可能保持前一次有效值或进入不定态(X),需通过外部约束或硬件设计避免此情况。

此时T=1,输出缓存被禁用,IIOIOB的路径关闭,原语的I端口输入任何值(无论0/1或是悬空)都不会对IOIOB的电压状态造成任何影响;

 

输出模式(T=0):

I的单端信号被转换为差分信号,驱动到IO(与I同相)和IOB(与I反相)。

例如,若I=1,则IO=1IOB=0;若I=0,则IO=0IOB=1,此时功能与OBUFDS一致。

此时T=1,输出缓存启用,可以看到在原语的图中,IOIOBO的路径没有受到T端口开关的影响,此时O的输出来自IOIOB,而IOIOB的值此时来自于I,所以O值与I值相同。

 

l  原语例化如下:

7系:

IOBUFDS #(

  .DIFF_TERM('FALSE'),     // Differential Termination ('TRUE'/'FALSE')

  .IBUF_LOW_PWR('TRUE'),   // Low Power - 'TRUE', High Performance = 'FALSE'

  .IOSTANDARD('BLVDS_25'), // Specify the I/O standard

  .SLEW('SLOW')            // Specify the output slew rate

) IOBUFDS_inst (

  .O(O),     // Buffer output

  .IO(IO),   // Diff_p inout (connect directly to top-level port)

  .IOB(IOB), // Diff_n inout (connect directly to top-level port)

  .I(I),     // Buffer input

  .T(T)      // 3-state enable input, high=input, low=output

);

 

Ultrascale+系:

IOBUFDS IOBUFDS_inst (

  .O(O),     // 1-bit output: Buffer output

  .I(I),     // 1-bit input: Buffer input

  .IO(IO),   // 1-bit inout: Diff_p inout (connect directly to top-level port)

  .IOB(IOB), // 1-bit inout: Diff_n inout (connect directly to top-level port)

  .T(T)      // 1-bit input: 3-state enable input

);

 

可以看到两个原语的端口一致,不过7系的原语同样比Ultrascale+系多几个参数,Ultrascale+的参数如前述,被整合到约束部分;

7系例化里可以看到参数DIFF_TERMIBUF_LOW_PWRIBUFDS部分讲解过,SLEWOBUFDS部分讲解过,IOSTANDARD则是两节里都讲过,这里不再赘述;

不过这里可以看到模板默认的电平标准是BLVDSBLVDS 仅在 HR I/O bank 中可用,并且要求 VCCO 电压电平为 2.5V IOSTANDARD 称为BLVDS_25,在下一讲将简单汇总下FPGA中常见的差分电平标准。

 

 

l  IOBUFDS原语仿真:

测试模块:

module top_7series_iobufds(

  input   wire      clk,

  input   wire      rst,

  inout   wire      PAD_IO,

  inout   wire      PAD_IOB,

  input   wire      iob_t,

  input   wire      iob_in,

  output  wire      iob_out

    );

 

IOBUFDS #(

  .DIFF_TERM('FALSE'),     // Differential Termination ('TRUE'/'FALSE')

  .IBUF_LOW_PWR('TRUE'),   // Low Power - 'TRUE', High Performance = 'FALSE'

  .IOSTANDARD('BLVDS_25'), // Specify the I/O standard

  .SLEW('SLOW')            // Specify the output slew rate

) IOBUFDS_inst (

  .O(iob_out),     // Buffer output

  .IO(PAD_IO),   // Diff_p inout (connect directly to top-level port)

  .IOB(PAD_IOB), // Diff_n inout (connect directly to top-level port)

  .I(iob_in),     // Buffer input

  .T(iob_t)      // 3-state enable input, high=input, low=output

);

 

endmodule

 

testbench

这里将原语的T端口每隔1000ns切换一次,且设置50ns变化一次的两个随机值分别赋值给端口IO/IOB和端口I;然后仿真查看根据T端口的变化,原语的各端口输入输出如何变化;

module tb;

reg                                                              clk;

reg                                                              rst;

reg                                                                data1;

reg                                                                data2;

wire                                                    PAD_IO;

wire                                                    PAD_IOB;

reg                                                     iob_t;

wire                                                    iob_in;

wire                                                    iob_out;

wire                                                            pad_dio;

wire                                                            pad_diob;

 

initial begin

              clk = 0;

              rst = 1;

              #100

              rst = 0;

end

 

always #50 clk = ~clk;

 

initial begin

              data1 = 0;

              data2 = 0;

              while(1)begin

                            #50

                            data1 = $random();

                            data2 = $random();

              end

end

 

initial begin

              iob_t = 0;

              while(1)begin

                            #1000

                            iob_t = ~iob_t;

              end

end

 

assign iob_in = iob_t ? 1'bz : data1;

assign {PAD_IO,PAD_IOB} = iob_t ? {data2,~data2} : 2'bz;

assign pad_dio = PAD_IO;

assign pad_diob = PAD_IOB;

 

top_7series_iobufds inst_top_7series_iobufds(

              .clk     (clk),

              .rst     (rst),

              .PAD_IO  (PAD_IO),

              .PAD_IOB (PAD_IOB),

              .iob_t   (iob_t),

              .iob_in  (iob_in),

              .iob_out (iob_out)

);

 

endmodule

 

l  仿真结果:

仿真波形如图所示:

为方便描述,上图中4根黄线将波形分为4个区域,区域1/3iob_t设置为0,表示原语处于输出模式,区域2/4iob_t设置为1,表示原语处于输入模式;

 

可以看到:

 

区域1/3,输出模式下,iob_in输入的值将被转换为差分的同相的PAD_IO和反相的PAD_IOB输出,可以看到在此范围内,PAD_IO输出值与iob_in相同,PAD_IOB输出值与iob_in相反;

此时iob_out的值与iob_in相同;

 

区域2/4,输入模式下,PAD_IOPAD_IOB将作为输入,转换后端口O输出,可以看到在此范围内,端口O输出与PAD_IO相同,与PAD_IOB相反;

而且此时iob_in输入接口给了一个悬空的高阻状态,但是可以看到图中所示,这个iob_in的高阻输入也不会对PAD_IOPAD_IOB产生任何影响;

 

本文章由威三学院出品

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

 

 

 

 

 

 

 


0
LVDS系列3:Xilinx的IOBUFDS原语
前面两节讲解了差分转单端的IBUFDS原语和单端转差分的OBUFDS原语,今天来讲一个同时带有两者功能的原语IOBUFDS;         前述的IBUFDS
长按图片保存/分享

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

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

 


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

热线:

159-2199-9232

 

图片展示

淘宝店铺:

威三科教

地址:

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

微信公众号:

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

热线:159-2199-9232

淘宝店铺:威三科教

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


微信公众号

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