具体如何设置差分对在7 Series FPGA & ZYNQ-7000 All Programmable SoC Library Guide for HDL Design(UG768)和7 Series FPGA SelectIO Resource(UG471)文档里面给出了HDL文件进行管脚分配的办法:
用OBUFDS原语(Primitive)可以进行单端转差分输出,其实使用该原语就是在FPGA IO Bank使用了一个LVDS发送器。
对应的,用IBUFDS原语可以进行差分信号的接收,该原语在IO Bank使用了一个LVDS接收器。
在Vivado环境中Flow Navigator -> PROJECT MANAGER -> Language Templates可以找到,上述原语分别如下:
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 #(
.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)
);
从语法上看,上面的原语例化了LVDS发送器和接收器,其中I端口是输入,IB端口是I的互补差分信号输入,O端口是输出,OB端口是O端口的互补差分输出。
在模块名和例化名之间,还有警号井号#带领的一些参数,这些都是和差分收发器具体实现相关的参数,比如具体的IO电平规格(LVDS,DIFF_HSTL等等),输出差分信号的压摆率(高/低),接收器端内部负载电阻使能,降低接收器的能耗等参数。
同样,对于将PS上的接口如I2C,SPI这些接口复用到EMIO时,系统默认输出差分信号转单端信号也是如此处理:
IOBUF I2C_SCL_IO
(.I(I2C_SCL_I),
.IO(I2C_SCL_IO),
.O(I2C_SCL_O),
.T(I2C_SCL_T));
IOBUF I2C_SDA_IO
(.I(I2C_SDA_I),
.IO(I2C_SDA_IO),
.O(I2C_SDA_O),
.T(I2C_SDA_T));
来自 <https://blog.tianjinkun.com/post/53.html>