摘 è¦ï¼šæœ¬æ–‡ä»‹ç´¹äº†MAX7000系列CPLD器件在DSP接å£é›»è·¯ä¸çš„æ‡‰ç”¨ï¼Œé‡é»žä»‹ç´¹äº†TMS3202××系列DSPå’Œå˜å„²å™¨ï¼ŒLCD接å£çš„æ–¹æ³•,并輔以VHDLæºç¨‹åºçš„例å。
é—œéµè©žï¼šDSP;MAX7000;CPLD;å¯ç·¨ç¨‹é‚輯器件
å‰è¨€ï¼š
  Alteraå…¬å¸çš„產å“基本上都屬于CPLDçµæ§‹ã€‚由于它的內部連線å‡é‡‡ç”¨é€£çºŒå¼äº’è¯çµæ§‹ï¼Œå³åˆ©ç”¨åŒæ¨£é•·åº¦çš„金屬線實ç¾é‚輯單元之間的連接,所以它具有延時å¯é æ¸¬çš„å„ªé»žã€‚ç”±äºŽé‡‡ç”¨äº†å…¨æ–°çš„çµæ§‹ï¼Œå…ˆé€²çš„æŠ€è¡“å†åŠ ä¸ŠMAX+PLUSIIå¯ç·¨ç¨‹é‚輯的開發環境,使得Alteraå…¬å¸çš„PLD器件ä¸åƒ…具有PLD器件的一般優點,而且還有如下一些優勢:高性能ã€é«˜é›†æˆåº¦ã€åƒ¹æ ¼åˆç†ã€é–‹ç™¼å‘¨æœŸè¼ƒçŸã€å¯ä»¥å¾ˆæ–¹ä¾¿çš„進行在線編程。
  MAX系列是Alteraç›®å‰æœ€ç‚ºæµè¡Œï¼Œä½¿ç”¨æœ€å»£æ³›çš„å…©å€‹ç³»åˆ—ä¹‹ä¸€ï¼Œå› æ¤æœ¬æ–‡ç« 以MAX7000系列芯片為例介紹了å¯ç·¨ç¨‹èŠ¯ç‰‡åœ¨DSP系統è¨è¨ˆä¸çš„æ‡‰ç”¨ã€‚
MAX7000系列器件的特點
  MAX7000系列是高密度,高性能的CMOS CPLD,是在Alteraå…¬å¸çš„第二代MAXçµæ§‹åŸºç¤Žä¸Šæ§‹æˆçš„,采用先進的0.8umCOMS EEPROMæŠ€è¡“åˆ¶é€ ã€‚MAX7000系列æä¾›600到5000å¯ç”¨é–€ï¼ˆå™¨ä»¶ä¸Šæä¾›1200-10000門),引腳到引腳的延時為6nsï¼Œè¨ˆæ•¸å™¨é »çŽ‡å¯é”151.5MHz。MAX7000系列的-7å’Œ-10P速度ç‰ç´šåŒPCI總線標準一致。MAX7000系列的高密度器件稱為MAX7000Eç³»åˆ—ã€‚å®ƒå€‘æœ‰å¹¾å€‹åŠ å¼·çš„ç‰¹æ€§ï¼šé™„åŠ å…¨å±€æ™‚é˜ï¼Œé™„åŠ è¼¸å…¥ä½¿èƒ½æŽ§åˆ¶ï¼Œå¢žåŠ é€£ç·šè³‡æºã€å¿«é€Ÿè¼¸å…¥å¯„å˜å™¨å’Œå¯ç·¨ç¨‹çš„輸出電壓擺動率。
  MAX7000是用CMOS EEPROM單元實ç¾é‚輯函數的。å¯ç·¨ç¨‹çš„MAX7000çµæ§‹å®¹ç´å„ç¨®å„æ¨£çš„,有ç¨ç«‹çš„組åˆé‚輯和時åºé‚輯函數。在è¨è¨ˆé–‹ç™¼å’Œèª¿æ•´éšŽæ®µï¼ŒMAX7000器件å¯ä»¥å¿«é€Ÿè€Œæœ‰æ•ˆåœ°é‡æ–°ç·¨ç¨‹ï¼Œå¹¶ä¿è‰å¯ç·¨ç¨‹çš„æ“¦é™¤100次。
