摘 要:本文介紹了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中寫入新的邏輯關系就可以調試。