• 沒有找到結果。

運算管線設計(Pipeline design)

第三章 智慧型 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 =ej2π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 處理器指令集共分五大類:資料搬移、算數邏輯運算、跳躍指令、其

相關文件