DSPç³»çµ±çµæ§‹
  在進行DSP系統è¨è¨ˆæ™‚采用CPLD來實ç¾DSP和其他外åœèŠ¯ç‰‡çš„æŽ¥å£é›»è·¯çš„å„ªé»žä¸»è¦æ˜¯ç¡¬ä»¶è¨è¨ˆç°¡å–®ï¼Œå› 為CPLD的管腳具有é‡å®šç¾©çš„功能,這使得PCBæ¿çš„è¨è¨ˆè¦ç°¡åŒ–很多;åŒæ™‚å› ç‚ºMAX7000系列CPLD的功能比較強大,å¯ä»¥å¾ˆå®¹æ˜“實ç¾åœ°å€è¯ç¢¼ã€ç‰å¾…時åºçš„æ’å…¥ä»¥åŠé€™ç¨®ç°¡å–®çš„總線轉æ›ï¼Œä¸€èˆ¬ç”¨ä¸€å¡ŠCPLDå°±å¯ä»¥å¯¦ç¾ç³»çµ±æ‰€æœ‰çš„æŽ¥å£é›»è·¯ã€‚它的功能框圖如下:
  下é¢å¾žç‰å¾…時åºçš„產生ã€åœ°å€è¯ç¢¼å’ŒLCD接å£é›»è·¯çš„實ç¾å¹¾å€‹æ–¹é¢ä¾†èˆ‰ä¾‹èªªæ˜Žã€‚
用CPLD產生ç‰å¾…時åº
  TMS320C2X支æŒèˆ‡æ…¢é€Ÿå¤–è¨æŽ¥å£çš„硬件ç‰å¾…狀態æ’å…¥ã€‚ç•¶èˆ‡æ…¢é€Ÿå¤–è¨æŽ¥å£æ™‚ï¼Œç³»çµ±å¿…é ˆæä¾›èƒ½ç”¢ç”Ÿç‰å¾…狀態的硬件電路。外è¨å˜å–的速度越慢,所需æ’入的ç‰å¾…狀態數é‡å°±è¶Šå¤šã€‚é‚£ä¹ˆï¼Œå¦‚ä½•æ ¹æ“šå¤–è¨å˜å–速度來確定所需的ç‰å¾…數å¯ä»¥ç”±ä¸‹å¼ç¢ºå®šï¼š
  è¨t為外è¨è¨ªå•時間
  TMS32020 [200(N-1)+85]ns
  TMS320C25-40 [100(N-1)+40]ns
  TMS320C25-50 [80(N-1)+29]ns
  å‡è¨è¨è¨ˆçš„系統在訪å•程åºç©ºé–“時需è¦åР入兩個ç‰å¾…,I/O空間和數據空間則是全速。用VHDL語言æè¿°å¦‚下:
  —— generate wait state for low speed interface
  g_wait_prog:
  PROCESS (clockout, reset)
  BEGIN
  IF ((res_cpu = ‘0‘) or (ps = ‘1‘))THEN
  progwaitclock <= 0;
  ELSIF (clockout‘EVENT AND clockout= ‘0‘) THEN
  IF (ps = ‘0‘) THEN
  IF progwaitclock = 2 THEN
  progwaitclock <= 0;
  ELSE
  progwaitclock <= progwaitclock + 1;
  END IF;
  ELSE
  progwaitclock <= progwaitclock ;
  END IF;
  END IF;
  END PROCESS g_wait_prog;
  —— generate ready signal
  PROCESS
  BEGIN
  IF ((progwaitclock = 0)and(lcdwaitclock = 0)) THEN
  ready <= ‘1‘;
  ELSE
  ready <= ‘0‘;
  END IF;
  END PROCESS ;
  Clockout為CPU的時é˜è¼¸å‡ºä¿¡è™Ÿï¼Œä¿¡è™Ÿé‡progwaitclock是用來計數clockout的個數,當CPU訪å•程åºç©ºé–“時,PS為低電平,progwaitclock開始計數,當progwaitclock的值ä¸ç‚º0時ready為高,CPUç‰å¾…外部è¨å‚™å°±ç·’,當progwaitclock計數到è¦ç‰å¾…的個數時,progwaitclock復ä½ç‚ºé›¶ï¼Œready變為低,CPUç‰å¾…çµæŸã€‚
