目录
一.LVDS的简介
由于系统功能实现日益增多,主控芯片的外围芯片也越来越多,因此主控芯片的引脚
资源相对变得紧俏,在数字系统互联的设计中,并行传输的方式将会被高速串行传输逐步
替代。而在串行传输标准中,低电压差分信号传输( LVDS)接口具有高速率、低功耗、低
噪声和低电磁干扰等优点,广泛应用于高速数字系统设计中。
低压差分信号相对于单端的传送具有较高的噪声抑制功能,其较低的电压摆幅允许差
分对线具有较高的数据传输速率,消耗较小的功率以及产生更低的电磁辐射。
LVDS: Low Voltage Differential Signaling,低电压差分信号。
LVDS 传输支持速率一般在 155Mbps(大约为 77MHZ)以上。
LVDS 是一种低摆幅的差分信号技术,它使得信号能在差分 PCB 线对或平衡电缆上以几
百 Mbps 的速率传输,其低压幅和低电流驱动输出实现了低噪声和低功耗。
二.差分信号抗噪特性
从差分信号传输线路上可以看出,若是理想状况,线路没有干扰时,
在发送侧,可以形象理解为:
IN= IN+ — IN-
在接收侧,可以理解为:
IN+ — IN- =OUT
所以:
OUT = IN
在实际线路传输中,线路存在干扰,并且同时出现在差分线对上,
在发送侧,仍然是:
IN = IN+ — IN-
线路传输干扰同时存在于差分对上,假设干扰为 q,则接收则:
(IN+ + q) — (IN- + q) = IN+ — IN- = OUT
所以:
OUT = IN
噪声被抑止掉。 上述可以形象理解差分方式抑止噪声的能力。
三. SelectIO 资源的介绍
不管是Spartan6还是xilinx 7系列FPGA,他们都已集成了 SelectIO 资源,我们可以通过配置 IP 核,可以生成支持LVDS 电平标准的接口程序,实现高速 LVDS 接口通信。 SelectIO 资源包含了 ISERDESE2、OSERDESE2、 IDELAYE2、ODELAYE2、 IDELAYCTRL 等, 本设计中仅用到 ISERDESE2 和OSERDESE2。 ISERDESE 为 Xilinx FPGA 中专用的解串器,主要用于数字传输中的串行转并行, 先到的比特为为高位。 OSERDESE2 为并行转串器,主要用于数字传输中的并行转串行,先到的比特为为高位。
FPGA 中 ISERDESE2 和 OSERDESE2 支持非常高的 I/O 数据速率,对于 ISERDESE2 存在 bitslip 信号来重新对齐串行数据以获得正确的字节数据。
使用 bitslip 信号可以修改串转并的起始位置,如下图所示,为 DDR 模式下使用 bitslip的时序图,开始时最先采集到的串行数据转换出来的并行数据为 0xCDAB,插入一个 bitslip信号后采集数据变为 0xBCDA,你可以通过多次插入 bitslip 的方法来获取正确的并行数据序。
在应用SelectIO IP核的时候还是相对来说简单一点,因为ISERDESE2 和OSERDESE2 已经在IP核里面例化好了,核心要点就是通过发送bitslip脉冲信号重新排序直到接收到正确数据, 其它没什么。想要深入研究ISERDESE2 和OSERDESE2 ,直接查看IP核的VHDL,你会发现bitslip的信号是在ISERDESE2上的,这里再说下原因,因为ISERDESE2在接收串行差分数据的时候并不知道起始位置,所以要bitslip来调整正确的数据序;关于bitslip的原理和获取正确的并行数据的过程更详细的讲解可以参考这里:FPGA之SelectIO_高级IO逻辑资源简介。
四. SelectIO IP核的仿真验证
关于SelectIO IP核 的创建这里提供了ISE和VIVADO两个平台的创建步骤:
- ISE平台的创建详情可以点击这里 :SelectIO IP 核的创建(spatan6)。
- VIVADO平台的创建详情点击这里:SelectIO IP 核的创建(Xilinx7)。
我们仿真只在ISE平台上创建的模式做了一个发送接收的环回仿真,主要是看bitlsip调整正确的接收数据序的过程,你们也可以自己直接做一个ISERDESE2+OSERDESE2 的环回测试,关于bitslip的信号控制是需要自己去搭建的。
在我们项目应用中,bitslip信号是很关键的,它直接关乎到2个设备之间LVDS正确通信。举个例子:A设备和B设备是LVDS接口连接,那他们之间就得协商好一致的前导码(和以太网帧原理差不多),我们这里是8'h9b,说白了,A和B的LVDS接收发送的FPGA程序是一样的;在设备上电后,A和B之间就一直互相发送8'h9b,A和B一直靠bitslip调整接收的8bit数据序,如果判断到接收的8bit数据等于8'h9b,那A设备和B设备的LVDS就成功建立好了连接---link_up,只有当link_up成功后,设备之间才可以发送或接收有效的数据帧。
此处是仿真激励代码:
// An highlighted block
module vtf_lvds;// Inputs
reg sys_rst;
reg clk_div_in;
reg clk_in_pll;
wire [0:0]DATA_IN_FROM_PINS_P;
wire [0:0]DATA_IN_FROM_PINS_N;
reg locked;
reg [7:0] data_in;
reg data_in_vld;// Outputs
wire [0:0]DATA_OUT_TO_PINS_P;
wire [0:0]DATA_OUT_TO_PINS_N;
wire [2:0] bit_count;
wire bitslip_int;
wire [30:0] debug_out;
wire [8:0] debug_in;
wire link_up;
wire [7:0] data_out;
wire data_out_vld;
wire bitslip;// Instantiate the Unit Under Test (UUT)
lvds uut(.sys_rst(sys_rst),.clk_div_in(clk_div_in),.clk_in_pll(clk_in_pll),.DATA_IN_FROM_PINS_P(DATA_IN_FROM_PINS_P),.DATA_IN_FROM_PINS_N(DATA_IN_FROM_PINS_N),.DATA_OUT_TO_PINS_P(DATA_OUT_TO_PINS_P),.DATA_OUT_TO_PINS_N(DATA_OUT_TO_PINS_N),.bit_count(bit_count),.bitslip_int(bitslip_int),.bitslip(bitslip),.debug_out(debug_out),.debug_in(debug_in),.link_up(link_up),.data_out(data_out),.data_out_vld(data_out_vld),.locked(locked),.data_in(data_in),.data_in_vld(data_in_vld));
initial begin
// Initialize Inputs
sys_rst =1;
clk_div_in =0;
clk_in_pll =0;// DATA_IN_FROM_PINS_P = 0;// DATA_IN_FROM_PINS_N = 0;
locked =0;
data_in =0;
data_in_vld =0;// Wait 100 ns for global reset to finish
#100;
sys_rst =0;
locked =1;// Add stimulus here
end
always # 32 clk_div_in =~clk_div_in;
always # 4 clk_in_pll =~clk_in_pll;
assign DATA_IN_FROM_PINS_P=DATA_OUT_TO_PINS_P;
assign DATA_IN_FROM_PINS_N=DATA_OUT_TO_PINS_N;
endmodule
仿真图中,我们的前导码是8’h9b,它的值和位宽是可以自己定义的,理论上位宽越多越好,能够提高准确性,降低偶然事件的发生,但是两连接的设备得用相同的前导码。看bitslip信号,每隔一段时间调整我们IP核中 ISERDESE2 接收的数据序,直到接收的数据值一直是8’h9b时,bitslip信号就一直保持低电平,此时link_up为高点平,说明LVDS接收连接成功。(bitslip信号的脉宽为一个clk_div_in时钟周期)
因为本文相当于自己做的笔记,如果大家有什么问题,可以交流~
版权归原作者 xiao小怪兽爱上凹凸曼 所有, 如有侵权,请联系我们删除。