|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
+ N0 c* _! z) @cadence公司工程师 胡建伟
+ U/ K1 i; o$ F2 X0 I 当今IT产业的发展日新月异,对硬件设备的要求也越来越高,硬件设计师们面临如何设计高速高密度PCB的难题。常言道,工欲善其事,必先利其器,这也是越来越多的设计师放弃低端的PCB设计工具,进而选择Cadence等公司提供的高性能PCB EDA软件的原因。
# I' m7 \4 z- [5 W6 t0 ? 但是这种变革必然会带来这样或那样的问题。由于接触和使用较早等原因,国内的protel用户为数众多,他们在选择Cadence高速PCB解决方案的同时,都面临着如何将手头的Protel设计移植到Cadence PCB设计软件中的问题。
, |" v/ Y+ \) A9 |) B# `6 d+ K 在这个过程当中碰到的问题大致可分为两种:一是设计不很复杂,设计师只想借助Cadence CCT的强大自动布线功能完成布线工作;二是设计复杂,设计师需要借助信噪分析工具来对设计进行信噪仿真,设置线网的布线拓扑结构等工作。# w+ D7 {9 _, K+ V. Q' t2 ~
对于第一种情况,要做的转化工作比较简单,可以使用Protel或Cadence提供的Protel到CCT的转换工具来完成这一工作。对于第二种情况,要做的工作相对复杂一些,下面将这种转化的方法作一简单的介绍。
) w& Z: }8 p6 o/ t' W4 U Cadence信噪分析工具的分析对象是Cadence allegro的brd文件,而Allegro可以读入合乎其要求的第三方网表,Protel输出的Telexis格式的网表满足Allegro对第三方网表的要求,这样就可以将Protel文件注入Allegro。
1 \) B% ]' V: \3 G3 X6 w 这里有两点请读者注意。首先,Allegro第三方网表在$PACKAGE段不允许有“.”;其次,在Protel中,我们用BasName[0:N]的形式表示总线,用BasName[x]表示总线中的一根信号,Allegro第三方网表中总线中的一根信号的表示形式为Bas NameX,读者可以通过直接修改Protel输出的Telexis网表的方法解决这些问题。7 A7 M" T8 D3 j; y; ?
Allegro在注入第三方网表时还需要每种类型器件的设备描述文件Device.txt文件,它的格式如下:
: P2 X& i# n3 ~6 P5 TPackage: package type
2 K2 g3 V( z+ ?' T! r9 DClass: classtype
- n( j- ~6 }0 x5 Q% X: E, RPincount: total pinnumber
$ [ Y r0 A P# V+ C7 E+ J) wPinused: ...
# l) U0 e- o8 i9 \ 其中常用的是PACKAGE,CLASS,PINCOUNT这几项。PACKAGE描述了器件的封装,但Allegro在注入网表时会用网表中的PACKAGE项而忽略设备描述文件中的这一项。CLASS确定器件的类型,以便信噪分折,Cadence将器件分为IC,IO,DISCRETE三类。PINCOUNT说明器件的管脚数目。对于大多数器件,Device.txt文件中包含有这三项就足够了。( P9 G/ m* O+ @& H
有了第三方网表和设备描述文件,我们就可以将Protel中原理图设计以网表的形式代入到Cadence PCB设计软件中,接下来,设计师就可以借助Cadence PCB软件在高速高密度PCB设计方面的强大功能完成自己的设计。
: Q, c: y% `) s0 x 如果已经在Protel作了PCB布局的工作,Allegro的script功能可以将Protcl中的布局在Allegro中重现出来。在Protel中,设计师可以输出一个Place & Pick文件,这个文件中包含了每个器件的位置、旋转角度和放在PCB顶层还是底层等信息,可以通过这个文件很方便的生成一个Allegro的script文件,在Allegro中执行这个script就能够重现Protel中的布局了,下面给出了完成Place & Pick文件到Allegro Script文件转化的C++代码,笔者使用这段代码,仅用了数分钟就将一个用户有800多个器件的PCB板布局在Allegro重现出来。
' h! R! L$ j6 I: F2 g$ L: B$ JFILE *fp1, *fp2;
, H- I" k! i( U9 v" Z: C8 u::AfxMessageBox("hello");
' B5 |3 E! x: Q' [* f% F I4 pfp1=fopen("pick.txt", "rt");3 X5 t# T! R) f- J
if (fp1==NULL) ::AfxMessageBox("Can not open the file!!!");6 l! Y+ v; W( f2 I) Z5 J
fp2=fopen("place.txt","wt");
) C4 _5 E; ^2 L9 J+ ~if (fp2==NULL) ::AfxMessageBox("Can not create the file!!!");
4 C) U/ T) W$ Y. ?& Ychar refdes[5], Pattern[5];
, g5 u, V" i, v* ffloat midx,midy,refx,refy,padx,pady,rotation;
7 S4 T( s& K1 C6 G. J9 h* r6 R. qchar tb[1];
2 p6 N2 n( n* Q6 @5 @6 Z! j1 fchar tmp='"';
; O M* T# Y' @2 m' H7 A. zfprintf(fp2,"%s\n", "# Allegro script");
. K( N }3 {% F; H+ @fprintf(fp2,"%s\n", "version 13.6");
4 p5 ?! D4 ~/ o* ffprintf(fp2,"%s\n", "place refdes");
. c p" h3 I6 E0 I: t( o: \( `while (!feof(fp1)) {5 o7 ?# F: g+ h! R( l
fscanf(fp1,"%s", refdes);* A/ r, v' G% l+ C& R
fscanf(fp1,"%s", Pattern);( @. Q) F/ ]! l& S
fscanf(fp1,"%f", &midx);
- { c& u9 r8 R9 u4 Zfscanf(fp1,"%f", &midy);9 O" L2 K! w$ d' `; F
fscanf(fp1,"%f", &refx);$ F' q* P, F% r% T9 b
fscanf(fp1,"%f", &refy);
$ P$ H0 S* |2 T- x" p- `& jfscanf(fp1,"%f", &padx);* J+ {5 B3 |/ Y
fscanf(fp1,"%f", &pady);
' R( v9 _( [( s! wfscanf(fp1,"%s", tb);
4 T& z) p+ _. ?& E. D2 h& Sfscanf(fp1,"%f", &rotation);7 H- _' W% u. S' `* }2 v# B( E
fprintf(fp2, "fillin %c%s%c \n",tmp,refdes,tmp);
1 ^& p( f& V' z* t+ G. k& T& \2 C$ dif (rotation!=0) {2 S0 ^7 k7 S! p" A& R! ?
fprintf(fp2, "rotate\n");& i( F* C+ W$ |+ u
fprintf(fp2, "iangle %f\n", rotation);1 Y& p2 h4 c% H z. [( [8 U# ]8 d
};
. h* `+ c) {4 P$ h" k( nchar yy=tb[0];* a$ C/ L- q' _' D% @4 N& l
if (yy!='T') fprintf(fp2, "pop mirror\n");4 W9 Y& d! u/ L. t+ V" x7 L
fprintf(fp2, "pick %f %f \n", padx,pady);* a' Y$ f4 G8 B! b2 \; y7 _+ J
fprintf(fp2, "next \n");
. r+ x& ?1 T2 ^+ E+ Z( U3 F& k};! z- g; N/ n4 P3 Z P# H/ m" I/ a
fprintf(fp2, "done");
4 }3 i" Y* N$ r0 ofclose(fp1);- s0 O1 \0 v- z a ]; F$ t: h6 j5 _
fclose(fp2); 1 _! S" `, x: _3 t" v6 p* q1 l
, }0 _" X T3 G. F% M* u% b以上简单介绍了Protel到Allegro转化的方法,希望能对读者的设计工作有所帮助。 & N5 `8 K% Z+ F& |; a/ _
|
|