用CPLD實ç¾å˜å„²å™¨æŽ¥å£
  å˜å„²å™¨æŽ¥å£åŒ…括ROM接å£å’ŒRAM接å£å…©ç¨®ã€‚ROMä¸»è¦æŒ‡PROMå’ŒEPROM,而RAMä¸»è¦æ˜¯éœæ…‹RAM(SRAM)。è¨è¨ˆå˜å„²å™¨æŽ¥å£æ™‚主è¦è€ƒæ…®åˆ°å˜å„²å™¨é€Ÿåº¦ï¼Œä»¥ç¢ºå®šéœ€è¦æ’入幾個ç‰å¾…ç‹€æ…‹ï¼ŒåŒæ™‚é‚„è¦è€ƒæ…®åˆ°åœ°å€è¯ç¢¼ï¼Œåœ°å€ç©ºé–“分é…çš„å•題。
  1 快速PROM/EPROM接å£
  快速PROM/EPROM(å˜å–時間 35ns)å¯ç›´æŽ¥å’ŒTMS320C2××接å£è€Œä¸ç”¨åŠ å…¥ç‰å¾…,但è¦è€ƒæ…®åˆ°åœ°å€è¯ç¢¼çš„å•題。
  2 慢速EPROM/EEPROM/FLASH MEMORY的接å£
  å°äºŽæ…¢é€Ÿå™¨ä»¶ï¼Œåœ¨å’ŒDSP這種較快的處ç†å™¨æŽ¥å£çš„æ™‚候è¦åŠ å…¥åˆé©çš„ç‰å¾…å‘¨æœŸï¼ŒåŒæ™‚é‚„è¦è€ƒæ…®åœ°å€è¯ç¢¼çš„å•題。
  3 快速SRAM接å£
  TMS320C2××既å¯å°‡SRAM用作程åºå˜å„²å™¨ï¼Œä¹Ÿå¯ç”¨ä½œæ•¸æ“šå˜å„²å™¨ã€‚ä¸ç®¡æ˜¯ç¨‹åºç©ºé–“還是數據空間,它都åªè¦è€ƒæ…®è¯ç¢¼çš„å•題,用æ£ç¢ºçš„線片é¸å³å¯ï¼Œå¦‚程åºç©ºé–“用PS片é¸ï¼Œè€Œæ•¸æ“šç©ºé–“用DS片é¸ã€‚
  4 程åºå’Œæ•¸æ“šå…¬ç”¨SRAM
  在很多時候,為了方便調試ä¸ä½†è¦æ“´å±•程åºSRAMä¹Ÿè¦æ“´å±•數據SRAMã€‚å› ç‚ºTMS320C2××分別用PSå’ŒDS來é¸ç¨‹åºå’Œæ•¸æ“šç©ºé–“ï¼Œæ‰€ä»¥ä¸€èˆ¬çš„åšæ³•是用PSå’ŒDS分別片é¸ä¸åŒçš„芯片,為了使DSPæœ‰è¶³å¤ çš„ç¨‹åºå’Œåœ°å€ç©ºé–“,我們需è¦å¤šç‰‡å˜å„²å™¨èŠ¯ç‰‡ï¼Œé€™æ¨£ï¼Œæœƒçµ¦PCBå¸ƒç·šçš„æ™‚å€™å¸¶ä¾†å¾ˆå¤§çš„éº»ç…©ã€‚å› ç‚ºé‡‡ç”¨äº†CPLD來進行è¯ç¢¼ï¼Œæˆ‘們å¯ä»¥å¾ˆæ–¹ä¾¿çš„用一塊容é‡è¼ƒå¤§çš„SRAM,通éŽåˆé©çš„è¯ç¢¼é›»è·¯ä½¿å®ƒçš„空間能分開,既有程åºç©ºé–“åˆæœ‰æ•¸æ“šç©ºé–“。下以CY7C1024-15為例來說明:
  —— ram address allocation.
  —— pro_data = 1 means select 8000H——ffffH(data);
  —— pro_data = 0 means select 0000H——7fffH(program);
  PROCESS (ds,ps)
  BEGIN
  IF((strb= ‘0‘)and(ds = ‘1‘)and(ps = ‘0‘)) THEN
  pro_data <= ‘0‘;
  ELSIF((strb= ‘0‘)and(ds = ‘0‘)and(ps = ‘1‘)) THEN
  pro_data <= ‘1‘;
  ELSE
  pro_data <= ‘0‘;
  END IF;
  END PROCESS;
  —— ram control line.
  control:
  PROCESS (we, w/r, ps, ds, ios, br, strb)
  BEGIN
  IF strb = "0" THEN
  IF ((ds = ‘1‘)and(ps = ‘0‘))or((ds = ‘1‘)and(ps = ‘0‘)) THEN
  ram_cs <= "0";
  ram_w/r <= w/r;
  ram_oe <= we;
  ELSE
  ram_cs <= "1";
  ram_w/r <= "1";
  ram_oe <= "1";
  END IF;
  ELSE
  ram_cs <= "1";
  ram_w/r <= "1";
  ram_oe <= "1";
  END IF;
  CY7C1021是Cypresså…¬å¸ç”Ÿç”¢çš„64k×16bit Static RAM,以上程åºè¦å®Œæˆçš„功能是讓一塊芯片的64k空間ä¸çš„低端32k為程åºç©ºé–“,å¦å¤–32k為數據空間。程åºä¸çš„pro_data接CY7C1021的最高ä½åœ°å€ç·šA15,當ps為低時pro_data為低電平,é¸ä¸RAM的低32k空間,當ds為低時pro_data為高電平,é¸ä¸RAM的高32k空間,ram_csã€ram_w/rã€ram_oe分別接CY7C1021的片é¸ã€è®€ã€å¯«ç·šã€‚
用CPLD實ç¾LCD接å£é›»è·¯
  我們常用的LCD有很多種,如段型ã€é»žé™£åž‹ï¼Œé€™å…’主è¦ä»‹ç´¹å¦‚何用CPLD來實ç¾DSP和點陣型LCD的接å£ã€‚ç”±äºŽé»žé™£åž‹æ¶²æ™¶é¡¯ç¤ºå™¨çš„å¼•ç·šå¤šï¼Œç”¨æˆ¶ä½¿ç”¨æ¥µä¸æ–¹ä¾¿ï¼Œæ‰€ä»¥åˆ¶é€ 商將點陣型液晶顯示器åšåœ¨ä¸€å¡Šæ¿ä¸Šæˆå¥—出售,這種產å“稱為液晶顯示模塊。在液晶顯示模塊上è£é…好了液晶顯示驅動電路和分壓電路,并æä¾›é©…動電路的接å£ï¼Œé€™ä½¿å¾—液晶顯示模塊和微處ç†å™¨çš„æŽ¥å£ååˆ†æ–¹ä¾¿ã€‚å®ƒåœ¨çµæ§‹ä¸Šå¯åˆ†ç‚ºæŽ¥å£ã€æŽ§åˆ¶å’Œè¼¸å‡ºä¸‰å¤§éƒ¨åˆ†ã€‚以深圳天馬公å¸çš„æ¶²æ™¶æ¨¡å¡Šç‚ºä¾‹ï¼Œç°¡å–®ä»‹ç´¹å®ƒçš„æŽ¥å£ã€‚它一共有11æ¢ä¿¡è™Ÿç·šï¼š
  RS用于寄å˜å™¨é¸æ“‡ï¼Œä½Žé›»å¹³é¸æ“‡æŒ‡ä»¤å¯„å˜å™¨ï¼Œé«˜é›»å¹³é¸æ“‡æ•¸æ“šå¯„å˜å™¨ã€‚
  R/W為讀/寫控制端,低電平時寫顯示模塊,把CPU的數據寫入顯示模塊;高電平讀顯示模塊,把顯示模塊的數讀回CPU。
  E為å…許輸入信號線(數據讀寫æ“作å…許信號),高電平有效。
  D0-D7為數據線。
  相比較DSP而言,LCD顯示模塊是慢速器件,在è¨è¨ˆæŽ¥å£é›»è·¯æ™‚除了è¦è€ƒæ…®å®ƒçš„æŽ¥å£æ™‚åºåŒ¹é…外還è¦è€ƒæ…®åŠ å…¥åˆé©çš„ç‰å¾…周期。在下é¢çµ¦å‡ºçš„例åä¸åœ°å€ç·ša0用來控制是讀還是寫,a1ç”¨ä¾†é¸æ“‡æ•¸æ“šå¯„å˜å™¨é‚„是控制寄å˜å™¨ã€‚Lcd_rs接到LCD模塊的RS管腳,lcd_wr接到LCD模塊的W/R管腳,lcd_e接到E管腳。程åºä¸çš„high_adr是DSP地å€ç·šé«˜3ä½a15-a13的組åˆï¼Œåœ¨é€™å€‹ä¾‹å程åºä¸LCD模塊的æ“作地å€è¢«æ˜ 射到DSPçš„IO空間的0x2000-0x3fff。
  —— lcd interface :
  —— input : a1(lcd_rs), a0(lcd_wr) ,we, wr, ios, strb ;
  —— a1,a0 => "00" : write command
  —— a1,a0 => "01" : read AC value
  —— a1,a0 => "10" : write data
  —— a1,a0 => "11" : read data
  —— lcd_rs : select register bank ‘1‘ for data, ‘0‘ for command
  —— lcd_wr : write/read control ‘1‘ for read, ‘0‘ for write
  —— lcd_e : enable signal; ‘1‘ for read , ‘1‘ to ‘0‘ write data in
  lcd_en:
  PROCESS (we, wr, ios, strb)
  BEGIN
  IF ((strb = ‘0‘) and (ios = ‘0‘)) THEN
  IF (high_adr = "001") THEN
  lcd_rs <= a1;
  lcd_wr <= a0;
  lcd_e <= (not (we or wr));
  ELSE
  lcd_rs <= ‘0‘;
  lcd_wr <= ‘0‘;
  lcd_e <= ‘0‘;
  END IF;
  ELSE
  lcd_rs <= ‘0‘;
  lcd_wr <= ‘0‘;
  lcd_e <= ‘0‘;
  END IF;
  END PROCESS lcd_en;
  —— generate wait state for low speed interface
  g_lcd_wait:
  PROCESS (clockout, reset1 )
  BEGIN
  IF ((reset1 = ‘0‘)or(not((ios = ‘0‘) and (high_adr = "001")))) THEN
  lcdwaitclock <= 0;
  ELSIF (clockout‘EVENT AND clockout= ‘0‘) THEN
  IF ((ios = ‘0‘) and (high_adr = "001")) THEN
  IF lcdwaitclock = 5 THEN
  lcdwaitclock <= 0;
  ELSE
  lcdwaitclock <= lcdwaitclock + 1;
  END IF;
  ELSE
  lcdwaitclock <= 0;
  END IF;
  END IF;
  END PROCESS g_lcd_wait;
  用CPLD實ç¾éµç›¤æŽ¥å£é›»è·¯
  DSPå’Œéµç›¤çš„æŽ¥å£å¯ä»¥ç”¨å°ˆç”¨çš„éµç›¤æŽ¥å£èŠ¯ç‰‡ä¾†å¯¦ç¾ï¼Œä½†å¦‚果是è¦è˜åˆ¥çš„éµä¸æ˜¯å¾ˆå¤šï¼Œç”¨ä¸€å¡Šå°ˆé–€çš„éµç›¤æŽ¥å£èŠ¯ç‰‡å°±é¡¯å¾—æœ‰äº›å¤šä½™ï¼Œç”¨ä¸€å¡ŠCPLD附帶就能實ç¾éµç›¤æŽ¥å£ï¼Œå®ƒå¯ä»¥æŠŠéµç¢¼çš„è˜åˆ¥æ˜ 射到DSP的一個IO空間,然åŽé€šéŽè®€é€™å€‹IO地å€ä¾†åˆ¤æ–·æ˜¯å¦æœ‰éµæŒ‰ä¸‹ï¼Œå®ƒä¹Ÿå¯ä»¥å¾ˆæ–¹ä¾¿çš„å¯¦ç¾æŒ‰éµä¸æ–·ï¼Œæ‰€ä»¥çš„éµé€šéŽèˆ‡çš„關系產生一個信號,這個信號連到CPUçš„ä¸æ–·è¼¸å…¥ç®¡è…³ï¼Œç•¶æœ‰éµæŒ‰ä¸‹æ™‚,這個信號發生調變觸發CPUçš„ä¸æ–·ã€‚åŒæ™‚它還å¯ä»¥å¾ˆå®¹æ˜“實ç¾ç¡¬ä»¶æ¶ˆæŠ–ã€‚å› ç‚ºé€™éƒ¨åˆ†æ¯”è¼ƒç°¡å–®ï¼Œæ•…ä¸å†èˆ‰ä¾‹èªªæ˜Žã€‚
