Serdes原理

2023-05-16

Serdes原理

1.为什么需要SerDes?

电子系统中,传送数据的方式一般有两种方式,串口或者并口,具体定义不区分。先来说一下同步与异步通信。二者的区别在于是否有时钟线来对齐数据,采样数据。一般而言,并行通信都会有时钟线用来采样,现在的系统中最常见的就是DDR。

对于系统的互联,随着性能的提高,速率当然要求越来越高。对于理想状态而言,自然是并口要快于串口,其缺点也很明显,就是需要更多的接口资源。

在不断提高信号速率的过程中,有几个条件会限制并行通信速率的提高

  • 时钟到达两个芯片的传播延时不相等(clock skew)

  • 并行数据各个bit的传播延时不相等(data skew)

  • 时钟的传播延时和数据的传播延时不一致(skew between data and clock)

数据可以正确的采样的条件是要满足建立保持时间,当时钟线与数据线之间存在skew时,随之而来的是保持时间的减少,这就导致了数据采样出错概率增大,当数据线的位宽越大时,保持时间的窗口是各个数据线之间与的关系,也就是说数据线越多,数据有效窗口就越小。如下图:
在这里插入图片描述

以DDR为例,DDR3的读写速率可以达到1066~2400Mhz,在时钟速率的提高还有一个现象会成为瓶颈,就是同步开关噪声(SSN)。

要提高接口的传输带宽有两种方式,一种是提高时钟频率,一种是加大数据位宽。那么是不是可以无限制的增加数据的位宽呢?这就要牵涉到另外一个非常重要的问题-----同步开关噪声(SSN)。

这里不讨论SSN的原理,直接给出SSN的公式:

SSN = L *N* di/dt。

L是芯片封装电感,N是数据宽度,di/dt是电流变化的斜率。

并行通信中数据位宽就意味着要同时开关更多的接口,因此开关的同时电流的变化的变化也更大,并且速率的提高也同时导致di/dt增大。

因此也不可能靠无限的提高数据位宽来继续增加带宽。一种解决SSN的办法是使用差分信号替代单端信号,使用差分信号可以很好的解决SSN问题,代价是使用更多的芯片引脚。使用差分信号仍然解决不了数据skew的问题,很大位宽的差分信号再加上严格的时序限制,给并行接口带来了很大的挑战。Serdes因此应运而生!

2.什么是SerDes?

串口是系统设计中比较常用的接口,低速串口中比较常见的是UART、SPI、I2C等,我们的目标是提升系统的性能,获得更高的数据带宽,高速的串口接口就要说到Serdes接口,什么是SerDes?

SerDes是一个合成词,全程是串行器/解串器,将低速并行数据转换成串行数据发送出去,接收端再把串行数据解码为并行数据。结构主要包括3部分:发送端、接收端、PLL部分。
在这里插入图片描述

底色为浅绿色的子模块为PCS层,负责数据流的编码/解码,是标准的可综合CMOS数字逻辑,可以硬逻辑实现,也可以使用FPGA软逻辑实现。

底色为浅褐色子模块是PMA层,是数模混合CML/CMOS电路,负责负责串化/解串化,是理解SerDes区别于并行接口的关键。

PMD是负责串行信号传输的电气块

PLL模块(PLL Block)负责产生SerDes各个模块所需要的时钟信号,并管理这些时钟之间的相位关系。

3.SerDes为什么快?

作为串行接口,如何做到比并行接口快呢?主要有以下几方面的原因:

  • 串口使用差分线进行传输,因此噪声的抗干扰能力要强很多,并不是说并口不能使用差分线,由于并行线位宽较宽,IO端口数量的再翻一倍,则系统设计更加困难,并且要做到数据线skew,做到等长更加困难。
  • SerDes中还有一项重要技术,CDR可以将时钟编码进数据线中,这样就避免时钟与数据线之间的skew对数据传输的影响
  • SerDes中还有另一个重要技术:预加重和均衡,对于改善信道质量有很大提升,能有效提高数据传输速度

