當今IT產(chǎn)業(yè)的發(fā)展日新月異,對硬件設備的要求也越來(lái)越高,硬件設計師們面臨如何設計高速高密度PCB的難題。常言道,工欲善其事,必先利其器,這也是越來(lái)越多的設計師放棄低端的PCB設計工具,進(jìn)而選擇Cadence等公司提供的高性能PCB EDA軟件的原因。 但是這種變革必然會(huì )帶來(lái)這樣或那樣的問(wèn)題。由于接觸和使用較早等原因,國內的Protel用戶(hù)為數眾多,他們在選擇Cadence高速PCB解決方案的同時(shí),都面臨著(zhù)如何將手頭的Protel設計移植到Cadence PCB設計軟件中的問(wèn)題。 在這個(gè)過(guò)程當中碰到的問(wèn)題大致可分為兩種:一是設計不很復雜,設計師只想借助Cadence CCT的強大自動(dòng)布線(xiàn)功能完成布線(xiàn)工作;二是設計復雜,設計師需要借助信噪分析工具來(lái)對設計進(jìn)行信噪仿真,設置線(xiàn)網(wǎng)的布線(xiàn)拓撲結構等工作。 對于第一種情況,要做的轉化工作比較簡(jiǎn)單,可以使用Protel或Cadence提供的Protel到CCT的轉換工具來(lái)完成這一工作。對于第二種情況,要做的工作相對復雜一些,下面將這種轉化的方法作一簡(jiǎn)單的介紹。 Cadence信噪分析工具的分析對象是Cadence Allegro的brd文件,而Allegro可以讀入合乎其要求的第三方網(wǎng)表,Protel輸出的Telexis格式的網(wǎng)表滿(mǎn)足Allegro對第三方網(wǎng)表的要求,這樣就可以將Protel文件注入Allegro。 這里有兩點(diǎn)請讀者注意。首先,Allegro第三方網(wǎng)表在$PACKAGE段不允許有“.”;其次,在Protel中,我們用BasName[0:N]的形式表示總線(xiàn),用BasName[x]表示總線(xiàn)中的一根信號,Allegro第三方網(wǎng)表中總線(xiàn)中的一根信號的表示形式為Bas NameX,讀者可以通過(guò)直接修改Protel輸出的Telexis網(wǎng)表的方法解決這些問(wèn)題。 Allegro在注入第三方網(wǎng)表時(shí)還需要每種類(lèi)型器件的設備描述文件Device.txt文件,它的格式如下: Package: package type Class: classtype Pincount: total pinnumber Pinused: ... 其中常用的是PACKAGE,CLASS,PINCOUNT這幾項。PACKAGE描述了器件的封裝,但Allegro在注入網(wǎng)表時(shí)會(huì )用網(wǎng)表中的PACKAGE項而忽略設備描述文件中的這一項。CLASS確定器件的類(lèi)型,以便信噪分折,Cadence將器件分為IC,IO,DISCRETE三類(lèi)。PINCOUNT說(shuō)明器件的管腳數目。對于大多數器件,Device.txt文件中包含有這三項就足夠了。 有了第三方網(wǎng)表和設備描述文件,我們就可以將Protel中原理圖設計以網(wǎng)表的形式代入到Cadence PCB設計軟件中,接下來(lái),設計師就可以借助Cadence PCB軟件在高速高密度PCB設計方面的強大功能完成自己的設計。 如果已經(jīng)在Protel作了PCB布局的工作,Allegro的script功能可以將Protcl中的布局在A(yíng)llegro中重現出來(lái)。在Protel中,設計師可以輸出一個(gè)Place & Pick文件,這個(gè)文件中包含了每個(gè)器件的位置、旋轉角度和放在PCB頂層還是底層等信息,可以通過(guò)這個(gè)文件很方便的生成一個(gè)Allegro的script文件,在A(yíng)llegro中執行這個(gè)script就能夠重現Protel中的布局了,下面給出了完成Place & Pick文件到Allegro Script文件轉化的C++代碼,筆者使用這段代碼,僅用了數分鐘就將一個(gè)用戶(hù)有800多個(gè)器件的PCB板布局在A(yíng)llegro重現出來(lái)。 FILE *fp1, *fp2; ::AfxMessageBox("hello"); fp1=fopen("pick.txt", "rt"); if (fp1==NULL) ::AfxMessageBox("Can not open the file!!!"); fp2=fopen("place.txt","wt"); if (fp2==NULL) ::AfxMessageBox("Can not create the file!!!"); char refdes[5], Pattern[5]; float midx,midy,refx,refy,padx,pady,rotation; char tb[1]; char tmp='"'; fprintf(fp2,"%s\n", "# Allegro script"); fprintf(fp2,"%s\n", "version 13.6"); fprintf(fp2,"%s\n", "place refdes"); while (!feof(fp1)) { fscanf(fp1,"%s", refdes); fscanf(fp1,"%s", Pattern); fscanf(fp1,"%f", &midx); fscanf(fp1,"%f", &midy); fscanf(fp1,"%f", &refx); fscanf(fp1,"%f", &refy); fscanf(fp1,"%f", &padx); fscanf(fp1,"%f", &pady); fscanf(fp1,"%s", tb); fscanf(fp1,"%f", &rotation); fprintf(fp2, "fillin %c%s%c \n",tmp,refdes,tmp); if (rotation!=0) { fprintf(fp2, "rotate\n"); fprintf(fp2, "iangle %f\n", rotation); }; char yy=tb[0]; if (yy!='T') fprintf(fp2, "pop mirror\n"); fprintf(fp2, "pick %f %f \n", padx,pady); fprintf(fp2, "next \n"); }; fprintf(fp2, "done"); fclose(fp1); fclose(fp2); 以上簡(jiǎn)單介紹了Protel到Allegro轉化的方法,希望能對讀者的設計工作有所幫助。 |