仿真波形
  如圖所示為以上VHDL程åºåœ¨MAXPLUSIIä¸ç·¨è¯ä»¿çœŸçš„çµæžœï¼Œä»¿çœŸåƒ…僅給出了æ¯å€‹åŠŸèƒ½æ¨¡å¡Šçš„éƒ¨åˆ†æ³¢å½¢ï¼Œåœ–ä¸é¡¯ç¤ºäº†ç•¶è¨ªå•程åºç©ºé–“時,pro_data為低電平,readyä¿æŒå…©å€‹æ™‚é˜å‘¨æœŸçš„低電平使得CPU總線æ’入兩個周期的ç‰å¾…。圖ä¸é‚„顯示了當訪å•IO空間的0x2002åœ°å€æ™‚的波形,å°é€™å€‹åœ°å€é€²è¡Œè®€æ“作是從LCD的控制寄å˜å™¨è®€å…¥æ•¸æ“šï¼Œé€™æ™‚readyä¿æŒ5個時é˜å‘¨æœŸçš„低電平來讓CPUæ’å…¥5個周期的ç‰å¾…,在這個期間lcd_wrä¿æŒé«˜é›»å¹³è¡¨ç¤ºå°LCD進行讀æ“作,lcd_rsä¿æŒä½Žé›»å¹³è¡¨ç¤ºé¸æ“‡LCD的控制寄å˜å™¨ã€‚
