为了能高效、低误码的接收异步数据,一般在接收端的硬件电路设计中要注意差分线路的直流平衡,同时要注意差分对中的两根差分线要等长,以及注意通信信道上阻抗匹配,这是硬件电路设计中的信号完整性要求。
1. 眼图的概念及利用
尽量做到接收端眼图张开,好的眼图如图1所示。

图1 TX 差分眼图(测量结果)
图1是用示波器测量看到的TX差分发送的眼图。从逻辑原理上可以眼图可以如图2所示。

图2 TX差分眼图
2. 影响眼图的因素
-
噪声及过冲,如图3所示。

图3 噪声与过充对眼图的影响
噪声与过冲对眼图是否影响,决定于差分信号的抗噪声容限,参见文章 TTL,CMOS,LVTTL,LVCMOS电平标准以及差分信号原理及LVDS电气接口内容。
-
直流不平衡
在差分信号原理部分我们介绍了共模电压,共模电压是差分信号的转换点,有效眼图也与共模电压为参考,如果共模电压不稳定,将会影响眼图的张开效果。如图4所示。

图4
图4 中紫红线标注了单端信号的眼图效果(即不考虑差分情况),由于直流不平衡带来的影响,不仅使眼图的形状发生改变,而且影响眼图张开效果,最终会影响0,1的判决效果。如果采用差分输出,由于差分信号是Vp -Vn,可以在一定的范围内对共模信号的变化或噪声免疫。可以有如下处理办法:
-
- 采用交流耦合,在接收端重新生成共模参考电压。
- 采用信道编码,避免信道中出现长0,长1的码流。如采用8b/10b编码,加扰解扰等编码措施。
- 采用差分信号接收与发送,从信号运算原理的角度消除直流不平衡带来的影响。
-
斜升率对眼图的影响,如图5

图5 斜升率对眼图的影响
从图5中可以看出,斜升率对眼图的张开影响很大,斜升率一般与底层的器件性能有关。对于FPGA而言,一般越是高档的FPGA,其斜升率的值也会越大。在Vivado软件中有以下几种指定办法。
- 在Xilinx Verilog文件中设定slew rate 为fast或slow。
// Sets the Slew rate to be FAST
(* SLEW = “FAST” *) output FAST_DATA;
- 在XDC约束文件里指定
# Sets the Slew rate to be FAST
set_property SLEW FAST [get_ports FAST_DATA]
- Obuf引用时在属性(参数)部分指定slew rate的属性。
OBUF #(
.DRIVE (12), // Specify the output drive strength
.IOSTANDARD ("DEFAULT"), // Specify the output I/O standard
.SLEW ("FAST") // Specify the output slew rate ,指定slew rate 为fast
) fast_data_obuf (
.O (FAST_DATA), // Buffer output (connect directly to top-level port)
.I (fast_data_int) // Buffer input
);
-
-
阻抗匹配对眼图的影响
-
阻抗匹配非常重要,如果在信道中出现阻抗失配的情况,信号就会发生反射。反射后的结果就会叠加到原信号上,因此对眼图也会产生很大的影响。
解决方案是在信道阻抗失配的位置,针对具体情况进行处理:如添加终端匹配电阻,或对差分线加保护地(如线路板差分信号换层),输出端加串联电阻等。
目前Xilinx 7系列的FPGA,Intel (Altera) 5系列及以上的器件都可以设置匹配电阻,简化了硬件设计。后续文章会介绍如何设置FPGA的匹配电阻以满足阻抗匹配的要求。
Xilinx可以在XDC文件添加 DIFF_TERM约束如下:
set_property DIFF_TERM TRUE [get_ports data_p]

图6
眼图的波形越理想,张开的效果越好,在接收端采样和判决时数据的准确率也越高。
3. 异步接收信号采样
一般接收信号采样有两种常用的办法:
-
时钟信号提取
从数据中提取的时钟信号经过PLL后实现频率及相位的追踪,最终实现采样时钟与被采样数据同步,这就是我们经常提到的CDR(clock data recovery),如图6所示。

图6 时钟数据恢复原理(CDR)
图6中 clk1是从接收数据流中提取的时钟(经过分频),clk2是经过PLL后进行频率追踪及相位补偿的时钟,用于数据解调。至于为什么选择外部PLL,是由于clk1是本地时钟经过数据边沿(接收端数据的时钟信息)修正过的时钟,一般Jitter比较严重,时钟质量较差,在高速通信中直接用于解调可能会带来数据采错,数据丢失等现象。在硬件设计时可以选择外部性能更高的PLL以提高时钟质量,进而降低时钟噪声,减小jitter ,减小相位误差(phase error)等,因此外部PLL有时也称Clean(或Clear) PLL。如果时钟频率不高,如只有几兆到几十兆,也可以用FPGA内部的PLL进行,但性能不能保证。
采用上面提到的方法,由于成本高,一般在传输数据速率比较高,对误码率有要求的情况采用。
-
过采样的方法。
这个方法我们其实并不陌生,在异步串行口通信中,已经使用。
-
-
过采样倍率
-
过采样位同步提取一般采用4或5倍过采样(不同的应用场景可能不同,如异步串行口通信更多的是采用8倍过采样),在高速通信中为了降低过采样频率一般采用4倍过采样。
-
-
检测边沿
-
边沿检测的目的是利用数据的上升沿或下降沿提取时钟信息,或过采样的初始相位,如图7。常用的边沿有上升沿,下降沿,双边沿等。
-
-
采样定位
-
根据得到边沿信息,定位采样点的数据。由于采用多倍采样,在采样的数据中包含了数据位信息的重复值,可以用中心定位或判多的方法实现位信号提取,这部分内容可以参照异步串行口接收原理部分内容。本节内容主要使用中心定位的原则,在检测到初始相位后,利用上升沿或下降沿采样数据,如图7所示。

图7 4倍过采样
-
-
位输出
-
最终采样后的输出有两个位,分别为rx_bit和rx_bit_en。rx_bit最终采样得到的数据与过采样时钟同步,位宽为过采样时钟周期的宽度的倍数。如4倍过采样,则rx_bit的宽度为4倍采样时钟的宽度。当然这是在不考虑采样位置调节的前提下。rx_bit_en用来指示采样时刻,用来与rx_bit同步。因为rx_bit,rx_bit_en都与过采样时钟同步,如图7所示,时钟频率比数据基频快4倍,而rx_bit_en的宽度为过采样时钟的周期宽度,在rx_bit,rx_bit_en应用时不会出现对rx_bit重复采样的可能性。整个过采样及位提取的流程如图8所示。

图8 异步过采样流程
例:利用rx_bit 及rx_bit_en 实现串并转换。
下面的程序实现接收数据的串并转换(移位寄存器)的Verilog程序。
reg [9:0] shift_r
always @(posedge over_clk or posedge rst)
if(rst) begin
shift_r <= 0;
end
else begin
if(rx_bit_en)
shift_r <= {shift_r[8:0], rx_bit};
end
后续文章中会继续介绍相位自适应过采样的原理、程序设计以及信道编码等问题。