Vivado中使用IP核SelectIO配置LVDS学习笔记

文章详细探讨了在FPGA设计中使用PLL、OSERDESE和ISERDESE组件时遇到的问题和解决方案,包括PLL初始化与系统复位的协调、ISERDESE解串器的bitslip功能、LVDS信号环回的仿真以及阻抗匹配在LVDS传输中的重要性。同时,提到了Vivado工具中的一些报错处理,如输入时钟源设置和管脚配置中的端接选项。此外,还讨论了LVDS接口速率与传输速率的关系以及Vivado中SelectIO配置对LVDS接口频率的影响。
摘要由CSDN通过智能技术生成

        Ps.1:起初将PLL、OSERDESE、ISERDESE的复位都接系统复位,但是由于PLL初始化需要一段时间导致data异常,将PLL复位取消后data正常(且系统复位要在PLL初始化完成之后)。

         Ps.2:bitslip不使能时,ISERDESE不能解串。

         顶层模块代码如下:

module lvds_loop(
    clk_50M,
    rst_n,
    bitslip,
    data_o
    );
    
input clk_50M;
input rst_n;
input bitslip;
output [7:0]data_o;

wire clk_6M;
reg [7:0]data_i;
always@(posedge clk_6M or negedge rst_n)
if(~rst_n)
    data_i<='d0;
else
    data_i<=data_i+'d1;

pll pll_0
   (
    // Clock out ports
    .clk_6M(clk_6M),     // output clk_6M
    // Status and control signals
    .resetn(), // input resetn
   // Clock in ports
    .clk_in1(clk_50M));      // input clk_in1

wire data_p;
wire data_n;
lvds_oserdese 
  lvds_oserdese_0
 (
   .data_out_from_device(data_i), // input [7:0] data_out_from_device
   .data_out_to_pins_p(data_p), // output [0:0] data_out_to_pins_p
   .data_out_to_pins_n(data_n), // output [0:0] data_out_to_pins_n
   .clk_in(clk_50M), // input clk_in                            
   .clk_div_in(clk_6M), // input clk_div_in                        
   .io_reset(~rst_n) // input io_reset
); 

lvds_iserdese 
  lvds_iserdese_0
 (
   .data_in_from_pins_p(data_p), // input [0:0] data_in_from_pins_p
   .data_in_from_pins_n(data_n), // input [0:0] data_in_from_pins_n
   .data_in_to_device(data_o), // output [7:0] data_in_to_device
   .bitslip(bitslip), // input bitslip                           
   .clk_in(clk_50M), // input clk_in                            
   .clk_div_in(clk_6M), // input clk_div_in                        
   .io_reset(~rst_n) // input io_reset
); 
    
endmodule

        

        使用转串器OSERDESE与解串器ISERDESE实现自加数回环(数据不匹配)功能仿真。

        仿真图如下:

        仿真代码如下:

