注意:本文所有内容皆来源于Xilinx工程师,如需转载,请写明出处作者及赛灵思论坛链接并发邮件èï¼æªç»Xilinxåèä½æäººè®¸å¯ï¼ç¦æ¢ç¨ä½åä¸ç¨éã
BY 墿
è®ºåææ¥ä¹ææå - 墿
æ¾å°±èäºä¸æµ·è´å°ï¼é¿å°å¡ç¹æè®¯ï¼ï¼ä»»FPGAå·¥ç¨å¸ãç®åä»äºFPGAå éè®¡ç®æ¹é¢çå·¥ä½ãæå¤å¹´ä½¿ç¨FPGAå¼åååºç¨çç»åï¼çæXilinx FPGAçä½ç³»ç»æã
Vivadoç¸æ¯ä¸ä¸ä¸ä»£å¼åå·¥å ·ISEï¼ä¸ä¸ªå·¨å¤§çæåå°±æ¯å ¨é¢æ¯æTclèæ¬è¯è¨ãç±äºå ¨é¢æ¯æTclèæ¬ï¼æä»¥å¯ä»¥å©ç¨Tclæ¥åä¸äºå¥½ç©çäºæ ãè¿éæç å¼çï¼å享ä¸ç¹å ³äºVivado Tclç使ç¨å°å¿å¾ã
é常çå·¥ç¨ä¸ï¼ç´æ¥çæçæä»¶æ¯bitæä»¶ï¼å¦æéè¦è°è¯ï¼å¯è½è¿éè¦ltxæä»¶ï¼ãèé产项ç®ä¸ï¼bitæä»¶çå 容é常éè¦æ¾å¨flashä¸ï¼é¤äºæ©å¹´çSpartan-3ANï¼Xilinxç®åè¿æ²¡æå¨å®çå ç½®FlashçFPGA产åï¼ï¼è¿ä¸ªæ¶å常è§çæä½æ¯å°bitæä»¶è½¬ä¸ºmcsæä»¶æè binæä»¶ï¼å©ç¨Vivadoæè ç¬¬ä¸æ¹å·¥å ·ç§å ¥å°Flashä¸ã
å¨ISEæ¶ä»£ï¼æä¸ªå¾å¥½ç¨çå·¥å ·iMPACTæ¥å®æbitå°mcs/binæä»¶ç转æ¢ãå°äºVivadoæ¶ä»£ï¼ç±äºå¯ä»¥ä½¿ç¨Tclèæ¬ï¼æä»¥é常建议使ç¨Tclèæ¬æ¥çæmcs/binæä»¶ï¼å ·ä½å½ä»¤æ¯write_cfgmemã
ä¸è¿æ¯æ¬¡çæbitæä»¶ä¹åéè¦æå¨è¾å ¥å½ä»¤æ¥çæä¸æ¬¡ï¼è¿æ ·çæä½æ¯æ¯è¾éº»ç¦çãè¿éæä¾ä¸ä¸ªæ¹æ³æ¥èªå¨å®ç°çæmcs/binæä»¶çåè½ï¼å¨æ¤åºç¡ä¸è¿è½å®åæ´å¤çç»èåè½ã
注æï¼å¦æä½¿ç¨non-project模å¼ï¼æè å³ä½¿æ¯project模å¼ä¹ä½¿ç¨å ¨èæ¬æ¨¡å¼ï¼é£ä¹åç´æ¥åå ¥Tclèæ¬å³å¯ãæ¬æè®ºè¿°çæ¹æ³æ¯åºäºProject模å¼Vivado GUI使ç¨çã
Vivado卿¯ä¸æ¥æä½ç设置ä¸ï¼æä¸¤ä¸ªé项å¯ä»¥ä½¿ç¨ã

å ¶ä¸ï¼tcl.preåtcl.postæ¯æ·»å tclæä»¶çè·¯å¾ãtcl.pre表示è¿ä¸æ¥ä¹åè¿è¡æ·»å çtclæä»¶ï¼tcl.post表示è¿ä¸æ¥ä¹åè¿è¡æ·»å çtclæä»¶ã综åï¼å®ç°åbitæä»¶ççæè¿äºæ¥éª¤é½æè¿ä¸¤ä¸ªè®¾ç½®å¯ä»¥ä½¿ç¨ã
æä»¥åºæ¬æè·¯å°±æ¯ï¼å°éè¦çæä½ä»¥Tclèæ¬çå½¢å¼åå¨Tclæä»¶ä¸ï¼ç¶åæ·»å å°Bitstream Settingsä¸çtcl.postä¸ï¼è¿æ ·çæbitæä»¶ä¹åï¼Vivadoå°±ä¼èªå¨è¿è¡ç¸å ³çTclæä»¶æ¥å®ç°éè¦çåè½ã

