第三章 智慧型 DMA 運算控制器設計
3.1 多級向量量化器設計
3.1.5 運算管線設計(Pipeline design)
多級向量量化單元的核心為一個四級運算管線(4-stage pipeline)的設 計,為實現 WMSE(weighted mean squared error)計算,每一級在一個 clock 週 期進行一個運算,並將結果儲存在暫存器中準備給下ㄧ級使用,資料及控制訊號
Fetch 級運算兩個輸入來源的絕對值差;Weight 級運算差值的權重,這裡與 演算法不同的是,在 Square 級前先做了權重的運算,這是因為考量到數值的特
將 Weight 提前(Weight modify)所造成的 WMSE 結果與未修改前(Original Input)的比較如表 3-4,誤差值在 5%之內,與 SNR 的影響很小。
表 3-4:架構修改前後誤差表 SNR(dB)
Original Input 57.243 Weight modify 56.335 3.1.6 比較器(Comparator)
當運算管線將 WMSE 數值計算完畢後,經由比較器選擇最小的誤差值,比較 器的設計為有號數(Sign)的比較,另外位了配合 M Paths 的演算法,這裡設計了 ㄧ個 threshold 暫存上ㄧ條 Path 的誤差值,下ㄧ條 Path 則需大於 threshold 下進行比較。
3.1.7 數值表單元(Write Table)
數值表單元記錄各種數值暫存的路徑,由一個 FSM(Finite State Machine) 實現。其狀態流程圖如 3-8 所示,狀態工作內容如表 3-5 所示。
圖 3-8:數值表單元狀態圖
狀態名稱 工作內容
Ready 初始值設定
judge_condition 判斷該進入哪個 stage update_error 更新誤差值
recode_table(index) 紀錄各 stage 的索引值值
update_regfile 將最小 WMSE 的誤差當作下一級的輸入
idle 忙錄狀態
Final_compare 紀錄表完畢後,比較最後量化誤差大小,選擇ㄧ條最 好的 PATH,再將他的各級索引值輸出
表 3-5:數值表單元狀態工作內容
為了增加多級向量量化的精確度,例如表 3-6 所示,假設 M paths 數為 3,
Stage 數為 2,為了求最佳的量化路徑,可用ㄧ張表紀錄各個路徑的索引值(index) 與最後ㄧ級的誤差值(error),比較每個誤差值的大小,選出最小的誤差值就是 最佳的路徑。假設 Error1 數值最小,可知最佳的量化路徑在 M1 上,此時輸出的
Ready
Judge_condition
Update_error Recode_tableI
Update_regfile
Idle
Final_compare
索引值即為 Index1、Index2。
M1 M2 M3
S1 Index1 Index3 Index5
S2 Index2 Index4 Index6
Error Error1 Error2 Error3 表 3-6:控制輸入暫存器
數值表單元即記錄各個 M Paths 的資訊,為了節省暫存器的使用,這裡直接 將表的內容暫存到內部記憶體。數值表單元依據系統現在的狀態,寫入 M 個量化 路徑的索引值,與上一級的誤差值。當系統跑完一個 Stage 時,數值表單元會將 暫存在記憶體的誤差資訊取出,存在暫存器組裡當做下ㄧ個 Stage 的輸入。如圖 3-9 所示。
圖 3-9:數值表單元記錄下ㄧ級的輸入圖
當系統運算完畢後,由最佳路徑選擇單元(Select_M_Paths Unit)選出最佳 的向量量化路徑,數值表單元便將這個路徑上的索引值包裝成 32-bit 的數值,
輸出到智慧型 DMA 的暫存器組,由處理器取值,如圖 3-10 所示。
數值表單元 暫存器組
下ㄧ級的輸入
M 個量化路徑 上一級的誤差值
RAM A
下ㄧ級的輸入
Write Table
圖 3-10:數值表單元輸出圖
3.1.8 最佳路徑選擇單元(Select M_Paths)
將每條 Path 的最後ㄧ級誤差暫存,比較 M 組 Paths 的大小,輸出最小誤差 的路徑。
3.1.9 運作流程
多級向量量化一個重要的步驟在於編碼簿的搜索,龐大的編碼簿不可能存放 在內部記憶體中,所以需要一個外部記憶體的周邊。智慧型 DMA 有ㄧ般 DMA 溝通 周邊的能力,對外的溝通介面為 APB 匯流排,傳輸符合標準協定。在編碼簿的設 計上,由於 APB Bus 的傳輸方式為兩個時脈週期傳送ㄧ筆資料,為了符合多級向 量量化單元中運算管線的機制,將兩筆碼向量存成 32 位元存放在一個記憶體位 置上,經由 DMA 傳送至向量量化單元中,如此運算管線就可以每個時脈週期抓取 ㄧ筆的碼作運算,如圖 3-11 所示。
數值表單元
最佳路徑選擇單元
索引值 Index2 索引值 Index1
RAM A 路徑 Path 1
索引值輸出
DSPRegOut SDMA 暫存器組
圖 3-11:多級向量量化器與周邊運作流程圖
在處理器的設定上,如圖 3-11 所示的程式碼,利用指令設定智慧型 DMA 的 暫存器組,寫入 Level、Stage、Order 與 Paths 等參數,最後設定 MSVQ 功能致 能參數,系統便開始運作,此時處理器不必理會智慧型 DMA 的運作,可以進行其 他演算法的運算,當智慧型 DMA 運算完畢後,會發中斷給處理器取值。
3.2 蝴蝶運算器單元設計
本節將介紹蝴蝶運算器單元的設計。包括蝴蝶運算的理論、架構及其使用方 法。
3.2.1 蝴蝶運算理論
快速複立葉轉換(Fast Fourier transform;FFT)在多媒體應用上非常常見,
詳細的 FFT 理論詳見[16],本章節介紹 FFT 理論的核心:蝴蝶運算。對於一個 8 點的時域分離的 FFT 形式(Decimation in Frequency)如圖 3-12 所示,共有 3 級,每級皆有 4 個蝴蝶的運算元,所以 8 點的 FFT 共有 12 個蝴蝶運算元,蝴蝶 運算元形式如圖 3-13 所示,此時Wr =e−j2πr N/ 。
圖 3-12:8 點 FFT 圖
點格式的調整,在與輸入進行複數乘法完後,必須要將格式復原,捨去額外的資 料。所以這裡設計用位移器來達到格式調整的目的,並可由使用者自行設定位移 量,增加蝴蝶運算單元的使用性。蝴蝶運算單元流程如圖 3-14。
圖 3-14:多級向量量化器架構圖
蝴蝶運算單元的架構圖如圖 3-15 所示,進行一次的運算只需 9 個時脈週期。
設定SDMA參數:
-3個記憶體位址 -位移數
直接從記憶體 抓 取 資 料 與 Cosine/Sine係數
進 行 複 數 乘法
存回原來的記憶體位 址,給下ㄧ級作運算
進行複數 加法
由使用者設定 Scaling位移數
圖 3-15:蝴蝶運算單元架構 3.2.3 程式流程設定
蝴蝶運算單元在 FFT 運算中,由智慧型 DMA 操作,處理器負責流程的控管,
如圖 3-16 及圖 3-17 所示,處理器負責控制三層迴圈,以及蝴蝶運算輸入位址的 -
1 Cycles 2 Cycles 2 Cycles
RAM1 RAM0
Re Im
Re Im
Cos Sin
Re Im Re Im Cos Sin
Re Im
Re Im
Re Im
2 Cycles
RAM0
2 Cycles
SHIFTER +
+ -
計算,當蝴蝶運算在進行時,處理器開始計算下ㄧ筆的輸入位址以及計數器的運 作,達到處理器與計算單元分工的效果,大幅提升效能。
圖 3-16:FFT 運算分工情形
圖 3-17:利用 SDMA 計算 FFT 運算
LABEL:FFT (主迴圈:計算 FFT 級數) LABEL:LOOPI (次迴圈:ㄧ級裡有幾個蝴蝶運算) LABEL: ButterFly (內迴圈:蝴蝶運算) SDMAR 16,R4 (蝴蝶 Input 1) SDMAR 17,R8 (蝴蝶 Input 2) SDMAR 18,R5 (SinCos 位址) SDMAB 19,R11 (設定位移量) SDMAB 5,01000000_00_0_100_0_0 (蝴蝶單元致能)
DMAOK (DMA 設定完畢)
... (計數器計算)
... (位址計算)
JMBR R15,R4,ButterFly JNER R3,R1,LOOPI JNER R9,R10,FFT
設定智慧型DMA參數
RISC計算輸入位址 與Sine&Cosine表 位址
兩顆記憶體
的輸入位址 智慧型DMA計算 蝴 蝶 運 算 資 料 過 程
RAM A:計算資料 RAM B:Sine&Cosine RISC 計 算 迴 圈 計 數
器
第四章 智慧型 DMA 控制器與 RISC 處理 器的整合
智慧型 DMA 控制器搭配 RISC 處理器可以增強處理器的數位訊號處理效能。
因此,本論文利用實驗室發展的一個 32 位元精簡指令集架構(RISC)處理器核 心,並有快取記憶體控制器,與智慧型 DMA 控制器整合,為一個單核具有 DSP 平行架構的嵌入式處理器。以下章節將說明此精簡指令集架構處理器的特性、指 令集、軟體開發環境及如何與智慧型 DMA 做整合。
4.1 RISC 處理器
實驗室發展的 RISC 訊號處理器擁有九級管線架構的設計[20][21],為一個 Unit-core 和 Multi-Ram 的處理器 IP[22][23]。當一個指令透過程式計數器
(Program counter)抓取進入處理器內部後,會先對該指令進行解碼,接著到 暫存器提取所需要的資料到 ALU 中執行,最後將結果存回暫存器或記憶體中。周 邊裝置的存取透過智慧型 DMA 來規劃,組譯器及處理器直接支援智慧型 DMA 的設 定及使用[24],周邊裝置(或 IP)可利用標準的 APB 規格掛上匯流排[25],將外 部的取樣訊號透過智慧型 DMA,將資料儲存在內部記憶體,或內部運算的結果送 到周邊裝置上輸出[26]。
4.1.1 RISC 處理器核心
RISC 架構處理器擁有 9 級管線架構,9 級管線包含程式計數與跳躍判斷模 組、指令抓取模組、程式碼記憶體模組、指令預測模組、指令解碼模組、暫存器 模組、及算數邏輯單元模組,以下分別描述其主要的工作簡述如下:
1. PC Counter/Branch Protect:在硬體架構最上層,目的是把程式計數
器加一,並處理跳躍,最後決定程式計數器的值,並送到下一級指令抓 取(Instruction fetch)。
2. Cache:將 PC 位址傳到快取記憶體去抓指令,其中 PC 的位址線為 16-bit,傳回 RISC 指令為 32-bit,快取記憶體控制器架構為三級,因 此若搭配此 RISC 訊號處理器,則總級數為九級。
3. Instruction Fetch:這一級的目的是把程式計數器的值,轉成程式記 憶體的位址,送進下一級的程式記憶體去抓取指令。其中,由於有些指 令在 ALU 級時會需要處理中指令的程式計數器值,所以必須把程式計數 器值一級一級地傳下去,因此,程式計數器值會傳進下一級的暫存器。
在處理跳躍指令時,為了避免浪費跳躍指令發生後一個指令被抓取,設 定兩個訊號做為防止跳躍發生時的指標,用以表示現在的管線是否在 Stall 狀態,決定要不要執行該級動作。
4. Program Memory:將程式記憶體的位址經由硬體最上層的腳位傳到外部 的唯讀記憶體去抓指令,其中位址線為 16-bit,傳回 RISC 指令為 32-bit。
5. Instruction Decoder:這一級的目的是把指令依照對應的指令碼去做 解碼,指令中有兩個來源暫存器的位置,一個目的暫存器的位置。這些 位置可以對下一級的暫存器組取得來源運算元並提供未來 ALU 級寫回 的目的位置。內建兩組處理核心,所以也提供了指令去從兩個處理核心 中互相提取對方暫存器組的資料,方便資料的直接交換。
6. Register File : 處理核心有 32 個通用暫存器。設計有 13 個中斷暫存 器來處理外部中斷,暫存器組為 2 讀 1 寫的格式,負責提供解碼器所解 碼出的來源運算元值,並將 ALU 級算出的目的運算元寫回。在此模組 中,有很多連接 ALU 級模組的輸出信號,目的是把這些 ALU 級要用到的
7. ALU:本級功能是計算出邏輯或運算值,為了 Data forwarding 的實作,
Data memory 及 Write back 這兩級隱含在 ALU 級內。Data forwarding 的機制是利用前面一級一級傳回的信號實作而成,目的是為了減少 RAW hazard。
除了以上基本的管線模組設計外,還有一些特殊硬體設計需求被強調出來 [27],包含以下五種說明:
1. 一個指令週期完成乘加運算。
2. Regular Loop Prediction: 數位訊號處理運算中有很多固定次數迴圈 的運算,利用一個良好的跳躍預測(Branch prediction),使處理器不 會有 Control hazard 造成的不必要 Stall。
3. 良好的 Data Forwarding 機制。
4. Condition Branch:預測採用 Prediction-untaken 方法設計。
4.1.2 RISC 處理器指令集
RISC 處理器指令集共分五大類:資料搬移、算數邏輯運算、跳躍指令、其
RISC 處理器指令集共分五大類:資料搬移、算數邏輯運算、跳躍指令、其