草庐IT

我的组会内容分享(部分)CDR+CTLE+DFE

偏偏多退一步 2023-07-08 原文

在串行IO系统中,时钟分配是一个非常重要的问题。最早的时候,发送端和接收端使用一个共同的时钟,都可以实现有效传输,但是数据速率到达100MHZ以后,效果就非常差。这时候出现两种主流的时钟分配方案。一种是转发时钟,一种是嵌入式时钟。左图是转发时钟的串行接口系统的一个示意图,它将发送端的时钟通过一个转发时钟通道转发给接收端。由于转发时钟被通道衰减,因此在接收端需要良好的时钟接收放大器,并且由于存在时钟偏斜,而时钟偏斜会限制前向时钟I/O性能 ,因此需要去偏斜电路以允许更大的数据速率。但是还有一些缺点,比如说驱动器强度和负载不匹配 、互连长度不匹配 、低通通道导致抖动放大 、 转发时钟的占空比变化。而嵌入式时钟指的是信号接收端并不直接接收发送端的时钟信号,而是从接收到的数据当中还原出对应的时钟信号,也就是时钟数据恢复电路。

时钟和数据恢复系统 (CDR) 产生时钟来采样传入的数据。时钟的有效频率必须等于传入数据速率。而且采样时钟应与传入数据具有适当的相位关系,以获得足够的定时裕度,以实现所需的位误码率 (BER)。同时要求CDR有效抖动小。

CDR环路的结构和锁相环有些类似,都是通过检测输入信号和本地时钟的相位差,然后反馈到本地时钟上来实现相位锁定。但CDR的输入信号并不是时钟信号,是无规则的非周期信号,所以在鉴相器上不能直接套用锁相环的方式,而是需要一些特殊结构。CDR需要从传入数据中提取时钟频率和最佳相位位置、相位检测连续运行、需要大的带宽来减小抖动。目前主流的CDR实现方式一般是基于PLL的CDR和具有PLL或DLL和相位插值器 (PI) 的 “双环” 体系结构的CDR。这种双环cdr需要仔细的设计考虑和控制硬件,以确保两个回路在锁相期间不会干扰或冲突它们对本地振荡器的并发控制。

CDR按照有无参考时钟可以分为有参考CDR和无参考CDR。有参考的cdr需要参考时钟来恢复数据。此参考时钟一般是由锁相环生成的,保持接近预期传入数据速率的频率。不使用参考时钟而是需要对片上本地振荡器进行外部手动调谐的CDR也被视为参考cdr。这些手动调谐信号的作用是在开始恢复操作之前将初始压控振荡器 (VCO) 频率置于CDR的捕获范围内 ,因此此类信号仍被视为CDR的外部参考。而无参考cdr都无需外部晶体振荡器或手动调谐机制。但是,需要额外的频率检测和校正方案。但无参考cdr与参考cdr相比实现了显着扩展的捕获范围,并且如果需要,可以自动适应多个数据速率。

根据采样方式的不同也可以分为过采样CDR和波特率CDR。传统的过采样设计,例如2 × 过采样cdr,每单位间隔 (UI) 对输入数据波形进行一次以上的采样,以恢复相位误差信息 .基于过采样的CDR基本思路是使用两个时钟,对每个输入数据分别进行两次采样,一次采样数据本身;一次采样数据的边沿。输入的边沿时钟和数据时钟保持半个数据周期的相差,然后将边沿时钟与输入数据的边沿对齐,就可以保证数据时钟在输入数据的正中间进行采样了。典型的2 × 过采样架构中,需要边沿时钟采样与CDR相位检测器 (PD) 的数据时钟采样相结合,以确定时序恢复决策。波特率CDR只需要数据样本,根据输入数据的波形恢复时钟。波特率时钟消除了对额外样本的需求,与传统的过采样cdr相比,这可以减少接收器中所需的高速前端采样器的数量。同样,需要通过时钟分配网络路由更少的高速时钟,从而可以实现更节能的接收器。

 过采样CDR和波特率CDR主要差异在于鉴相器的不同。鉴相器分为线性鉴相器和非线性鉴相器。过采样鉴相器和波特率鉴相器都属于非线性鉴相器,也就是仅提供采样相位误差的符号信息,而不提供相位误差的幅度信息。最早的亚历山大鉴相器如右图所示。

波特率鉴相器根据输入数据的波形来判断输入时钟的相位的符号信息。

 在SERDES中,我们通常会使用一些均衡器来抵消通道带来的损耗。在接收端我们一般使用CTLE+DFE的方法。

 CTLE分为有源和无源的,但是无源没有增益,因此我们一般是用有源CTLE。CTLE,连续时间线性均衡器。它主要来补偿channel对高频信号的插入损耗insertion loss。CTLE, 一般靠手工配置,根据信道的loss来配置相应的值,信道的插损越大,CTLE需要配置的peaking值越大,以保证CTLE的输出满足VGA的输入要求。随着CS增大,它的零点和第一级极点向左平移,峰值不变。增大RS,将零点移动到较低频率并增加峰值 (降低DC增益)。

 DFE是因果关系,对于post的ISI干扰补偿非常有效,可以在没有噪声和串扰放大的情况下提高高频内容 • 滤波器抽头系数可以自适应调谐,而无需任何后通道。但是对于pre的ISI干扰无能为力,同时级数多了,会导致错误传递,即多个bit的burst错误。所以56G及以后的serdes,多采用FFE之后只有1个tap的DFE设计。

“post”是指数据"0" -> "1"或者"1" -> "0"跳变之后的预加重

“pre”是指数据"0" -> "1"或者"1" -> "0"跳变之前的预加重

 

 

 

有关我的组会内容分享(部分)CDR+CTLE+DFE的更多相关文章

  1. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  2. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  3. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  4. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  5. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  6. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  7. ruby-on-rails - 测试我的 Ruby gem:Shoulda::Matchers:Module (NoMethodError) 的未定义方法 `configure' - 2

    我正在开发我的第一个Rubygem,并捆绑了cucumber、rspec和shoulda-matches进行测试。当我运行rspec时,出现以下错误:/app/my_gem/spec/spec_helper.rb:6:in`':undefinedmethod`configure'forShoulda::Matchers:Module(NoMethodError)这是我的gem规范:#my_gem.gemspec...Gem::Specification.newdo|spec|......spec.add_development_dependency"activemodel"spec.a

  8. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  9. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

  10. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

随机推荐