DSP 與數據轉換器協(xié)同工作所必須考慮的 10 大因素
假設您接到一項工作任務(wù),設計一套由 DSP
與DAC與ADC等模擬器件組成的信號處理系統。如果您考慮到幾個(gè)重要因素,工作就會(huì )非常簡(jiǎn)單。下面就來(lái)談?wù)勗O計工作中應該考慮的這幾個(gè)因素。
詳細了解應用類(lèi)型
第一步需要了解應用類(lèi)型。對于控制型應用,既需要應對突發(fā)的大量數據處理情形,也要考慮間歇的閑置狀態(tài);而對于音頻應用,則需要處理連續數據流的能力。了解應用的具體需求將有助于選擇適當的接口和正確的數據讀取方法。
評估系統速率
第二步需要了解數據采樣的速率。舉例來(lái)說(shuō),音頻系統可能是一部 CD 播放機,采樣率為 96 kHz,也可能是電話(huà)語(yǔ)音系統,采樣率僅為 8
kHz。當然,也可能是其他系統,如 ADSL 質(zhì)量測量應用,采樣速率高達 10 MSPS,或者是稱(chēng)重應用,每秒只要 16
次采樣就足夠了,但要求具備較高的分辨率(如 24 位)。了解此方面信息,將有助于開(kāi)展下一步工作,即選擇正確的 DSP 接口。
選擇正確的 DSP 接口
了解了應用及速率要求后,就對采用哪種 DSP 接口有了一定的認識。大多數音頻設備均使用特定類(lèi)型的串行接口,不過(guò)高速應用則要求并行接口。當采樣速率為
10 MSPS、分辨率為 12 位時(shí),如果采用串行接口,其端口的速率要達到 120 MHz 才能從轉換器向 DSP
發(fā)送數據。這一要求大大超過(guò)了大多數50 MHz 串行端口的處理能力。若使用并行接口,則總線(xiàn)上信號交換的頻率為 10
MHz,速率顯著(zhù)降低,因此處理起來(lái)非常簡(jiǎn)單。
在選擇接口時(shí),還要考慮的另一問(wèn)題就是,并行總線(xiàn)能否滿(mǎn)足所需的數據速率要求,或者說(shuō)并行總線(xiàn)芯片在滿(mǎn)足程序與系數要求后是否已經(jīng)達到了滿(mǎn)負荷。如果是的話(huà),不妨考慮在
DSP 與轉換器之間插入 FIFO。
確定握手模式
一旦選擇了 DSP 接口,下一步就要考慮轉換器與 DSP 之間的握手模式 (handshake
mode)。大多數轉換器在發(fā)出新的數據字之前都會(huì )給出某種類(lèi)型的轉換結束 (EOC) 信號。處理器使用上述信號的方式有兩種:一是輪詢(xún)
(poll);二是用其作為中斷。
使用 EOC 信號作為中斷具有一定優(yōu)勢,因為 CPU 不會(huì )被輪詢(xún)標記占用,因此在獲得數據前不會(huì )打斷 CPU
的正常工作。不過(guò),如果轉換器等待處理特定的協(xié)議來(lái)讀取數據,比如轉換器發(fā)出轉換結束信號后又需要讀取命令來(lái)檢索數據,每個(gè)讀取命令都會(huì )觸發(fā)新的中斷,那么就會(huì )造成過(guò)多的開(kāi)銷(xiāo),得不償失。在這種情況下,輪詢(xún)的方法就具有明顯的優(yōu)勢了。
如果中斷時(shí)延非常重要的話(huà),那么使用輪詢(xún)方式就更具優(yōu)勢。輪詢(xún)可確保信號響應速度更快,這比進(jìn)入中斷服務(wù)例程要快得多。如果數據檢索有短暫時(shí)隙
(narrow timeslot),那么采用輪詢(xún)方式也是有利的。
確定傳輸模式
下一步就是實(shí)際收集數據的工作了。收集數據有兩種方法,各有千秋。第一種方法是采用 DSP 的
DMA(直接存儲器存取)控制器,可使傳輸與轉換器的轉換結束標記同步,并使 CPU
不用承擔傳輸工作,因為數據陣列的填充是在后臺完成的,傳輸完成后再通知
CPU。不過(guò),這種方法只有在進(jìn)行直接傳輸的情況下才有效。如果數據轉換器在檢索數據時(shí)需要某些復雜的機制,那么 DMA 就不太有效了。
在這種情況下,應讓 CPU 參與傳輸工作。盡管服從特殊的協(xié)議相當簡(jiǎn)單,但必須使用大量的 CPU資源來(lái)收集數據。如果中斷率非常高,那么 CPU
可能很難有時(shí)間再去執行數據收集之后的算法了。
是否采用數據猝發(fā)
假設數據轉換器連接至 DSP 的并行總線(xiàn),該并行總線(xiàn)在存儲器存取(讀取正在執行的數據)和 I/O
存取(讀取采樣)之間需要幾個(gè)周期的轉換,而且數據轉換速率非常高,因此,轉換常常是必需的,幾乎每次采樣讀取都要進(jìn)行轉換。
如果一步就能讀取多個(gè)數據字,且不用每次都進(jìn)行數據總線(xiàn)交換,肯定是非常有價(jià)值的。在這種情況下,不妨考慮在數據轉換器與 DSP 之間采用 FIFO。一旦
FIFO 達到一定的水平即中斷 DSP,達到一定數量的數據字一步完成傳輸,這就大大降低了總線(xiàn)轉換的開(kāi)銷(xiāo)。
針對變量選擇正確的
數據類(lèi)型
數據轉換器針對所用的數據采用不同的格式。有的使用標準二進(jìn)制(即無(wú)符號二進(jìn)制)數據類(lèi)型,有的則采用帶符號的二進(jìn)制數據類(lèi)型,這就是問(wèn)題的復雜所在。如果有一個(gè)
12
位數據轉換器,那么在帶符號二進(jìn)制數據情況下,如何使用將是一個(gè)問(wèn)題。符號位占據最重要的位置,即第“11”位(這里的起始位是第“0”位)。如果將此數據字賦予“C”變量,寬度為“16”位,那么假定“C”符號位為第“15”位。如果從轉換器讀取的數字為負,那么
DSP 就不能識別其為負值,因為符號位的位置錯誤。如何解決這一問(wèn)題呢?第一種方法是在讀取數據時(shí)進(jìn)行數據位移。不過(guò),這只有在 CPU
讀取數據時(shí)才有可能,因為 DMA 控制器不可能在傳輸時(shí)進(jìn)行數據位移。另一種方法是在數據塊完全傳輸后在環(huán)路中將數據位移至正確的位置。不過(guò)這必須使用
CPU,并要求額外的 MIPS。
如果改變連接后轉換器的第“11”位剛好連接至 DSP 數據總線(xiàn)的第“15”位,那么符號位從首位算起剛好位于正確的位置,這就能實(shí)現基于DMA
的傳輸,而且也不用再進(jìn)行數據位移。
確保處理的是正確數據
現在,數據已經(jīng)進(jìn)入系統,數據字存儲在陣列中,數據大小也合適,于是開(kāi)始處理數據,但沒(méi)有獲得預期的結果,這時(shí)需要思考到底出了什么問(wèn)題。首先應該檢查
DSP 的高速緩存,DMA
傳輸數據進(jìn)入存儲器時(shí)是否啟用高速緩存,在這種情況下,高速緩存很可能保留拷貝的舊數據,并在算法工作中使用它們。如果發(fā)生了此類(lèi)問(wèn)題,就必需注意高速緩存相關(guān)性與轉儲清除問(wèn)題,或者是存儲新數據的高速緩存區失效。這樣就能確保
CPU 處理的數據是傳輸完成后的最新數據。
如果用 C 語(yǔ)言編程
應分配易失關(guān)鍵字
在調試嵌入式系統時(shí),采用變量查詢(xún)外設的狀態(tài)后,發(fā)現 CPU 所用變量值是錯誤的,這時(shí)就要思考到底哪里出了問(wèn)題。先看看下面這個(gè)結構:
unsigned int *pControl = (unsigned int *)0x00COFFEE; 錯誤
while (*pControl == 0); 等待一個(gè)外部事件
這里的 *pControl 指向一個(gè)外設。通過(guò) while 循環(huán),期望 EOC
能從“0”轉換為“1”。但在大多數情況下,恐怕得一直等下去,因為編譯器認為它已經(jīng)完全控制了變量及與其相關(guān)的存儲器,只加載 *pControl
指向的存儲器位置的內容一次,就會(huì )對其進(jìn)行循環(huán)測試。但問(wèn)題在于,由于不會(huì )重新讀取存儲器內容,也就不能結束循環(huán)。
解決這一問(wèn)題的方法就是將 *pControl
的聲明作一下修改,通知編譯器其指向的存儲器位置可由外部事件修改,而每次使用該變量時(shí)都必須重新載入,如下所示:
volatile unsigned int *pControl = (unsigned int *)0x00COFFEE; 正確
while (*pControl == 0); 等待一個(gè)外部事件
確保采樣等距
如果要在頻域中處理采樣數據,那么還要提到一點(diǎn):不是所有轉換器都有啟動(dòng)新轉換的自身時(shí)基。在這種情況下,應采用外部時(shí)基或 DSP 定時(shí)針 (timer
pin) 。
評論