正文内容均来自于Henzler于2010年发表的《Time-to-Digital Converters》。
最近在学习TDC,新的东西太多了,看了一遍忘得很快,碰巧前两天看到了有关费曼学习法,打算通过写博客来总结每个阶段的所学(其实就是疫情在家闲得慌/狗头),希望自己能够坚持。文中所有内容都是我个人对上述文献的一些总结,我还很菜,如有错误,敬请指正。
一、为什么会有TDC(时间数字转换器)?
到目前为止,芯片设计的总体1方向是,越来越小的面积,越来越低的功耗。以我目前正在学习的CMOS工艺为例,要使面积缩小,晶体管的尺寸也要随之减小,要使功耗降低,使电源电压降低,从而带来了设计上的一系列问题,如:晶体管的增益降低。尽管可以通过cascode结构、增加输出阻抗、使用有源负载等传统方法来改善增益。但由于电源电压的限制,即使提高了增益,电路的响应速度和电压摆幅也有可能因此而受到影响。尤其是电压摆幅降低,会使信噪比降低,降低输出信号水平。而在此基础上,数字辅助或增强技术( Digital assist or enhancement techniques)可以用更小的代价来更好的实现这些功能。举个简单的例子:

在电压域中,电源电压变低,而噪声没变时,噪声对信号的影响就会愈发明显。而若将电压值转换成是与之对应的时间值(就类似于ADC将模拟电压值,转换成二进制码),则即使电源电压变小,要保证与原来相同的信息量,只需要增加时间长度即可。噪声存在于边沿跳变时刻,随着工艺的进步,边沿跳变时长会越来越短,并不会像电压域那样产生巨大的影响。这样就解决了上面所述的电源电压降低带来的一系列问题,将信号处理从电压域转到了时域,一系列新的技术应运而生。
二、第一代TDC(模拟TDC)
第一代TDC设计的目的似乎只是为了将时间值测量出来。结构图所示:

框图和时序图如上所示。先通过脉冲信号发生器,将Start(时间起始信号)和Stop(时间结束信号)之间的时间间隔装化成脉冲信号(如波形Vp),再通过积分器,将脉冲信号转化成电压信号传递给ADC,最后输出数字信号。假设ADC位数为N,则该TDC的动态范围

由上式可见,当TDC测量的范围越大,由于ADC的位数固定,所以TDC的分辨率也就越低。
长时间的测量需要分两个阶段来进行:长时间间隔的粗量化(由时钟周期数得出),以及粗量化之后剩余部分的细量化(由上述结构得出)。
有几个问题会降低TDC得性能:脉冲发生器、积分器和ADC必须满足整个TDC的线性要求。
普通的积分器是通过一个电流源连接到一个积分电容来实现的,由于实际电流源的输出电阻是有有限的,所以线性度也很弱。可以用有源RC积分器(运放结构)来解决线性度的问题,但是运放有限的带宽限制了积分电路的速度和最小时间间隔。导致分辨率不会很高。
上述测量方法都是要在已知电阻电容具体值的情况下进行的,属于绝对时间测量方法。而由于工艺原因,电阻与电容的值不可能十分精准,故需要校准。而相对测量方法可以有效的避免这个问题。


可以通过双斜率积分来实现相对测量。主要分为两个测量阶段:
第一阶段,up支路有效, 将Start信号与Stop信号的时间间隔转换为脉冲信号,再通过积分器转化为电压信号,将电压信号输入到电压比较器的正输入端,作为参考信号。
第二阶段,down支路有效,进行为第一阶段1/p倍速度的积分,知道积分出的电压值与第一阶段的输出相等,比较器翻转,计数器输出计数值。
如此,就有了第二阶段的积分时间 t2 ,是第一段积分时间 t1 的 p 倍,而计数器在第一和第二阶段都是计数的,所以计数器的输出应为(1+p)t1,再通过 t1 与输入的关系,只要已知 p 即可得到输入。p与电容和电流的比值有关,为(C2*I1) / (C1*I2)。
基于双斜率方法的TDC,前一段时间还读到过一篇:
A Low-Cost Low-Power CMOS Time-to-Digital Converter Based on Pulse Stretching (2006)
该文章是用pulse stretcher(脉冲展宽)电路来粗量化之后的剩余部分进行展宽,再进行细量化。优点是在保证了分辨率的同时,还有低功耗的特点。
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
我需要一个表,其中行实际上是2行表,一个嵌套表是..我怎样才能在Prawn中做到这一点?也许我需要延期..但哪一个? 最佳答案 现在支持子表:Prawn::Document.generate("subtable.pdf")do|pdf|subtable=pdf.make_table([["sub"],["table"]])pdf.table([[subtable,"original"]])end 关于ruby-on-rails-PrawnPDF:Ineedtogeneratenested
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas