位置:51电子网 » 技术资料 » 模拟技术

VHDL中Loop动态条件的可综合转化

发布时间:2008/5/27 0:00:00 访问次数:1068

来源:单片机及嵌入式系统应用 作者:朱国魂 周 娅摘要:论述vhdl中loop语句动态表达式的可综合性问题,提出三种解决方法:直接代入法、边界扩充法和计数器法,并对比这三类方法的适用性。

关键词:vhdl loop动态条件 综合子集 直接代入法 边界扩充法 计数器法

引言vhdl是一种硬件描述语言,于1983年被ieee制定为国际标准ieee1076。近年来国内引进和出版了不少教材,使其在国内得到迅速推广。由于vhdl最初目的是为了实现硬件的建模而被提出的,所以其措施能力超越了数字逻辑集成电路的范围。而现有的eda工具基本上只能支持vhdl的子集,特别是针对fpga/cpld器件进行的不同的综合工具,其综合子集并非统一,不少初学者很难掌握。即使是部分有经验的设计者,对于通常高级语言中都会涉及的循环语句,在vhdl中往往也不能运用自如,甚至无法表达此类逻辑,从而限制了vhdl的应用水平。例如,vhdl的并行堆排序描述就是一个比较典型的例子。该实例十分类似通常数据结构的描述,推广前景诱人;但只能通过仿真,却不能在目前任何一个eda工具进行综合,导致无实用价值。

本文从高级语言涉及最多的loop语句出发,讨论如何在vhdl中解决这类问题。

1 无法综合的loop动态条件vhdl中loop表达式有三种体现形式:while……loop、for……loop和单独的loop语句。它还支持next、exit和标号,因此,循环语句的表达能力大于常规的c或pascal语言。程序1是利用for语句和while语句描述插入算法的部分代码。

程序1 不可综合的vhdl循环语句

……

for i in 2 to length loop ---length为一个变量

temp:=mylist(i);

j:=i;

while(j>1)and mylist(j-1)<temp loop

mylist(j):=mylist(j-1);

j:=j-1;

end loop;

mylist(j):=temp;

end loop;

……

对于第一个for语句,eda工具synplify综合时将会给出无边界的范围错误提示。

@e:"h:.vhd"|for loops with unbound ranges should contain w wait statement

即使部分优秀的综合工具,例如orcad express、mentor grpahs quickhdl等能够综合第一个for语句,也无法支持第二个while条例表达式。orcad express将给出表达式不可静态计算的错误提示。

..vhd(45):error,expression does not evaluate to a constant.

由于程序1在c程序员看来是没有问题的,因此,初学者往往不能解决好此类问题,从而使学习陷入困境,无法充分利用vhdl来表述逻辑。

2 直接代换法对于第一类无边界的范围错误问题,可以用循环的综合机制转化为相应的语句。例如下面代码:

for i in 0 to 1 loop

out_bus(i)<=in_bus(i);

end loop;

其对应综合后的电路见图1。

相应的,也可以用下列语句直接代入代换:

out_bus(0)<=in_bus(0);

out_bus(1)<=in_bus(1);

程序1可以采用下列vhdl代码表示:

k:=2;

temp:=mylist(2);

