DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1436|回复: 0
打印 上一主题 下一主题

[待整理] 《玩转IP core》之八:小学一年级水平,加法器的结构

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-12 16:26:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
话说上一回,鄙人给大家介绍了一种最简单的功能单元----计数器,此中奥妙已是变化万千了。下面的几讲,都会涉及不同的功能单元,自然是更加的丰富多彩、仪态万千。因此上,亲们不要换频道,待小子慢慢道来。
       
        常言说得好:“学好数理化,不如有个好爸爸”,估计听我续道的都是没有好爹可以用来拼的,只好相信“学好数理化,走遍天下都不怕”了。既然如此,那大家还是保持安静,跟着我学学如何设计加法器,以后好做些无本买卖。
       
        工程设计里面有一个原则:从简单做起。这里面还有一个小故事,今天就不讲了。
       
        现在,我们先瞧瞧最简单的一个比特位宽的加法器:半/全加器。全加器的输入为三个一比特的信号a0、a1,还有低位的进位c0;输出也是两个一比特的信号:结果s和进位位c1。单元的真值表如下。好了,数字电路我们复习结束。做IP core的一个好处,就是组合逻辑不用化简,自然有软件帮你完成。所以,完全不必写s和c的公式(虽然,我还记得:s = a0 ⊕ a1 ⊕ c0、c1 = a0 a1 + a1 c0 + a0 c1。显摆一下下,是这属于画蛇添足的事情。小小的卖弄,大家不准BS我。)如果固定c0 = 0,那么就可以省略c0这个信号,就是所谓的半加器。以后的讲座里面,为了偷懒,我们就不严格区分全加器和半加器的概念了。
                               
                                        输入

                       
                               
                                        输出

                       
                               
                                        a0

                       
                               
                                        a1

                       
                               
                                        c0

                       
                               
                                        s

                       
                               
                                        c1

                       
                               
                                        0

                       
                               
                                        0

                       
                               
                                        0

                       
                               
                                        0

                       
                               
                                        0

                       
                               
                                        0

                       
                               
                                        0

                       
                               
                                        1

                       
                               
                                        1

                       
                               
                                        0

                       
                               
                                        0

                       
                               
                                        1

                       
                               
                                        0

                       
                               
                                        1

                       
                               
                                        0

                       
                               
                                        0

                       
                               
                                        1

                       
                               
                                        1

                       
                               
                                        0

                       
                               
                                        1

                       
                               
                                        1

                       
                               
                                        0

                       
                               
                                        0

                       
                               
                                        1

                       
                               
                                        0

                       
                               
                                        1

                       
                               
                                        0

                       
                               
                                        1

                       
                               
                                        0

                       
                               
                                        1

                       
                               
                                        1

                       
                               
                                        1

                       
                               
                                        0

                       
                               
                                        0

                       
                               
                                        1

                       
                               
                                        1

                       
                               
                                        1

                       
                               
                                        1

                       
                               
                                        1

                       
                               
                                        1

                       
         
       

       
        这两个玩意儿,属于上海话说的“没花头”的东西。我们之所以要提提它们,是因为本讲以后有用。史记里面说“天下熙熙皆为利来,天下攘攘皆为利往”,不是我教你坏,工程师一定要做到“无利不起早”。
         
        下来我们就来摆一摆多比特位数的加法器的龙门阵。后面,本讲座均以4比特加法器作为例子。最基本的、组合逻辑的加法器如下图。这个叫逐次进位的加法器,建立时间为各级半/全加器的建立时间之和。在位宽很大的时候,这种单元可以允许的最高工作时钟频率是很低的,也符合我们在上讲里面画的图的趋势。
         
       

       
        在设计里面最怕的,这里有“之一”,就是这种串糖葫芦似的组合逻辑了。可以肯定地说,这种结构在位宽变大的时候,允许的最高工作时钟频率一定会急剧降低的。原因吗,是在于需要不停的等待。对于这种结构,要提高工作的最高时钟频率,就要采用我们前面在“三板斧”里面提到的方法了。这叫:“没有三把神沙,怎敢倒反西岐”。
        第一种方案是包治百病的狗皮膏药:查找表,这个就无需多言了,大家听得耳朵都要生茧子了。这里还有一个很多人津津乐道的“超前进位的加法器”的话题,这个可以看作查找表被简化的一种形式。我也不在此多啰嗦了,有兴趣的人们可以度娘之。
       
        第二种方案,也是耳熟能详的了:流水线。(下面这位说了:是不是也就忽略了。您老叫我“掐头去尾,不讲中间”啊?那我不就要回家喝西北风了吗?在下一个吃开口饭的也不容易,大爷也行行好啊!)列位先回忆一下我们前面“武林秘籍”那一讲里面的内容,什么“两条延迟链+组合逻辑”的结构啊,诸如此类的。
       
        我们现在来个“依葫芦画瓢”、“照猫画虎”。先加上输入a和b的延时链,在添上结果s的延时链,最后把组合逻辑的所有半/全加器组合进去。(感觉很象格格巫:“加一滴鳄鱼的眼泪,再来一根黑猫的尾巴毛……”)于是乎,不难得到下面的结构。
         
       

       
        等等,等等,列位看这个结构对吗?(凡是回答没问题的,都去面壁去!“错误等着你,为你惊天动地;流水线的时序充满着问题;错误欢迎你,在仿真中沮丧情绪;在加班中创造奇迹。”我时不时的会很刻薄的。
       
        没关系了,“人非圣贤,孰能无过”呢?错误是成功他亲妈。)
        有人不禁要问了:毛病出在什么地方呢?问题就出在进位位上,设计犯了“冒险主义”的老毛病。我们观察一个时钟沿上的、第二个比特上对应的加法器信号。输入a1和b1在时钟沿上变了过来,设计正确。然而,c0会怎么样呢?我们是组合逻辑获得的c0。同时,在时钟沿的时刻,c0由于a0和b0的变化,也会变的。这样结果延时链才到的s1以及输出的c1是不大会正确的。具体时序分析,参考下图。其中,标号里面的第二个数字,表示输入数据的排序。图里面为了表现的清楚,故意夸大了建立时间和信号skew,还忽略了组合逻辑建立期间的毛刺。
         
       

       
        一个不小心,就成了“画虎不成反类犬”了。时序设计容不得半点的马虎啊。
       
        修正以上的问题,我们再来一版:
         
       

       
        合唱队准备:“错误等着你,1-2-3, READY?唱!”这又怎么了?不是加了保护了吗?兄弟啊,你加了c的延时,对应c的时延多了,其他时延链不对应修改,这个信号不同步了。“智者千虑,必有一失”嘛。
       
        和大伙儿捉迷藏也玩够了,下面是正确的结构了。给了各位这没多有问题的设计,诸位可千万不要认为逼人的拖时间、赚稿费啊。上面可都是典型的错误,一般人不会告诉您。你自己玩的时候,又是经容易出的。加子曾经曰过:“有时候关于错误的描述,要比正确的答案来的更重要。”(“加子”是哪位啊?正是在下。)
         
       

       
        人道常言说得好:“熟读唐诗三百首,不会作诗也会吟”。我们没事常画图,不会工程也会面试了。诸位看来,上面的两个D触发器延时链,就是输入数据延时链;中间半/全加器就是通用模型里面的组合逻辑;下面的D触发器延时链,就是结果延时链。不知诸位可曾看清?没看清也没关系,看着看着,吐着吐着,就习惯了。
       
        上面图里面是一个比特操作,(要是炒作就好了,有钱赚),作为一个流水的步骤的。这种结构自然是允许工作时钟频率最高的,但是对应面积也最大。在不需要那么高的时钟频率的设计中,也可以考虑若干个比特操作作为一个流水的步骤的结构。具体一个步骤处理几个比特,可以考察组合逻辑的时钟评估确定。具体就是:作出N,N = 1,2…,的加法器允许工作时钟频率,把可以满足系统要求的、最大的N作为一个流水步骤里面处理的加法位数。当然,别忘了留下裕量,激进主义要不得。
       
        “花开两朵,各表一枝”,却说加法器的流水线还有一种实现方法。小伙伴不要惊呆了,早就说过了,这里有很多匪夷所思的西洋景的。
        伟大领袖毛主席教导我们:(不是眼保健操了,是老三篇的《矛盾论》。哈哈,有几人读过?我显摆显摆。
       
        )“分析问题要抓住主要方面。”我们来看看逐次进位的加法器的主要问题,就是上一级不许必须等待下一级的结果。叫上级等待,这个在政治上正确吗?值得商榷啊。
       
        我们再研究一下,上级再等什么呢?等的只有一个比特的进位信息。既然只有一个比特,那么就只有两种可能:“0”和“1”。有点想法没?(忙什么啊?不用写专利了,早就有的了。)
       
        思路是把运算分为两部:第一步算出所有可能的运算结果,低于最低比特运算就是半加器,对于其他运算则预先算出进位是“0”和“1”的结果;第二步根据进位进行选择,得到最终结果。一般而言,选择器比全加器的速度快得多,所以一个流水步骤可以容纳更多的“逐次进位”的处理。这样相对于,上面的逐次进位的流水线,信号的建立时间可以减少。但是,系统单元的面积也会急剧增加。另外,这种电路里面的毛刺也会比较多。
       
        下面是一个三级加法分段的例子,亲们可以参考。记住口诀:“一算二选”,以大家的IQ----“我看好你呦”。
         
       

       
        当然,对于工作的时钟频率要求很低的场景,也可以采用时分复用的方法。但是,一般全加器的结构比较简单,所以时分复用不一定可以节约面积的。这点大家需要慎重。
       
        写了好多啊,CPU都发热了。现在来个打油诗总结:“设计精髓变中求,加法讲座说因由。迥异两条流水线,速度面积各风流。”。
       
        下一讲,我们提升一个档次,来研究乘法器,预告一下下。
         
        《玩转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 我们的讲座内容将在微博同步更新。
       
        加菲独家供稿与非网,谢绝任何形式的转载,与非网做你技术生涯中最有价值的电子网站。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-8-2 23:03 , 耗时 0.091099 秒, 21 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表