摘 要:从描述方法、设计规则、逻辑函数分析了VHDL设计中容易引起电路复杂化的原因,并提出了相应的解决方法。
关键词:VHDL 电路简化
近年来,随着集成电路技术的发展,用传统的方法进行芯片或系统设计已不能满足要求,迫切需要提高设计效率。在这样的技术背景下,能大大降低设计难度的VHDL设计方法正越来越广泛地被采用。但是VHDL设计是行为级的设计所带来的问题是设计者的设计思考与电路结构相脱节。设计者主要是根据VHDL的语法规则对系统目标的逻辑行为进行描述然后通过综合工具进行电路结构的综合、编译、优化,通过仿真工具进行逻辑功能仿真和系统时延的仿真。实际设计过程中,由于每个工程师对语言规则、对电路行为的理解程度不同,每个人的编程风格不同,往往同样的系统功能,描述的方式是不一样的,综合出来的电路结构更是大相径庭。因此,即使最后综合出的电路都能实现相同的逻辑功能,其电路的复杂程度和时延特性都会有很大的差别,甚至某些臃肿的电路还会产生难以预料的问题。从这个问题出发,我们就很有必要深入讨论在VHDL设计中如何简化电路结构,优化电路设计的问题。
1 描述方法对电路结构的影响
用VHDL进行设计,其最终综合出的电路的复杂程度除取决于设计要求实现的功能的难度外,还受设计工程师对电路的描述方法和对设计的规划水平的影响。最常见的使电路复杂化的原因之一是设计中存在许多本不必要的类似LATCH的结构。而且由于这些结构通常都由大量的触发器组成,不仅使电路更复杂,工作速度降低,而且由于时序配合的原因而导致不可预料的结果。例如对于同一译码电路有不同VHDL描述:
1: IF INDEX=″00000″ THEN
STEPSIZE<=″0000111″;
WLSIF 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
……
″0000000″;
以上两段程序描述了同一个译码电路。第二段程序由于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(clk,cclk,count2)
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(cclk,count3,ctemp)
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(clk,ctemp,count)
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″;
,VHDL设计中电路简化问题的探讨