目录
1.LVDS的概念
LVDS ( Low Voltage Differential Signalin )是一种低振幅差分信号技术。它使用幅度非常低的信号(约 350mV ) 通过一对差分 PCB 走线或平衡电缆传输数据。大部分高速数据传输中,都会用到 LVDS 传输。 目前 FPGA LVDS 实际上有大量的应用,特别是在高速 ADC, 高分辨率摄像头,液晶屏显示技术等应用领域。所以掌握 LVDS 通信也是我们 FPGA 开发者的必备基本技能。本文首先简要介绍一些 XILINX FPGA 的 LVDS 解决方案。2.XILINX FPGA 差分信号解决方案
(1)IBUFDS
(2)OBUFDS
(3)IOBUFDS(三态差分输入输出)
3.LVDS中的终端电阻
注:如果要使用内部的终端电阻,对于 HP 的 LVDS 信号 BANK 电压必须是 1.8V,而对于 HR 的 LVDS25 BANK 信号必须是 2.5V,否则可以使用外部终端电阻。
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