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一致。文章来源:https://www.toymoban.com/news/detail-615035.html
文章来源地址https://www.toymoban.com/news/detail-615035.html
到了这里,关于Vivado中使用IP核SelectIO配置LVDS学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!