VHDL设计中电路简化问题的探讨-本文的图已经被站长省掉了。
摘 要:从描述方法、设计规则、逻辑函数分析了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″;
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;
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″;
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 peocess;