4.串行器/解串器

串行器Serializer把并行信号转化为串行信号。Deserializer把串行信号转化为并行信号。一般地,并行信号为8 /10bit或者16/20bit宽度,串行信号为1bit宽度(也可以分阶段串行化,如8bit->4bit->2bit->equalizer->1bit以降低equalizer的工作频率)。

接收方向除了Deserializer之外,一般带有还有对齐功能逻辑(Aligner)。相对SerDes发送端,SerDes接收端起始工作的时刻是任意的,接收器正确接收的第一个 bit可能是发送数据的任意bit位置。因此需要对齐逻辑来判断从什么bit位置开始(哪里开始算是第一个数据),以组成正确的并行数据。对齐逻辑通过在串行数据流中搜索特征码字(Alignment Code)来决定串并转换的起始位置,这就需要用到了8b/10b的控制字符集,也就是我们常说的**“K”字符**,常见的什么K28.5、K28.0、K28.3、K28.4等,在JESD204B中他们又称/K/、/R/、/A/、/Q/字符。

5.时钟数据恢复(CDR)

CDR(Clock Data Recovery )即时钟数据恢复,是SerDes设计中非常重要的环节。CDR通常采用PLL实现,当数据经过时,CDR就会捕获数据边沿跳变的频率,如果数据长时间没有跳变,CDR就无法得到精确的训练,CDR采样时刻就会漂移,可能采到比真实数据更多的“0”或“1”。这就是为什么我们在发送的时候会进行扰码或者编码来避免重复出现“0”或者“1”,所以CDR有一个指标叫做最长连“0”或“1”长度容忍。

恢复时钟之后,需要恢复数据。第一步首先要将恢复出来的时钟与数据边缘进行对齐,然后再将数据给读出来。在硬件原理上,使用PLL电路以及触发器即可。

6.均衡与加重

SerDes信号从发送芯片到达接收芯片所经过的路径称为信道(channel),包括芯片封装、PCB走线、过孔、电缆、连接器等元件。从频域来看,信道可以简化为一个低通滤波器模型,如果SerDes的速率大于信道的截至频率,就会一定程度损伤信号(高频被滤掉了,数字信号边沿会变得平滑)。均衡的作用就是补偿信道对信号的损伤。

发送端的均衡器采用FFE(Feed forward equalizers)结构,从频域上看,FFE是一个高通滤波器(容易理解,信道损伤是一个低通滤波器,会抑制高频,那么均衡器就补偿高频)。从时域上看,又叫加重器(emphasis)。加重分为去加重(de-emphasis)和预加重(pre-emphasis)。De-emphasis降低差分信号的摆幅(swing)。pre-emphasis增加差分信号的摆福。

接收端均衡器的目标和发送均衡器目标是一致的。对于低速(<5Gbps)SerDes,通常采用连续时域、线性均衡器实现如尖峰发达器(peaking amplifier),均衡器对高频分量的增益大于对低频分量的增益。

7.引用