if(mylist(1)<temp then

mylist(2):=mylist(1);

j:=1;

end if;

mylist(j):=temp;

j:=3;

temp:=mylist(3);

if(mylist(2)<temp then

mylist(3):=mylist(2);

j:=2;

end if;

if(mylist(1)<temp then

mylist(2):=mylist(1);

j:=1;

end if;

mylist(j):=temp;

……

然而,这种使用方法要求设计者清楚循环条件一定会执行的次数,否则将无法实施。当循环次数比较大时,代码编写工作量将十分庞大,因此可以采用第二种方法——边界扩充法。

3 边界扩充法边界扩充法是指在边界未定时,可以将边界定为最大可能的范围,即用静态表达来替代。例如程序1的代码可以改写为:

constant max:integer=100; --max必须大于mylen所有可能的取值

……

out_loop:for i in 2 to max loop

exit out_loop when i>mylen; --mylen为变量

temp:=mylist(i);

countj:=i;

inter_loop:for j in i downto 2 loop

countj:=j;

exit inter_loop

来源:单片机及嵌入式系统应用 作者:朱国魂 周 娅摘要:论述vhdl中loop语句动态表达式的可综合性问题,提出三种解决方法:直接代入法、边界扩充法和计数器法,并对比这三类方法的适用性。

关键词:vhdl loop动态条件 综合子集 直接代入法 边界扩充法 计数器法

引言vhdl是一种硬件描述语言,于1983年被ieee制定为国际标准ieee1076。近年来国内引进和出版了不少教材,使其在国内得到迅速推广。由于vhdl最初目的是为了实现硬件的建模而被提出的,所以其措施能力超越了数字逻辑集成电路的范围。而现有的eda工具基本上只能支持vhdl的子集,特别是针对fpga/cpld器件进行的不同的综合工具,其综合子集并非统一,不少初学者很难掌握。即使是部分有经验的设计者,对于通常高级语言中都会涉及的循环语句,在vhdl中往往也不能运用自如,甚至无法表达此类逻辑,从而限制了vhdl的应用水平。例如,vhdl的并行堆排序描述就是一个比较典型的例子。该实例十分类似通常数据结构的描述,推广前景诱人;但只能通过仿真,却不能在目前任何一个eda工具进行综合,导致无实用价值。

本文从高级语言涉及最多的loop语句出发,讨论如何在vhdl中解决这类问题。

1 无法综合的loop动态条件vhdl中loop表达式有三种体现形式:while……loop、for……loop和单独的loop语句。它还支持next、exit和标号,因此,循环语句的表达能力大于常规的c或pascal语言。程序1是利用for语句和while语句描述插入算法的部分代码。

程序1 不可综合的vhdl循环语句

……

for i in 2 to length loop ---length为一个变量

temp:=mylist(i);

j:=i;

while(j>1)and mylist(j-1)<temp loop

mylist(j):=mylist(j-1);

j:=j-1;

end loop;

mylist(j):=temp;

end loop;

……

对于第一个for语句,eda工具synplify综合时将会给出无边界的范围错误提示。

@e:"h:.vhd"|for loops with unbound ranges should contain w wait statement

即使部分优秀的综合工具,例如orcad express、mentor grpahs quickhdl等能够综合第一个for语句,也无法支持第二个while条例表达式。orcad express将给出表达式不可静态计算的错误提示。

..vhd(45):error,expression does not evaluate to a constant.

由于程序1在c程序员看来是没有问题的,因此,初学者往往不能解决好此类问题,从而使学习陷入困境,无法充分利用vhdl来表述逻辑。

2 直接代换法对于第一类无边界的范围错误问题,可以用循环的综合机制转化为相应的语句。例如下面代码:

for i in 0 to 1 loop

out_bus(i)<=in_bus(i);

end loop;

其对应综合后的电路见图1。

相应的,也可以用下列语句直接代入代换:

out_bus(0)<=in_bus(0);

out_bus(1)<=in_bus(1);

程序1可以采用下列vhdl代码表示:

k:=2;

temp:=mylist(2);

if(mylist(1)<temp then

mylist(2):=mylist(1);

j:=1;

end if;

mylist(j):=temp;

j:=3;

temp:=mylist(3);

if(mylist(2)<temp then

mylist(3):=mylist(2);

j:=2;

end if;

if(mylist(1)<temp then

mylist(2):=mylist(1);

j:=1;

end if;

mylist(j):=temp;

……

然而,这种使用方法要求设计者清楚循环条件一定会执行的次数,否则将无法实施。当循环次数比较大时,代码编写工作量将十分庞大,因此可以采用第二种方法——边界扩充法。

3 边界扩充法边界扩充法是指在边界未定时,可以将边界定为最大可能的范围,即用静态表达来替代。例如程序1的代码可以改写为:

constant max:integer=100; --max必须大于mylen所有可能的取值

……

out_loop:for i in 2 to max loop

exit out_loop when i>mylen; --mylen为变量

temp:=mylist(i);

countj:=i;

inter_loop:for j in i downto 2 loop

countj:=j;

exit inter_loop

相关IC型号

热门点击

 

推荐技术资料

泰克新发布的DSA830
   泰克新发布的DSA8300在一台仪器中同时实现时域和频域分析,DS... [详细]
版权所有:51dzw.COM
深圳服务热线:13751165337  13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!