1. é¦å éè¦æ³¨æçé®é¢æ¯ï¼Tclæä»¶è¿è¡è·¯å¾ãå½Tclæä»¶è®¾ç½®å°Bitstream Settingsä¸çtcl.postä¸ä¹åï¼å¨è¿è¡æ¶ï¼è¿è¡çè·¯å¾å°±æ¯æåçæbitæä»¶æå¨è·¯å¾ï¼èä¸ææ·»å çTclæä»¶åæ¾çè·¯å¾æ å ³ãè·åå½åè·¯å¾çTclå½ä»¤ï¼pwdãè¿ä¸æ¥éå¸¸æ¯æä»¤äººå°æçï¼ç»å¸¸ä¼å 为路å¾ä¸æ£ç¡®èæ æ³æ£ç¡®çè¿è¡ã
2. ç¥éè·¯å¾ä¹åï¼ä¸ä¸æ¥æ¯éè¦ç¥ébitæä»¶åï¼è¿éå°±æä¸ä¸ªéè¦æ³¨æçå°æ¹ãé常ï¼å¨çæbitæä»¶çè·¯å¾ä¸åªä¼æä¸ä¸ªbitæä»¶ï¼æä»¶åæ¯åºå®çï¼æ¯æ¬¡çææ°çbitæä»¶ä¼è¦çææ§æä»¶ã使¯ææ¶åä¼åºç°æå¤ä¸ªbitæä»¶çæ åµï¼ä¾å¦ï¼ä¼å°bitæä»¶æ¹å使¯ä¾ç¶ä¿åå¨å½åè·¯å¾ä¸ï¼ç¨äºå¤ä»½ãè°è¯æ¶ä¸´æ¶æ¾ç½®äºå¤ä¸ªbitæä»¶çãè½ç¶è¿äºæ åµå¹¶ä¸è¢«æ¨èï¼ä½æ¯å¦æä¸æ¦åå¨ï¼ä¼å¯¼è´Tclèæ¬æ æ³ç¥éåºè¯¥å¤çåªä¸ªæä»¶ãä¸ä¸ªç®åå¯ç¨çæ¹æ³æ¯ï¼éååºææçbitæä»¶ï¼å¹¶åä¿®æ¹æ¶é´ææ°çä¸ä¸ªãç±äºåçæbitæä»¶ä¹åå°±è¿è¡Tclèæ¬ï¼æä»¥ææ°çæä»¶èªç¶å°±æ¯ååçæçbitæä»¶ã
对åºçTclèæ¬å¦ä¸
set pro_path "[pwd]\/" set bit_file_list [glob -path "$pro_path" "*.bit"] set file_time 0 foreach file $bit_file_list { set ftime [file mtime $file] if {$ftime == 0} { puts "Error File!" } if { $ftime > $file_time} { set file_time $ftime set file_name $file } }
ä¸è¿°ä»£ç ä¸ï¼globæ¯ç¨æ¥æ¥æ¾bitæä»¶çï¼file mtimeæ¯ç¨æ¥è·åæä»¶çæ´æ°æ¶é´ï¼ç¨æ¥å¯¹æ¯ã第ä¸è¡ç¨pwdè·åçè·¯å¾æ¯ç»å¯¹è·¯å¾ï¼ åé¢å ä¸â\/âæ¯ç¨æ¥ä½ä¸ºä¸ä¸ªç®å½è·¯å¾ï¼ä¾¿äºglobæç´¢å¹¶åæåºæ°çæä»¶åã为äºé²æ¢åºé®é¢ï¼å¦ææä»¶çä¿®æ¹æ¶é´æ¥å°æ¯0ï¼å认为该æä»¶ä¸æ£ç¡®ï¼ä¼æå°ä¿¡æ¯åæç¤ºã
3. è·åæä»¶ä¹åï¼å°±å¯ä»¥çæmcsæä»¶äºãæ¤æ¶bitæä»¶çæä»¶å以宿´çç»å¯¹è·¯å¾åå¨å¨file_nameåéä¸ï¼æç®åçåæ³æ¯ç´æ¥å°æä»¶çåç¼â.bitâæ¿æ¢ä¸ºâ.mcsâå³å¯ã
Tcl代ç ï¼ set mcs_file "[file rootname $file_name].mcs" file rootnameä¼è·åé¤äºæä»¶åç¼ä¹å¤çæä»¶åå ¨é¨ä¿¡æ¯ï¼åé¢å ä¸â.mcsâå³å¯ä½¿ç¨ã妿è¦çæbinæä»¶ï¼ä¿®æ¹mcs为binå³å¯ã
4. çæmcsæä»¶ãè¿é使ç¨write cfgmemå½ä»¤ãå ·ä½æ ¼å¼ä¾æ®éè¦è¿è¡è°æ´å³å¯ãæå¥½å ä¸-forceæ¥å®ç°è¦çæ§æä»¶ãä¸é¢æ¶write cfgmemçä¸ä¸ªä½¿ç¨èä¾ã
write_cfgmem -format MCS -size 256 -interface BPIx16 -loadbit "up 0x0 $file_name" -file $mcs_file -force
éè¦æ³¨æçæ¯ï¼è¿æ¡æä»¤ä¸flashç容é忝æçæ¥å£æ¨¡å¼éè¦ç¨æ·æ ¹æ®èªå·±çå¼åæ¿è¿è¡é ç½®ãå¦å¤ï¼ZynqåZynq Ultrascale+ç³»åå¨ä»¶ä¸æ¯å¾éåç¨æ¬æçæ¹æ³æ¥çæmcsæä»¶ã
å°æ¬¡ï¼Tclæä»¶å·²ç»å®æèªå¨çæmcsæä»¶çå·¥ä½ãæ¯æ¬¡çæå¥½bitæä»¶ä¹åï¼å°±ä¼å¨bitæä»¶çè·¯å¾ä¸èªå¨çæmcsæä»¶ã
ä¸è¿ï¼é常ç项ç®å¼åï¼å¯¹é ç½®æä»¶çéæ±è¿ä¸æ¢äºæ¤ãè¿ç§æ¯æ¬¡çæçbitæä»¶é½æ¾å¨å·¥ç¨é»è®¤ç®å½ä¸çæä½ï¼å¹¶ä¸å©äºæä»¶/çæ¬ç管çï¼ä¹ä¸å©äºåé/æäº¤ãè¾ä¸ºå¸¸è§çåæ³æ¯å°bitæä»¶ä½ä¸ºåå§æä»¶ï¼éä¸ç§å½Flashç¨çmcsæä»¶ãè°è¯ç¨çltxæä»¶çï¼ä¸èµ·è½¬åå°å ¶ä»è·¯å¾ï¼ä¾å¦å ¬å¸çå é¨ç§æç½çï¼è¿è¡å¤ä»½/ååï¼ä¾¿äºå个工ç¨å¸æéæåãèè¿ä¸æ¥è½¬åï¼ä¹å¯ä»¥éæå¨è¿ä¸ªTclæä»¶ä¸ã
é¦å ï¼ä¸æå·²ç»ç¹æï¼Tclæä»¶è¿è¡çè·¯å¾åTclæä»¶æ¬èº«çè·¯å¾æ å ³ï¼æä»¥è¿ä¸ªTclæä»¶å¯ä»¥æ¾å¨ä»»æè·¯å¾ä¸ã妿éè¦å°bitæä»¶åmcsæä»¶æ¾ç½®äºæä¸ªåºå®è·¯å¾ä¸ä¿åï¼å¯ä»¥å°è¯¥Tclæä»¶æ¾äºè¿ä¸ªè·¯å¾ä¸ãç¶åè¿è¡æ¶ï¼ä»Tclèæ¬ä¸è·åTclæä»¶æå¨è·¯å¾å³å¯ã
Tclæä»¶è·åæä»¶æ¬èº«è·¯å¾çå½ä»¤ set dest_path "[ file dirname [ info script ] ]"
è¿æ ·Tclæä»¶çç»å¯¹è·¯å¾å°±åå¨å¨dest_pathè¿ä¸ªåéä¸äºï¼åç»å¦æéè¦å¤å¶/ç§»å¨æä»¶ï¼å¯ä»¥ä»¥è¿ä¸ªè·¯å¾ä½ä¸ºåºç¡è¿è¡ç¸å ³ä¿®æ¹ã
å¤å¶æä»¶çç¸å ³Tclå½ä»¤ï¼
file copy -force $file_name "$dest_path/bitfile/" file copy -force $mcs_file "$dest_path/mcsfile/"
éè¦æ³¨æçæ¯ï¼ç®çè·¯å¾éè¦ç¡®å®åå¨ï¼æ¯å¦ä¸é¢çbitfileåæä»¶å¤¹åmcsfileåæä»¶å¤¹ã妿ä¸åå¨çè¯ï¼å¯ä»¥æ·»å ç¸å ³å½ä»¤ï¼çæåæä»¶å¤¹ä¹ååè¿è¡å¤å¶ã
æ¬æç²æµ å°ä»ç»äºä¸ç§å©ç¨Tclèæ¬æ¥èªå¨åå®ç°mcsçæå¹¶å¤å¶çæ¹æ³ãå ³é®ç¹å¨äºå¼è·åTclæä»¶æ§è¡ååæ¾çè·¯å¾ãç±äºTclçå å ¥ï¼Vivadoå¯ä»¥ææ´å¤æ°çç©æ³æ¥ç®åæ¥å¸¸å·¥ä½ãæå¿çæåå¯ä»¥å¤å ³æ³¨ä¸ä¸ï¼å¹¶å¨è®ºåä¸å¤è¿è¡äº¤æµã
éä»¶ä¸è½½ï¼ gen_mcs.zip https://forums.xilinx.com/xlnx/attachments/xlnx/CN_support_blog/47/1/gen...
æ¥æºï¼èµçµæè®ºå