https://zhuanlan.zhihu.com/p/113737215
https://zhuanlan.zhihu.com/p/115422685

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Serdes原理 的相关文章

  • win32 SDK开发中打开 保存文件对话框的使用

    示例程序如下 TCHAR strFileName MAX PATH 61 T 34 34 TCHAR strPath MAX PATH 61 T 34 34 OPENFILENAME ofn 61 sizeof OPENFILENAME N
  • static 修饰的全局变量具有内部链接的一个例子

    很久不能明白这个事情 xff0c 下面自己来举个例子吧 xff1a 文件1 c include lt stdio h gt extern int s int main printf 34 d n 34 s return 0 文件2 c in
  • CentOS6 虚拟机管理工具 virt-manager 在Xmanager键位混乱问题

    平时一直在Linux下面管理虚拟机 xff0c 没有啥问题 xff0c 今天由于工作需要 xff0c 在Xmanager中进行虚拟机管理 xff0c 发现virt manager管理工具中虚拟机控制台登录键盘映射错乱 xff0c 经研究发现
  • 在Jdeveloper 11gR2中传递url参数到由task flow构成的区中

    1 建立环境 新建fusion web application gt PassVar 在默认任务流 adf config xml里面创建view welcome和相应的jsf页面 新建bounded任务流passVar xml 在任务栏中添
  • Oracle ADF控件屏幕居中

    在某些情况下 xff0c 比如登录窗口 xff0c 我们希望能位于屏幕正中央 在ADF中通过下面步骤实现 1 新建fusion web application gt CenterItem 在默认任务流 adf config xml里面创建v
  • 顺序表的创建与使用

    顺序表的创建与使用 这里还定义了一个数据类型的宏 xff0c TYPE 首先需要设计数据结构 xff0c 这里设计了两个成员 xff1a 数组首地址和元素个数 然后是进行各种业务功能的分函数 xff1a 创建顺序表 销毁顺序表 访问顺序表中
  • 顺序栈的创建与使用

    顺序栈的创建与使用 首先是各种函数的头文件声明 这里还另外定义了一个数据类型的宏 xff0c int类型数据暂时用作TYPE替换 xff0c 也可以替换成其他类型数据 然后是设计数据结构体 xff0c 这里定义了三个成员变量 其次是实现各项
  • 利用C++模板封装链表

    利用C 43 43 实现链表模板类 include lt iostream gt include lt stdlib h gt using namespace std template lt typename T gt class Node
  • 利用套接字创建本地socket文件完成本地进程间通信

    利用套接字创建socket文件完成本地两个进程之间的通信 xff0c 这里分为进程A和进程B 进程A 头文件 进程A里面首先是各种头文件 xff1a 1 include lt stdio h gt 2 include lt stdlib h
  • C++在字符串中搜索特定的字符

    C 43 43 在字符串中搜索特定的字符 在字符串中搜索特定字符是指在字符串中寻找是否存在指定的字符或字符集 include lt iostream gt int main int argc const char argv std stri

