DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

[待整理] 《玩转IP core》之六:程咬金的三板斧--系统基本结构

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-12 16:26:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
有诗赞曰:
        手持宣化开山钺,胯下大肚蝈蝈红;称霸混世大魔王,官拜大唐鲁国公。皇杠劫在小孤山,三斧定得瓦岗山;征南大战王世充,开唐位列凌烟阁。
       
        这里说的是一位古人,姓程名咬金,小名阿丑,山东东昌府东阿县斑鸠镇小耙子村人士。隋唐年间一员副将,他老人家最拿手的就是三板斧。所谓“一招鲜,吃遍天”,此人靠这一手,行遍大江南北,被封为唐朝的鲁国公,享尽人间荣华。
       
        今天我们开始进入本讲座的第二部分:单元篇。大家将会发现,我们在基本单元设计里面,也就是三板斧:查找表、时分复用和流水线。但是,我们比程大将军稍稍高一点,我们会把这三招糅合,能产生变招。
       
        闲言少序,言归正传。下面我们分别介绍这三招。(至于变招,我们会在后面的相关内容里面进行描述,评书里面说:“欲知后事如何,且听下回分解”。等等,别走!这还没开讲呢!)徒儿们,你们要听清楚、多记笔记,过了这个村可没这个店了。
       
        第一招:查找表。汉语名字叫查找表,(英文名字叫“Chazhaobiao”?您小沈阳看多了。)英文叫LUT,Look Up Table。是一种最简单的实现结构,传统上被贴上了大面积的标签(具体分析见本讲座“踏雪寻熊”一节),很少被待见(L兄哭了:“我招谁惹谁了,凭什么不用我啊?”)。在我们最初学习《数字电路》的时候,应该最常用的方法了。是否还记得,大家曾经乐此不疲的化简卡诺图,这就是查找表法了。现在EDA软件发达了,简化卡诺图工作不需要大家操心,计算机帮我们做的很好的,这对LUT是个好消息。
       
        下面给一个通用的LUT的形式:查找表原理上就是给出全部输入可能的输出,作出一张输出的“表”。假设输入为in1,in2…,输出为out1,out 2…,那么查找表可以表示为下图所示。里面好多的点点啊,左面是全部输入的组合(很多的啊,如果全部输入N bits,那么就有2N个呢),右边是出入对应的输出(可以由其他程序,例如仿真,得到)。如果输入规模很大时候,这个表是非常复杂的,因此很多材料不建议采用的原因。但是,考虑某些情况下,输入规模会很小的场景。此时,是不是可以考虑采用LUT了呢?L君终于有用武之地了。例如,后面会介绍的全加器,输入3 bits,输出2 bits。对于这种器件,可以考虑在Verilog用查找表实现,叫实现软件实现卡诺图的简化。简化的结果吗,就是我们数电老师成天和我们自夸的那两个公式了。(什么公式?不会吧,找本随便什么《数字电路》看看好了,一定有的。)
         
       

       
        LUT还有一种产生方法,就是利用RAM完成,如下图所示。具体方法是,用输入组成{…,in1,in0}作为RAM的地址,把这些输入的输出作为值存在RAM里面。这样读对应地址,就得到想要的输出了。这个方法在二进制逻辑里面用得不多,但是对于非线性函数求值却是一个常用的策略。这个问题,我们以后关于非线性函数求值的章节里面,有详细的介绍。
         
       

       
        为了便于记忆,这里给招法口诀一首专门讲的是如何做查找表:“皆说查找身材胖,瘦身即需输入少。全部输入连一串,输出数值列身旁。”第一招打完,收功了。
       
        下来是第二招,不是小鬼剔牙了,是时分复用。时分复用的基本思想是:对于一些需要处理速度比较慢、有重复运算的单元,在可以接受的建立时间内,多次重复利用有关的运算器件,以达到减少整个单元面积的目的。
       
        说了一堆严格的非人话,总结一下是必要的。
       
        首先,室分复用的应用的场合是“对于一些需要处理速度比较慢”,也就是需要的建立时间较长的单元。
        其次,这些单元里面,必须“有重复运算的单元”。例如:在FIR滤波器里面存在很多相同位数的加法,就合适采用时分复用。
       
        最后,时分复用的手段是“多次重复利用有关的运算器件”。
        前两个要点是第二招适用的场景,第三点是时分复用的实战招式(对方招架时,收斧头,献斧纂,攻击对方的脸。)。
        同学们,我们来解剖时分复用的结构。时分复用在流程上,很类似程序语言,运算不是以前我们介绍硬件描述语言那样并行进行的,而是按照一定顺序串行完成的。这个顺序,是设计人员按照系统的要求设计的,一般用时序图的形式表现。由于硬件描述语言的特殊性,在采用时分复用的单元里面,一般需要一个计数器来控制时序。
        以下用一个简单的例子来说明时分复用的方法,计算 e = a + b + c + d。时序图如下,我们在节拍0(计数器为0),计算x = a + b;我们在节拍1,计算e = e + c;;我们在节拍2,计算e = e + d。
       

         
        好了,下来是设计代码(为了简化,就不写常规操作和计数器部分,只写操作有关的部分了):
        …
        case (counter)
        2’b00: e = a + b;
        2’b01: e = e + c;
        2’b10: e = e + d;
        endcase
        …
        简单吧?对不起这位仁兄,来人啊,拖出去给我打。还真的以为是程序语言了,这个实现里面还是三个加法器,而不是一个加法器的复用。
        还是看看正解吧:
        …
        assign x = y + z;
        …
        case (counter)
        2’b00: #2 y = a; #2  z = b; #2 e = x;
        2’b01: #2 y = e; #2   z = c; #2 e = x;
        2’b10: #2 y = e; #2  z = d; #2 e = x;
        endcase
        …
        这才是用一个加法器,实现了3次加法。在实际设计种,还需要注意的是加法的进位问题。这个和时分复用关系不大,为了突出重点,就忽略了。
       
        另外,里面的“#2”是模拟加法器的处理时延。具体的原因,我们会在《番外篇:磨刀与砍柴----程序的风格》里面详细介绍。
       
        现在是提问时间,我们需要的四个数字相加的结果在什么时候有效?“节拍2!”,谁回答的?接着打,打得长记性位置。听好了,记住了,四个数字相加的结果在下一个节拍0才真正建立。回答2的忘记了寄存器在时钟上升沿才采样了。
       
        第二招也有口诀:(“他强由他强,清风抚山冈。 他横由他横,明月照大江。”,错了。串台了,在看马大嘴的《倚天屠龙记》,sorry)“时分妹子身材棒,找个计数(器)掌节拍。重复操作单独撰,输入输出时钟控。”我看谁敢说:“忘记一半了”!我不是张真人,这里也不教太极拳;还有更重要的是:你以为你是张无忌啊。
       
        最后,压轴的好戏来了,第三招:流水线(P君,pipeline)。小P可是FPGA/ASIC界的风云人物啊。您随便去baidu一下“流水线+FPGA”,网上的资料可谓汗牛充栋。给人的感觉是:您不会流水线,都不好意思说自己是FPGA界的。(作者本人是娱乐界的,这个可以没有。)
       
        流水线的主要思想是把一个操作分为多个步骤,每个时钟节拍做一个步骤。对于单个数据,经过N个步骤之后,获得最终的结果。硬币的另一面,对于整个数据流而言,每个时钟节拍,有一个数据进入处理。这样,由于每个步骤的处理时延小于总的处理时延,系统能够以更高的时钟周期工作,相应处理的数据流的速度也就提高了。然而,考察一个处理的建立时间,由于N个时钟之后才能获得最终结果,实际的建立时间一般比较其他方式会长。对于面积的考虑,流水线也没有节约面积,反而由于其中必然采用的寄存器延时链,系统的面积一般大于其他方法。一句话,流水线也是用面积和建立时延换系统工作频率和数据流速度的一种实现方式。
        P君这个人属于开热线之前的范厨子----一根筋,用北京土话说就是“轴”。数据流的方向必须是勇往直前的“奔腾到海不复还”。因此上,如果是“数据处理”的话,流水操作是再适合不过。如果是“驱动”、“控制”之类的工作,还想交给P君完成,那就是三两棉花----免谈(弹)。
       
        下面的图是一个流水线的一般模型。可以看出,一个流水线由三部分组成:数据延迟链(组)负责原始数据的存储、结果延时链(组)完成各步骤结果的存储,组合逻辑链接这两种延时链(组)是各个步骤的真实操作。通用模型里面值得注意的是,结果延时链(组)可能是D触发器的串联,也可能是单独的D触发器用于存储中间结果,还可能是两者的组合。
         
       

       
        这个描述比较抽象,以后的章节里面会针对不同功能的单元,给出对应的具体实现。俗话说得好:心急吃不得热豆腐。
        最后,也有几句口诀赞扬P君:“双边两条延迟链,组合逻辑中间站,数据结果每节拍,高速设计流水线。”
       
        最后----已经说了“最后”了,那就----最最后,需要叮嘱一句,本次讲的三种基本结构只是典型的例子。在设计中,这三种结构不是泾渭分明的。真实的设计中,大家需要根据需要,自由组合。真正做到你中有我,我中有你,才是高手,高高手。这种例子,在后面的讲座中鄙人也会给大家介绍一二的----好戏刚刚开场。
         
         
        《玩转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》系列技术讲座,每周三加菲博士与你不见不散,如果针对本讲座有任何技术问题欢迎与加菲进行技术互动:《玩转IP core》交流区
       
        关注与非网官方微博:http://e.weibo.com/eefocus 我们的讲座内容将在微博同步更新。
       
        加菲独家供稿与非网,谢绝任何形式的转载,与非网做你技术生涯中最有价值的电子网站。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-3 01:23 , 耗时 0.092397 秒, 21 个查询请求 , Gzip 开启.

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

桂公网安备 45031202000115号

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

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

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

QQ:28000622;Email:libyoufer@sina.com

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

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