• 沒有找到結果。

第三章 系統軟硬體設計與實現

3.5 多通道聲音資料擷取

3.5.1 FPGA 端

數位式麥克風訊號透過FPGA 平台處理後,再傳送至 DM6446 平台供 後端演算法應用。FPGA 部分主要對輸入進來的 1-bit 資料作 Decimation 處理,之後存進各通道對應之ping-pong buffer,並由 ping-pong control 加 以控制。每當 ping-pong buffer 填滿時,FPGA 會送出 full 訊號通知 DM6446,DM6446 則開始送出 rdaddr(read address),FPGA 端根據此 rdaddr 將對應的資料送出。其中rdaddr 包含 sel 資訊以供多工器選擇通道,rdaddr 可直接視為一塊包含8 個通道資料的記憶體。

FPGA 主要模組包含 Decimation、Ping-pong buffer、Ping-pong Control、

Decode & Multiplexer,此外另有 Clock Divider 與 debounce 模組,以下將 一一介紹其功能。圖3-19 為 FPGA 主要架構方塊圖。

DM6446

圖3-19 FPGA 主要架構方塊圖

1. debounce:此模組只針對 reset 訊號做,目的是確保 reset 訊號不會被 雜訊干擾而驅動。

─34─

2. Clock Divider:對外部震盪器時脈做除頻動作,一共提供 20 MHz、1.2

4. Ping-pong buffer:Buffersize 為 256 (Int16),透過 wrenping 判斷資料該 讀寫在ping buffer 或 pong buffer 中。若 wrenping 為 1,則表示資料可 寫入ping buffer 中,而 pong buffer 資料可讀取。資料寫入的時脈為 16 kHz,而讀取資料的時脈(rdclk)為 20 MHz。

5. Ping-pong Control:主要產生 wrenping、wraddr 與 full 訊號。wrenping 提供給各通道之ping-pong buffer 來判斷讀寫的 buffer。wraddr 以簡單 計數器產生,提供給各通道之 ping-pong buffer 寫入資料的位置。full

75 1 z 2

訊號則是在ping-pong 切換時產生,以告知 DM6446 抓取資料。full 訊 號並非完全與ping-pong 切換訊號(wrenping)同步,有加入一點延遲,

確保讀寫間的安全。

6. Decode & Multiplexer:判斷 DM6446 輸入的 rdaddr,並切換對應的通 道資料。

3.5.2 DM6446 端

對DM6446 平台而言,八個通道的聲音資料可視為是儲存在一塊連續 的外部記憶體之中,而平台透過其非同步外部記憶體介面向此外部記憶體 抓取聲音資料。由 FPGA 端架構一節可知 FPGA 模擬成一塊大小為 4096 bytes(8 channel x 256 buffer size x 2 bytes)的記憶體,但由於使用 ping-pong 機制,FPGA 實際上是使用兩倍大的記憶體空間(8192 bytes)。

圖3-21 DM6446 記憶體位置空間對應圖

上圖3-21 為 DM6446 的記憶體位置空間對應圖[18],由圖中可看出非 同 步 外 部 記 憶 體 介 面(AEMIF)對應到的記憶體位置由 0x02000000 到 0x08000000, 其中 AEMIF CS3 (0x04000000 ~ 0x06000000)這區塊是對應 到硬體的DC(Daughter Card),較為適合拉出來與 FPGA 連接,因此決定使 用AEMIF CS3 這塊記憶體位置空間去對應到 FPGA,而在實際使用上,先

─36─

是在 DSP 的記憶體配置檔案(.cmd)中由 AEMIF CS3 記憶體位置空間配置 一塊大小為4096 bytes 的暫存器,此記憶體位置區間需與 FPGA 端事先溝 通好,如此才能確保FPGA 端的資料對應無誤,之後流程則是 DM6446 判 斷FPGA 傳出的 full 訊號,一但 full 則由此暫存器搬資料到 DSP 內部暫存 器即可。下圖3-22 為 AEMIF DC 的腳位對應圖[18],其中 B.EM_A 即為對 應的address bus 而 EM_D 為對應的 data bus。

圖3-22 AEMIF DC 腳位對應圖

─37─

AEMIF[19]的data bus寬度有8bits跟16bits兩種可選,由於FPGA資料格 式是16bits(int16),所以AEMIF對應使用16bits的data bus寬度。AEMIF的傳 輸速度是可以控制的,但由於是非同步架構,所以速度的調整並非直接改 變單一的時脈。每一個讀取或寫入的時序都可分為三個階段,分別是Setup 階段、Strobe階段與Hold階段,每一階段都有一個小暫存器控制各階段時 間長度,實際的時間長度為暫存器值乘上AEMIF的internal clock rate,但此 internal clock rate是不可控的。由於FPGA是我們自行設計的硬體,因此 DM6446與FPGA的通訊機制可以不完全照著AEMIF的機制做溝通,所以我 們直接藉由分別調快Setup、Strobe、Hold三階段時間來加快AEMIF速度與 FPGA溝通。我們修改Linux kernel 程式來加快AEMIF速度,在程式中加上 對Asynchronous 3 Configuration Register 此 暫 存 器 做 設 定 的 部 份 即 可 (Asynchronous 3 Configuration Register 對應到 AEMIF CS3),32Bits暫存器 中各Bit對應到的意義可由下表3-1得知。修改Bit 1-0可以調整data bus 寬 度,而Bit 29- 4 可以加快AEMIF的讀寫速度。

表 3-1 A3CR 暫存器設定表

─38─

相關文件