LVDS系列1:Xilinx的IBUFDS原语

LVDS(全称Low-Voltage Differential Signaling,低压差分信号)是一种高速、低功耗的差分信号传输技术,广泛应用于数字通信、视频传输、高速数据接口等领域。
如下图所示,LVDS使用一对相位相反的差分信号传输数据,通过两者电压差来判断逻辑值,在发送端单端转差分,在接收端差分转单端。使用差分信号在外部传输时抗干扰能力更强,外部噪声同时作用与两根差分数据线,那么两者电压差基本不受影响。
差分信号用于信号传输,但是在FPGA内部数据处理时,需要将差分信号变为单端使用,所以就需要将外来的差分信号转为单端,可以使用IBUFDS原语实现,将内部的单端信号转为差分信号输出,可以使用OBUFDS原语实现。

 IBUFDS原语:
在这里插入图片描述
上图中,左侧的输入管脚I和IB从FPGA焊盘输入的外部信号,其中I为差分信号的正端P端,IB为差分信号的负端P端;
该原语可以将差分信号转换为单端信号,右侧的O为原语输出的单端信号,O的值如下:
当I=1,IB为0,O为1;
当I=0,IB为1,O为0;
当I=IB时,此时原语不会工作,会保持之前的值不变;

原语的例化形式如下:
7系器件:
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)
);

Ultrascale+器件:
IBUFDS IBUFDS_inst (
.O(O), // 1-bit output: Buffer output
.I(I), // 1-bit input: Diff_p buffer input (connect directly to top-level port)
.IB(IB) // 1-bit input: Diff_n buffer input (connect directly to top-level port)
);

可以看到两个原语的端口一致,不过7系的原语多了三个参数;
参数说明:
参数DIFF_TERM:差分终端电阻,控制是否启用FPGA内部的差分终端电阻,用于匹配传输线阻抗(通常为100Ω),减少信号反射。
“TRUE”:启用内部终端电阻,适用于未外接终端电阻的差分信号链路(如LVDS长距离传输)。
“FALSE”:禁用内部终端电阻,需外接物理电阻(常见于短距离或已预匹配阻抗的电路)。

参数IBUF_LOW_PWR:低功耗模式,控制输入缓冲器的功耗与性能平衡。
“TRUE”:低功耗模式,适用于对功耗敏感的场景(如电池供电设备),但可能降低信号带宽和抗噪能力。
“FALSE”:高性能模式,提升信号处理速度,适用于高速接口(如Camera Link)。
例如低速传感器接口选"TRUE",千兆以太网或高速ADC接口选"FALSE"。

参数IOSTANDARD:输入电平标准,指定输入信号的电气标准,确保FPGA引脚电平与外部设备兼容。
常见值:
“LVDS_25”:LVDS差分信号,1.25V共模电压(默认值,Bank供电电压为2.5V)。
“LVDS”:LVDS差分信号,1.25V共模电压(默认值, Bank供电电压为1.8V)。
“LVCMOS18”:单端1.8V LVCMOS电平。
“DEFAULT”:自动适配Bank默认电平,但需确保FPGA Bank供电与外部信号匹配。
其中Xilinx 7系列FPGA的HP Bank仅支持1.2V~1.8V电平,HR Bank支持3.3V电平,需结合实际使用的Bank类型选择。

其中差分的输入端口需直接连接到顶层的输入端口;
且I和IB极性相反,原语才能正常工作;

关于Ultrascale+器件,UltraScale+系列对I/O逻辑进行了重构,部分参数(如DIFF_TERM)默认集成到I/O Bank的全局配置中,而非通过原语单独设置。
例如差分终端电阻(DIFF_TERM)的启用/禁用由Vivado的I/O约束文件(XDC)统一管理。
电平标准(IOSTANDARD)通过FPGA Bank的电压配置自动适配,减少手动参数设置需求。
Ultrascale+器件功耗与性能的自动化控制逻辑将IBUF_LOW_PWR参数在UltraScale+器件中移除,改为由工具根据设计时序和功耗约束自动选择最优模式。

