找回密码
 立即注册
查看: 223|回复: 4

Xilinx 原语之 IBUFDS 、OBUFDS及IOBUFDS

[复制链接]

1

主题

1

回帖

19

积分

娃娃

积分
19
发表于 2025-3-16 20:42:50 | 显示全部楼层 |阅读模式
本帖最后由 电路_fpga 于 2025-3-16 20:42 编辑

        在使用FPGA时,往往会用到一些差分信号,比如HDMI接口,LVDS接口的ADC、显示器等等设备。而FPGA内部往往只使用单端信号,因此需要在IO管脚处实现差分和单端的相互转换。xilinx提供了原语实现差分和单端的转换,IBUFDS将FPGA输入的差分信号转换为单端信号,OBUFDS把FPGA内部的单端信号转换为差分信号输出,IOBUFDS可以将双向单端信号转换为双向差分信号。


1、差分转单端(IBUFDS)


        IBUFDS是⼀个⽀持低电压差分信号的输⼊缓冲器,图1是IBUFDS的框图。在IBUFDS中,有两个输⼊接⼝,⼀个是差分输⼊的正极端⼝I,另⼀个是差分输⼊的负极端⼝IB,两个端⼝的信号极性必须相反才能正常⼯作,输出端O将输⼊的差分信号转换为单端信号输出。



        IBUFDS的真值表如图2所示(直接从UG768中截图),注意仅当I和IB极性相反的时候才能表示两个信号互为差分对,此时才能正常工作,输出I端口的电平。



        IBUFDS的Verilog HDL原语模板如下所示:
  1. OBUFDS #(
  2.       .IOSTANDARD("DEFAULT"), // Specify the output I/O standard
  3.       .SLEW("SLOW")           // Specify the output slew rate
  4.    ) OBUFDS_inst (
  5.       .O(O),     // Diff_p output (connect directly to top-level port)
  6.       .OB(OB),   // Diff_n output (connect directly to top-level port)
  7.       .I(I)      // Buffer input
  8.    );
复制代码
2、单端转差分(OBUFDS)



    IBUFDS用在FPGA的输入管脚,将外部输入的差分信号转为单端信号供内部逻辑使用。OBUFDS用在输出管脚,将内部逻辑的单端信号转换为差分信号输出到FPGA管脚。图3是OBUFDS的框图,I为单端输入信号,O为差分输出正极,OB是差分输出负极。



        OBUFDS功能比较简单,对应真值表(可以从UG768手册直接获取)如图4所示。


        OBUFDS对应的Verilog HDL原语模板如下所示:

  1. OBUFDS #(
  2.       .IOSTANDARD("DEFAULT"),
  3.       .SLEW("SLOW")   
  4.    ) OBUFDS_inst (
  5.       .O(O),
  6.       .OB(OB),
  7.       .I(I)
  8.    );
复制代码
3、双向单端转双向差分(IOBUFDS)


    除了上述单向的差分信号外,可以利用三态差分转换器件IOBUFDS实现双向差分转换,对应的框图如图5所示,T是三态的使能信号,低电平有效(图中少画了圈),T为低电平时,I作为FPGA输出的单端信号,IO和IOB作为转换后的差分输出引脚。    当T为高电平时,三态门关闭,此时IO作为差分输入的正极,IOB作为差分输入的负极,O作为差分输入转换后的单端输入信号。


       对应的真值表如图6所示:

        IOBUFDS对应的Verilog HDL原语模板如下所示:
  1. IOBUFDS #(
  2.       .DIFF_TERM("FALSE"),  
  3.       .IBUF_LOW_PWR("TRUE"),
  4.       .IOSTANDARD("BLVDS_25"),
  5.       .SLEW("SLOW")   
  6.    ) IOBUFDS_inst (
  7.       .O(O),   
  8.       .IO(IO),
  9.       .IOB(IOB),
  10.       .I(I),   
  11.       .T(T)  
  12.    );
