tag 标签: 流水线

相关帖子
相关博文
  • 热度 23
    2015-3-24 13:43
    1788 次阅读|
    0 个评论
       EDN博客精华文章   作者: tengjingshu   之前一篇博文(流水线加法器设计(Verilog))介绍了2级流水线4位全加器,本来目的是和之前不运用流水线的加法器延时进行比较,不过结果程序写得不太好,也被codeman 大侠指出了错误的地方,于是尝试一下从新改写,于是有了这篇博文。   流水线设计是用于提高所设计系统运行速度的一种有效的方法。为了保障数据的快速传输,必须使系统运行在尽可能高的频率上,但如果某些复杂逻辑功能的完成需要较长的延时,就会使系统很难运行在高的频率上,在这种情况下,可使用流水线技术,即在长延时的逻辑功能快中插入触发器,使复杂的逻辑操作分步完成,减少每个部分的处理延时,从而使系统的运行频率得以提高。流水线设计的代价是增加了寄存器逻辑,即增加了芯片资源的耗用。 流水线操作概念示意图    流水线设计的概念:   所谓流水线设计实际上就是把规模较大、层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组暂存中间数据。K级的流水线就是从组合逻辑的输入到输出恰好有K个寄存器组(分为K级,每一级都有一个寄存器组)上一级的输出是下一级的输入而又无反馈的电路。 组合逻辑设计转化为流水线设计   上图表示如何将把组合逻辑设计转换为相同组合逻辑功能的流水线设计。    组合逻辑设计:   这个组合逻辑包括两级。   第一级的延迟是T1和T3两个延迟中的最大值;   第二级的延迟等于T2的延迟。   为了通过这个组合逻辑得到稳定的计算结果输出,需要等待的传播延迟为:    流水线:   在从输入到输出的每一级插入寄存器后,流水线设计的第一级寄存器所具有的总的延迟为T1与T3时延中的最大值加上寄存器的 Tco(触发时间)。同样,第二级寄存器延迟为T2的时延加上Tco。采用流水线设计为取得稳定的输出总体计算周期为: max(max(T1,T3)+Tco,(T2+Tco))   流水线设计需要两个时钟周期来获取第一个计算结果,而只需要一个时钟周期来获取随后的计算结果。开始时用来获取第一个计算结果的两个时钟周期被称为采用流水线设计的首次延迟(latency)。   但对于CPLD来说,器件的延迟如T1、T2和T3相对于触发器的Tco要长得多,并且寄存器的建立时间Tsu也要比器件的延迟快得多。因此流水线设计获得比同功能的组合逻辑设计更高的性能。   采用流水线设计的优势在于它能提高吞吐量(throughput)。   首次延迟(latency)——(从输入到输出)最长的路径进行初始化所需要的时间总量;   吞吐延迟——执行一次重复性操作所需要的时间总量。   假设T1、T2和T3具有同样的传递延迟Tpd。   组合逻辑设计:   首次延迟为2*Tpd   吞吐延迟为2*Tpd   流水线设计:   首次延迟为2*(Tpd+Tco)   吞吐延迟为Tpd+Tco   如果CPLD硬件能提供快速的Tco,则流水线设计相对于同样功能的组合逻辑设计能提供更大的吞吐量。   如Xilinx的XC9572-7的Tpd为7.5ns,Tco为4.5ns。 点击看原图 点击看原图 点击看原图   上图是上述4级流水线加法器的框图,从该图可以看出,上面的加法器采用5级缓存、4级加法,每一个加法器实现8位数据和一个进位的相加,整个加法器只受8位全加器的工作速度的限制。 点击看原图   例化后可以看到4个8位全加器和缓存。   顶层测试程序:   布线布局后仿真(选择XC3S500E) 点击看原图   4个时钟周期后获得计算结果。   延时大概为5ns。    注意:   要注意在加法的过程中的位宽问题    {cout,sum}={9'b0+thirda +thirdb +thirdco,thirdsum};   等式左边33位:cout (1bit )+sum(32bit)   等式右边32位:thirda/thirdb(8bit)+thirdsum(24bit)   如果没有加上9’b0的话,cout会被综合掉,一直接地。    参考资料:   1)Verilog数字系统设计教程,夏宇闻,北京航空航天大学出版社,P105页 ,2.6流水线   2)Verilog HDL程序设计教程,P151页,10.2流水线设计技术(程序不能综合,具体参考上文)   下载地址: http://bbs.ednchina.com/ShowTopic.aspx?id=73098
  • 热度 24
    2015-3-24 13:30
    1081 次阅读|
    0 个评论
       0  引言   现代信号处理技术通常都需要进行大量高速浮点运算。由于浮点数系统操作比较复杂,需要专用硬件来完成相关的操作(在浮点运算中的浮点加法运算几乎占到全部运算操作的一半以上),所以,浮点加法器是现代信号处理系统中最重要的部件之一。FPGA是当前数字电路研究开发的一种重要实现形式,它与全定制ASIC电路相比,具有开发周期短、成本低等优点。但多数FPGA不支持浮点运算,这使FPGA在数值计算、数据分析和信号处理等方面受到了限制,由于FPGA中关于浮点数的运算只能自行设计,因此,研究浮点加法运算的FPGA实现方法很有必要。    1 IEEE 754单精度浮点数标准   浮点数可以在更大的动态范围内提供更高的精度,通常,当定点数受其精度和动态范围所限不能胜任时,浮点数标准则能够提供良好的解决方案。   IEEE协会制定的二进制浮点数标准的基本格式是32位宽(单精度)和64位宽(双精度),本文采用单精度格式。图1所示是IEEE754单精度浮点数格式。图中,用于单精度的32位二进制数可分为三个独立的部分,其中第0位到22位构成尾数,第23位到第30位构成指数,第31位是符号位。   实际上,上述格式的单精度浮点数的数值可表示为:   上式中,当其为正数时,S为0;当其为负数时,S为1;(-1)s表示符号。指数E是ON255的变量,E减127可使指数在2-127到2128变化。尾数采用科学计算法表示:M=1.m22m21m20……m0。m22,m21,…,m0,mi为Mp的各位,设计时应注意尾数中隐含的整数部分1。0是一个特殊的数,0的指数位和尾数位均为0,符号位可以是1,也可以是0。    2电路的流水线结构   一般情况下,结构化设计是电路设计中最重要的设计方法之一,采用结构化设计方法可以将一个复杂的电路分割为独立的功能子模块,然后按一定的原则将各子模块组合成完整的电路,这几乎是电路设计的通用模式。这种设计方法便于设计人员分工合作、实现设计和功能测试,缩短上市时间、升级和二次开发,因而具有其它方法无法比拟的优势。   结构化设计基本上可归结为两种方法:流水线(pipeline)和握手原则。其中握手原则适用于各功能子模块内部运算比较复杂、数据运算时延(latency)不确定的设计。由于数据运算时延不确定,所以,各子模块间的时序配合必须通过握手信号的交互才能完成。握手原则设计的电路一般采用复杂的有限状态机(FSM)作为控制单元,工程设计难度大,故在设计时应慎重使用。流水线法适用于各功能子模块内部运算简单整齐、数据运算时延确定的设计。由于数据运算时延比较确定,各前后级功能子模块不需要任何交互信号就能完成时序配合,故可方便地实现数据的串行流水运算。流水线控制比较简单,一般不需要设计专门的有限状态机,而且工程设计容易,设计时可优先选用。    3  工程的FPGA实现   3.1开发环境和器件选择   本工程开发可在FPGA集成开发环境QuartusII 8.0 spl中完成。OuartusⅡ是世界著名PLD设计生产厂商——Altera公司的综合性PLD开发软件,内嵌综合器和仿真器,并有可与第三方工具协作的灵活接口,可以完成从设计输入到硬件配置的完整PLD设计流程,而且运行速度快,界面统一,功能集中,易学易用。   本设计中的器件选用Stratix IIEP2S15F484C3。Stratix II是Altera公司的高性能FPGA Stratix系列的第二代产品,具有非常高的内核性能,在存储能力、架构效率、低功耗和面市及时等方面均有优势。   本系统的顶层框图如图2所示。为了显示清楚,图2被分成两个部分显示。本工程采用异步置位的同步电路设计方法,其中clk、reset、enab分别为系统时钟、系统异步置位、系统使能信号。din_a、din_b分别为两个输入的单精度浮点数,data_out则是符合IEEE 754标准的两输入浮点数之和。    3.2浮点加法运算的实现   浮点加法运算可总结为比较、移位、相加、规范化等四个步骤,分别对应于compare、shift、sum、normalize四个模块。    (1)compare模块   本模块主要完成两输入浮点数的比较,若din_a、din_b为两个输入单精度浮点数,则在一个时钟周期内完成的运算结果如下:   ◇大数指数b_exp这里的大数指绝对值的比较;   ◇两浮点数的指数差sube,正数;   ◇大数尾数b_ma;   ◇小数尾数s_ma,该尾数已加入隐含1;   ◇和符号c_sgn,为确定输出结果的符号;   ◇加减选择add_sub,两输入同符号时为0(相加)、异符号时为1(相减),sum模块中使用实现加减选择。    (2)shift模块   shift模块的作用主要是根据两个输入浮点数的指数差来执行小数尾数(已加入隐含1)向右移动相应的位数,以将输入的两个浮点数指数调整为相同的数(同大数),若b_exp、sube、b_ma、s_ma、c_sgn、add_sub为输入信号(其含义见compare模块),则可输出如下运算结果(在一个时钟周期内完成):   ◇大数指数(sft_bexp),将b_exp信号用寄存器延迟一个周期,以实现时序同步;   ◇小数尾数(sft_sma),已完成向右移动相应的sube位;   ◇大数尾数(sft_bma),将b_ma信号用寄存器延迟一个周期,以实现时序同步;   ◇和符号(sft_csgn),将c_sgn信号用寄存器延迟一个周期,以实现时序同步;   ◇加减选择(sft_addsub),将add_sub信号用寄存器延迟一个周期,以实现时序同步;    (3)sum模块   本模块可根据加减选择(sft_addsub(信号完成两输入浮点数尾数(已加入隐含1)的加减,若sft_bexp、sft_sma、sft_bma、sft_csgn、sft_addsub为输入信号(其含义见shift模块),则可输出如下运算结果(在一个时钟周期内完成):   ◇大数指数(sum_bexp),将sft_bexp信号用寄存器延迟一个周期,以实现时序同步;   ◇尾数和(sum_ma),为大数尾数与移位后小数尾数的和,差(两尾数已加入隐含1);   ◇和符号(sum_csgn),将sft_csgn信号用寄存器延迟一个周期,以实现时序同步;    (4)normalize模块   normalize模块的作用主要是将前三个模块的运算结果规范为IEEE 754单精度浮点数标准,若sum_bexp、sum_ma、sum_csgn为输入信号(其含义见sum模块),则其输出的运算结果(在一个时钟周期内完成)只有一个和输出(data_out),也就是符合IEEE754浮点数标准的两个输入浮点数的和。    4系统综合与仿真   由于本工程是由compare、shift、sum、normalize四个模块组成的,而这四个模块通过串行方式进行连接,每个模块的操作都在一个时钟周期内完成,因此,整个浮点数加法运算可在四个时钟周期内完成。这使得工程不仅有确定的数据运算时延(latency),便于流水线实现,而且方便占用的时钟周期尽可能减少,从而极大地提高了运算的实时性。    4.1工程综合结果   经过Quartus II综合可知,本设计使用的StratixⅡEP2S15F484C3芯片共使用了641个ALUT(高级查找表)、188个寄存器、0位内存和可达到80 MHz的时钟频率,因此可证明,本系统利用合理的资源实现了高速浮点数加法运算。    4.2工程仿真结果   本工程仿真可使用Quartus II 8.0内嵌式仿真工具来编写Matlab程序,以生成大量随机单精度浮点数(以便于提高仿真代码覆盖率,提高仿真的精确度),然后计算它们相加的结果,并以文本形式存放在磁盘文件中。编写Matlab程序可产生作为仿真输入的*.vec文件,然后通过时序仿真后生成*.tbl文件,再编写Matlab程序提取其中有用的结果数据,并与先前磁盘文件中的结果相比较,以验证设计的正确性。   图3所示是其仿真的波形图。   从图3可以看出表1所列的各种运算关系。表2所列为其实际的测试数据。   表中“A+B实数表示(M)”指Matlab计算的结果;“误差”指浮点处理器计算结果与Matlab计算结果之差。   综上所述,本工程设计的浮点加法器所得到的运算结果与Matlab结果的误差在10-7左右,可见其精度完全能够符合要求。    5  结束语   本工程设计完全符合IP核设计的规范流程,而且完成了Verilog HDL建模、功能仿真、综合、时序仿真等IP核设计的整个过程,电路功能正确。实际上,本系统在布局布线后,其系统的最高时钟频率可达80MHz。虽然使用浮点数会导致舍入误差,但这种误差很小,可以忽略。实践证明,本工程利用流水线结构,方便地实现了高速、连续、大数据量浮点数的加法运算,而且设计结构合理,性能优异,可以应用在高速信号处理系统中。
  • 热度 16
    2013-10-18 09:54
    16818 次阅读|
    0 个评论
    二维流水线结构矩阵乘法( Array Multiplication ) 上一篇文中建立了矩阵乘法运算的数据路径,从仿真结构中可以看出整个计算方案的可行性,但是存在一个问题,就是硬件运算单元的资源利用率不高。这是什么意思呢?就是说,在每次计算两个 3*3 矩阵的乘法之前,需要将整个运算单元中的每个寄存器都清零,但是 9 个输出结果不是在同一个时刻输出,有先有后。当最先出结果的 P11 计算出第一个结果之后,它就不再输出新值了。其实这时硬件电路是存在的,而且是在不断计算出新值,只是这些值不是我们需要的有效值。那么如果将这些硬件资源完全被利用起来,让它们在最短的时间间隔里都有有效正确数据输出呢。 其实要说的就是流水线设计思想,我们只需要当 P11 单元计算出新的值,下个 CLK 将其计算结果输出(只要有另一个机制接收这些值),然后将其清零(如果不清零,那个会累加了上次的计算结果),再然后就可以将下个要计算的两个 3*3 矩阵对应位置上面的新值输入给 P11 单元,让其计算两个数的乘积。 其他单元类似,思想就是在输出结果后立即做清零和赋新值,不必等整个计算单元都出结果之后才开始进行下个矩阵乘法的计算。 那么从大局来看,就出现个这样的情况:在上个矩阵计算还没有完全计算出 9 个值的时候(右下角部分还在计算),左上角的单元就已经开始下个矩阵乘法的计算。关于输出就是,每个 CLK 都有有效的数据输出,产生了流水输出。而这些输出是从这整个二维矩阵计算单元的某些地方同时输出的,就像水流即向下流也向右流,只是在这里水流对应了数据输出。 回顾一下这样做的目的是什么:为了增加整个运算单元的利用率。做了改进,我们可以看出,每个 CLK 到来时,每个计算单元中的乘法和加法器的运算都是有效的计算。我们一定要记住 FPGA 做运算和 CPU 做计算的不同点。 FPGA 做运算,那些设计好的运算单元,不管你对这些运算单元操作或者不操作,它们都已经以硬件电路的形式存在了,也就是说,每个 CLK 到来时,它们都进行了一次计算。那么如何有效的利用这些运算单元,就是不要让它们做无效的计算,让它们每一次的计算都对我们来说是有效的,是一个对整个单元输出有影响的计算。而想实现这样的功能流水线设计方法是必须要采用的。只是有时候单向流水(一维)更容易被我们所理解。其实这二维运算单元也是如此,也可以产生流水。 相对于不采用流水线操作,数据路径不必做太多修改,主要是控制单元更为复杂,要考虑何时对某个单元清零,何时再对其赋值,何时把数据读走等。这些需要比较精准的调度。有人会想,那么这样是不是需要更多状态机状态?答案是肯定的。那么是不是需要更多的硬件资源的开销呢?答案也是肯定的。那么这种流水线的优势在哪呢?其实是速度上面的优势,有时候在不能提高整个系统的工作频率的情况下,再消耗一点资源来提高其它部分(运算单元)的利用率也是一个很好的提高运算速度的办法。(注:这并不等同于面积与速度的法则)其实这也是一个比较好的,硬件算法优化方案。我们可以将其归纳为以优化算法路径的算法优化方法。 下面是仿真结果:   矩阵还是之前的矩阵。可以看出每个 CLK 都有 2-3 个有效输出。 增加了 Valid 信号,当其为高电平时,说明对应运算单元输出是有效值。其实在算法成熟之后,这些 Valid 信号是可以撤销的,因为我们完全知道了,输出的规律,只需要在特定的时间读走数据即可。而且我们可以将这些数据合并到几根连续有效的总线上面。让每个总线上面每个 CLK 都是有效值。(笔者将按照此方法,继续优化输出总线) 下面是对输入最大值时的输出仿真,主要是看数据会不会益处: 测试 8bits 输入最大值 255 对应的输出值: 时序仿真: 255*255+255*255+255*255=195075 255*254+255*254+255*254=194310
  • 热度 15
    2013-9-5 21:25
    1211 次阅读|
    0 个评论
    1引言 在数字化飞速发展的今天,人们对微处理器的性能要求也越来越高。作为衡量微处理器性能的主要标准,主频和乘法器运行一次乘法的周期息息相关。因此,为了进一步提高微处理器性能,开发高速高精度的乘法器势在必行。同时由于基于IEEE754标准的浮点运算具有动态范围大,可实现高精度,运算规律较定点运算更为简捷等特点,浮点运算单元的设计研究已获得广泛的重视。本文介绍了32位浮点乘法器的设计,采用了基4布思算法,改进的4:2压缩器及布思编码算法,并结合FPGA自身特点,使用流水线设计技术,在实现高速浮点乘法的同时,也使是系统具有了高稳定性、规则的结构、易于FPGA实现及ASIC的HardCopy等特点。 2运算规则及系统结构 2.1浮点数的表示规则 本设计采用单精度IEEE754格式【2】。设参与运算的两个数A、B均为单精度浮点数,即: 2.2浮点乘法器的硬件系统结构 本设计用于专用浮点FFT处理器,因此对运算速度有较高要求。为了保证浮点乘法器可以稳定运行在80M以下,本设计采用了流水线技术。流水线技术可提高同步电路的运行速度,加大数据吞吐量。而FPGA的内部结构特点很适合在其中采用流水线设计,并且只需要极少或者根本不需要额外的成本。综上所述,根据系统分割,本设计将采用5级流水处理,图1为浮点乘法器的硬件结构图。 3主要模块设计与仿真 3.1指数处理模块(E_Adder)设计 32位浮点数格式如文献【2】中定义。由前述可知,浮点乘法的主要过程是两个尾数相乘,同时并行处理指数相加及溢出检测。对于32位的浮点乘法器而言,其指数为8位,因而本设计采用带进位输出的8位超前进位加法器完成指数相加、去偏移等操作,具体过程如下。 E_Adder模块负责完成浮点乘法器运算中指数域的求和运算,如下式所示: 其中,E[8]为MSB位产生的进位。Bias=127是IEEE754标准中定义的指数偏移值。Normalization完成规格化操作,因为指数求和结果与尾数相乘结果有关。在本次设计中,通过选择的方法,几乎可以在Normalization标志产生后立刻获得积的指数部分,使E_Adder不处于关键路径。 本设计收集三级进位信号,配合尾数相乘单元的Normalization信号,对计算结果进行规格化处理,并决定是否输出无穷大、无穷小或正常值。 根据E_Adder的时序仿真视图,可看出设计完全符合应用需求。 3.2改进的Booth编码器设计 由于整个乘法器的延迟主要决定于相加的部分积个数,因此必须减少部分积的数目才能进而缩短整个乘法器的运算延迟。本设计采用基4布思编码器,使得部分积减少到13个,并对传统的编码方案进行改进。编码算法如表1所示。 由于FPGA具有丰富的与、或门资源,使得该方法在保证速度和准确性的前提下,充分利用了FPGA内部资源,节省了面积,同时符合低功耗的要求。 3.3部分积产生与压缩结构设计 3.3.1部分积产生结构 根据布思编码器输出结果,部分积产生遵循以下公式【4】: 其中,PPi为部分积;Ai为被乘数。经过隐藏位和符号位的扩展后,26位的被乘数尾数将产生13个部分积。在浮点乘法器中,尾数运算采用的是二进制补码运算。因此,当NEG=1时要在部分积的最低位加1,因为PPi只完成了取反操作。而为了加强设计的并行性,部分积最低位加1操作在部分积压缩结构中实现。另外,为了完成有符号数相加,需对部分积的符号位进行扩展,其结果如图4所示。13个部分积中,除第一个部分积是29位以外,其余部分积扩展为32位。其中,第一个部分积包括3位符号扩展位“SSS”,第2至13个部分积的符号扩展位为“SS”,加一操作位为“NN”,遵循如下公式:  其中,i为部分积的行数,sign(i)为第i行部分积的符号。 3.3.2部分积压缩结构 本设计混合使用4:2压缩器、3:2压缩器、全加器和半加器,实现了13个部分积的快速压缩,并保证了精度。本文部分积压缩结构的划分如图2所示。 图2中,虚线给出了传统部分积的压缩划分,而实线描述的是本文采用的部分积压缩结构划分,这样的划分有利于简化第二级的压缩结构,从而在保证速度的基础上,节省FPGA内部资源。从图2中可看出,有些位不必计算,因为这些位是由Booth编码时引入的乘数尾数的符号位产生的,48位足以表达运算结果。 3.3.3改进的4:2压缩器 本设计采用广泛使用的4:2压缩器,并针对FPGA内部资源特点,对其进行了改进。如图3所示。传统的4:2压缩器即两个全加器级联,共需要四个异或门和8个与非门。而改进的4:2压缩器需要四个异或门和两个选择器(MUX)。8个与非门需要36个晶体管,而两个MUX需要20个晶体管。同时,FPGA内部集成了大量的异或门和选择器资源,这种设计方法也是对FPGA的一个充分利用。 由于压缩部分积需要大量的4:2压缩器,所以改进的电路能在一定程度上减小版图的面积,也为该乘法器的ASIC后端设计带来了优势。另外,改进的压缩器的4个输入到输出S的延时相同,都是3级XOR门延时。 432位浮点乘法器的实现与仿真 图4显示了本设计的FPGA时序仿真结果,时序仿真环境为QuartusII7.0,目标芯片为Cyclone系列的EP1C6Q240C8,功能仿真环境为Modelsim6.0b。整个设计采用VHDL语言进行结构描述,综合策略为面积优先。由仿真视图可看出,该浮点乘法器可稳定运行在80M及以下频率,在延时5个周期后,以后每一个周期可稳定输出一级乘法运算结果,实现了高吞吐量。如果采用全定制进行后端版图布局布线,乘法器的性能将更加优越。 5结语 本文作者创新点:针对FPGA器件内部资源特性,独创地提出了一种适合FPGA实现的5级流水高速浮点乘法器。该乘法器支持IEEE754标准32位单精度浮点数,采用了基4布思算法、改进的布思编码器、部份积压缩结构等组件,从而在保证高速的前提下,缩小了硬件规模,使得该乘法器的设计适合工程应用及科学计算,并易于ASIC的后端版图实现。该设计已使用在笔者设计的浮点FFT处理器中,取得了良好效果。
相关资源