黄 林
(重庆工商大学派斯学院, 重庆 合川 401520)
随着时代的不断发展, 科技的不断创新, 软硬件设备的功能逐渐增多, 数字电路变得越来越复杂、 越来越集成化, 大规模集成电路在芯片设计、数据储存中被大量应用, 传统的设计规则与经验已经无法满足信息时代的要求。 为了保障系统设计的可靠性与通用性, 可以从以下3 方面对数字电路进行优化改进: 一是大规模使用现场可重构器件, 使硬件电路的实现载体和评价方式变得更加优化, 以推进数字电路的优化。 二是优化算法, 从而全面优化搜索性能。 例如使用代入遗传算法的过程中, 可以采用新的结构来提高数字电路的设计模型, 并将下载的最好染色体保留在可重构器件上, 用染色体算法进行运算, 进而使运算和操作变得更加优化。三是利用软件模型, 将期望的数值和电路优化设计所得到的结果与当前的实际情况进行对比, 方便优化过程中直观明确地了解优化方案的效果, 进而提出更加完善的优化设计。
本文提出的自顶向下的模块设计理念, 将复杂的数字电路设计分解、 细化为一系列相对简单的子电路, 将复杂、 繁琐的电路设计变为简单、 容易的设计, 这种将复杂难懂的问题转换为简单易懂的问题的方式在于思维的转变。 在本文中, 具体描述数字电路功能时, 可在数字电路设计上搭建一个真值表, 对于那些可以优化的过程, 需把真值表看成一个完整的数字电路系统, 对数字电路的输入变量和输出变量进行模块化设计, 让整个过程变得更加简单方便。 把输入部分的位数看作子功能输入信号,把其余位数看作通信信号, 这样就可使整个算法变得简单。 通俗说就是利用优化电子电路的输入和输出来改变传统的电路算法, 使用模块化设计, 优化计算系统的独立性。
与传统电路算法相比, 模块化进化算法具有两个优势, 一是可以让功能电路的选择更加准确; 二是能够缩小子系统输入和输出的位数占比, 降低算法复杂程度, 提高算法的成功概率, 减少算法计算时间[1]。
数字电路设计划分为许多个小模块, 为了快速、 高效地寻找出一种最优的电路设计目标, 引入遗传算法, 遗传算法的过程如下。
1.2.1 染色体编码
在对染色体定向编码过程中, 首先要进行遗传算法的运算时间规划, 对电路模块化结构的染色体进行优化, 以提升运算时间。 进行染色体编码时,可将染色体分成更为独立的逻辑段, 每个独立的逻辑段都表示一个小的子系统, 在子系统当中采用更加精准的门级电路进化方式, 让每个子系统都包含编码、 通信信号和联线编码, 这样就可以让整个染色体变化的过程变得更为简单快捷。 遗传算法的染色编码为实数编码, 把所有的子系统整合为一个大的染色体, 每个子系统既可以独立进行并排净化,又可以降低大范围的电路资源浪费, 而且每个子系统之间既相互独立又相互联系。
1.2.2 适应度函数设计
在数字电路设计中, 适应度函数有着非常重要的作用, 适应度函数设计的优劣可以对最终目标产生直接影响。 可对适应度函数的输入值与期望值进行更为科学的对比研究, 让整个评价系统变得更加准确, 评价过程采用的标准就是操作结果; 数字电路中遗传算法的使用公式可以表示电路功能的正确度[2]。
1.2.3 选择操作
在进行遗传算法的过程中, 需选择很多操作,其中包括竞争选择方法和轮盘法。 本文采用模块化原则, 故而倾向选用竞争选择方法。 竞争选择方法就是从父代的种族当中挑选多个遗传个体, 然后将这些个体采用适应度函数进行比较, 最终选择最好的个体来进行交叉算法, 不断地进行重复, 直到整个过程操作完毕[2]。
1.2.4 交叉算法
如果使用交叉算法进行操作, 就需要从父代当中随便选择两个染色体进行杂交, 以便把优秀基因保留下来, 并且较大程度地保留特别优秀的基因。采用交叉算法可以使种族的基因更加优化, 让整个种族变得更加发达。 在进行交叉算法的过程中, 一般采用均匀交叉方式或两点交叉方式及单点交叉方式。 均匀交叉方式就是将染色体的很多优点进行交换, 让它们更加有利于种族延续, 本文采用的是均匀交叉操作方式。
1.2.5 变异算子
变异算子是把染色体中的一些基因按照相应的概率进行变异操作, 所选取的概率值越大, 遗传过程中的多样性就会越大。 变异操作仅在父代上进行就可改变某一个基因, 使种族发生整体改变。 本文中变异算子的具体操作是选择一条染色体, 根据变异概率决定是否变异, 如果取值为零, 那么就不进行变异; 如果取值不为零, 那么就进行文件的变异操作[1]。
1) 优化方向。 使用组合逻辑+时序逻辑+存储的方法。 时序电路的特点: 输出与当时的输入值和电路之前的状态有关系; 组合电路功能的特点: 任意一个时刻的输出仅仅与该时刻的输入有关系, 和电路原来的状态没有关系, 可以采用结合的方式来减小功耗[3]。
2) 组合逻辑。 通过算法优化来减少门电路,复用模块, 优化算法。
3) 时序逻辑。 尽量降低采用没有用的register和非功能性的register, 最好不要采用带复位reg,数据打拍。
存储模块选择RAM 还是register, 应根据需求综合考虑。 规模小的存储结构可以采用寄存器实现(规模小于8×32 的FIFO); 规模较大的存储模块可采用 RAM 实现 (规模大于 8×32 的 FIFO)。 同等容量下, register 比RAM 功耗大, 所以大容量存储采用register 会造成更大的功耗。 如果是小规模存储,采用register 面积开销比较少, 且相对于RAM 功耗增加不明显。
拆分RAM 能够减少功耗; 采用低主频高密度的RAM, 减小使用面积能够加大位宽降低访问频率; 把多端口的RAM 换成单端口的RAM 或采用共享RAM 的方式都能够减小使用面积与功耗[4]。
1) 减小面积的措施。 在组合逻辑方面, 除了采取优化算法减小门电路, 还可以采用共享资源、复用模块等方法减小面积。 采取组合逻辑+时序逻辑+存储的方式同样可以减小面积。
2) 电路时序的优化。 通过优化算法可以降低组合逻辑的层数; 逻辑复制可以改善路径延时的情况。 在流水设计的过程中插入寄存器可以更好地减少延时情况。 除此之外, 优化关键信号可以将信号转变为控制器的控制信号, 从而将关键路径信号调整到离输出很近的位置, 使得信号更快地被接收。如果想对晚到的信号进行优化, 通常会采取两种方式, 一种是把数据信号变为慢信号 (优化if else 嵌套); 另一种是把控制信号变为慢信号 (优化if else嵌套)。
通常而言, 优化速度相比于优化资源更为重要, 需优先考虑。 速度优化包括FPGA 的结构特性、HDL综合器性能、 PCB 制版情况等, 也包括Verilog的编程风格。 下面探讨4 种电路结构方面的速度优化方式。
1) 流水线是一种在成组的逻辑之间添加寄存器的方法, 它在很大程度上提升了设计电路运行的速度。 在使用了两级流水线之后, 组合逻辑块的延时大大减少, 两级组合逻辑块的延时分别为T1,T2, 设置 T1≈T2, 且 Ta=T1+T2, Tclk可接近 T1, 其最高工作频率为 fmax≈ fmax1≈ fmax2≈ 1/T1≈ 1/T2, 使用流水线的最高工作频率比没有使用流水线的速度提升了将近一倍。
2) 使用流水线加法器实现八位加法器。 用3个4 bit 加法器以及多个锁存器实现。
3) 乒乓操作法。 乒乓操作法是一种数据缓冲优化设计技术, 可以将其看作是不同的流水线技术, 通过输入数据流选择单元和输出数据流的单元, 按照不同的方式进行切换, 将缓冲数据流中的数据无接缝地传递到处理模块, 进而进行接下来的操作。
4) 加法树法。 想要实现 A+B+C 的结构, 可先实现A+B, 再将A+B 的和锁存一个时钟周期之后再与C 相加。
5.2.1 资源共享
资源共享采取选择、 复用来共享使用该模块,达到降低使用资源、 优化减小面积的目的。 可以选用规模更小的可编程器件对资源进行优化, 以降低成本, 提升性价比, 为后续技术升级保留可编程的资源。 这样做可以减少资源的耗用, 减轻器件的耗费。
5.2.2 优化组合逻辑
在优化过程中可以进行组合逻辑的优化, 以最大程度减少资源浪费。 首先在流水线设计过程中进行优化, 在不同的组合逻辑之间插入寄存器, 以尽可能减少出现延时的可能。 其次可以采用模块复用、 资源共享的方式, 减少逻辑运算过程中占用的面积。 此外, 还可以采用逻辑复制的方式, 减少延迟情况的产生; 将关键路径信息转变为控制器的控制信号, 再将信号调到离输出很近的位置也是减少路径运输时间的方法。
5.2.3 串行化
串行化可以将巨大的逻辑块分割成小的逻辑块, 并在运送过程中寻找相同的逻辑块, 用多个时钟周期完成相同的功能。 可以使用并行逻辑设计,或者采用串行化设计, 只需要用一个八位的乘法器和一个十六位的加法器及一个附加信号start 即可。
通过对电路的优化设计可以让整个电路变得更加模块化, 在进行数据储存及芯片设计过程中降低设计复杂度, 使设计变得更为方便。 数字电路采用模块化设计方式可以使遗传算法得到更多的优化,提高了数字电路的准确性和可靠性; 这种方法在现阶段适应于比较精密的仪器, 可整体提高机器设备的自动化和智能化水平。