使用串行比并行总线可以节省更多的布线空间,芯片、电缆等的尺寸可以做得更小,同时传输速率更高。但是,在很多数字系统如CPU、DSP、FPGA等内部,进行数据处理的最小单位都是Byte,即8个bit,如何把一个或多个Byte的数据通过串行总线可靠地传输出去是需要对数据做些特殊处理的。

并串转换与串并转换

最简单的把并行数据转换成串行信号传输的方法如下图所示。比如发送端的数据宽度是8bit,时钟速率是100MHz,我们可以通过Mux(复用器)芯片把8bit的数据时分复用到1bit的数据线上,相应的数据速率提高到800Mbit/s(在有些LVDS的视频信号传输中比较常用的是把并行的7bit数据时分复用到1bit数据线上)。信号到达接收端以后,再通过DeMux(解复用器)芯片把串行的信号分成8路低速的数据。

这种并串转换方法由于不涉及的信号编解码,结构简单,效率较高,但是需要收发端进行精确的时钟同步以控制信号的复用和解复用操作,因此需要专门的时钟传输通道,而且串行信号上一旦出现比较大的抖动就会造成串并转换的错误。

因此,这种简单的并串转换方式一般用于比较关注传输效率的芯片间的短距离互连或者一些光端机信号的传输中。另外由于信号没有经过任何编码,信号中可能会出现比较长的连续的0或者连续的1,因此信号必须采用直流耦合方式,收发端一旦存在比较大的共模或地噪声,会严重影响信号质量,因此这种并串转换方式用于电信号传输时或者传输速率不太高(通常<1Gb/s),或者传输距离不太远( 通常<50cm)。

8b/10b数据编码

为了提高串行数据传输的可靠性,现在很多更高速率的数字接口采用的是对数据进行编码后再做并串转换的方式。编码的方式有很多,如8b/9b编码、8b/10b编码、64b/66b编码、128b/130b编码等,下面我们以最流行的ANSI 8b/10b编码为例进行一下介绍。

在ANSI 8b/10b编码方式中,8比特的数据先通过相应的编码规则转换成10比特的数据,然后再进行并串转换;接收端收到信号后先把串行数据进行串并转换得到10比特的数据,然后再通过10比特到8比特的解码得到原始传输的8比特数据。因此,如果发送端并行侧的数据速率是8bit100Mb/s,通过8b/10b编码和并串转换后的串行侧的数据速率就是1bit1Gb/s。8b/10b编码方法最早由IBM发明,后来成为ANSI标准的一部分(ANSI X3.230-1994, clause 11),并在通信和计算机总线上广泛应用。下图是ANSI 8b/10b编码表的一部分,以数据0x00为例,其原始的8bit数据是0b00000000,经过编码后就变成了0b1001110100或者0b0110001011。