复制代码
4、仿真

    这几个原语功能比较简单,使用一个工程完成三个原语的仿真,设计文件如下所示,外部输入的差分信号ibufds_p和ibufds_n,经过IBUFDS转为单端信号ibufds_o,该信号经过触发器延迟一个时钟得到ibufds_o_r,通过OBUFDS转换为差分信号obufds_p和obufds_n输出。外部输入一个三态控制信号t,用于控制IOBUFDS的三态使能端口,使能有效时,将IBUFDS寄存后的信号ibufds_o_r输出。

  1. module buf_ctrl(
  2.    input       clk      ,//系统时钟信号;
  3.    input       rst      ,//系统复位信号,高电平有效;

  4.    input       iobufds_t,//iobufds使能控制端;
  5.    input       ibufds_p ,//ibufds正极输入;
  6.    input       ibufds_n ,//ibufds负极输入;
  7.    output      obufds_p ,//obufds正极输出;
  8.    output      obufds_n ,//obufds负极输出;
  9.    inout       iobufds_p,//iobufds正极输出;
  10.    inout       iobufds_n,//iobufds负极输出;
  11.    output      iobufds_i //将IOBUFDS输入的数据输出,防止倍优化掉;
  12. );
  13.    reg         ibufds_o_r;

  14.    wire        ibufds_o ;

  15.    //例化IBUFDS原语
  16.    IBUFDS #(
  17.       .DIFF_TERM     ( "FALSE"   ),
  18.       .IBUF_LOW_PWR  ( "TRUE"    ),
  19.       .IOSTANDARD    ( "DEFAULT" )
  20.    )
  21.    u_IBUFDS (
  22.       .O    (ibufds_o   ),
  23.       .I    (ibufds_p   ),
  24.       .IB   (ibufds_n   )
  25.    );

  26.    always@(posedge clk)begin
  27.       ibufds_o_r <= ibufds_o;
  28.    end

  29.    //例化OBUFDS原语
  30.    OBUFDS #(
  31.       .IOSTANDARD ( "DEFAULT" ),
  32.       .SLEW       ( "SLOW"    )
  33.    )
  34.    u_OBUFDS (
  35.       .O    (obufds_p   ),
  36.       .OB   (obufds_n   ),
  37.       .I    (ibufds_o_r ) // Buffer input
  38.    );

  39.    //例化IOBUFDS原语
  40.    IOBUFDS #(
  41.       .DIFF_TERM     ("FALSE"    ),// Differential Termination ("TRUE"/"FALSE")
  42.       .IBUF_LOW_PWR  ("TRUE"     ),// Low Power - "TRUE", High Performance = "FALSE"
  43.       .IOSTANDARD    ("BLVDS_25" ),// Specify the I/O standard
  44.       .SLEW          ("SLOW"     ) // Specify the output slew rate
  45.    )
  46.    u_IOBUFDS (
  47.       .O    (iobufds_i     ),// Buffer output
  48.       .IO   (iobufds_p     ),// Diff_p inout (connect directly to top-level port)
  49.       .IOB  (iobufds_n     ),// Diff_n inout (connect directly to top-level port)
  50.       .I    (ibufds_o_r    ),// Buffer input
  51.       .T    (iobufds_t     ) // 3-state enable input, high=input, low=output
  52.    );

  53. endmodule
复制代码
       仿真结果如图7所示,图中对IBUFDS的四种输入取值做了仿真,当IBUFDS的输入同时为高电平或者低电平时,IBUFDS转换的输出信号会保持之前的状态不变。在实际情况下应该避免这种情况出现,其余情况IBUFDS与真值表结果一致,不再赘述。

        下图主要关注OBUFDS相关信号,如图黄色信号为OBUFDS输入单端数据,而红色信号为OBUFDS输出差分信号,由图可知仿真正确。



        IOBUFDS的仿真如图9所示,红色信号为IOBUFDS的三态使能信号,橙色信号是IOBUFDS的单端输出信号,对应真值表中的I,天蓝色信号表示IOBUFDS的双向差分信号,紫色信号是IOBUFDS的单端输入信号,对应真值表中的O。



      当使能信号为高电平时,IOBUFDS的三态门关闭,此时两路天蓝色差分信号为输入信号,紫色信号是两路差分输入转换为单端的结果,紫色信号与差分正极的逻辑保持一致,与橙色信号无关,所以正确。


      当使能信号为低电平时,IOBUFDS的三态门打开,此时IOBUFDS把橙色单端信号转换为两路天蓝色的差分信号输出,紫色信号此时与橙色信号是一致的,与普通三态门逻辑一致,仿真正确。



5、FPGA如何实现差分输入\输出



      通过上文仿真可以知道逻辑实现,但是FPGA是如何实现差分输入和输出的呢?将上述工程分配管脚(差分信号只需要绑定P端引脚即可),然后综合工程,生产比特流文件,最后查看信号在芯片中的走线及布局。



      如图10所示,是IBUFDS两个差分输入管脚的布局,Xilinx把两个相邻的管脚作为差分信号的两个管脚,通过两个IOB模块实现IOBUFDS的转换功能。


       图11是OBUFDS的实现情况,把两个管脚组合成差分信号,通过OBUFDS位于P脚的IOB之中,也就是单端引脚OBUF的位置,该结构可以作为OBUFDS使用,如图12所示。

        IOBUFDS的情况稍微复杂一点,因为是双向信号,所以会同时经过ILOGIC和OLOGIC,并且因为有三态使能信号,所以OLOGIC需要同时使用上下两条路径,如图13所示。

        综上,FPGA会将相邻两个管脚配置为差分对,保证两路信号足够近,延时足够小。IBUF和OBUF的位置根据功能不同,可能实现IBUFDS、OBUFDS、IOBUFDS等功能。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

1

主题

1

回帖

19

积分

娃娃

积分
19
 楼主| 发表于 2025-3-16 20:43:58 | 显示全部楼层
本帖最后由 电路_fpga 于 2025-3-17 20:49 编辑

发一个公众号和CSDN的文章

6

主题

108

回帖

291

积分

壮年

积分
291
发表于 2025-3-16 23:21:19 | 显示全部楼层
应该把CSDN搬过来

16

主题

95

回帖

344

积分

管理员

积分
344
发表于 2025-3-16 23:22:42 | 显示全部楼层
xxppno1 发表于 2025-3-16 23:21
应该把CSDN搬过来

我还准备去CSDN建立专栏呢。。。

16

主题

95

回帖

344

积分

管理员

积分
344
发表于 2025-3-16 23:22:55 | 显示全部楼层
电路_fpga 发表于 2025-3-16 20:43
发一个公众号和CSDN的文章,需要工程的九二一获取

921是啥东西?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|CrazyFPGA ( 粤ICP备2023025753号 )

GMT+8, 2025-4-3 16:28 , Processed in 0.051156 second(s), 21 queries .

Powered by CrazyFPGA X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表