`timescale 1ns / 1ps

module lvds_loop_tb();

reg clk_50M;
reg rst_n;
reg bitslip;
wire [7:0]data_o;

lvds_loop lvds_loop_0(
    clk_50M,
    rst_n,
    bitslip,
    data_o
    );

initial clk_50M=1;
always #10 clk_50M=~clk_50M;

initial begin
rst_n=0;
bitslip=0;
#1000;
rst_n=1;
bitslip=1;
#20;
bitslip=0;
#20000;
$stop;
end

endmodule

         之后搭建LVDS数据环回工程功能仿真通过。

        Ps.3:差分信号两根线但I/O Planning里只能分配p端引脚,因为p/n是一一对应的关系,分配的p端引脚其n端必须与原理图对应。

       

        Ps.4:设计实现时报错([DRC REQP-1712] Input clock driver: Unsupported PLLE2_ADV connectivity. The signal u0_pll/inst/clk_in1 on the u0_pll/inst/plle2_adv_inst/CLKIN1 pin of u0_pll/inst/plle2_adv_inst with COMPENSATION mode ZHOLD must be driven by a clock capable IO.) ,将锁相环IP中输入时钟源设置为Global buffer即可解决。

        

        Ps.5:设计实现时报错([DRC BIVC-1] Bank IO standard Vcc: Conflicting Vcc voltages in bank 16. For example, the following two ports in this bank have conflicting VCCOs: rst_n (LVCMOS33, requiring VCCO=3.300) and tx_data_p (LVDS_25, requiring VCCO=2.500)
),FPGA为了同时能和多种不同的电平标准接口芯片通信,Vcco通常以BANK为界,互相之间相互独立,也就是说在一颗FPGA芯片上同时存在几种不同的I/O电压。当然同一个BANK只能存在1种I/O电压。

         Ps.6:板级验证如下图所示:

         如上图所示,lvds_rx模块不能正确接收lvds_tx模块在空闲时持续发送的数据0xa6,使得位对齐模块位对齐移位信号rx_data_bit_align持续拉高且位对齐完成信号rx_bit_align_done不能拉高,初步推断rx_data为误码的原因是lvds_tx模块发送的差分信号有误,使用示波器抓取tx_data_p(蓝)、tx_data_n(黄)的波形如下:

        如上图所示,差分信号异常。

        差分信号在FPGA内部环回时功能仿真图如下:

        如上图所示,差分信号无异常 。

        Ps.7:Vivado中不能debug差分信号?

                ([Chipscope 16-3] Cannot debug net 'tx_data_n'; it is not accessible from the fabric routing.无法调试网络'tx_data_n';无法从结构路由访问它。)

        Ps.8:Vivado一直处于 initialiazing design:重启电脑解决。

        Ps.9:管脚配置中off-chip termination和IN TERM \ OUT TERM分别指什么啊?

                Xilinx FPGA可以选择端接电阻是在FPGA内实现还是外部实现,一般都是采用在FPGA内实现可以省却PCB上布板的不便,对接口速率较低的来说,有时候不端接也看不出问题来,但是速率一高问题就容易出现了,会影响到FPGA接收数据的准确性,就是信号完整性方面的内容。

                Off-Chip Termination:显示每个I/O标准的默认端接。比如FP_VTT_50表示远端并联50Ω的VTT端接类型;HSTL_1表示远端并联40Ω的VTT端口类型。具体的端接类型可以在ug471(7系列)和ug571(UltraScale系列)中查看。

                端接方法:LVDS电平在接收端增加100Ω并联电阻来实现端接。相比于LVPECL,端接方法更简单。端接电阻的作用:实现电流向电压的转化;实现阻抗匹配。

        Ps.10:什么是阻抗匹配,有什么作用,具体在那些电路?

        【阻抗匹配】是指信号源或者传输线跟负载之间的一种合适的搭配方式。阻抗匹配分为【低频】和【高频】两种情况讨论。

        【低频】我们先从直流电压源驱动一个负载入手。由于实际的电压源,总是有内阻的,我们可以把一个实际电压源,等效成一个理想的电压源跟一个电阻r串联的模型。假设负载电阻为R,电源电动势为U,内阻为r,那么我们可以计算出流过电阻R的电流为:I=U/(R+r),可以看出,负载电阻R越小,则输出电流越大。负载R上的电压为:Uo=IR=U*[1+(r/R)],可以看出,负载电阻R越大,则输出电压Uo越高。再来计算一下电阻R消耗的功率为:
        P=I*I*R=[U/(R+r)]*[U/(R+r)]*R=U*U*R/(R*R+2*R*r+r*r)=U*U*R/[(R-r)*(R-r)+4*R*r]=U*U/{[(R-r)*(R-r)/R]+4*r}
        

        对于一个给定的信号源,其内阻r是固定的,而负载电阻R则是由我们来选择的。注意式中[(R-r)*(R-r)/R],当R=r时,[(R-r)*(R-r)/R]可取得最小值0,这时负载电阻R上可获得最大输出功率Pmax=U*U/(4*r)。即,当负载电阻跟信号源内阻相等时,负载可获得最大输出功率,这就是我们常说的阻抗匹配之一。对于纯电阻电路,此结论同样适用于低频电路及高频电路。当交流电路中含有容性或感性阻抗时,结论有所改变,就是需要信号源与负载阻抗的的实部相等,虚部互为相反数,这叫做共厄匹配。在低频电路中,我们一般不考虑传输线的匹配问题,只考虑信号源跟负载之间的情况,因为低频信号的波长相对于传输线来说很长,传输线可以看成是“短线”,反射可以不考虑(可以这么理解:因为线短,即使反射回来,跟原信号还是一样的)。

        从以上分析我们可以得出结论:
        如果我们需要输出电流大,则选择小的负载R;
        如果我们需要输出电压大,则选择大的负载R;
        如果我们需要输出功率最大,则选择跟信号源内阻匹配的电阻R。
        有时阻抗不匹配还有另外一层意思,例如一些仪器输出端是在特定的负载条件下设计的,如果负载条件改变了,则可能达不到原来的性能,这时我们也会叫做阻抗失配。

        【高频、微波】在高频电路中,我们还必须考虑反射的问题。当信号的频率很高时,则信号的波长就很短,当波长短得跟传输线长度可以比拟时,反射信号叠加在原信号上将会改变原信号的形状。如果传输线的特征阻抗跟负载阻抗不匹配(相等)时,在负载端就会产生反射。为什么阻抗不匹配时会产生反射以及特征阻抗的求解方法,牵涉到二阶偏微分方程的求解,有兴趣的可参看电磁场与微波方面书籍中的传输线理论。

        传输线的【特征阻抗】(也叫做特性阻抗)是由传输线的结构以及材料决定的,而与传输线的长度,以及信号的幅度、频率等均无关。例如,常用的闭路电视同轴电缆特性阻抗为75欧,而一些射频设备上则常用特征阻抗为50欧的同轴电缆。另外还有一种常见的传输线是特性阻抗为300欧的扁平平行线,这在农村使用的电视天线架上比较常见,用来做八木天线的馈线。因为电视机的射频输入端输入阻抗为75欧,所以300欧的馈线将与其不能匹配。实际中是如何解决这个问题的呢?不知道大家有没有留意到,电视机的附件中,有一个300欧到75欧的阻抗转换器(一个塑料包装的,一端有一个圆形的插头的那个东东,大概有两个大拇指那么大的)?它里面其实就是一个传输线变压器,将300欧的阻抗,变换成75欧的,这样就可以匹配起来了。

        这里需要强调一点的是,特性阻抗跟我们通常理解的电阻不是一个概念,它与传输线的长度无关,也不能通过使用欧姆表来测量。为了不产生反射,负载阻抗跟传输线的特征阻抗应该相等,这就是传输线的阻抗匹配。如果阻抗不匹配会有什么不良后果呢?如果不匹配,则会形成反射,能量传递不过去,降低效率;会在传输线上形成驻波(简单的理解,就是有些地方信号强,有些地方信号弱),导致传输线的有效功率容量降低;功率发射不出去,甚至会损坏发射设备。如果是电路板上的高速信号线与负载阻抗不匹配时,会产生震荡,辐射干扰等。

        当阻抗不匹配时,有哪些办法让它匹配呢?
        第一,可以考虑使用变压器来做阻抗转换,就像上面所说的电视机中的那个例子那样。
        第二,可以考虑使用串联/并联电容或电感的办法,这在调试射频电路时常使用。
        第三,可以考虑使用串联/并联电阻的办法。一些驱动器的阻抗比较低,可以串联一个合适的电阻来跟传输线匹配,例如高速信号线,有时会串联一个几十欧的电阻。而一些接收器的输入阻抗则比较高,可以使用并联电阻的方法,来跟传输线匹配,例如,485总线接收器,常在数据线终端并联120欧的匹配电阻。

        Ps.11:为什么lvds的终端电阻为100欧姆?

        由于lvds接收器的输入阻抗很大和传输线阻抗不匹配,这里的终端电阻时做阻抗匹配消除或减少反射,至于为什么是100欧姆,我想这个是经典值不是绝对值,我们知道lvds传输线是差分线。

        一般控制差分阻抗为90-100欧姆,并且有时这个100欧姆电阻时集成在接收端ic芯片里了,个人这样理解的。

        高频信号传输时,信号波长相对传输线较短,信号在传输线终端会形成反射波,干扰原信号,所以需要在传输线末端加终端电阻,使信号到达传输线末端后不反射。

        对于低频信号则不用。在长线信号传输时,一般为了避免信号的反射和回波,也需要在接收端接入终端匹配电阻。

         Ps.12:400M传输速率下将LVDS的串行时钟由lvds_tx输出,输入lvds_rx后,lvds_rx不能接收到tx_data异常,板级验证分析如下:

        Ps.13:将PLL输出一端设为800M时显示:WARNING : clk _out1 output frequencies are out of range for the corresponding buffers. Timing violations may be present.

        译为:警告:clk _out1输出频率超出相应缓冲区的范围。可能存在时间违例的情况。

        但在之后板极验证没能发现此处警告产生的影响。

        Ps.14:将串并转换器的输入输出时钟调整为100M,800M后板极验证在逻辑分析仪由于用50M的抓取时钟所以只显示奇数数,一个50M时钟传输两个8位数速率达到800Mbps。

        Ps.15:Vivado中OSERDESE的差分时钟从外部输入所以限制了单通道的传输速率最高为PLL能生成的最大速率800Mbps,所以要达到1.6Gbps则至少需要两通道?而Quartus中OSERDESE的差分时钟是IP内部产生的,其速率=内部时钟*串化因子,只需要200M内部时钟即可?

         Ps.16:我总结出的关于Vivado中使用SelectIO配置LVDS接口频率关系如下:

        LVDS传输速率=单通道串行数据传输速率(clk_in)*通道数*[1(SDR)或者2(DDR)];

        单通道串行数据传输速率=clk_in*[1(SDR)或者2(DDR)];

        并行数据位数=串化因子*通道数;

        并行数据速率=clk_div。

        Ps.17:通过用示波器抓取数据,时钟差分线信号对比不带端接电阻的信号可以得出XILINX的XC7A35TFGG484-2芯片差分线端接电阻在TX输出端,与Vivado中引脚分配时显示的Off-Chip Termination一致。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值