Xilinx 差分信号 LVDS传输实战

目录

1.LVDS的概念    

2.XILINX FPGA 差分信号解决方案

(1)IBUFDS

(2)OBUFDS

(3)IOBUFDS(三态差分输入输出)

3.LVDS中的终端电阻

4.LVDS 电气特性

(1)LVDS25

(2)LVDS25

5.LVDS 自环测试


 

1.LVDS的概念    

    LVDS Low Voltage Differential Signalin )是一种低振幅差分信号技术。它使用幅度非常低的信号(约 350mV ) 通过一对差分 PCB 走线或平衡电缆传输数据。大部分高速数据传输中,都会用到 LVDS 传输。
    目前 FPGA    LVDS 实际上有大量的应用,特别是在高速 ADC, 高分辨率摄像头,液晶屏显示技术等应用领域。所以掌握 LVDS 通信也是我们 FPGA 开发者的必备基本技能。本文首先简要介绍一些 XILINX FPGA LVDS 解决方案。

2.XILINX FPGA 差分信号解决方案

(1)IBUFDS

Xilinx 差分信号 LVDS传输实战_第1张图片

(2)OBUFDS

Xilinx 差分信号 LVDS传输实战_第2张图片

(3)IOBUFDS(三态差分输入输出)

Xilinx 差分信号 LVDS传输实战_第3张图片

3.LVDS中的终端电阻

注:如果要使用内部的终端电阻,对于 HP 的 LVDS 信号 BANK 电压必须是 1.8V,而对于 HR 的 LVDS25 BANK 信号必须是 2.5V,否则可以使用外部终端电阻。

Xilinx 差分信号 LVDS传输实战_第4张图片

4.LVDS 电气特性

(1)LVDS25


VCCO 2.5V
VOH 是高电平最大 1.675V
VOL 低电平最小 0.7V
VODIFF 差模电压最大 600mv , 最小 247mv, 典型值 350mv
VOCM 输出共模电压,最小 1V 最大 1.425V ,典型值 1.25V
VIDIFF 输入差模电压,最大 600mv, 最小 100mv, 典型 350mv
VICM 输入共模电压,最大 1.5V ,最小 0.3V ,典型 1.2V

(2)LVDS25


VCCO 1.8V
VOH 是高电平最大 1.675V
VOL 低电平最小 0.825V
VODIFF 差模电压最大 600mv , 最小 247mv, 典型值 350mv
VOCM 输出共模电压,最小 1V 最大 1.425V ,典型值 1.25V
VIDIFF 输入差模电压,最大 600mv, 最小 100mv, 典型 350mv
VICM 输入共模电压,最大 1.5V ,最小 0.3V ,典型 1.2V
LVDS 器件电气特性是否兼容主要看, VODIF VOCM VIDIFF VICM ,可以看到, LVDS25 LVDS 的差分电 气特性是兼容的。

5.LVDS 自环测试

module lvds_loop(
	// sysclk input 系统时钟
	input 	clk_i_p	,
	input 	clk_i_n	,


	// TTL输入输出
	input 	rx_i	,
	output 	tx_o	,
	
	//lvds loop input  输入的LVDS时钟
	input 	dclki_p	,
	input 	dclki_n	,
	input 	din_p	,
	input 	din_n	,
	
	//lvds loop output 输出的LVDS时钟
	output dclko_p	,
	output dclko_n	,
	output dout_p	,
	output dout_n
);

 
wire clk50m,dclki,din; 
reg rx_lvds = 1'b0;

wire clk_i;

// 得到单端系统时钟,对差分时钟采用 IBUFGDS IP 核去转换
IBUFGDS CLK_U(
	.I	(	clk_i_p	),
	.IB	(	clk_i_n	),
	.O	(	clk_i	)
);

//clk_wiz_0 uclk(.clk_out1(clk50m),.clk_out2(clk5m), .clk_in1_p(clk_i_p),.clk_in1_n(clk_i_n));
clk_wiz_0 uclk(.clk_out1(clk50m),.clk_in1(clk_i));

// lvds out, 把 rx 接收到的数据,通过LVDS发送出去
// 输出50M的差分时钟
OBUFDS #(
	.IOSTANDARD		(	"DEFAULT"	), // Specify the output I/O standard
	.SLEW			(	"SLOW"		) 
)     
dclko_OBUFDS
(
	.O  (	dclko_p ),
	.OB (	dclko_n ),
	.I  (	clk50m  ) 
);

// 输出接收到的数据
OBUFDS #(
	.IOSTANDARD		(	"DEFAULT"	), // Specify the output I/O standard
	.SLEW			(	"SLOW"		) 
)  
dout_OBUFDS
(
	.O  (	dout_p 	),
	.OB (	dout_n 	),
	.I  (	rx_i	) 
);


//lvds in
// 还原单端时钟
IBUFDS 
#(
	.DIFF_TERM		(	"TRUE"		),       // Differential Termination
	.IBUF_LOW_PWR	(	"TRUE"		),     // Low power="TRUE", Highest performance="FALSE" 
	.IOSTANDARD		(	"DEFAULT"	)     // Specify the input I/O standard
)
dclki_IBUFDS
(
	.O	(	dclki	),   // 1-bit output: Buffer output
	.I	(	dclki_p	),   // 1-bit input: Diff_p buffer input (connect directly to top-level port)
	.IB	(	dclki_n	)  // 1-bit input: Diff_n buffer input (connect directly to top-level port)
);    
// 还原单端数据
IBUFDS 
#(
	.DIFF_TERM		(	"TRUE"		),       // Differential Termination
	.IBUF_LOW_PWR	(	"TRUE"		),     // Low power="TRUE", Highest performance="FALSE" 
	.IOSTANDARD		(	"DEFAULT"	)     // Specify the input I/O standard
)
ddatai_IBUFDS
(
	.O	(	din		),   // 1-bit output: Buffer output
	.I	(	din_p	),   // 1-bit input: Diff_p buffer input (connect directly to top-level port)
	.IB	(	din_n	)  // 1-bit input: Diff_n buffer input (connect directly to top-level port)
); 

always @(posedge dclki)begin
    rx_lvds <= din;
end

assign tx_o = rx_lvds;
 
endmodule

 

你可能感兴趣的:(FPGA,LVDS,差分传输,Xilinx,FPGA)