DIY编程器网

标题: 《玩转IP core》之十四:我的地盘我做主,锁相与分频 [打印本页]

作者: admin    时间: 2014-10-12 16:22
标题: 《玩转IP core》之十四:我的地盘我做主,锁相与分频
很早很早以前,给大伙儿介绍过有关系统时钟的问题。对的,就是《统一行动听指挥》那个讲座。这个里面,老衲曾经告诫大家:没事别打时钟的主意。现在,大伙儿学习了这么久了,也该是属于身怀绝世的。所以,这一讲,贫僧就带领大家去摸一摸系统时钟这一个老虎的屁股。
       
        在做设计的时候,谁都希望片子的输入时钟是稳定的、可靠的,并且和我们系统的采样频率是一致的。这是最理想状态。可惜啊,希望是丰满的,现实是骨感的。很多时候,情况并没有这么理想。这种时候,就需要我们自己调节系统时钟,达到系统工作的目的了。不是大伙儿“无知者无畏”,是不得不为啊。实际上,在很多通讯系统中,对于系统时钟的调节都是不可避免的。
       
        这个老虎屁股呢,也分左右两瓣。左边的叫“锁相”,右边的叫“分频”。下面,待鄙人一一道来。
        说书的一张嘴,难表两家的事。洒家我,先由锁相这桩事情上面讲起好了。
       
        一个系统上的时钟控制着整个系统的时序节拍,以及所对应的一切行为。一个存在不稳定、不可靠时钟的系统,就像一个心率不齐的人,早晚要挂掉的。人得了心脏病,需要安装起搏器;系统时钟不稳,就需要锁相器了。
       
        与时钟调节有关的系统,如下图所示。其中,数模转换器(DAC)和压控振荡器(VCO,Voltage Controlled Oscillator)一般位于FPGA/ASIC之外的,用虚线标识。锁相器的输入有两个。一个是VCO输出的系统时钟信号,另一个是一个高精度的参考(时间)信号。这个参考信号可能来源与任何高精度的时间源,例如GPS接收机输出的一秒钟脉冲信号等。锁相器的作用就是控制时钟与高精度的参考(时间)信号同步。
       

       
         
        锁相分为模拟锁相和数字锁相两种。模拟锁相比较复杂,略去不讲。数字锁相里面又分为有直接的参考信号与需要在接收信号里面提取参考信号的两种。需要提取参考信号的锁相,也涉及到信号处理知识,不是一两句说的清楚的,也按下不提。这里,只掰扯一下有直接参考信号的锁相的实现。(不准丢臭鸡蛋。这是为你们好。这么晚了,讲数学不合适,大伙儿都会去见周公的。)
       
        多说一句,在接收信号里面恢复参考信号很难,然而一旦恢复了,下面的内容一样适用。怎么说,大伙儿也算半吊子了。另外的半瓶子水,叫算法工程师们去头痛好了。啦啦啦…!“事不关己不开口,一问摇头三不知”,这才是生存之道。美其名曰,子曾经曰过:“不在其位,不谋其政”。跑题了,这些职场秘籍怎么也说出来了,我有罪。
       
        还是拉回来,讨论我们的锁相。大家不反对系统的时钟固定吧?也不反对系统时钟和参考信号是整数倍的关系吧?也就是所,一个参考信号周期里面,应该有多少个系统时钟节拍应该是固定的、已知的。
       
        有点想法了,是吧?我们在一个参考信号周期里面计数。如果得到的值就是已知的值,那么时钟是准的,不需要调整。如果偏大或者偏小,那么时钟不准,需要调整。
       
        例如:一秒周期的参考信号,1 KHz周期的系统时钟。那么,一个参考信号周期里面应该有1000个计数。如果计数值是1000,那么就时钟准确,不调节;如果如果计数值是1001,那么时钟快了,需要调慢点;如果如果计数值是999,那么时钟慢了,需要调快点。
       
        这就是锁相的基本思想,恭喜你掌握了。
       
        锁相系统的基本结构,如下图所示。按照惯例,时钟不体现在图里。各个单元的功能理解起来并不难,但是还是有几个部分需要好好掰扯掰扯。
       

       
         
        首先,为什么要采用沿捕捉单元,而不直接引入高精度参考信号呢?这是因为,一般而言参考信号与系统时钟不是沿对齐的。如果直接采样,可能产生问题。这是一个外部非同步信号作为系统内部使能信号的基本处理方法,大家牢记。
       
        其次,为什么没有在清零的时候,对于沿捕捉单元的时延进行补偿呢?这是因为,每一次的参考信号的沿捕捉的时延都是一致的,因此,沿捕捉单元的时延不会影响参考信号的周期,所以不必补偿。
        最后,比较器的输出是三值的:相等、大于和小于。理由嘛,上面论述已经明确了,在这儿就不多说了。还有,如果参考值可编程,那么这就叫可变锁相单元。这个名字可以拿出去唬人,市场人员喜欢。
       
        花开两朵,各表一枝。下面,我们接着摆摆分频器的龙门阵。
       
        分频器是另外一种时钟控制的方法,主要是通过对于PCB板上时钟的改变,产生我们真正需要的时钟。
        当然,不可否认PCB板上的时钟最好就是系统所需的时钟。但是,在很多情况下,这是无法做到的。举一个典型的例子,这就是多模手机,不同无线接入模式所要求的系统时钟是不一样的,而PCB上的VCO的调节范围是有限的,所以必须通过分频方式获得当前工作系统所要求的时钟。
       
        分频器也分模拟和数字两类。模拟分频器也可以做成倍频器,可以非常有效的提供需要的频率,但是基于我们讲座的范围,佛主说:不能说,不可说。数字分频器有一个特点,就是只能降低频率不能升高频率。并且,数字分频器产生的时钟,也无法保证50%的占空比。但是,数字分频器结构简单并且便宜,所以也还是有应用的场景的。
       
        还有需要注意的是,如果采用了分频器产生系统时钟。对于ASIC设计而言,必须通知后端布线工程师,分频器的输出必须由全局时钟树传递。如果用的FPGA,就要请PCB布线工程师吃饭,请他们分配一个输出管脚作为分频器的输出。同时,这个输出需要通过PCB引入FPGA的一个时钟输入管脚,好进入全局时钟线。
       

       
         
        数字分频器分为整数分频器和小数/分数分频器两种。整数分频又要细分为奇数分频和偶数分频两种。由于设计小数/分数分频的时候,奇数分频和偶数分频都会出现,所以我们先从整数分频说起。想要考秀才,先读三字经。
       
        偶数分频是最是简单,假设分频倍数是2K。那么,做一个满值2K-1的计数器,当计数0和K-1的时候,输出翻转一下,就好了。下图是8分频的时序图。
       
        这里面还有一个小技巧:如果分频倍数是2的幂,可以节约一个判断,输出时钟就是计数器内部变量的最高位。
         
       

       
        奇数分频是稍稍复杂一点,假设分频倍数是2K+1。那么,做一个满值2K的计数器,当计数为0时,输出翻转一下。另外一个翻转是先小后大,还是小大后下,或亦大小小大,您随便,反正结果是一样的。下图是5分频的时序图。
       

         
        小数/分数分频的情况,略略复杂一点。
       
        这时候,分频操作需要通过M1个N分频和M2个(N+1)分频实现。首先,假设分频倍数为P,那么N就等于P的整数部分。同时,P的小数/分数部分可以表示为X/Y,其中X和Y都是整数,Y > X(最好,X和Y是不可约的)。则有:M2 = X, M1 = Y – X。(多说一句,网上很多小数/分数分频的资料,里面唧唧歪歪地写了一堆,就是不给我这里的公式。不知道是故意还是无意。还记得,当年还是的小沙弥的我,很是郁闷了一阵子。)
       
        这里面的推导并不难,但是实在懒得输入公式了。懒惰是工程师进步的阶梯。
       
        上面的写法有点抽象,一下我们举一个具体的例子,把5 MHz信号转化为4 MHz信号。分频倍数 P = 5 MHz / 4MHz = 1.25,所以 N = 1(就是不分频了)。P = 0.25,X = 1, Y = 4,因此M2 = 1, M1 = 4 – 1 = 3。也就是说,一个变化周期需要不分频3次,2分频1次。
        大伙一起算算,这个5MHz如何就成了4 MHz 了。上面说的一个变化周期,输入时钟变化3 + 1 × 2 = 5次,而输出时钟变化 3 + 1 = 4次。这样1秒里面,输入时钟变化5000次,对应输出时钟变化4000次,就是4 MHz的时钟了。
       
        下面是对应的时序图。
       

       
         列位不难发现,正如鄙人在前面提到的,大多数分频出来的时钟的占空比不是50%。
        更加可怕的是,小数/分数分频的时钟周期是不稳定的。对于,小数/分数分频的情况,需要多说一句,在评估时间的时候,需要按照较快的时钟周期(也就是N分频的时钟)来估计。
       
        这正是:时钟皆云拦路虎,锁相分频心有数。不同场合巧选择,我的地盘我做主。
       
        至此为止,终于结束了第二篇《单元篇》的内容。最后有点时间,再多啰嗦几句。反正,贫僧这个“唐僧”的名声是出去了,所谓:债多了不愁,虱子多了不痒。
       
        首先,受限于这个讲座的篇幅,这里肯定没有覆盖所有的设计中可能涉及的单元。说句实话,恐怕提到的模块也就十之一二罢了。您也不要有意见,真给您来个不是十八讲而是八十讲的讲座,估计您也没有耐心看下去。还有就是,看再多讲座,也是需要自己亲自做做。宋诗有云:“纸上得来终觉浅,绝知此事要躬行”。
       
        其次,虽然本讲座没有涉及全部模块,但是单元设计的思想,应该已经在所述的内容里面呈现给诸位了。那就是根据系统需要,尽量不败家地设计。自己掌握的如何,就看工程师的造诣了。俗话说:“师傅领进门,修行靠个人”。
       
        最后,仅仅了解单元篇里面的内容,还是不够的。下面是第三篇《系统篇》,大伙儿还会看到,这些单元是如何被打碎了,重新排列组合,以获得更好的系统架构的。只有站得高才能看得远,同样,只有系统把握得全面才能设计的好。唐诗有云:“会当凌绝顶,一览众山小”。
         
        --------
        《玩转IP core》之一:我们的目标是ASIC
        摘要:具体到一个产品里面,到底是采用FPGA还是ASIC,这个问题是多方面确定的。简单说,如果产品出货量小、时间紧、生命周期短,那么FPGA比较适合;反之就建议ASIC。但是,也不是完全绝对的,就像很难说少林和武当那个更牛一样。
         
        《玩转IP core》之二:所见非所得
        摘要:Verilog语言是由Gateway设计自动化公司的工程师于1983年末创立的;VHDL语言诞生于1983年,1987年被美国国防部和IEEE确定为标准的硬件描述语言。这个古人也“古”不到哪里去。上板砖!
         
        《玩转IP core》之三::统一行动听指挥
        摘 要:现在我们正沿着PCB数据大道,走向芯片大厦----就是大家眼前的巨大的、银色的大厦。我是本次旅行的导游,敝姓十,大叫可以叫我十导。路途之中, 为了大家不感到无聊,本人先给大家略略介绍一下,什么是数字电路的时钟。数字电路中,时钟是整个电路最重要、最特殊的信号。
         
        《玩转IP core》之四:踏雪寻熊---面积与速度的协调
        摘 要:具体到我们的FPGA/ASIC设计,这个“鱼”就是面积,而“熊掌”时钟频率(速度)。能不能很好的协调面积与速度的关系,是衡量一个数字逻辑设计 工程师能力的一个重要标准。在本讲座的第二篇里面,会说明各种单元模块的不同面积和速度的基本解构;在第三篇中,则会通过例子,介绍如何在系统中很好综合 考虑两者的关系,选择比较合适的实现解构。
         
        《玩转IP core》之五:测试向量生成
        摘要:在不考虑电源输入的前提下,在我们系统/板子上,能够不依靠其他外界输入而产生输出信号的器件有木有呢?当然有,而且必须有,那就是大名鼎鼎的晶振了,用来产生我们说过的、对以系统极端重要的系统时钟信号。
         
        《玩转IP core》之六:程咬金的三板斧--系统基本结构
       
        摘要:今天我们开始进入本讲座的第二部分:单元篇。大家将会发现,我们在基本单元设计里面,也就是三板斧:查找表、时分复用和流水线。但是,我们比程大将军稍稍高一点,我们会把这三招糅合,能产生变招。
         
        《玩转IP core》之七:一个计数器引起的思考
        摘 要:设问句:在进行一个计数器单元设计之前,我们需要什么前提条件呢?首先,需要功能描述(一个计数器嘛,不就是在不是复位“RST”的状态,每来一个时 钟内部/输出加一吗?还描述什么啊?磨洋工吧?----“非也,非也”,这个还是要描述一下。至少我们需要知道一下计数器的内部位数吧?也就是,计数器加 到多大回到0。)另外,就象我们在前面“菜谱”那一讲里面说过的,需要了解系统需要的时钟频率。
         
        《玩转IP core》之八:小学一年级水平,加法器的结构
        摘要:工程设计里面有一个原则:从简单做起。这里面还有一个小故事,今天就不讲了。现在,我们先瞧瞧最简单的一个比特位宽的加法器:半/全加器。全加器的输入为三个一比特的信号a0、a1,还有低位的进位c0;输出也是两个一比特的信号:结果s和进位位c1。
         
        《玩转IP core》之九:小学二年级水平,乘法器的结构
        摘要:大伙儿已经通过两次讲座,了解了计数器和加法器大体结构。大家不难发 现,同样的一种功能,可能由于需要、工作频率和代价的不同要求,存在若干种不同的结 构。这些结构如何选择,实际上是一个艰难的选择。这些选择,很多时候都是靠一个工程师的经验(我们老年人也就靠这个混口饭吃了。要不就被“长江后浪推前 浪,前浪死在沙滩上”了)。
         
        《玩转IP core》之十:除法器的结构
        摘要:如果各位在加法器和乘法器里面可以欣赏到了变化多端的话,那么在下不得不很遗憾的通知诸位:除法器里面大家只能看到“自古华山一条路”。不是 我保守,是除法这个东西的本性。用《数学分析》里的说法,加法和乘法都是线性运算满足交换律的,除法是非线性运算不满足交换律的。这是数学上的根子,可以 用来唬人。
         
        《玩转IP core》之十一:非线性求值的孤独九剑,CORDIC方法
       
        摘要:现在来个“师夷长技以制夷”,给大家画画CORDIC的流水线(因为是小数运算,假设实数“1”为十六进制的全1,实数值就可以折算了。这是普遍的技巧,不详述。)。还有一个小技巧就是由于每步的放大作用,公式里预先收缩了一把。
         
        《玩转IP core》之十二:电路串串香,D触发器链  
        摘要:今个儿寡人给大家讲点有“理论”的:CRC校验(循环冗余校验 码,Cyclic Redundancy Check)和编码器。CRC校验的目的就是看接收的一串比特和原来发射的是不是一致,有没有接收误码。CRC在编码界的春典,就是“gCRC16(D) = [D16 + D12 + D5 + 1]”和“1 0001 0000 0001 0001”。给大家一个口诀:“延时触发串一串,遇到一字砍一段。输入牵来异或算,输出导出入口看。”
         
        《玩转IP core》之十三:简直的层层叠,FIR滤波器的串联实现
       
        摘要:今天我们继续信号处理的行程,给大家介绍FIR滤波的串行实现。却说“请介绍FIR滤波器和IIR滤波器的差别”,这可是一道非常典型的面试题。这道题目类似于《哈利波特》里面那个“分院帽”的作用,当然这个题目里面没有宝剑。
         
        《玩转IP core》之十四:我的地盘我做主,锁相与分频
        摘要:在做设计的时候,谁都希望片子的输入时钟是稳定的、可靠 的,并且和我们系统的采样频率是一致的。这是最理想状态。可惜啊,希望是丰满的,现实是骨感的。很 多时候,情况并没有这么理想。这种时候,就需要我们自己调节系统时钟,达到系统工作的目的了。不是大伙儿“无知者无畏”,是不得不为啊。实际上,在很多通 讯系统中,对于系统时钟的调节都是不可避免的。
         
        《玩转IP core》之十五:国球与其它,输入输出介绍
        摘要:我们现在正式为《第三篇:系统篇》剪彩(哗哗哗,掌声响起来,我心更明白…)。在这一部分里面,会在更高的层次上,分析设计问题。大伙儿不仅 仅能看到《单元篇》里面的各个部件的应用,而且会发现系统绝对不是单元的简单的搭积木。在整个讲座里面,“变化”是永远的主题。
         
        《玩转IP core》之十六:来个批发价,多路数字中频系统设计
        摘要:数字中频主要分两种类型:数字上变频(DUC)和数字下变频(DDC),它们的主要功能是相反,但原理和实现的方法是十分相似。由于FIR滤波器里面讲的是下采样的例子,这里也就以数字下变频作为例子,这样匹配。
         
        《玩转IP core》之十七:看客做饭,CDMA接收机的同步
        摘要:这一讲里面会介绍CDMA系统的同步部分,这不是重点。关键是,大伙儿会看到同样的算法,在终端和基站侧由于系统用户数目不同,会有不同实现。这是给大家的一个启示:不能因循守旧,要与时俱进。
         
        《玩转IP core》之十八:磨刀不误砍柴工,程序的风格
        摘要:“代码风格和规则”这个问题,很多人看来不是十分重要。但是,我问问大伙儿几个现象,看看是否遇到过?过了三个 月,读不懂自己的程序的,有木有?看别人代 码,赶脚不如自己重写的,有木有?做C代码的,竟然能看懂你的程序的,有木有?调试的时候,感觉是老虎吃天----无从下口,有木有?如果有,以老衲的经 验,多多少少和“代码风格和规则”有些瓜葛。
        ------------------=--------
        如果你从事FPGA研发,或者你对IP core设计感兴趣,欢迎关注《玩转IP core》系列技术讲座,每周三加菲博士与你不见不散,如果针对本讲座有任何技术问题欢迎与加菲进行技术互动可以加入QQ群(FPGA交流圈:23294742),或者去交流区提问:《玩转IP core》交流区
       
        关注与非网官方微博:http://e.weibo.com/eefocus 我们的讲座内容将在微博同步更新。
       
        加菲独家供稿与非网,谢绝任何形式的转载,与非网做你技术生涯中最有价值的电子网站。




欢迎光临 DIY编程器网 (http://diybcq.com/) Powered by Discuz! X3.2