计算机工程
COMPUTER ENGINEERING
1999年 第25卷 第12期 vol.25 No.12 1999



ABC95阵列机的FPGA实现及其优化
佟　冬　黎冬梅　周永林　方滨兴
　　ABC95阵列机和它的前身ABC90-jr阵列机[1]一样是一台16个节点的SIMD并行计算机，它的主要特点是5种模式存储器无冲突访问、静态和动态互连模式相统一的拓扑结构等。ABC90的实现技术是TTL芯片和小规模的可编程器件，它由11块PCB板组成，集成度不高，调试难度大。ABC95采用现场可编程门阵列(FPGA)技术，最主要的目的是提高阵列机的集成度。
　　ABC95由5个部分组成：输入输出部件(I/O)、控制部件(CU)、16位标量运算部件(SP)、16个8位向量运算部件(PE)和互连网络部件(NET)。其运行方式是：I/O将汇编程序和数据先加载入阵列机的存储器中，并命令程序开始执行。CU分析每一条指令并向SP、PE和NET发送控制信号和运算数据，控制它们统一同步地运行。SP部件执行标量指令并控制PE的屏蔽字。PE部件执行向量指令，存储数据的对准和PE之间的数据传输由NET部件完成。
　　ABC95阵列机采用Altera公司的FLEX10K系列FPGA器件[2]实现，设计软件是Altera公司的MaxPlus II软件包。FLEX10K器件有以下几个主要部分组成：1) LAB(Logic Array Block)，采用4-LUT(4 Look-Up Table)技术实现逻辑功能。在逻辑单元LE(Logical Element)之间加入了快速进位链(延迟小于1ns)和级联链(Cascade Chain)，能大大提高了算术运算的速度。2) EAB(Embedded Array Block)，可用来实现小规模的RAM、ROM，还可以设计成大型的LUT实现其它特殊的逻辑。3) FastTrack Interconnection，采用分层的互连模式，实现快速、统一延迟的连接。4) IOE(I/O Element)，能实现各种对外连接方式，包括三态和漏级开路(Open-drain)。
1 主要需解决的问题
　　在ABC95设计的开始阶段采用的是传统的设计方法，只把FPGA当作一般的大型可编程器件来看。在设计中仍然采用了ABC90阵列机中使用的一些元器件，如SP的算逻部件(Am29C101)、SP的乘法部件(Am29517)、PE的算逻部件、存储器及实现CU指令译码的EPROM等。表1是SP和PE的结果数据，其中用一个FPGA实现两个PE。
表1 未优化的FPGA试验数据
部件名称器件类型输入输出总数LE利用率EAB利用率
SP10k50VBC356-32617%0%
PE2in110K50GC403-327739%0%

　　从表1的数据可以看出，实现SP和PE的FPGA逻辑单元利用率非常低，EAB的利用率为零，而且所选择的FPGA器件类型也比较高级。总之，其性能价格比极低。
　　主要原因是此设计中SP和PE的输入输出信号过多。这样势必选择管脚多的FPGA，而管脚多的FPGA其内部逻辑单元也相对多，从而使FPGA的利用率很低。另外，设计中没有小规模的存储器，Altera的FPGA中提供的EAB单元也浪费了。
　　为了提高FPGA的利用率，必须对设计进行重新优化。首先需分析阵列机各功能模块的输入输出信号来源，然后以此为依据采取相应的优化方法。优化的主要方法是将分立部件的逻辑尽可能的用FPGA 实现。由于SP和PE的设计大同小异，本文以SP为例进行分析。SP主要由算逻部件(ALU)、乘法部件(MUL)、存储器和接口部件组成，图1是其输入输出信号的分布图。

