详解FPGA的输入输出处理

描述

来源:FPGA从入门到跑路

1.输入信号

时钟单端

时钟差分

单端信号

差分信号

 

      input clk, //时钟
      input clk_P, //差分时钟+端
      input clk_N, //差分时钟-端
      input Din_S, //单端信号输入
      input Din_D_P, //差分信号 + 端
      input Din_D_N, //差分信号 - 端

 

2.输出信号

时钟单端

时钟差分

单端信号

差分信号

 

output clk_O, //时钟
output clk_O_P, //差分时钟+端
output clk_O_N, //差分时钟-端
output Dout_S, //单端信号输入
output Dout_D_P,//差分信号 + 端
output Dout_D_N //差分信号 - 端

 

3.双向信号端口

inout是可以输入也可以输出的引脚,只能由wire型网线驱动。

 

inout DataBus, //双向信号

 

当inout作输入引脚时需要将此引脚置为高阻态z。inout端口的实现是使用三态门。

输入信号

inout端口的实现

 

assign DataBus = control ? 'bz : DataOut ;

 

inout端口DataBus作为输出的时候值为DataOut,作为输入时为高阻态。

4.IO相关原语

输入:

IBUF

输入缓冲器。

单端输入信号的处理举例:

 

wire Din;
    IBUF #(
     .IOSTANDARD("DEFAULT")    // Specify the input I/O standard
   )IBUF_Din (
      .O(Din),     // Buffer output
      .I(Din_S)      // Buffer input (connect directly to top-level port)
   );

 

IBUFDS

专用差分输入时钟缓冲器(Dedicated Differential Signaling Input Buffer with Selectable I/O Interface)。将差分时钟转换成单端时钟作为全局时钟,需要添加例化此原语。IBUFDS是一个输入缓冲器,支持低压差分信号(如LVCMOS、LVDS等)。在IBUFDS中,一个电平接口用两个独特的电平接口(I和IB)表示。一个可以认为是主信号,另外一个可以认为是从信号。主信号和从信号是同一个逻辑信号,但是相位相反。

输入信号

IBUFDS

使用方式如下:

 

IBUFDS #(
      .DIFF_TERM("FALSE"),       // Differential Termination
      .IBUF_LOW_PWR("TRUE"),     // Low power="TRUE", Highest performance="FALSE" 
      .IOSTANDARD("DEFAULT")     // Specify the input I/O standard
   ) IBUFDS_inst (
      .O(O),  // Buffer output
      .I(I),  // Diff_p buffer input (connect directly to top-level port)
      .IB(IB) // Diff_n buffer input (connect directly to top-level port)
   );

 

IBUFG

输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过IBUF元,否则在布局布线时会报错。 IBUFG支持AGP、CTT、GTL、GTLP、HSTL、LVCMOS、LVDCI、LVDS、LVPECL、LVTTL、PCI、PCIX和 SSTL等多种格式的IO标准。

IBUFGDS

IBUFG的差分形式,当信号从一对差分全局时钟管脚输入时,必须使用IBUFGDS作为全局时钟输入缓冲。IBUFG支持BLVDS、LDT、LVDSEXT、LVDS、LVPECL和ULVDS等多种格式的IO标准。

IDDR2

后面单独介绍。

双向:

IOBUF

输入信号

IOBUF

IOBUF由一个OBUFT和一个IBUF组成。

输入信号

OBUFT

OBUFT是三态输出缓冲器,其结构和真值表如下图所示,可以看到,当T为1时,输出是高阻态。当T为0时,输出与输入结果相同。

输入信号

OBUFT真值表

使用双向信号端口时,使用此原语和使用上面第3部分的三态门效果相同。

 

assign DataBus = control ? 'bz : DataOut ;
IOBUF IOBUF(
.I(DataIn),
.O(DataOut),
.T(control),
.IO(DataBus)
);

 

输出:

OBUF

输出缓冲器。使用方式如下:

 

wire Dout;
OBUF #(
      .DRIVE(12),   // Specify the output drive strength
      .IOSTANDARD("DEFAULT"), // Specify the output I/O standard
      .SLEW("SLOW") // Specify the output slew rate
   ) OBUF_inst (
      .O(Dout_S),     // Buffer output (connect directly to top-level port)
      .I(Dout)      // Buffer input 
   );

 

OBUFDS

差分输出时钟缓冲器(Differential Signaling Output Buffer with Selectable I/O Interface),将单端信号转换成差分信号。OBUFDS是一个输出缓冲器,支持低压差分信号。OBUFDS隔离出了内电路并向芯片上的信号提供驱动电流。它的输出用O和OB两个独立接口表示。一个可以认为是主信号,另外一个可以认为是从信号。主信号和从信号是同一个逻辑信号,但是相位相反。

输入信号

OBUFDS示意图

使用方式如下:

 

OBUFDS #(
      .IOSTANDARD("DEFAULT"), // Specify the output I/O standard
      .SLEW("SLOW")           // Specify the output slew rate
   ) OBUFDS_inst (
      .O(O),     // Diff_p output (connect directly to top-level port)
      .OB(OB),   // Diff_n output (connect directly to top-level port)
      .I(I)      // Buffer input
   );
输入信号IBUFDS、IBUFGDS 和 OBUFDS 真值表

 

ODDR2

后面单独介绍。

5.举例

单端输入时钟的处理——全局时钟:

 

wire clk_in;
IBUFG #(
     .IOSTANDARD("DEFAULT")
   ) IBUFG_CLK_S (
      .O(clk_in), // Clock buffer output
      .I(clk)  // Clock buffer input (connect directly to top-level port)
   );

 

差分输入时钟的处理——全局时钟,以LVDS为例子

 

wire clk_in_D;
   IBUFGDS #(
      .DIFF_TERM(“TRUE"), // Differential Termination
      .IOSTANDARD("LVDS_25") // Specifies the I/O standard for this buffer
   ) IBUFGDS_inst (
      .O(clk_in_D),  // Clock buffer output
      .I(clk_P),  // Diff_p clock buffer input
      .IB(clk_N) // Diff_n clock buffer input
   );

 

差分输入信号的处理 ,以LVDS为例子

 

wire Din_D;
IBUFDS #(
      .DIFF_TERM("TRUE"),   // Differential Termination
      .IOSTANDARD("LVDS_25") // Specify the input I/O standard
   ) IBUFDS_inst (
      .O(Din_D),  // Buffer output
      .I(Din_D_P),  // Diff_p buffer input (connect directly to top-level port)
      .IB(Din_D_N) // Diff_n buffer input (connect directly to top-level port)
   );

 

更多相关内容,或者想要深入学习,建议去看UG471。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分