MP3播放機雖然是可攜式多媒體(PMP)裝置中,整合技術比較單純的一種。但是,這種單純性是來自於SoC處理器的強大功能,簡化了工程師原本繁複的工作。當然要獲得這樣的單純性和便利性,是要付出代價的──須支付SoC處理器和作業系統軟體的授權金和權利金。這就像Wintel集團的PC解決方案一樣,雖然開發方便,可以及早量產,但是其核心的技術知識(know-how)是近似於封閉和不可探知的。
功能單元
成本低、功能簡單的MP3播放機至少需要以下的基本單元:處理器/微控制器、MP3解碼器、DMA、記憶體、硬碟、電源電路、DAC或I2S,LCD和鍵盤則是選項。當然還需要外接揚聲器。為了減少元件的數量、提高設計的彈性、縮小體積,可以使用FPGA來設計DMA、記憶體控制器、IDE控制器。如附(圖一)所示。
FPGA電路
在附圖一的FPGA電路中,列舉其中功能比較重要者說明如下:
- ●主電路:這是完整的資料路徑----從微控制器匯流排到可共享的參數/位址映射記憶體、到DRAM/IDE匯流排。它包含了微控制器能夠存取的所有外部暫存器、事件偵測(event detection)和行動請求位元(action request bits)。外部暫存器組是位於DRAM內,執行各種特定的任務;當關機時,這些暫存器將會消失。事件偵測、行動請求位元都是為了讓微控制器得知目前的狀態,並採取適當的行動、或執行特定的韌體程式。
- ●控制用的狀態機:負責接收各種行動請求位元,並使所有的控制線生效(assert),最後導致資料移動。它是一種簡單的,但大型的狀態機;平時它處於閒置和等待的狀態,直到要採取行動。所有的狀態是採用S_state_#的方式命名的。OR閘在適當的狀態下,會使正確的控制訊號生效,如附圖二所示。這個電路也包含了「優先順序編碼器(priority encoder)」。在閒置狀態時,若擱置了許多個請求,則優先順序編碼器可以決定哪一個要先執行。這種電路雖然有點複雜,但是它使用「一熱(one-hot)」的簡單概念。所謂「一熱」是指每一個狀態是使用一個正反器(flip-flop)實現的,在每一個狀態下,只有一個正反器是處於高值,其餘都是低值,而且「熱位元(hot bit)」會一直移動,直到回到閒置狀態。在DMA路徑上,具有一個正反器(也可以省略不用),當結束DMA作業的條件成立時(ISZERO),此正反器會收到「熱位元」。所有的控制訊號是由OR閘產生的,只要輸入的狀態訊號群組中有一個是高值,OR閘就會輸出高值(使控制訊號生效)。例如:若(圖二)的OR2的S_RD_IDE_1或S_WR_IDE_1為高值,則IDE_ADDR的輸出也會是高值,因此IDE_ADDR生效了。不過,有一些對時間要求很嚴格的(timing critical)訊號,並不是使用OR閘產生的,它們是使用建立/重置(set/reset)暫存器產生的。建立/重置暫存器的功效和OR閘一樣,但是沒有延遲。
微控制器匯流排MOVX偵測
傾聽微控制器匯流排,當沒有MOVX指令要執行時,使DMA_OK訊號生效。當DMA_OK未生效時,優先順序編碼器不會讓任何非CPU的硬體單元存取DRAM。所以,它對微控制器的讀取和寫入請求是立即回應的,不會有延遲發生。這對8051微控制器而言,是很重要的,因為8051沒有等待狀態。如果有偵測到一個MOVX作業碼,但是MOVX沒有被執行,一個31週期的計時器可以使DMA_OK再次生效。
微控制器的位址解碼
這些訊號生效後,可以使外部暫存器在微控制器的記憶體映射區域內使用。通常,這是將位址排線和REG_RD訊號或REG_WR訊號AND在一起;REG_RD和REG_WR訊號是由狀態機產生的。
DRAM/IDE位址多工器(mux)
在DRAM的行列式位址位元(address bits)、IDE的位址位元(來自於微控制器)之間,做DRAM/IDE位址腳位的切換;或為零,當執行IDE DMA的直接傳輸作業時(類似PIO)。
MP3輸出位移暫存器(shift register)
這是16位元的位移暫存器,它從IDE介面得到一個16位元的字組(word),並以位移的方式將此字組送至 MP3解碼器。
MP3位元計數器
計算位移暫存器送至MP3解碼器的位元數目。當所有的16位元都被移出時,會產生一個訊號,此時,位移暫存器準備供給STA013 DMA使用,以繼續從DRAM中讀取和傳送下一個字組。
DRAM的重清(refresh)時脈
這個電路會每15.2 ?s 產生一個脈衝,要求狀態機執行一個DRAM重清週期。此脈衝會在主電路內,建立一個請求旗標,當匯流排可以使用時,狀態機會開始執行重清作業,而且優先等級比較高的請求不會被擱置。
DRAM/IDE位址緩衝器(buffer)
保存位址,這些位址是用來驅動DRAM和IDE介面。
32-byte的SRAM記憶體
使用兩個16×16寬度的DRAM記憶體,將它們虛擬成具有位址或資料鎖定(latch)功能的SRAM。其中一個保存DRAM的分頁(page)號碼,這些分頁是映射至微控制器的位址空間0xFF00至0xFF1F的區域(DRAM_PAGE_CFG暫存器),它們和微控制器的12個位址位元一起被送至DRAM/IDE位址多工器,最後可以為DRAM的讀寫作業,產生一個唯一的位址。第二個SRAM負責保存DMA的參數值(在0xFF20至0xFF3F的區域內)。
位址映射記憶體的寫入功能生效
允許對位址映射記憶體進行寫入作業。不過,它只允許微控制器在0xFF00至0xFF1F的記憶體區域寫入資料。
DMA參數記憶體的寫入功能生效
允許對DMA參數記憶體進行寫入作業。微控制器能寫入這些參數,而且,這些參數也可以被狀態機更新,例如:在進行DMA傳輸作業時,狀態機可以改變它們。
16位元的遞增/遞減電路
在進行DMA傳輸作業時,16位元的遞增/遞減可以用來更新參數值。遞增電路是為了計算DRAM的目標位址,遞減電路是為了計算字組。DMA參數記憶體的輸出值會被送至此電路中,而且也會被送至16個多工器中,以允許DMA參數被轉譯成位址,就好像它們來自於微控制器的位址匯流排(address bus)一樣。
零、壹和奇數值檢測器
當DMA參數值被改變時,這個電路能夠立即得知;如果DMA參數值是零、壹或奇數位址,這個電路也能夠通知狀態機。當DMA參數值是零時,狀態機會清除DMA的請求旗標,以終止DMA作業,並將「完成DMA傳輸」的中斷旗標設為1。
微控制器的「位址鎖定致能(address latch enable;ALE)」訊號之同步
能使微控制器的ALE訊號和FPGA 的時脈同步。微控制器的其它控制訊號也是採用類似的同步機制,但是它們位於主電路中。
2:1多工器/4位元
此電路允許在每32 byte記憶體內的位址,可以被記憶體的一般功能控制,或被微控制器的匯流排控制(當韌體從這些暫存器中讀出或寫入,來改變位址映射或建立DMA傳輸時)。
2:1多工器/8位元
它被使用在IDE區塊內。它允許從微控制器的資料區域中,將資料載入至輸出緩衝器內。
2:1多工器/16位元
當執行一個DMA週期時,利用這個電路,可以從微控制器的位址匯流排(一般作業),切換成DMA參數記憶體的位址匯流排。
2:1多工器/16位元
利用這個電路可以選擇DMA參數記憶體的輸入值;它是在更新的DMA參數(在一個DMA週期內)和微控制器的資料匯流排(當微控制器寫入DMA設定值)之間做切換。單獨設計這個16位元的多工器,是因為FPGA開發工具的「可設定的邏輯區塊(configurable logic block;CLB)」之映射,無法將額外的邏輯閘納入上列的那些2:1多工器內(如此會浪費8個CLB,並在重要的時序路徑上,增加額外的延遲時間),除非邏輯閘是在同一個電路設計圖內。
16至8位元匯流排,三態(tri-state)緩衝器
此三態緩衝器允許一個16位元匯流排的任一半位元組(8 bit)去驅動一個8位元匯流排。它可以讓微控制器從寬16位元的記憶體中讀取資料。
8至16位元匯流排緩衝器
連接兩個8位元的匯流排成為一個16位元匯流排(但FPGA開發工具並不會因此混淆)。
8至16位元匯流排緩衝器
連接一個8位元的匯流排兩次,成為一個16位元匯流排(但FPGA開發工具並不會因此混淆)。此16位元匯流排的任一半位元組都是來自於此8位元匯流排,如附(圖三)。
8位元暫存器
一個8位元暫存器,用來收集微控制器的位址位元。
此外,由於不同的FPGA開發工具的性能差異,可能還需要:
- ●數個具有不同位元數(例如:5至9位元)的位移暫存器:它們在狀態機中使用。可以避免因為在同一電路設計圖內具有太多的符號,而使FPGA開發工具當機。
- ●正反器(在CLB中):這是唯一的CLB正反器,以一個比在FPGA開發程式庫(library)中還要小的符號來重設計。
- ●正反器(在IOB中):這是唯一的「I/O區塊(IOB)」正反器,以一個比在FPGA開發程式庫(library)中還要小的符號來重設計。
FPGA電路算是此MP3播放機系統中,比較複雜的一部份,一般的OEM/ODM可以指定規格委外設計。另一個OEM/ODM廠商必須注意的是韌體的設計;或許韌體也可以委外設計,但是他們必須懂得如何使用底層韌體(組合語言)所提供的應用程式介面(API),來設計上層的使用者程式(C語言程式)。
應用程式介面
應用程式介面至少包含:動態配置記憶體(memory allocation)、檔案/目錄的讀取、MP3音樂的播放、與其它週邊的通訊(包括:可當作除錯用途的序列埠、LCD顯示器…..等)。這裡僅介紹動態配置記憶體的應用程式介面如下:
動態配置記憶體
對使用者程式而言,一定需要配置記憶體來儲存字串、結構、或其它項目。它的功能就像C語言裡的malloc( )一樣。這裡使用的是simm_malloc( ),它的原式如下所示:
- ●simm_id simm_malloc (unsigned int num_bytes):
- 分配num_bytes的DRAM記憶體空間,並傳回simm_id代表這個空間。simm_id不是一個指標(pointer),而是一個號碼。想要得到配置好的實際的記憶體空間位址,必須透過addrX函式,如下所示:
- ●xdata void * addr5 (simm_id addr32):映射至0x5000~0x5FFF
- ●xdata void * addr6 (simm_id addr32):映射至0x6000~0x6FFF
- ●xdata void * addr7 (simm_id addr32):映射至0x7000~0x7FFF
- 將simm_id所代表的記憶體空間映射至微控制器的位址空間,並傳回一個指標。這些函式的回傳值幾乎是使用「類型轉換(typecast)」,例如:(xdata char *)addr5(string_id)。每一個函式會分別映射至一個屬於微控制器位址空間的特殊區段。如果有任何一個指標已經被使用了,這個特殊區段就不是有效的;因此,對同一個simm_id而言,只能透過上列的3個函式,獲得3個不同的指標,而且它們不能被使用,這樣的位址空間才是有效的。
- 想要釋放simm_malloc( )先前配置的記憶體空間,必須使用下列的函式:
- void simm_free (simm_id addr32)
在表一中,從0x0000至0xEFFF的區域是儲存資料用的分頁(page),其餘都是暫存器。每一個分頁(或區塊)大小是4K(Bytes)。所支援的DRAM模組大小,是從1024(4MBytes)至8192(32MBytes)個區塊。系統初始化後,這些4K大的區塊會被配置且閒置著(free)。當一組區塊被配置時,通常第一個區塊的號碼會先被用掉,後面的區塊是透過呼叫next_block( )函式來依序存取。DRAM控制器允許任何15個區塊能映射至微控制器的位址空間中,從0x0000至0xEFFF。下面條列出與分頁管理相關的函式(是以組合語言寫成的):
- ●init_memory_mgr:將「記憶體管理者(memory manager)」初始化。它會檢測出DRAM模組的大小,少部份的記憶體區塊會被保留下來,供作設計所有區塊的鏈結串列(linked list)之用。此鏈結串列可以追蹤哪些區塊是閒置的,哪些是被使用的。當應用程式需要一組區塊時,這個被保留的記憶體區塊就會儲存那組區塊的串列。在使用其它函式之前,必須先呼叫此函式。
- ●malloc_blocks:配置1個或更多個區塊(4K大的分頁),並傳回第一個區塊的號碼。若要配置一個以上的區塊,須配合使用next_block函式來擷取其它區塊。請注意,它和simm_malloc( )一樣,這些區塊並不會自動映射至微控制器的定址空間。
- ●map_block:將一個區塊映射至微控制器的定址空間。輸入分頁號碼(0~14)和區塊數量。
- ●free_blocks:將配置好的區塊釋放。釋放後的區塊之映射並不會自動消失。輸入第一個區塊的號碼,與它同一組的區塊都會被釋放。
- ●next_block:擷取一個以上的區塊時,配合malloc_blocks使用。輸入目前的區塊的號碼,它會傳回下一個區塊的號碼。
結語
對許多中小型電子公司而言,使用SoC處理器和作業系統軟體來開發PMP產品,其成本是偏高的。「低成本」似乎只是一種理想而已,因為當元件成本降低時,整合技術的成本可能會上升。整合技術需要許多種不同的技術和知識,這就像設計SoC處理器一樣,若要找到專精於各種技術領域的人才,就難免要增加人事成本了。
|
|
選擇使用PNP電晶體或PMOS元件之LDO調節器的輸出電容器並不容易,因為這些架構通常有特定的ESR需求。相關介紹請見「PMP可攜式電源」一文。 |
|
本文討論了與可攜式數位音視訊(A/V)播放器或稱為個人媒體播放器(PMP)開發有關的要求。你可在「為個人媒體播放器設計增添視訊功能」一文中得到進一步的介紹。 |
|
自法國Archos的公司開啟PMP概念先驅後,各IT廠商亦看好2005年PMP的發展潛力。在「便攜式多媒體播放器選購攻略」一文為你做了相關的評析。 |
|
|
|