图1 SP部件的输入输出信号比例图
　　由图1可以看出SP的信号主要来自算逻部件、乘法器、CU和存储器。SP部件是16位的标量部件，其存储器的大小是64kBX16。Altera公司的FLEX10kB内部的EAB不能实现这么大的内部存储器，所以存储器还是采用分立元件实现。对阵列机设计的优化主要是减少算逻部件、乘法器和CU的连线。
2 控制器CU的优化设计
　　在ABC90阵列机中，SP、PE和NET的所有控制信号和运算数据，都是由控制器CU产生的。指令采用3地址格式，算术和逻辑运算及结果的寄存器回写在一个时钟周期内完成，指令字长为32位。指令的执行采用流水线方式，分为取指、译码、执行、写入4个执行周期。将所有72个控制信号组成控制字，将由每条指令控制字组成的译码表存在一个EPROM中。当指令执行时，指令的操作码作为EPROM的地址，EPROM的输出数据即是所需的控制信号。
　　控制信号和运算数据由CU统一发出，使CU和SP、PE、NET之间的连线过多，影响每个模块的FPGA利用率。如何减少连线是解决ABC95阵列机优化的一个关键问题。
　　FLEX10K中的EAB单元能实现ROM，可以用来实现指令译码。为了减少各模块之间的连线，可以将译码逻辑移入各模块中。这样CU向各模块发送的是指令字，各模块分别对指令译码产生控制信号。由于这些控制信号在FPGA内部产生，可以减少连线。例如SP的控制信号和数据共54根线，在内部实现译码后，SP与CU的连线减少为32根线。
　　在ABC95阵列机中一共有72根控制线，指令数为113条，需要256kBX72的ROM。但是FLEX10K中没有这么多的EAB单元，不能实现整个的译码功能。但在每个模块内，并不是每个信号都用到，如标量指令执行时SP只用25个控制信号。可以将指令控制字划分，各模块用到的信号组成控制字，存入EAB单元中，这样每个模块的译码器都能用最少的EAB单元实现。
　　这种将译码表分解到各个模块的方法有以下优点：1) 减少了CU和各功能模块的连线；2) 使用了EAB单元，充分利用了FPGA的资源；3) 更改设计容易，对一个功能模块的改变基本上不影响阵列机的其它部分；4) 由于各模块的控制输入是指令字，可以分别模拟，减少整机调试的难度。
3 算逻部件和乘法器的优化实现
3.1 算逻部件的实现
　　ABC95阵列机SP的算逻部件的主要组成部分是：16个16位寄存器组、操作数选择部件、ALU、移位部件和0标志位生成部件。ALU需完成8种操作：加、减、位与、位或、位异或等，操作由选择信号S[2:0]控制。
　　实现算逻部件的关键是ALU的实现。在FLEX10K系列中，可以用3种方法实现ALU：传统的设计方法、硬件描述语言方法和Altera的lmp专用库法。传统的设计方法以基本的门为基础，特点是对逻辑运算和进位链进行直接优化设计，在VLSI设计和TTL级的设计中经常使用。硬件描述语言设计方法采用VHDL或AHDL(Altera HDL)描述硬件，经过综合得到最终的设计结果，其好处是设计方便。
　　Altera的设计软件包中，提供了一个专用的元件库lpm，其中每个元件都是用AHDL编写的，它充分考虑到FLEX10K的各种特色，使每个元件的设计都能达到最优。但是lmp库中并没有提供ALU的元件，只提供了加减法器和单个的逻辑部件。
　　采用一种结果选择法来实现ALU：用lmp库的元件分别实现ALU的每一种运算，再用一个多选一部件来选择输出，其选择信号是ALU的操作控制信号。这种方法的结构如图2所示。在做任何的运算时，各个运算逻辑元件同时进行运算，但结果只选择需要的。

图2 用lmp库实现ALU的结构图
　　我们在MaxPlusII中分别用这3种方法实现了SP的16位ALU，其中传统的设计(ALU_74381)采用74系列中的ALU器件74381和进位链74182，硬件描述语言方法(ALU_AHDL)使用AHDL硬件描述语言，专用库法(ALU_Selector)分别用lpm库中元件实现了8中运算。通过模拟ALU延迟最长的运算FFFF+1和0-1，对这3种方法进行了比较，表2为实验结果。
表2 实现ALU 3种方法的结果比较
实现方法输入输出数FFFF+1延迟0-1延迟所用LE数
ALU_743815431.8ns56.4ns123
ALU_AHDL5436.1ns25.8ns243
ALU_Selector5431.6ns25.2ns151

