<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MELP語(yǔ)音編碼的FPGA實(shí)現(xiàn)的系統(tǒng)框架

          MELP語(yǔ)音編碼的FPGA實(shí)現(xiàn)的系統(tǒng)框架

          作者: 時(shí)間:2012-01-19 來(lái)源:網(wǎng)絡(luò) 收藏
           Nios II處理器是Intel公司為Altera公司推出的32位精簡(jiǎn)指令處理器軟核。在Altera公司推出的軟件SOPC中加載Nios II軟核和相應(yīng)的外圍接口以及與定義相應(yīng)的自定義指令,對(duì)設(shè)計(jì)進(jìn)行綜合,下載到中就可以方便地實(shí)現(xiàn)一個(gè)具有高速DSP功能的嵌入式處理器[1]。

            由硬件實(shí)現(xiàn)復(fù)雜的算法通常比軟件實(shí)現(xiàn)更高效。利用Altera公司的Nios II嵌入式處理器的定制指令,可以把用戶自定義的功能直接添加到Nios II CPU的算術(shù)邏輯單元(ALU)中,以加快專項(xiàng)任務(wù)的執(zhí)行速度。自定義指令的優(yōu)勢(shì)就在于可以將程序代碼中的瓶頸部分改用硬件指令支持,用自定義的指令使程序得到加速。

            1 的構(gòu)成

            聲碼器的采樣率為8 kHz,每個(gè)樣點(diǎn)值用16 bit量化,每180個(gè)樣點(diǎn)為1幀,幀長(zhǎng)22.5 ms,每幀量化bit數(shù)為54 bit,總的速率為2.4 Kb/s。

            聲碼器是建立在傳統(tǒng)的二元激勵(lì)LPC模型基礎(chǔ)上,采用了混合激勵(lì)、非周期脈沖、自適應(yīng)譜增強(qiáng)、脈沖整形濾波和傅氏級(jí)數(shù)幅度值等5項(xiàng)新技術(shù),使得合成語(yǔ)音能更好地?cái)M合自然語(yǔ)音。圖1所示為MELP編解碼原理框圖[2]。

            

          MELP語(yǔ)音編碼的FPGA實(shí)現(xiàn)的系統(tǒng)框架

            2 Nios II可嵌入軟核的特點(diǎn)

            Nios嵌入式處理器是用戶可配置的通用RISC嵌入式處理器,是一個(gè)非常靈活、強(qiáng)大的處理器,因此已成為世界上最流行的嵌入式處理器[3];采用改進(jìn)的哈佛存儲(chǔ)器結(jié)構(gòu),CPU帶有分離的數(shù)據(jù)和程序存儲(chǔ)器總線控制。SOPC Builder系統(tǒng)開(kāi)發(fā)工具允許用戶容易地指定系統(tǒng)中Avalon控制器和從屬設(shè)備之間的連接,這些從屬設(shè)備可以是存儲(chǔ)器或外圍設(shè)備。

            Nios指令總線為16位,用于從存儲(chǔ)器中讀取指令。Nios數(shù)據(jù)總線寬度為16位或32位,分別用于Nios CPU的16位或32位配置。

            2.1 指令系統(tǒng)

            Nios指令系統(tǒng)支持C和C++程序編譯,包括算術(shù)和邏輯運(yùn)算、位操作、字節(jié)讀、數(shù)據(jù)傳送、流程控制和條件轉(zhuǎn)移等指令。指令系統(tǒng)包含豐富的尋址方式以減少代碼長(zhǎng)度和提高處理器性能。

            2.2 寄存器組

            Nios CPU有1個(gè)大容量的窗口化的通用寄存器組、8個(gè)控制寄存器、1個(gè)程序計(jì)數(shù)器和1個(gè)用于指令前綴的K寄存器。通用寄存器在16位Nios CPU中是16位,在32位Nios CPU中是32位。寄存器組可配置為包含128、256或512個(gè)寄存器。軟件可以通過(guò)包含32個(gè)寄存器的滑動(dòng)窗口存取這些寄存器,滑動(dòng)窗口的移動(dòng)間隔是16個(gè)寄存器,且允許快速地進(jìn)行寄存器切換,加速子程序的調(diào)用和返回。

            2.3 高速緩存

            可配置的Nios CPU可以有選擇地包含指令和數(shù)據(jù)高速緩存。高速緩存通常通過(guò)提供局部存儲(chǔ)系統(tǒng)提高CPU的性能,這個(gè)局部存儲(chǔ)系統(tǒng)可以快速地響應(yīng)CPU產(chǎn)生的總線事件。Nios高速緩存的實(shí)現(xiàn)是采用簡(jiǎn)單的直接映射的連續(xù)寫入結(jié)構(gòu),這種結(jié)構(gòu)設(shè)計(jì)能夠用最少的器件資源獲得最大的性能[4]。

            2.4 中斷處理

            Nios處理器允許多達(dá)64個(gè)矢量中斷。中斷源有三類:外部硬件中斷、內(nèi)部中斷和軟件中斷。Nios中斷處理模式能夠準(zhǔn)確地處理所有內(nèi)部中斷。

            用戶可以有選擇地禁止TRAP指令軟件中斷、硬件中斷和內(nèi)部中斷。這項(xiàng)選擇能夠減少Nios系統(tǒng)的大小,但只用于處理器不運(yùn)行復(fù)雜軟件的系統(tǒng)。

            2.5 硬件加速

            Nios指令系統(tǒng)可以利用硬件提高系統(tǒng)性能。特殊的周期密集型軟件操作可以用硬件顯著地提高系統(tǒng)性能,這種特性通過(guò)修改指令系統(tǒng)提供[5]。

            Nios處理器有2種指令系統(tǒng)修改方法:自定義指令和標(biāo)準(zhǔn)CPU選項(xiàng)[6]。

            2.5.1 自定義指令

            開(kāi)發(fā)者可以通過(guò)向Nios處理器指令系統(tǒng)中添加自定義指令加快時(shí)間要求嚴(yán)格的軟件算法,也可以用自定義指令在單周期和多周期操作中執(zhí)行復(fù)雜的處理任務(wù)。另外,用戶添加的自定義指令邏輯電路可以訪問(wèn)Nios系統(tǒng)外的存儲(chǔ)器和邏輯電路。

            復(fù)雜的操作序列可以在硬件中簡(jiǎn)化為單指令的執(zhí)行。這種特性允許開(kāi)發(fā)者為數(shù)字信號(hào)處理(DSP)、分組標(biāo)題處理和計(jì)算密集操作優(yōu)化自己的軟件。

            Altera公司的SOPC Builder軟件提供了一個(gè)圖形用戶界面(GUI),開(kāi)發(fā)者利用GUI可以向Nios嵌入式處理器中添加多達(dá)5個(gè)自定義指令。

            2.5.2 標(biāo)準(zhǔn)CPU選項(xiàng)

            Altera公司提供單獨(dú)的預(yù)定義指令來(lái)提高軟件性能。MUL和MSTEP指令就是與其他硬件一起實(shí)現(xiàn)的預(yù)定義指令。當(dāng)用戶在SOPC Builder中選擇這些CPU選項(xiàng)時(shí),相關(guān)邏輯被增加到算術(shù)邏輯運(yùn)算單元(ALU)。例如,如果用戶選擇執(zhí)行MUL指令,整數(shù)乘法器被自動(dòng)地添加到CPU的ALU中,并在2個(gè)時(shí)鐘周期內(nèi)完成16位與16位的乘法操作(相同的操作若用循環(huán)的軟件程序?qū)崿F(xiàn)需要80個(gè)時(shí)鐘周期)。


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: MELP FPGA

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();