8b/10b编码的好处:

 有足够多的跳变沿,可以从数据里进行时钟恢复。正常传输的数据里可能会有比较长的连续的0或者连续的1,而进行完8b/10b编码后,其编码规则保证了编码后的数据流里不会出现超过5个的连续的0或1,信号里会出现足够多的跳变沿,因此可以采样嵌入式的时钟方式,即接收端可以从数据流里用PLL电路直接恢复时钟,不需要专门的时钟传输通道。

 直流平衡,可以采用AC耦合方式。经过编码后数据里不会出现连续的0或者1了,但是还是有可能在某个时间段内0或者1的数量偏多一些。从上面的编码表中我们可以看到同一个Byte对应有正、负两组10bit的编码,一个编码里1的数量多一些,另一个编码里0的数量多一些。数据在对当前的Byte进行8b/10b编码传输时,会根据前面历史传输的数据中正负bit的数量来选择使用哪一组编码,从而可以保证总线上正负bit的数量在任何时刻基本都是平衡的,也就是直流点不会发生大的变化。直流点平衡以后,在信号传输的路径上我们就可以采用AC耦合方式(最常用的方法是在发送端或接收端串接隔直电容),这样信号对于收发端的地电平变化和共模噪声的抵抗能力进一步增强,可以传输更远的距离。采用AC耦合方式的另一个好处是收发端在做互连时不用太考虑直流偏置点的互相影响,互连变得非常简单,对于热插拔的支持能力也更好。

 有利于信号校验。很多高速信号在做传输时为了保证传输的可靠性要对接收到的信号进行检查以确认收到的信号是否正确。在8b/10bit编码表里,原始的8bit数据总共有256个组合,即使考虑到每个Byte有正负两个10bit编码也只需要用到512个10bit的组合。而10bit的数据总共可以有1024个组合,因此有大约一半的10bit组合是无效的数据,接收端一旦收到这样的无效组合就可以判决数据无效。另外,前面我们介绍过数据在传输过程中是要保证直流平衡的,一旦接收端收到的数据中发现违反直流平衡的规则,也可以判决数据无效。因此采用8b/10b编码以后数据本身就可以提供一定的信号校验功能。不过需要注意的是,这种校验不是足够可靠,因为理论上还是可能存在有几个bit在传输中发生了错误但是结果仍然符合8b/10b编码和规则和直流平衡原则。因此,很多使用8b/10b编码的总线都还会在上层协议上再做相应的CRC校验(循环冗余校验)。

 可以插入控制字符。在10bit数据可以表示的1024个组合中,除了512个组合用于对应原始的8bit数据以及一些不太好的组合(比如0b1100000000这样信号里有太长的连续0或者1而且明显0、1的数量不平衡)以外,还有一些很特殊的组合。这些特殊的组合可以用来在数据传输过程中做为控制字符插入(如下图所示)。这些控制字符不对应特定的8bit数据,但是在有些总线应用里可以代表一些特殊的含义。比如K28.5码型,其特殊的码型组合可以帮助接收端更容易判别接收到的连续的10bit数据流的符号边界,所以在一些总线的初始化阶段或数据包的包头都会进行发送。还有一些特殊的符号用于进行链路训练、标记不同的数据包类型、进行收发端的时钟速率匹配等。

综上所述,要把并行的信号通过串行总线传输,一般需要对数据进行并串转换。为了进一步减少传输线的数量和提高传输距离,很多高速数据总线采用嵌入式时钟和8b/10b的数据编码方式。8b/10b编码由于直流平衡、支持AC耦合、可嵌入时钟信息、抗共模干扰能力强、编解码结构相对简单等优点,在很多高速的数字总线如FiberChannel、PCI-E、SATA、USB3.0、DisplayPort、XAUI、RapidIO等接口上得到广泛应用。下图是一路串行的2.5Gbps的8b/10b编码后的数据流以及相应的解码结果,从中我们可以明显看到从里面解出的K28.5等控制码以及相应的数据信息。

8b/10b编码的缺点

需要注意的是,采用8b/10b编码方式也是有缺点的,最大的缺点就是8bit到10bit的编码会造成额外的20%的编码开销。比如对于一个采用8b/10b编码的5Gbps的串行总线来说,其有效的数据传输速率只有4Gbps,也就是说仅为了进行4Gbps的信号传输就需要把总线的数据速率提高到5Gbps。相应地,如果要进行8Gbps的有效数据传输就需要把总线的数据速率提高到10Gbps,而10Gbps相对与8Gbps的数据速率来说,对于硬件人员的设计经验、接插件、板材都有比较高的要求,所以很多10G左右或更高速率的总线都不再使用8b/10b编码方式。比如PCI-E1.0和PCI-E2.0的总线速率分别为2.5Gbps和5Gbps,都是采用8b/10b编码,而PCI-E3.0的总线就舍弃了8b/10b的编码方式,数据速率为8Gbps,是通过效率更高的128b/130b的编码结合更复杂的扰码的方法来实现直流平衡和嵌入式时钟的。另一个例子是FibreChannel总线,1xFC、2xFC、4xFC、8xFC的数据速率分别为1.0625Gbps、2.125Gbps、4.25Gbps、8.5Gbps,都是采用8b/10b编码,而16xFC、32xFC的数据速率分别为14.025Gbps和28.05Gbps,采用的是效率更高的64b/66b编码方式。

来源:网络整理,如涉及版权问题,请及时联系删除