　　表2的试验结果表明，专用库方法实现ALU最好。主要是FLEX10K中提供了快速的进位链和级连链，它们能优化加法器和多选一逻辑的实现。这种专用库实现方法虽然不太合常理，但很有效，其优点在于：设计简单、更改容易、速度快、使用的逻辑单元数少。
3.2 乘法器的实现
　　SP中的乘法器是一个16X16的整数乘法器，其结果是一个32位的整数。乘法指令执行时，其结果的低16位直接存入一个寄存器内，其高8位结果暂存在乘法器的一个结果寄存器内。乘法指令执行后，应立即执行高位结果传送指令，将高8位送入另一个寄存器内。
　　Altera的FLEX10K中，乘法器可以采用两种结构：EAB和LE。FLEX10K中的EAB 可以用来实现存储，它也可以看作是大型的LUT来实现逻辑。使用EAB有两种设计方法：流水线并行乘法器和时间域选择乘法器。用EAB设计的乘法器，其计算结果是通过查表得来的，因此其运算运算速度最快，而且延迟固定。
　　利用LE设计乘法器利用了LE之间的快速进位链，其设计方法有3种：逐位进位乘法器、布思算法的组合乘法器和流水式乘法器。流水式的乘法器速度最快，适合大量的乘法连续执行，但它使用的LE资源太多。逐位进位乘法器和布思算法乘法器的速度也比较快，其使用的LE数更合理。
　　在ABC95阵列机的SP设计中，FLEX10K中的EAB已经用来实现指令译码，所以采用EAB来实现乘法器，只能用LE来实现。SP的乘法器只当执行乘法指令时才用到，因此采用流水式乘法器速度未必快。所以SP中采用逐位进位乘法器来实现乘法指令，它用了537个LE，最大延迟48ns。
3.3 ALU和乘法器的结合
　　ABC90阵列机中SP的乘法器是采用的专用芯片Am29517，它的两个操作数是由ALU部件的结果数据提供的。由于ALU一个时钟周期只能提供一个操作数，完成乘法运算需要用4个周期，给控制和时钟设计带来不便。
　　在ABC95阵列机的中，将乘法器和加法器设计在一起。将图1中的一个运算部件用lmp库中的逐位进位乘法器代替，结果的低8位通过八选一逻辑直接回写到寄存器组中，结果的高8位用一个寄存器暂存，在执行高位结果传送指令时，由立即数端口回写到寄存器组中。
　　利用以上方法可以将SP和PE中的ALU和乘法器用FPGA实现，ALU和乘法器的信号都变成了FPGA中的内部信号。这样不仅提高了计算速度，简化了控制，而且也提高了FPGA的利用率。
4 结论
　　通过以上两种优化，对SP和PE重新设计的结果如表3所示。结果表明经过优化后的设计，采用的FPGA规模小，LE和EAB的利用率都很高。
表3 优化后的FPGA试验数据
部件名称器件类型输入输出总数LE利用率EAB利用率
SP10K30RC20813295%54%
PE2in110K30RC24017887% 72%

　　ABC95阵列机由3块PCB板组成，两块各有8个PE的PE板，一块由I/O、CU和SP组成的控制板。这比ABC90的11块PCB板少得多，达到了提高集成度的目的。
作者单位：哈尔滨工业大学计算机科学与工程系,哈尔滨150001
参考文献
1 方滨兴,李晓明.ABC90-jrSIMD阵列计算机控制结构.计算 机研究与发展,1995,34(4):1-5
2 Altera.FLEX10K Embedded Programmable Logic Family Data Sheet,1998
