数字信号处理算法逻辑 第五章.docx
第五章 基本运算逻辑和它们的 Verilog HDL 模型前言复杂的算法数字逻辑电路是由基本运算逻辑、数据流动控制逻辑和接口逻辑电路所构成的。对基本运算逻辑的深入了解是设计复杂算法逻辑系统电路结构的基本功。虽然 Verilog 硬件描述语言能帮助我们自动地综合出极其复杂的组合和时序电路,并帮助我们对所设计的电路进行全面细致的验证,但对于速度要求很高的特殊数字信号处理电路,其结构还是由设计者来定夺。为了提高算法的运算速度除了提高制造工艺技术外,逻辑结构设计是最重要的环节。而设计出结构合理的基本运算组合电路是算法逻辑结构设计的基础,只有深入理解复杂组合电路的许多基本特点,才有可能通过电路结构的改进来提高算法逻辑系统的基本时钟速度,为结构合理的高速复杂算法的数字逻辑系统的构成打下坚实的基础。这部分知识应该是数字系统和计算机结构课程讲述的内容,为了使同学们能熟练地把学过的基础知识运用到设计中去,有必要在这里把提高加法器、乘法器速度的电路结构原理和方法简单地复习一下, 并把流水线设计的概念也在这一章中引入。希望同学们能灵活地把这些电路结构的基本概念应用到设计中,来提高设计的水平。5.1 加法器在数字电路课程里我们已学习过一位的加法电路,即全加器。它的真值表很容易写出,电路结构也很简单仅由几个与门和非门组成。XiYiCi - 1SiCi0 0 0 0 00 0 1 1 00 1 0 1 00 1 1 0 11 0 0 1 01 0 1 0 11 1 0 0 11 1 1 1 1表 5.1一位全加器的真值表表中 Xi 、Yi 表示两个加数,Si 表示和, Ci - 1 表示来自低位的进位、 Ci 表示向高位的进位。 从真值表很容易写出逻辑表达式如下:Ci = X i Y i + Yi Ci - 1 + X i Ci - 1全加器和 Si 的表达式也可以表示为:Si=Pi Ci其中 Pi = X i Yi(5.1)(5.2)Ci=Pi · Ci - 1 + G i其中 Gi= X i · Yi5.2 式就是进位递推公式。参考清华大学出版社出版的刘宝琴老师编写 的 数字电路与系统 , 可以很容易地写出超前进位形成电路的逻辑,在这里不再详细介绍。在数字信号处理的快速运算电路中常常用到多位数字量的加法运算,这时需要用到并行加法器。并行加法器比串行加法器快得多,电路结构也不太复杂。它的原理很容易理解。现在普遍采用的是 Carry-Look-Ahead-Adder 加法电路(也称超前进位加法器),只是在几个全加器的基础上增加了一个超前进位形成逻辑,以减少由于逐位进位信号的传递所造成的延迟。下面的逻辑图表示了一个四位二进制超前进位加法电路。Y0Y1Y2Y3全加器全加器全加器全加器S0S1S2S3PAG C B020 02A1B PG CA1 11 1 0B0PCG C22 2三位超前进位加法器P G C3 3 -1C0超前进位加法器P*图 5.1由四个一位全加器组成的超前进位四位加法器P*同样道理,十六位的二进制超前进位加法电路可用四个四位二进制超前进位加法电路再加上超前进位形成逻辑来构成。同理,依次类推可以设计出 32 位和 64 位的加法电路。Y03Y47Y811Y1215四位全加器四位全加器四位全加器四位全加器S03S47S811S1215P* G* C*000P* G* C*111P* G* C*222P* G*330图 5.2 由四个四位全加器组成的超前进位十六位加法器在实现算法时(如卷积运算和快速富里叶变换),常常用到加法运算,由于多位并行加法器是由多层组合逻辑构成,加上超前进位形成逻辑虽然减少了延迟,但还是有多级门和布线的延迟,而且随着位数的增加延迟还会积累。由于加法器的延迟,使加法器的使用频率受到限制,这是指计算的节拍(即时钟)必须要大于运算电路的延迟,只有在输出稳定后才能输入新的数进行下一次运算。如果设计的是32 位或 64 位的加法器,延迟就会更大。为了加快计算的节拍,可以在运算电路的组合逻辑层中加入多个寄存器组来暂存中间结果。也就是采用数字逻辑设计中常用的流水线( pipe line ) 办法,来提高运算速度,以便更有效地利用该运算电路,我们在本章的后面还要较详细地介绍流水线 结构的概念和设计方法。我们也可以根据情况增加运算器的个数,以提高计算的并行度。用 Verilog HDL 来描述加法器是相当容易的,只需要把运算表达式写出就可以了,见下例。module add_4( X, Y, sum, C); input 3 : 0 X, Y;output 3: 0sum; output C;assignC,Sum = X + Y; endmodule而 16 位加法器只需要扩大位数即可,见下例:module add_16( X, Y, sum, C); input 15 : 0 X, Y;output 15 : 0sum; output C;assignC,Sum = X + Y;endmodule这样设计的加法器在行为仿真时是没有延时的。借助综合器,可以根据以上 Verilog HDL 源代码自动将其综合成典型的加法器电路结构。综合器有许多选项可供设计者选择,以便用来控制自动生成电路的性能。设计者可以考虑提高电路的速度,也可以考虑节省电路元件以减少电路占用硅片的面积。综合器会自动根据选项为你挑选一种基本加法器的结构。有的高性能综合器还可以根据用户对运算速度的要求插入流水线结构,来提高运算器的性能。可见在综合工具的资源库中存有许多种基本的电路结构,通过编译系统的分析,自动为设计者选择一种电路结构,随着综合器的日益成熟它的功能将越来越强。然后设计者还需通过布局布线工具生成具有布线延迟的电路,再进行后仿真,便可知道该加法器的实际延时。根据实际的延迟便可以确定使用该运算逻辑的最高频率。若需要重复使用该运算器,则需要在控制数据流动的状态机中为其安排必要的时序。5.2 乘法器乘法电路:在数字信号处理中经常需要进行乘法运算,乘法器的设计对运算的速度有很大的影响。本节讨论两个二进制正数的乘法电路和运算时间延迟问题以及怎样用VerilogHDL 模型来表示乘法运算。还将讨论当用综合工具生成乘法运算电路时,怎样来控制运算的时间延迟。设两个 n 位二进制正数X 和Y:X : X n-1···X1 X0Y : Y n-1··· Y1Y0则 X 和 Y 的乘积 Z 有 2n 位: 并且式中 YiX 称为部分积,记为 P i,有显然,两个一位二进制数相乘遵循如下规则:0×0=0;0×1=0;1×0=0;1×1=1因此 YiXj 可用一个与门实现,记 Pi.j = Yi X j例:两个四位二进制数 X 和 Y 相乘。被乘数:X3X XX210×)乘数:Y3Y YY210Y XY XY X0 20 10 0Y XY X1 11 0Y X0 3Y XY X1 31 2快速乘法器常采用网格形式的迭带阵列结构,图 5.3 示出两个四位二进制数相乘的结构图,图中每一个乘法单元MU 的逻辑图如图 5.4 所示,即每一个MU 由一个与门和一个全加器构成。事实上,图 5.3 中第一行的每个MU 可用一个与门实现,每一行最右边一个 MU 中的全加器可用半加器实现。图5.3 实现乘法的最长延时为 1 个与门的传输延时加上八个全加器的传输延时。假设每个全加器产生和与产生进位的传输延时相同,并且均相当4 个与门的传输延时,则图5.3 逐位进位并行乘法器的最长延时为 1+8×4=33 个门的传输延时。Y X03Y X02YX01Y0M UM UM UM U0Y XY X1312Y X11Y X10M UM UM UM U0Y X23Y X22Y X21Y X20M UM UM UM U0Y X33Y X32Y X31Y X30M UM UM UM U0Z ZZZ7654图 5.3逐位进位并行乘法器与门PijABC全加器 SSk+1YiXjC 0C I图 5.4乘法单元(MU)YXYXYXY0与门030201与门与门与门13YXY XY XY X121110与门M UM UYXYXY XYX23222120与门M UM UM UM U0Y XYXY XYX33323130与门M UM UM U0ABAB2211AB00C三位超前进位加法器2ZZZZZ77654图 5.5进位节省乘法器为了提高乘法运算速度可以改为图 5.5 所示的进位节省乘法器(Carry-Save Multiplier)。图中用了一个三位的超前进位加法器,九个图 5.4 所示的乘法单元,七个与门。显然,图 5.5 中第二行的乘法单元中全加器可改为半加器。图 5.5 执行一次乘法运算的最长延时为 1 个与门的传输延时加上 3 个全加器的传输延时,再加上三位超前进位加法器的传输延时。设三位超前进位加法器的传输延时为 5 个门的传输延时,则最长延时为1+3×4+1×5=18 的传输延时。节省乘法运算时间的关键在于每个乘法单元的进位输出向下斜送到下一行,故有进位节省乘法器之称。根据加法器类似的道理,八位的二进制超前进位乘法电路可用两个四位二进制超前进位乘法电路再加上超前进位形成逻辑来构成。同理,依次类推可以设计出16 位、32 位和 64 位的乘法电路。用 Verilog HDL 来描述乘法器是相当容易的,只需要把运算表达式写出就可以了,见下例。module mult_4( X, Y, Product); input 3 : 0 X, Y;output 7 : 0Product; assignProduct= X * Y;endmodule而 8 位乘法器只需要扩大位数即可,见下例:module mult_8( X, Y, Product); input 7 : 0 X, Y;output 15 : 0Product; assignProduct = X * Y; endmodule这样设计的乘法器在行为仿真时是没有延时的。借助综合器,可以根据以上 Verilog HDL 源代码自动将其综合成典型的乘法器电路结构。综合器有许多选项可供设计者选择,以便用来控制自动生成电路的性能。设计者可以考虑提高速度,也可以考虑节省电路元件以减少电路占用硅片的面积。综合器会自动根据选项和约束文件为你挑选一种基本乘法器的结构。有的高性能综合器还可以根据用户对运算速度的要求插入流水线结构,来提高运算器的性能。随着综合工具的发展,其资源库中将存有越来越多种类的基本电路结构,通过编译系统的分析,自动为设计者选择一种更符合设计者要求的电路结构。然后设计者通过布局布线工具生成具有布线延迟的电路,再进行后仿真,便可精确地知道该乘法器的实际延时。根据实际的延迟便可以确定使用该运算逻辑的最高频率。若需要重复使用该运算器,便可以根据此数据在控制数据流动的状态机中为其安排必要的时序。所以借助于硬件描述语言和综合工具大大加快了计算逻辑电路设计的过程。5.3 比较器数值大小比较逻辑在计算逻辑中是常用的一种逻辑电路,一位二进制数的比较是它的基础。下面列出了一位二进制数比较电路的真值表:XY(X > Y)(X >= Y)(X = Y)(X <= Y)(X < Y)(X != Y)00011100010001111011000111011100从真值表很容易写出一位二进制数比较电路的布尔表达式如下: (X > Y) =X·( Y)(X < Y) = ( X)·Y(X = Y) =(X) ·(Y) + X·Y也很容易画出逻辑图。位数较多的二进制数比较电路比较复杂,以前我们常用 7485 型四位数字比较器来构成位数较多的二进制数比较电路,如 8 位、16 位、24 位、32 位的比较器。同学们可以参考清华大学出版社刘宝琴老师编写的“ 数字电路与系统” 中, 有关多位并行比较器的设计的章节,在这里不再详细介绍。用 Verilog HDL来设计比较电路是很容易的。下面就是一个位数可以由用户定义的比较电路模块:module compare_n ( X, Y, XGY, XSY, XEY); input width-1:0 X, Y;output XGY, XSY,XEY; reg XGY, XSY, XEY;parameter width = 8;always ( X or Y )/ 每当 X 或 Y 变化时beginif ( X = = Y )XEY = 1;/ 设置 X 等于 Y 的信号为 1 else XEY = 0;if (X > Y)XGY = 1;/ 设置 X 大于 Y 的信号为 1else XGY = 0;if (X < Y)XSY = 1;/ 设置 X 小于 Y 的信号为 1elseXSY = 0;end endmodule综合工具能自动把以上原代码综合成一个八位比较器。如果在实例引用时分别改变参数width 值为 16 和 32 综合工具就能自动把以上原代码分别综合成 16 位和 32 位的比较器。5.4 多路器多路选择器(Multiplexer)简称多路器,它是一个多输入、单输出的组合逻辑电路,在数字系统中有着广泛的应用。它可以根据地址码的不同,从多个输入数据中选取一个,让其输出到公共的输出端。在算法电路的实现中多路器常用来根据地址码来调度数据。我们可以很容易地写出一个有两位地址码,可以从四组输入信号线中选出一组通过公共输出端输出的功能表。地址 1地址 0输入 1输入 2输入 3输入 4输出001000输入 1010100输入 2100010输入 3110001输入 4可以很容易地写出它的布尔表达式,也很容易画出逻辑图,但是当地址码比较长,比如有 12 位长,而且每组输入信号位数较宽(如位宽为8)信号组的数目又较多时,再加上又需多路选择使能控制信号时,其逻辑电路的基本单元需要量是较大的,如画出逻辑图来就显得很复杂,电路具体化后不易于理解,(同学们可以参考阎石老师主编的“数字电子技术基础” 教材,复习多路选择器的概念)。用 VerilogHDL 来设计多路选择器电路是很容易的。下面就是带使能控制信号的数据位宽可以由用户定义的八路数据选择器模块:module Mux_8( addr,in1, in2, in3, in4, in5, in6, in7, in8, Mout, nCS); input 2:0 addr;input width-1 in1, in2, in3, in4, in5, in6, in7, in8; output width-1 Mout;parameter width = 8;always (addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in8) beginif (!ncs)case(addr)3b000: Mout = in1; 3b001: Mout = in2; 3b010: Mout = in3;3b011: Mout = in4; 3b100: Mout = in5; 3b101: Mout = in6; 3b110: Mout = in7; 3b111: Mout = in8;endcase elseMout = 0;endendmodule综合工具能自动把以上原代码综合成一个数据位宽为 8 的八路选一数据多路器。如果在实例引用时分别改变参数 width 值为 16 和 32,综合工具就能自动把以上原代码分别综合成数据宽度为 16 位和 32 位的八选一数据多路器。5.5 总线和总线操作总线是运算部件之间数据流通的公共通道。在硬线逻辑构成的运算电路中只要电路的规模允许,我们可以比较自由地来确定总线的位宽,因此可以大大提高数据流通的速度。适当的总线的位宽,配合适当并行度的运算逻辑和步骤能显著地提高专用信号处理逻辑电路的运算能力。各运算部件和数据寄存器组可以通过带控制端的三态门与总线的连接。通过对控制端电平的控制来确定在某一时间片段内,总线归哪两个或哪几个部件使用(任何时间片段只能有一个部件发送,但可以有几个接收)。用 Verilog 来描述总线和总线操作是非常简单的。下面就是一个简单的与总线有接口的模块是如何对总线进行操作的例子:module SampleOfBus( DataBus, link_bus,write ); inout 11:0 DataBus;/ 总线双向端口input link_bus;/ 向总线输出数据的控制电平reg 11:0 outsigs;assign DataBus = (link_bus) ? outsigs : 12 h zzz ;/当link_bus 为高电平时通过总线把存在outsigs 的计算结果输出always (posedge write) /每当write 信号上跳沿时begin/接收总线上数据并乘以五outsigs <= DataBus * 5; /把计算结果存入outsigs endendmodule通过以上例子我们可以理解使这个总线连接模块能正常工作的最重要的因素是与其他模块的配合,如:何时提供 write 信号?此时DataBus 上数据是否已正确提供?何时提供link_bus 电平?输出的数据是否能被有效地利用?控制信号的相互配合由同步状态机控制的开关阵列控制。在第七章里我们将详细介绍如何用 Verilog HDL 来设计复杂的同步状态机并产生精确同步的开关控制信号来控制数据的正确流动。5.6 流水线(pipeline)流水线(pipe-line)设计技术:流水线的设计方法已经在高性能的、需要经常进行大规模运算的系统中得到广泛的应 用,如 CPU(中央处理器)等。目前流行的 CPU,如 intel 的奔腾处理器在指令的读取和执行周期中充分地运用了流水线技术以提高它们的性能。高性能的DSP(数字信号处理)系统也在它的构件(building-block functions)中使用了流水线设计技术。通过加法器和乘法器等一些基本模块,本节讨论了有关流水线的一些基本概念,并对采用两种不同的设计方法: 纯组合逻辑设计和流水线设计方法时,在性能和逻辑资源的利用等方面的不同进行了比较和权衡。流水线设计的概念:所谓流水线设计实际上就是把规模较大、层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组暂存中间数据。K 级的流水线就是从组合逻辑的输入到输出恰好有 K 个寄存器组(分为 K 级,每一级都有一个寄存器组)上一级的输出是下一级的输入而又无反馈的电路。图 5.6 表示了如何将把组合逻辑设计转换为相同组合逻辑功能的流水线设计。这个组合逻辑包括两级。第一级的延迟是 T1 和 T3 两个延迟中的最大值;第二级的延迟等于 T2 的延迟。为了通过这个组合逻辑得到稳定的计算结果输出,需要等待的传播延迟为max(T1,T3)+T2 个时间单位。在从输入到输出的每一级插入寄存器后,流水线设计的第一级寄存器所具有的总的延迟为 T1 与 T3 时延中的最大值加上寄存器的 Tco(触发时间)。同样,第二级寄存器延迟为 T2 的时延加上Tco。采用流水线设计为取得稳定的输出总体计算周期为:max(max(T1,T3)+Tco,(T2+Tco)流水线设计需要两个时钟周期来获取第一个计算结果,而只需要一个时钟周期来获取随后的计算结果。开始时用来获取第一个计算结果的两个时钟周期被称为采用流水线设计的首次延迟(latency)。对于CPLD 来说,器件的延迟如T1、T2 和T3 相对于触发器的Tco 要长得多, 并且寄存器的建立时间 Tsu 也要比器件的延迟快得多。只有在上述关于硬件时延的假设为真的情况下,流水线设计才能获得比同功能的组合逻辑设计更高的性能。采用流水线设计的优势在于它能提高吞吐量(throughput)。假设 T1、T2 和 T3 具有同样的传递延迟 Tpd。对于组合逻辑设计而言,总的延迟为 2*Tpd。对于流水线设计来说,计算周期为(Tpd+Tco)。前面提及的首次延迟(latency)的概念实际上就是将(从输入到输出)最图 5.6组合逻辑设计转化为流水线设计长的路径进行初始化所需要的时间总量;吞吐延迟则是执行一次重复性操作所需要的时间总量。在组合逻辑设计中,首次延迟和吞吐延迟同为2*Tpd。与之相比,在流水线设计中,首次延迟是 2*(Tpd+Tco),而吞吐延迟是 Tpd+Tco。如果 CPLD 硬件能提供快速的 Tco,则流水线设计相对于同样功能的组合逻辑设计能提供更大的吞吐量。典型的富含寄存器资源的CPLD 器件(如Lattice 的 ispLSI 8840)的 Tpd 为 8.5ns,Tco 为 6ns。流水线设计在性能上的提高是以消耗较多的寄存器资源为代价的。对于非常简单的用于数据传输的组合逻辑设计,例如上述例子,将它们转换成流水线设计可能只需增加很少的寄存器单元。随着组合逻辑变得复杂,为了保证中间的计算结果都在同一时钟周期内得到,必须在各级之间加入更多的寄存器。如果需要在 CPLD 中实现复杂的流水线设计,以获取更优良的性能,具有丰富寄存器资源的 CPLD 结构并且具有可预测的延迟这两大特点的FPGA 是一个很有吸引力的选择。流水线加法器与组合逻辑加法器的比较采用流水线技术可以在相同的半导体工艺的前提下通过电路结构的改进来大幅度地提高重复多次使用的复杂组合逻辑计算电路的吞吐量。下面是一个 n 位全加器的例子,如图 5.7 所示为实现该加法功能需要三级电路:(1)加法器输入的数据产生器和传送器;(2)数据产生器和传送器的超前进位部分;(3)数据产生、传送功能和超前进位三者求和部分。图 5.7n 位全加器的方程式在 n 位组合逻辑全加器中插入三层寄存器或寄存器组,将它转变为 n 位流水线全加器,如图5.8(b)所示。由于进位 C-1 既是第一级逻辑的输入,又是第二级逻辑输入,因此将 C-1 进位改为流水线结构时需要使用两级寄存器。同样地,发生器输出在作为求和单元的输入之前,an+1bn+1nan+1bn+1c-1nnn进位的产生和传递Pn+1Gn+1nn进位的产生和传递nnCout超前进位单元n-1nC-1 寄存器Pn+1n n寄存器寄存器Gn+1nC超前进位单元-1求和单元Cn+2n-1Sn+1n寄存器寄存器寄存器寄存器(a) n 位纯组合逻辑全加器Cn+2nCn+2n-1C -1超前进位单元n寄存器寄存器Cn+2Sn+1n(b) n 位流水线全加器图 5.8n 位纯组合逻辑全加器(a) 改进为 n 位流水线全加器 (b)也要多次插入寄存器。作为求和单元的输出,进位 Cout 要达到同一流水线的级别也需要插入两层寄存器。若用拥有 840 个宏单元和 312 个有寄存能力I/O 单元的Lattice ispLSI8840 分别来实现 16 位组合逻辑全加器和 16 位流水线全加器并比较它们的运行速度, 对于 16 位组合逻辑全加器, 共用了 34 个宏单元。执行一次计算需经过 3 个 GLB 层,每次计算总延迟为 45.6ns。而 16 位流水线全加器共用了 81 个宏单元。执行一次计算只需经过 1 个GLB 层,每次计算总延迟为 15.10ns(但第一次计算需要多用三个时钟周期),吞吐量约增加了三倍。流水线乘法器与组合逻辑乘法器的比较:首先,我们使用一个 4*4 乘法器的例子来说明部分积乘法器的基本概念。然后,通过一个复杂得多的 6*10 乘法器来比较流水线乘法器和组合逻辑乘法器这两个不同设计方法的实现在性能上有何差异。如图 5.9 所示,4*4 乘法器可以被分解为部分积的向量和(或称加权和),比如说是 16 个 1*1 乘法器输出的向量和。这里并没有直接在 4*4 乘法器的每一级都插入寄存器以达到改为流水线结构的目的,而是将其分割为 1*4 乘法器来产生所有的部分积向量。这样分割的结果是形成了两级的流水线设计,相对 1*1 乘法器的组合具有更短的首次延迟,而吞吐延迟相同。每一级的流水线求和用图 5.8(b)所示的流水线加法器来实现。我们用一个类似图 5.9 中的 4*4、但更为复杂的 6*10 流水线乘法器来比较流水线乘法器与非流水线乘法器之间性能上的差异。如图 5.10 所示,该 6*10 流水线乘法器采用 6 个 10 位乘法器来实现 1*10 乘法-a0 * b9:0, a1 * b9:0, a2 * b9:0, a3 * b9:0 , a4 * b9:0, a5 * b9:0 。由于 ai 非 0 即 1,那么 1*10 乘法器的结果是 b9:0 或 0。这表示下一级的两个输入不是 b9:0 就是 0。这六个多路器的输出被两两一组分成三个相互独立的组合,并分别用一个 3 层的流水线加法器加起来。每一组的两个多路输入的下标号差为 3。在这个例子里,这些组是如下组织的: a5,a2,a4,a1,a3,a0。a5,a2意味着第一个多路器的输出 M(10 位)和第四个多路器的输出 N(10 位)是流水线加法器O 的输入。同样地,其余的两组分别用流水线加法器P和 Q 加在一起。这样的两两组合能在加的过程中去除额外的部分积项。以a5,a2为例,其等式一般表示为:G(j,0) = 000, M(i,0) and N(i,0), 000P(j,0) = 000, M(i,0) xor N(i,0), 000(0 <= i <= 9, 0<= j <= 12)Cj = Gj or Gj-1Pj or Gj-2Pj-1Pj(0<= j <= 12) or .or G0P1P2P3.PjSk = Pk xor Ck-1 ( 0 <= k <= 13)由于 M 与N 的间隔为 3,M 的高三位和N 的低三位必定是 0。因此,M 和N 完成与操作后,G0, G1,G2 和 G10,G11,G12 必定为 0。进一步地说,因为存在这样一些结果为0 的发生器,进位的计算就可以得到简化。既然进位计算得到了简化,那么求和运算也就自然得到了简化。同样地,流水线加法器 P,Q 的输入间隔也是 3。流水线加法器 T 和 S 的输入之间的间隔分别为 1 和 2。由于加法器 T 是一个三层流水线加法器,所以在 Q 和 S 之间也插入了三层寄存器组从而达到与 T 相同的流水线级别。图 5.94 位组合逻辑乘法器与 4 位流水线乘法器的比较这里依然使用Lattice 的ispLSI8840 来比较6*10 乘法器分别用组合逻辑和流水线实现的执行情况。组合逻辑的 6*10 乘法器在用HDL 实现时消耗了 14 个 GLB 中的 93 个宏单元。执行一次运算需要经过 5 个 GLB 层,具有的最大传递延迟为 73.5ns。相应的是,流水线设计的6*10 乘法器在用HDL 实现时消耗了 22 个GLB 中的 360 个宏单元。执行一次运算只需经过一个 GLB 层,计算周期只要15.30ns,比组合逻辑的实现快 4 倍有余。该设计的相应首次延迟是 9 个时钟周期。总结:改为流水线结构是提高组合逻辑吞吐量从而增强计算性能的一个重要办法。为获取高性能所付出的代价是要使用更多的寄存器。要实现这样大规模的运算部件,只含少量寄存器资源的普通 PLD 器件是无法办到的,必须使用拥有大量寄存器资源的 CPLD 或 FPGA 器件或设计专用的 ASIC。当用 Verilog 语言描述流水线结构的运算部件时,要使用结构描述,才能够真正综合成设计者想要的流水线结构。简单的运算符表达式只有在综合库中存有相应的流水线结构的宏库部件时,才能综合成流水线结构从而显著地提高运算速度。从这一意义上来说,深入了解和掌握电路的结构是进行高水平 HDL 设计的基础。图 5.106*10 流水线乘法器思考题:1) 写出 8 位加法器和 8 位乘法器的逻辑表达式,比较用超前进位逻辑和不用超前进位逻辑的延迟。2) 提高复杂运算组合逻辑运算速度有哪些办法?3) 详细解释为什么采用流水线的办法可以显著提高层次多的复杂组合逻辑的运算速度。