随机推荐

  • C++中在字符串中提取子字符串

    C 43 43 中在字符串中提取子字符串 从字符串中提取子字符串是指将一个字符串中的一部分截取下来形成一个新的字符串 include lt iostream gt int main int argc const char argv std
  • C++中如何访问字符串中的单个字符

    访问字符串中的单个字符 访问字符串中的单个字符是像字符数组那样使用下标访问字符串中的某个元素 include lt iostream gt int main int argc const char argv std string str1
  • c中有时候一个名字具有块作用域但是有外部链接的一个例子

    文件1 c include lt stdio h gt void f void s具有块作用域 xff0c 但是具有外部链接 extern int s printf 34 d n 34 s int main f return 0 文件2 c
  • Javascript Map 对象使用说明

    Map 是 ES6 中引入的一种新的数据结构 xff0c 对象保存键值对 任何值 对象或者原始值 都可以作为一个键或一个值 以前用的JS对象 Object也是可以把其属性看作键来定位数据 xff0c 但 Map 和 Object 是有区别的
  • 如何将Mac备份到外置硬盘?

    Apple爱好者喜欢该其设备的时尚设计和简单的用户界面 然而 xff0c 设置Mac的备份可能会令人沮丧 xff0c 因为大多数外部硬盘驱动器在使用之前必须进行格式化 然而 xff0c 如果了解如何将Mac备份到外部硬盘驱动器后 xff0c
  • C++中字符串的交换与复制

    字符串的交换是指将两个字符串的内容互相交换 字符串复制是指生成一个新的字符串其内容为原有字符串的内容 include lt iostream gt int main std string str1 61 34 Hello 34 std st
  • Kali2022安装Docker和Docker-compose以及更改国内镜像源

    装之前可以选择更新一下软件库 root kali apt update 安装docker root kali apt install docker io root kali docker version 查看Docker版本 root ka
  • Mac系统配置php环境

    写在前面 叨叨叨 急着配环境的同志们可以绕道 最近学校的实验室里接了一个小项目 考勤刷卡系统 xff0c 利用RFID在硬件层获取学生卡的ID xff0c 通过wifi传输至服务器 xff0c 进行考勤信息存储 xff0c 手机端获取服务器
  • 病毒变种--C语言练习

    病毒变种 病毒DNA可以表示成由一些字母组成的字符串序列 xff0c 且病毒的DNA序列是环状的 例如 xff0c 假设病毒的DNA序列为baa xff0c 则该病毒的DNA序列有三种变种 xff1a baa aab aba 试编写一程序
  • http、https 等 常用默认端口号

    HTTP协议代理服务器常用端口号 xff1a 80 8080 3128 8081 9080 SOCKS代理协议服务器常用端口号 xff1a 1080 FTP xff08 文件传输 xff09 协议代理服务器常用端口号 xff1a 21 Te
  • 网络传输性能netperf测试方法和下载

    简介 Netperf是一种网络性能的测试工具 xff0c 主要针对基于TCP或UDP的传输 Netperf根据应用的不同 xff0c 可以进行不同模式的网络性能测试 xff0c 即批量数据传输 xff08 bulk data transfe
  • 个人服务器(Linux)安装confluence

    个人服务器 Linux 安装confluence 文章目录 个人服务器 Linux 安装confluence 前言 一 服务器配置 二 JDK环境安装 1 下载java8 2 上传安装包 3 解压缩并重命名 4 配置jdk环境变量 5 测试
  • 关于Windows利用Mstsc远程访问Ubutu的VNC方法

    这里发现了一篇网上很好的文章 xff0c 实现也很顺利 xff0c 因此将那篇文章直接引用过来 地址为 xff1a https www cnblogs com xuliangxing p 7642650 html
  • VSCode 常用且好用的插件推荐

    python相关插件 Tabnine AI代码提示器 xff08 支持JavaScript Python Java Typescript amp all other languages xff09 Python vscode 的 pytho
  • Qt中实现图片透明度设置与显示

    在使用QGraphicsScene过程中 xff0c 想要实现背景和前景图层叠加显示 xff0c 需要设置对应层绘图的透明度的设置 采用重写drawBackground QPainter painter const QRectF amp r
  • c语言现代发方法19章学习经历记录

    19 4 5用栈实现抽象数据类型 这里简直太牛了 xff0c 直接定义一个结构体类型的栈 xff0c 里面是一个头节点 xff08 也是一个指针 xff09 后面直接定义一个栈的指针对象 xff0c 那么就可以随意改变栈里面的内容 xff0
  • 计蒜客 信息学题库 T1068 救援

    T1068 救援 救生船从大本营出发 xff0c 营救若干屋顶上的人回到大本营 xff0c 屋顶数目以及每个屋顶的坐标和人数都将由输入决定 xff0c 求出所有人都到达大本营并登陆所用的时间 在直角坐标系的原点是大本营 xff0c 救生船每
  • 计蒜客 信息学题库 T1079 开关灯

    T1079 开关灯 假设有 N 盏灯 xff08 N 为不大于 5000 的正整数 xff09 xff0c 从 1 到 N 按顺序依次编号 xff0c 初始时全部处于开启状态 xff1b 有 M 个人 xff08 M 为不大于 N 的正整数
  • 利用python实现ftp的文件读写

    ftp登陆连接 from ftplib import FTP 加载ftp模块 ftp 61 FTP 设置变量 ftp set debuglevel 2 打开调试级别2 xff0c 显示详细信息 ftp connect 34 IP 34 34
  • Serdes原理

    Serdes原理 1 为什么需要SerDes 电子系统中 xff0c 传送数据的方式一般有两种方式 xff0c 串口或者并口 xff0c 具体定义不区分 先来说一下同步与异步通信 二者的区别在于是否有时钟线来对齐数据 xff0c 采样数据