当前UltraScale+器件可通过属性约束替代参数:
在UltraScale+中,原语参数的功能被转移到I/O端口属性中。例如:
(* IOSTANDARD = “LVDS_25”, DIFF_TERM = “TRUE” *)
IBUFDS ibufds_inst (.O(O), .I(I), .IB(IB));
这种方式将电平标准和终端电阻配置直接绑定到端口,而非原语内部参数去控制。

 IBUFDS原语仿真;
测试模块:
module top_7series_ibufds(
input wire clk,
input wire rst,
input wire din_p,
input wire din_n,
output wire dout
);

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(dout), // Buffer output
.I(din_p), // Diff_p buffer input (connect directly to top-level port)
.IB(din_n) // Diff_n buffer input (connect directly to top-level port)
);

endmodule

testbench:
设置两个随机的信号输入,然后仿真查看原语对于输入的处理结果,其中每100ns产生随机的输入,且两个输入极性不一定相反;
`timescale 1ns / 1ps

module tb;
reg clk;
reg rst;
reg data_p;
reg data_n;
wire dout;

initial begin
clk = 0;
rst = 1;
#100
rst = 0;
end

initial begin
data_p = 0;
data_n = 0;
while(1)begin
#100
data_p = $random;
data_n = $random;
end
end

top_7series_ibufds inst_top_7series_ibufds (
.clk(clk),
.rst(rst),
.din_p(data_p),
.din_n(data_n),
.dout(dout)
);

endmodule

仿真结果:
在这里插入图片描述
可以看到,
在第1个黄线处,data_p输入0,data_n输入1,此时输出为0,输出有效;
在第2个黄线处,data_p输入1,data_n输入1,那么输出就保持了之前第1个黄线处的有效输出0,此时原语不工作;
在第3个黄线处,data_p输入1,data_n输入0,此时输出为1,输出有效;
在第4个黄线处,data_p输入1,data_n输入1,输出又保持了之前第3个黄线处的有效输出1,此时原语不工作;
仿真的结果符合原语的特性;

### Xilinx LVDS 设计指南与教程 #### 创建LVDS接收模块 在Xilinx器件中实现LVDS接口通常涉及使用SelectIO IP核来创建LVDS接收模块。此过程允许开发者配置特定参数,如数据速率、相位调整等,从而优化信号完整性并满足具体应用场景的需求[^1]。 ```verilog // Verilog实例:调用SelectIO IP核生成LVDS_RX模块 module lvds_rx_module ( input wire clk, input wire rst_n, output reg [7:0] data_out ); // SelectIO IP核实例化代码省略... endmodule ``` #### LVDS训练机制解析 为了确保稳定可靠的通信链路,在某些情况下需要对LVDS连接执行初始化训练程序。这主要是因为物理层特性可能随环境变化而改变,因此有必要动态调整发送器和接收器之间的匹配度以补偿这些差异。 - **自动训练思想**:通过算法自动检测最佳设置组合,并将其应用于当前会话期间保持最优性能状态。 #### LVDS收发组件详解 对于FPGA内部处理而言,主要依赖于专用硬宏比如`IBUFDS`用于差分输入缓冲以及`OSERDESE2`/`ISERDESE2`完成串行至并行转换功能。其中后者负责对接收到的数据流按照指定协议解码重组为易于后续逻辑单元进一步加工的形式[^2][^4]。 ```vhdl -- VHDL示例:定义一个简单的LVDS输出路径利用OSERDESE2原语 component OSERDESE2 is generic( DATA_RATE_OQ : string := "SDR"; DATA_WIDTH : integer range 2 to 8 := 4; SERDES_MODE : string := "MASTER" ); port( OQ : out std_logic; -- 输出引脚 OFB : inout std_ulogic; CLKDIV : in std_ulogic; D1 : in std_ulogic; ... ); end component; signal serdes_data : std_logic_vector(3 downto 0); begin u_oserdease2_inst : OSERDESE2 generic map( DATA_RATE_OQ => "DDR", DATA_WIDTH => 4, SERDES_MODE => "MASTER" ) port map( OQ => lvds_output, OFB => open, CLKDIV => sys_clk_50Mhz, D1 => serdes_data(0), ... ); ``` #### 关键点总结 - 使用SelectIO工具简化LVDS硬件描述; - 自动训练有助于提升复杂环境下系统的鲁棒性和适应能力; - `IBUFDS`, `OSERDESE2`, 和 `ISERDESE2` 构建高效稳定的LVDS传输管道。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值