çµè«–
  芯片的è¨è¨ˆã€ç”Ÿç”¢å’Œåˆ¶é€ 技術的發展使得CPLD的在å„種è¨è¨ˆä¸æœ‰è¶Šä¾†è¶Šå¤šçš„æ‡‰ç”¨ï¼Œè€Œéš¨è‘—DSPèŠ¯ç‰‡æ€§èƒ½åƒ¹æ ¼æ¯”å’Œé–‹ç™¼æ‰‹æ®µçš„ä¸æ–·æé«˜ï¼ŒDSP已在通信與信æ¯ç³»çµ±ã€ä¿¡è™Ÿèˆ‡ä¿¡æ¯è™•ç†ã€è‡ªå‹•控制ã€é›·é”ã€è»äº‹ã€èˆªç©ºèˆªå¤©ã€é†«ç™‚ã€å®¶ç”¨é›»å™¨ç‰è¨±å¤šé ˜åŸŸä¹Ÿå¾—到廣泛的應用。DSPçš„é«˜é€Ÿåº¦å’ŒæœŸå¾©é›œçš„æŽ¥å£æ™‚åºä½¿å¾—在è¨è¨ˆDSP系統時往往會難于è¨è¨ˆDSP和外åœé›»è·¯çš„æŽ¥å£ï¼Œæœ¬æ–‡ä»¥å˜å„²å™¨ï¼ŒLCDç‰ç‚ºä¾‹ç°¡å–®ä»‹ç´¹äº†MAX7000系列在DSP系統ä¸çš„æ‡‰ç”¨ï¼Œå¹¶è¼”有VHDL實ç¾çš„例å,通éŽåœ¨é€™æ–¹é¢çš„å¯¦è¸æ‡‰ç”¨ï¼Œç¸½é«”感覺用CPLD來處ç†DSPçš„å¤–åœæŽ¥å£é›»è·¯å¾ˆæ–¹ä¾¿ï¼Œå› 為它的IO管腳幾乎å¯ä»¥éš¨æ„åˆ†é…,å¯çµ¦PCB布線帶來很大的方便;尤其在調試的時候,甚至ä¸ç”¨æ–·é›»å°±å¯ä»¥é‡æ–°å‘CPLDä¸å¯«å…¥æ–°çš„é‚輯關系就å¯ä»¥èª¿è©¦ã€‚