来源: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。
全部0条评论
快来发表一下你的评论吧 !