ansi编码转换_8b/1b编码是个什么东东相关推荐

  1. C#怎么将GBK编码转换成UTF-8编码?

    C#怎么将GBK编码转换成UTF-8编码? private void ChangeEncode(Encoding fromCoding,Encoding toCoding,string fileNam ...

  2. 在线编码转换/在线各类编码转换工具

    在线编码转换 链接: 在线编码转换. 链接: 在线编码转换工具. 在线 \u5728\u7ebf 离线 \u79bb\u7ebf

  3. html中转换utf8编码,如何将html网页utf-8编码转换到utf-8编码互转换

    HTML网页是有编码的,在head区域内的这句话是告诉浏览器,该网页采用的是utf-8编码,也就是简体中文编码.当文章/网页中包含繁体中文.日文.韩文时,这些内容可能无法被正确编码. UTF-8是UT ...

  4. html js utf8编码转换器,用Javascript实现UTF8编码转换成gb2312编码

    //把编码转换成 gb2312编码 function UrlEncode(str) { var i, c, ret="", strSpecial="!\"#$% ...

  5. 编码转换使用java_java编码转换的详细过程

    常见的JAVA程序包括以下类别: *直接在console上运行的类(包括可视化界面的类) *JSP代码类(注:JSP是Servlets类的变型) *Servelets类 *EJB类 *其它不可以直接运 ...

  6. Python:UTF-8编码转换成GBK编码

    2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # -*- coding:utf-8 -*- #UTF-8转换成GBK编码 #te ...

  7. 中日文字编码转换_关于编码你必须知道的知识和技巧

    知其然,知其所以然,彻底搞懂编码,搞定乱码 乱码问题是所有运维职业生涯中都会遇到的问题,本篇文章带你探究背后的原理以及解决的技巧 字符编码 我们知道计算机只认识二进制数据,其他格式的数据都需要转换成二 ...

  8. ios html 编码转换,IOS中编码转换方法(转)

    IOS开发中编码转换方法是本文要介绍的内容,主要是来学习一下编码转换的内容,不多说,直接来看详细内容.我们可以使用以下方法进行编码转换.NSString*str2= [NSString stringW ...

  9. oracle编码转换utf16,oracle编码转换:AL32UTF8-ZHS16GBK

    --修改Oracle数据库字符集为utf-8: SQL>conn / as sysdba; SQL>shutdown immediate; SQL>startup mount; SQ ...

最新文章

  1. C++ 笔记(01)— 环境设置(安装g++、g++ 编译 C++、 生成可执行文件流程、解释器与编译器区别)
  2. 申请加入 “WebGIS” 团队
  3. Config程序配置文件操作实践进阶之ConfigurationSectionGroup
  4. webview检测html事件,在JavaFX WebView中检测HTML textarea onkeyup事件
  5. JVM Class字节码之三-使用BCEL改变类属性
  6. 使用Oracle验证外部数据
  7. canvas 圆角矩形填充_一篇文章让你学会你最“害怕”的Canvas,太有意思了
  8. 网吧服务器RAID 0+1硬盘阵列组建图解
  9. 软件开发有哪些规范和标准_高品质、标准化——四维图新自动驾驶地图通过ASPICE CL2认证...
  10. java array 元素的位置_介绍java中的两种排序工具Arrays和Collections
  11. 图像的灰度化、二值化
  12. 视频编辑转换 ViscomSoft SDK ActiveX 19.0
  13. 使用ProcMon 输出调试信息
  14. TQ2440 mifi驱动及开机自动连接wifi全过程
  15. Relevance Vector Machine (RVM)简介
  16. 三次多项式的因式分解
  17. c语言 输出音频 单片机,单片机播放WAV格式音频的理解
  18. 并发——抽象队列同步器AQS的实现原理
  19. Micro(三)[服务创建]
  20. 记牛客2018真题笔试刷(二)

热门文章

  1. 【渝粤题库】陕西师范大学210002儿童文学 作业(高起专、高起本、专升本)
  2. 工业控制中无线局域网应用前景分析
  3. java怎么使异常不起作用_java – @Test(expected = Exception.class)对我不起作用,我错过了什么?...
  4. linux手机摩托,Linux操作系统触控智能机 摩托ZN4图赏
  5. java 注解 属性 类型_收藏!你一定要知道的Java8中的注解
  6. python学生管理系统类图_类图 python
  7. mysql 数据传输 定时,MySQL数据库定时备份的实现方法
  8. Math.random()获取随机数
  9. 如何开发一个可运维系统的一点体会
  10. 关于python的单线程和多线程