SerDes interface参考设计_程序优化(8)
2015-08-27 11:20
246 查看
8 程序优化
在测试中,对timing的报告进行分析,发现制约传输速率的因素并非IO接口的速率,在LVDS接口中,IO可以跑到800Mhz,而是内部的逻辑时序跑不上去了,而制约速度的来源主要为两个地方,分别为接受部分的r_check模块、S2p_10bit模块。在没有进行优化前,timing的报告如下:
S2p_10bit模块:对时钟进行恢复,并将串行数据转换为并行10bit数据,其内部有一个4bit的count用于时钟恢复与数据串行转并行的数据个数计数,因为逻辑比较复杂,在timing report中,该count是制约时钟的主要因素。
R_check模块:将数据进行对齐的功能,其工作的时钟rclk由S2p_10bit的采样时钟10分频得到,在相对低的时钟域内,但是其内部有一个非常大的对比检测逻辑,对10bit的数据依次检测并对其,内部有10个else if,数据路径很长,也是制约速率的重要因素。
8.1 逻辑优化1:
S2p_10bit模块:将恢复的数据长度由10bit变为5bit,并在后级将两个5bit的数据进行拼接,这样可以的降低count的位数,由4bit变成3bit,同时降低的逻辑的复杂程度。R_check模块:comma码的关键在于其独一无二的7bit数据1111100,因此在程序设计是,comma检测可以由检测10bit的commaK28.5(0101111100)缩短为检测7bit的局部comma (1111100),这样可以在很大程度上降低逻辑的复杂程序。
以下是对逻辑进行优化后的timing report:
在优化后对逻辑进行了通信的测试,以下是测试的环境:
测试5:采用LVDS的IO标准进行数据传输,发送端发送8位的累加值,传输后经过在接受端对数据进行恢复并判断,测试平台为HR03的evb板,数据线为普通的杜邦线,线长约15cm。
系统时钟 | 测试时间 | 错误数据个数 |
250M | 1h | 0 |
260M | 1h | 1个/s |
在此约束条件下,系统测试结果如下:
系统时钟 | 测试时间 | 错误数据个数 |
270M | 1h | 0 |
280M | 1h | 0 |
290M | 1h | 10个/s |
在M7上做相同的处理的timing对比结果如下图:
未优化的timing。
优化后的timing。
测试6:采用LVDS的IO标准进行数据传输,发送端发送8位的累加值,传输后经过在接受端对数据进行恢复并判断,测试平台为M7的evb板,数据线为普通的杜邦线,线长约15cm。
系统时钟 | 测试时间 | 错误数据个数 |
270M | 1h | 0 |
440M | 1h | 0 |
450M | 1h | 1000个/s |
上图为约束时钟为2MHz时的report,该约束条件下,程序在20MHz的时钟速率下,数据传输都不稳定,而将约束提升为60MHz,虽然约束也不过,但是在硬件测试20Mhz的时钟速率工作正常。
下面是该段程序的代码:
该部分逻辑比较大,if语句的深度达到10个,由于路径过长,导致timing非常的糟糕。
鉴于上面的问题,发现上部分的程序对逻辑的速度影响很大,以下对其进一步改进,将对其的逻辑放在高速部分,将该部分对齐的代码直接全部去掉。
8.2 逻辑优化2
上图为未优化前的结构,该结构下,comma检测与数据流对齐放在了串并转换后实现,这种做法的好处在于可以讲检测与对齐的逻辑放在低频的时钟域内实现,该部分的逻辑频率为时钟采样频率的十分之一,也就是采样时钟为200MHz时,该部分逻辑时钟为20Mhz,但是通过上面的时序约束分析发现该部分comma检测的逻辑耗费的资源比较大,原因在于对其的数据都是串并转换后的,数据的位置都是固定的,需要对比的情况比较多,耗费的逻辑也比较大,timing非常的糟糕,现将对其的部分放在串并转换模块中,让其工作在高速时钟域内。具体的做法是在没进行串并转换前,将串行的码流现对其,在做串并转换,该做法的好处在于对数据流对其,其本身是流动的,不需要做多种情况的对比,只需要在每bit的数据到达后与comma进行对比即可,逻辑简化了许多,但是会对采样时钟的最高工作频率有一定的影响。
该方法的具体效果测试如下:
测试7:采用LVDS的IO标准进行数据传输,发送端发送8位的累加值,传输后经过在接受端对数据进行恢复并判断,测试平台为HR03的evb板,数据线为普通的杜邦线,线长约15cm。
系统时钟 | 测试时间 | 错误数据个数 |
200M | 1h | 0 |
250M | 1h | 1000个/s |
270M | 1h | 1000个/s |
8.3 逻辑优化3
偶然在一篇论文《SoftSerDes在大规模FPGA中的应用研究》中发现了下面的思路,本以准备放弃优化,在看完该思路后,由进行了一次优化试验。论文介绍如下:复用器和解复用器是Serdes设计的重要模块,在整个电路中它们工作速度最快,
直接影响输出数据的抖动和恢复数据的准确性。如果复用器和解复用器设计不好,会影响输出信号的误码率。复用器的设计会影响数据相关抖动(data depender jitter,DDR),解复用器的设计会影响时钟采样输入数据的时间窗口(timing
window)。
复用器是用来把并行数据转换为串行数据,经过复用器产生的串行数据经过线驱动器(line driver)输出,线驱动器可以驱动PCB线、铜缆和光电转换模块(opticalmodule)。解复用器与复用器的功能正好相反,把串行数据转换成并行数据。近年关于复用器解复用器的报导多数是用于同步光学网络SONET(SDH)系统的,并且可以获得很高的工作速度。但是SDH和以太网(Ethernet)的协议有所不同,使
得那些适用于SDH的电路并不适合Ethernet。用于SDH的复用器和解复用器一般采用树型结构(见图2.7)。树型结构较其他结构而言,更容易达到较高的速度,并且能够以最直接的方式实现SDH的功能,也具有最简单的结构和电路面积。
由于复用器和解复用器具有相反的功能,一个用于把并行数据转换成串行数据,另一个用于把串行数据转换成并行数据,所以二者具有相似的结构,差别仅在于数据传输的方向不一样。图2.5-2.7给出了解复用器的框图,复用器的框图只要改变数据输入输出方向,基本的类型有三类,即传统的移位寄存器型、多相位型和树型结构。图2.5的移位寄存器型的复用器和解复用器是一种直接的实现方式,它可以转换任意宽度的数据,它的最高工作速度受限于器件的性能,尤其是寄存器的性能,即使采用0.15umCMOS工艺,这种结构也仅能获得3Gbit/s的速度。因为有较多的器件工作在最高速度,移位寄存器结构的复用器和解复用器的功耗比较大。由于是同步电路,只要时钟信号很干净,移位寄存器型的复用器的输出数据的抖动就很小。
图2.6中的多相位型的复用器和解复用器消除了移位寄存器固有的器件性能的限制,而且也能够转换任意宽度的数据。只要精确的控制用于选通各传输门的脉冲信号之间的相位差,就可以获得很快的速度,然而,在所有传输门连接在一起的公共点,寄生电容随着数据宽度的增加而线性增加。当并行数据的宽度增加时,必然影响电路的工作速度。在版图设计的时候,必须仔细匹配每个传输门。要减小复用器输出数据的抖动,只要有可能就应该在复用器的输出端增加一个触发器重新同步输出数据。
树型结构的复用器和解复用器克服了前两种结构的缺点。因为所需的时钟仅为比特率的二分频、四分频和八分频等等,这种结构可以获得非常高的比特率。和多相位结构一样,如果可能,树型结构的复用器的输出端也应该加一个触发器以减小数据抖动。与多相位时钟的复用器和解复用器比较,树型结构的每个节点都不存在大的寄生电容,因而可以获得更快的速度。精确的控制到达每个1:2DEMUX的时钟信号是电路设计的关键。由于树型结构本身的对称性,可以相对容易的控制时钟信号。
在树型结构的基础上又发展了一种辅以频率转换的异步树型结构的复用器和解复用器,该电路用于光纤传输(Fiber Channel),所以需要转换10bit宽度的数据,但是为了获得尽可能高的速度,树型结构又是一种比较好的选择。频率转换电路是在发送端把10bit宽度的数据转换成8bit数据,然后经过复用器变成串行数据;在接收端经过解复用器得到8bit数据,然后再转换成10bit数据,并且伴随这种结构增加了字节对准电路。
上述的思路中的树形结构与第一次的优化的思路是类似的,第一次优化的思路是将串行的数据流转化为5bit的数据流,并由两个5bit的数据组合为10bit的数据,该思路可以认为是1级的树形结构,但是做的不够彻底,在看完上述思路后,对串并转换模块进行进一步的优化,将串并转换由5bit缩短为2bit,并通过2bit的数据进而组合为10bit的输出。
在实际的逻辑优化中,发现改为2bit输出,timingreport的fmax有明显的提高,同时逻辑复杂度也明显下降,以下是timing report的对比:
未优化的timing report
第一次优化后的timing report
第三次优化后的timing report
未次优化的S2p_10bit模块RTL schematic和资源利用情况。
第一次优化后S2p_10bit模块的RTLschematic和资源利用情况
第三次优化后的S2p_10bit模块RTL schematic和资源利用情况。
从上面的对比,可以看出,RTL在改为2bit输出后,结构有明显的简化,没有优化时,LUT占用个数为:53个,在第一次的优化后LUT的个数为31个,而经过第三次的优化后,其LUT的个数降低到了17个。
以下是发送累加计数器count(0-255),图中的模拟数据为输出的最终结果:
测试8:采用LVDS的IO标准进行数据传输,发送端发送8位的累加值,传输后经过在接受端对数据进行恢复并判断,测试平台为HR03的evb板,数据线为普通的杜邦线,线长约15cm。
系统时钟 | 测试时间 | 错误数据个数 |
200M | 1h | 0 |
270M | 1h | 0 |
280M | 1h | 0 |
290M | 1h | 1000个/s |
相关文章推荐
- Nhibernate报错:Initializing[Sys_User#1]-Could not initialize proxy - no Session.
- 【Axure学习】(三)Axure原型无法预览
- 装饰模式
- Linux学习日记--基础命令(5)--用户和组概念与管理--文件权限
- hadoop二 ---- hadoop伪分布式服务的搭建
- python调用数据库并查询
- CRC校验算法学习(这个算法看了很多遍了,都是囫囵吞枣,这次将资料拷贝到这里,好好学习一下)
- 让Robot Framewor跑失败的测试用例重新跑一边
- 如何在eclipse中使用scrapy?
- python调用数据库并查询
- PHPExcel开发者文档[中文版]
- WP8手机只有4GB存储不能升级Win10 Mobile(5GB)怎么办?
- opengl介绍
- 传参
- MFC_CString TCHAR的互相转换
- 原型模式
- 洗牌算法:随机打乱一个数组
- 【Axure学习】(二)Axure遮罩层
- JavaWeb中读取文件资源的路径问题
- Mac 常用快捷键