近年来,随着集成电路技术的发展,用传统的方法进行芯片或系统设计已不能满足要求,迫切需要提高设计效率。在这样的技术背景下,能大大降低设计难度的VHDL设计方法正越来越广泛地被采用。但是VHDL设计是行为级的设计所带来的问题是设计者的设计思考与电路结构相脱节。设计者主要是根据VHDL的语法规则对系统目标的逻辑行为进行描述然后通过综合工具进行电路结构的综合、编译、优化,通过仿真工具进行逻辑功能仿真和系统时延的仿真。实际设计过程中,由于每个工程师对语言规则、对电路行为的理解程度不同,每个人的编程风格不同,往往同样的系统功能,描述的方式是不一样的,综合出来的电路结构更是大相径庭。因此,即使综合出的电路都能实现相同的逻辑功能,其电路的复杂程度和时延特性都会有很大的差别,甚至某些臃肿的电路还会产生难以预料的问题。从这个问题出发,我们就很有必要深入讨论在VHDL设计中如何简化电路结构,优化电路设计的问题。 |
1 描述方法对电路结构的影响 |
用VHDL进行设计,其终综合出的电路的复杂程度除取决于设计要求实现的功能的难度外,还受设计工程师对电路的描述方法和对设计的规划水平的影响。常见的使电路复杂化的原因之一是设计中存在许多本不必要的类似LATCH的结构。而且由于这些结构通常都由大量的触发器组成,不仅使电路更复杂,工作速度降低,而且由于时序配合的原因而导致不可预料的结果。例如对于同一译码电路有不同VHDL描述: |
1: IF INDEX=″00000″ THEN |
STEPSIZE<=″0000111″ |
ELSIF INDEX=″00001″ THEN |
STEPSIZE<=″0001000″ |
LSIF INDEX=″00010″ THEN |
STEPSIZE<=″0001001″ |
…… |
ELSE |
STEPSIZE<=″0000000″ |
END IF; |
2:STEPSIZE<=″0000111″ WHEN INDEX=″00000″ ELSE |
″0001000″ WHEN INDEX=″00001″ELSE |
″0001001″WHEN INDEX=″00010″ ELSE |
…… |
以上两段程序描述了同一个译码电路。第二段程序由于WHEN .....ELSE的语句不能生成锁存器的结构且ELSE后一定要有结果,所以不会有问题,而个程序如果不加ELSE STEPSIZE〈=“0000000”这句,则会生成一个含有7位寄存器的结构,虽然都能实现相同的译码功能。但是电路复杂度会大增。而由于每个工程师的写作习惯不同,有的喜欢用IF....ELSE的语句,有的喜欢用WHEN.....ELSE的方式,而用IF.....ELSE时,如稍不注意,在描述不需要寄存器的电路时没加ELSE,则会引起电路不必要的开销。所以在VHDL设计中要慎用IF ...ELSE这类能描述自身值代入的语句。 |
2 设计规划的优劣直接影响电路结构 |
另一主要引起电路复杂化的原因是对设计规划的不合理。虽然VHDL语言能从行为描述生成电路,但一个完整的设计一般来说都不可能由直接描述设计的目标功能来实现的。总要把设计分成若干部分,每一部分再分别描述其行为。这就涉及到如何划分功能模块的问题,要求对设计了解的较深入,才能使划分更有效,才能降低电路的复杂程度。例如我们设计一个时钟源为1kHz,每32秒发出一组信号(共八组)的简单的控制器来说。下面有两种实现方法: |
(1)用15位的记数器实现把输入1KHz的时钟分频为1/32Hz,然后用这个作为时钟驱动一个3位的记数器,这个记数器的八个状态分别通过一个3-8译码器发出所要求的信号。 |
(2)直接用18位的记数器把输入的1KHz时钟进行分频,再利用记数器的八个相距32秒的状态来推动一个12-8译码器来实现。 |
对于如此的设计要求,VHDL程序分别如下所示: |
1. 种设计方法的VHDL源程序 |
process(clkcclkcount2) |
begin |
if(clk='1' and clk'event)then |
count2<=count2 + 1 |
if(count2=″000000000000000″)then |
cclk<='1' |
else |
cclk<='0' |
end if |
end if |
end process |
process(cclkcount3ctemp) |
begin |
if(cclk='1' and cclk'event)then |
count3<=count3 + 1 |
if(count3=″000″)then |
ctemp<=″00000001″ |
elsif(count3=″001″)then |
ctemp<=″00000010″ |
elsif(count3=″010″)then |
ctemp<=″00000100″ |
elsif(count3=″011″)then |
ctemp<=″00001000″ |
elsif(count3=″100″)then |
ctemp<=″00010000″ |
elsif(count3=″101″)then |
ctemp<=″00100000″ |
elsif(count3=″110″)then |
ctemp<=″01000000″ |
elsif(count3=″111″)then |
ctemp<=″10000000″ |
else |
ctemp<=″00000000″ |
end if |
end if |
end process |
2. 第二种设计方法的VHDL源程序 |
process(clkctempcount) |
begin |
if(clk='1' and clk'event)then |
count<=count + 1 |
if(count=″00000000000000000″)then |
ctemp<=″00000001″ |
elsif(count=″001000000000000000″)then |
ctemp<=″00000010″ |
elsif(count=″010000000000000000″)then |
ctemp<=″00000100″ |
elsif(count=″011000000000000000″)then |
ctemp<=″00001000″ |
elsif(count=″100000000000000000″)then |
ctemp<=″00010000″ |
elsif(count=″101000000000000000″)then |
ctemp<=″00100000″ |
elsif(count=″110000000000000000″)then |
ctemp<=″01000000″ |
elsif(count=″111000000000000000″)then |
ctemp<=″10000000″ |
end if |
end if |
end process |
对于种的程序可以综合出的电路如图1所示。 |
该电路用一个15位的加法器和寄存器组成一个15位的记数器。在记数器记完一周回到“000000000000000”时,通过后面的15输入的与非门和一位的触发器就可以实现同步的进行215次分频,同步输出32Hz的时钟CCLK。CCLK再驱动一8位的移位寄存器,便可实现每32秒输出一信号。 |
而用第二种的程序设计综合出的电路如图2所示。 |
图2所示的电路用一个18位的加法器和寄存器组成一个18位的记数器。后接了8个18输入的逻辑门和8输入的或门。输入的1KHz时钟经过记数器被分频,其中有八个相隔32Hz的记数状态,逻辑门就负责把这八状态译码成所需的八组信号。译码后的数据通过选择器输出到8位的触发器,以实现同步输出。还有个锁存器,是用来保持输出信号不变,在八个状态中的从一个状态变到下一个之前,保持前一个的数值。选择器当逻辑门输出新的数据时让其输出数据通过,在新数据到来之前输出锁存器的数据。 |
以上两种方法都能实现相同的逻辑功能,但图2所示的方法由于运用了较少位数的记数器,所用的逻辑门也较简单,而且还少用了多路选择器和锁存器资源,所以综合出来的电路较简单,以XILINX |
Spartan S05 -3 芯片为例。种方法占用芯片CLB的12%,其中FMAPS为9%,工作速度为82MHz。而第二种方法占用了15%的CLB,FMAPS占用15%,工作速度只有69.9MHz。在这一个简单的设计之中就能省20%的电路,提高12.1MHz的工作速度,由此可见科学的划分设计对降低电路复杂程度的重要意义。 |
3 逻辑设计对电路结构的影响 |
还有一个使电路复杂化的原因是逻辑电路的输入项太多以致需占用过多的面积。我们从图3和图4两个相同功能的逻辑电路和他们对应的VHDL描述来分析。 |
比较两图可知,图3是二级逻辑门,每个输入信号与不只一个逻辑门相连,图4是三级的逻辑门,每个输入信号只与一逻辑门相连。由于级数少,延时也较少,因此图3的速度要比图4快。然而,由于图3的输入项要比图4大的多(10:5),因此,占用的面积必然也比图3大。图4是图3通过提取公因数(例中是B和C)得来的,这是把附加的中间项加到结构描述中去的一种过程,它使输入到输出中的逻辑级数增加,牺牲速度换来电路占用面积的减少。对于对延时要求不高的情况下采用这种方法分解逻辑电路以达到减少电路复杂度的目的。 |
通过以上简单、初步的探讨,我们可以知道,用VHDL进行集成电路的设计,牵涉到对VHDL语言的使用方法和对设计的理解程度。本文讨论了以下几个简化和优化电路设计的3个值得注意的方面: |
(1)在用VHDL进行设计中要注意避免不必要的寄存器描述。 |
(2)在编写程序前要先对整个设计进行较深入的了解科学的划分设计,多设想几种方案再进行比较用多个较少位数的单元取代较多位数的单元。 |
(3)在延时要求不高的情况下,可提取逻辑电路公因子把它分解成含有中间变量的多级电路。 |
|
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。