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

          新聞中心

          EEPW首頁 > EDA/PCB > 設計應用 > SOPC中自定義外設和自定義指令性能分析

          SOPC中自定義外設和自定義指令性能分析

          ——
          作者: 時間:2007-11-20 來源:單片機與嵌入式系統(tǒng)應用 收藏

            引言

            NiosII是一個嵌入式軟核處理器,除了可以根據(jù)需要任意添加已經(jīng)提供的各種外設以外,用戶還可以通過定制自定義外設和的方式來滿足各種應用需求。定制用戶外設和用戶指令是使用NiosII嵌入式軟核處理器的重要特征。定制的用戶外設能夠以“硬件加速器”的形式實現(xiàn)各種各樣用戶要求的功能;同時定制的用戶指令,可以把一個復雜的標準指令序列簡化為一條用硬件實現(xiàn)的單個指令,以增強對實時軟件算法的處理能力。近來,隨著國內(nèi)開發(fā)的逐步深入,這兩者的性能開始成為一個關注的焦點。本文通過CRC32對系統(tǒng)中的自定義外設和的實現(xiàn)以及對性能差異所作的詳細分析,給廣大開發(fā)人員提供參考。

            1 CRC自定義外設的實現(xiàn)

            1.1 SOPC系統(tǒng)中自定義外設的組成和結(jié)構(gòu)

            自定義外設作為NiosII軟核處理器超強靈活性的體現(xiàn),其開發(fā)遵循一定的規(guī)律。一個用戶自定義外設必須進行硬件設計,也就是說,必須用硬件描述語言來描述出硬件的邏輯組成。一般來說,一個自定義外設主要由下列部分組成:

           ?、?描述自定義外設邏輯的硬件描述文件部分(主要是HDL程序)。

            ② 軟件文件,一個用來定義外設寄存器的C語言頭文件,以及讓程序員控制這個元件的軟件驅(qū)動程序。

            ③ 元件的描述文件(class.ptf)。該文件定義了元件的架構(gòu),提供了SOPC。

            Builder將該元件集成到一個系統(tǒng)的各種信息。該文件由元件編輯器根據(jù)用戶提供的硬件和軟件文件以及在圖形用戶界面中設置的各個選項和參數(shù)自動生成。圖1給出了帶Avalon從端口的自定義外設組成框圖。

            

          帶Avalon從端口的自定義外設組成框圖

            從圖中可以看出,一個典型的自定義外設主要由下列功能模塊組成:

            ① 任務邏輯。任務邏輯實現(xiàn)外設的基本功能,是必不可少的組成部分。

            ② 寄存器文件。寄存器文件部分提供任務邏輯和外界交換信息的橋梁。有了寄存器文件,用戶就可以通過Avalon接口采用“基地址+地址偏移量”的方法來訪問外設內(nèi)部的各個寄存器。

            ③ Avalon接口。Avalon接口為寄存器文件提供了一個標準的Avalon前端。該模塊使用Avalon規(guī)定的信號來訪問寄存器文件,并且支持任務邏輯的傳輸類型。

            1.2 CRC32自定義外設的實現(xiàn)

            CRC32校驗可以由軟件或硬件來實現(xiàn)?,F(xiàn)多采用超大規(guī)模集成電路芯片以硬件方式實現(xiàn)。例如:

            

            其硬件實現(xiàn)原理如圖2所示。

            

          CRC硬件實現(xiàn)原理

            編碼運算過程如下:

            開關關閉,k位數(shù)據(jù)移入寄存器,同時送到外部。當k位信息全部送到外部時,除法運算也正好進行完畢,寄存器中的r位數(shù)據(jù)就構(gòu)成了余項的系數(shù)序列,即形成了校驗碼。然后切斷除法反饋電路,將移位寄存器的每一位逐次輸出到信道中。這些校驗碼與原來的數(shù)據(jù)位一起構(gòu)成了完整的碼字。

            采用HDL語言來描述出CRC32的硬件實現(xiàn),命名為crc.v。在SOPC Builder元件編輯器中加入該元件,其中自定義外設的接口信號和Avalon信號類型的一一對應關系如表1所列。

            

            當把自定義外設加入到SOPC系統(tǒng)中時,系統(tǒng)自動生成一個system.h文件。在system.h中生成的CRC自定義外設的相關信息如下:

            #defineCRC_NAME "/dev/crc"

            #defineCRC_TYPE "avalon_crc"

            #defineCRC_BASE 0x06210880

            根據(jù)system.h中的信息,可以建立名稱為altera_avalon_crc_regs.h的寄存器頭文件。在這個C頭文件中,用清晰的宏符號描述出設備的寄存器集合,并且給出其訪問方法。

            #ifnde

            f __ALTERA_AVALON_CRC_REGS_H__

            #define __ALTERA_AVALON_CRC_REGS_H__

            #include

            #defineCRC_INIT_REG0

            #defineCRC_WRITE_REG4

            #defineCRC_READ_REG016

            #defineCRC_READ_REG120

            #defineCRC_READ_REG224

            #defineCRC_READ_REG328

            #defineCRC_INITIALIZATION(base)

            IOWR_32DIRECT(base, CRC_INIT_REG, 0)

            #defineCRC_WRITEDATA_8(base,data)

            IOWR_8DIRECT(base, CRC_WRITE_REG, data)

            #defineCRC_WRITEDATA_16(base,data)

            IOWR_16DIRECT(base, CRC_WRITE_REG, data)

            #defineCRC_WRITEDATA_32(base,data)

            IOWR_32DIRECT(base, CRC_WRITE_REG, data)

            #defineCRC_READRESULT_32(base)

            IORD_32DIRECT(base, CRC_READ_REG0)

            #defineCRC_READRESULT_64(base)

            IORD_32DIRECT(base, CRC_READ_REG1)

            #defineCRC_READRESULT_96(base)

            IORD_32DIRECT(base, CRC_READ_REG2)

            #defineCRC_READRESULT_128(base)

            IORD_32DIRECT(base, CRC_READ_REG3)

            #endif //__ALTERA_AVALON_CRC_REGS_H__

            該頭文件定義了CRC IP核的寄存器訪問宏。用戶可以通過Avalon接口采用“基地址+地址偏移量”的方法來訪問外設內(nèi)部的各個寄存器,以實現(xiàn)NiosII CPU對CRC IP核的控制。

            2 CRC32的實現(xiàn)

            2.1 自定義指令的原理和開發(fā)

            自定義指令是基于NiosII處理器的SOPC系統(tǒng)的一個重要特征。NiosII處理器自定義指令不僅擴展了CPU的指令集,還能提高對時間要求嚴格的軟件運行速度,因此提高了系統(tǒng)的整體性能。采用自定義指令,用戶可以實現(xiàn)傳統(tǒng)處理器無法達到的最佳性能。在對數(shù)據(jù)處理速度要求比較高的場合,把由標準指令序列實現(xiàn)的核心功能變成由一條用戶定制的指令來實現(xiàn),這樣可以明顯提高軟件的執(zhí)行效率。基于硬件處理模塊的自定義指令可通過單個時鐘周期或多個時鐘周期的硬件算法操作完成原本十分復雜的處理任務。NiosII處理器最多支持256條定制指令,加速通常由軟件實現(xiàn)的復雜數(shù)學運算。

            自定義用戶指令實質(zhì)上就是讓軟核處理器實現(xiàn)由硬件邏輯實現(xiàn)的某種功能,這個硬件邏輯連接到NiosII處理器的算術(shù)邏輯單元上。對于NiosII的標準指令,NiosII使用ALU來完成相應的算術(shù)邏輯操作;對于自定義指令,則采用用戶自己建立的硬件邏輯來完成運算。

            2.2 CRC32定制指令的實現(xiàn)

            在前面開發(fā)的CRC自定義外設的基礎上,按照定制指令所要求的設計方式,把前面開發(fā)的自定義外設改寫成一條指令。本設計中,CRC自定義指令是作為多周期指令來實現(xiàn)的,在多周期指令要求中必須包括信號clk、clk_en、reset,其他的信號不是必需的。

            由于在SOPC系統(tǒng)中自定義外設的接口類型與自定義指令的接口類型要求不一樣,因此要求在自定義外設的基礎上必須加上一個接口文件。這個接口文件的作用是為了與多周期指令的端口信號類型對應。接口文件端口信號和自定義外設端口的對應關系如表2所列。

            

            開發(fā)完成后,把自定義指令加到NiosII CPU中。生成系統(tǒng)后,在生成的system.h文件中,關于CRC自定義指令的宏如下:

            #define ALT_CI_CRC_CUSTOM_INSTRUCTION_N 0x00000000

            #define ALT_CI_CRC_CUSTOM_INSTRUCTION(A,B)__

            builtin_custom_inii

            (ALT_CI_CRC_CUSTOM_INSTRUCTION_N,(A),(B))

            其中,“ALT_”是宏定義的前綴,表示為Altera公司;CI是用戶定制指令的意思;CI_CRC_CUSTOM_INSTRUCTION是用戶指令的邏輯模塊名稱;N表示指令操作碼。

            3 自定義外設和自定義指令在SOPC系統(tǒng)中的運行和驗證

            前面已經(jīng)分別用自定義外設和自定義指令的方式實現(xiàn)了CRC32。那么自定義外設和自定義指令執(zhí)行性能如何?在實現(xiàn)相同功能的情況下,何種方式在執(zhí)行過程中更有優(yōu)勢?它們之間的差異有多大?在這一部分將通過測試給予充足的驗證。

            3.1 驗證平臺的硬件系統(tǒng)

            采用以CycloneII系列EP2C35為核心芯片的SOPC開發(fā)系統(tǒng),來搭建實驗所需要的硬件平臺。在這個硬件平臺中,需要添加系統(tǒng)工作需要的外設,包括NiosII CPU、Timer、Avalon三態(tài)橋,外部RAM接口和Flash等。在該硬件系統(tǒng)中,首先要加入自己定制的外設邏輯,同時在NiosII CPU中加入開發(fā)的自定義指令。在同一系統(tǒng)中同時加入實現(xiàn)相同功能的自定義外設和自定義指令是為了得到對比結(jié)果。系統(tǒng)時鐘設置在50MHz。在本設計中,有大量的數(shù)據(jù)從SSRAM傳輸?shù)紺RC處理模塊中,這些數(shù)據(jù)在傳輸過程中不需要進行算術(shù)邏輯運算,如果通過CPU來操作,會消耗大量的CPU時間。為了提高CPU的工作效率,采用DMA(直接存儲器訪問)來完成。利用DMA控制器方式,在CRC自定義外設和SSRAM存儲器之間建立一條DMA傳輸通道,讓硬件自動讀取數(shù)據(jù)信息。在DMA傳輸過程中,首先通過中斷由CPU對DMA進行初始化設置,打開DMA傳輸通道,使DMA在CPU干預的情況下進行傳輸。然后DMA直接將SSRAM存儲器中的數(shù)據(jù)傳輸?shù)紺RC處理模塊中,直到數(shù)據(jù)傳輸完成。所添加的DMA通道,讀端口通過Avalon三態(tài)橋連接到了SSRAM,寫端口連接到了自定義外設CRC,如圖3所示。

            

          CRC驗證硬件平臺

            特別注意的是,在該硬件平臺中,要加入一個時間標記服務定時器high_res_timer(也就是經(jīng)常說的“時間戳”)。該服務可以幫助設計人員查找出耗時最長的功能函數(shù),定位優(yōu)化目標,檢測某個功能部件的運行情況。在這里,主要是利用該“時間戳”來測量CRC32不同方式的執(zhí)行時間,為分析各種方式的性能差異奠定基礎。

            3.2 軟件開發(fā)

            在NiosII IDE開發(fā)環(huán)境中,分別使用自定義外設、自定義指令和軟件的方式來實現(xiàn)CRC32。

           ?、?軟件實現(xiàn)方式:數(shù)據(jù)的讀取、處理、保存等全部由軟件來實現(xiàn)。

           ?、?用戶自定義指令方式:處理過程使用CRC32自定義指令來完成。

           ?、?用戶自定義外設方式:使用DMA通道完成數(shù)據(jù)的讀取、保存,NiosII處理器控制外設完成CRC32的處理。

            完成上面的工作后,編譯工程,下載到SOPC開發(fā)板中。從NiosII控制臺中,可以看到如下輸出信息,如圖4所示。

            

          NiosII IDE控制臺輸出信息

            4 性能對比和分析

            在NiosII IDE上面可以觀察到用軟件、自定義指令、自定義外設實現(xiàn)CRC32的各種情況。這幾種方式的運行結(jié)果是相同的,但用軟件實現(xiàn)的時間是12 381.33ms,采用優(yōu)化的軟件設計時間是8 393.02 ms,采用自定義指令的時間是164.69 ms,而采用自定義外部設備時則用了12.08ms。從結(jié)果可以分析出,純用軟件來執(zhí)行,運行速度最低;如果把標準指令序列實現(xiàn)的核心功能由一條用戶自定義指令來實現(xiàn),可以明顯提高系統(tǒng)的執(zhí)行效率;如果采用自定義外設,即將軟件實現(xiàn)的功能全部由硬件來實現(xiàn),則速度又大大提高。從圖5中可以更清楚地看到這種對比:從左到右依次是軟件方式、改進軟件方式、自定義指令方式、自定義外設方式。由此可知,自定義外設執(zhí)行效率最高,其次是自定義指令。

            

          各種方式執(zhí)行時間和效率對比圖

            從實現(xiàn)機理上來講,自定義外設可以看作是和NiosII并行運行的一個硬件加速邏輯,中間CPU參與過程很少,這就為系統(tǒng)“全面加速”提供了堅實的基礎;而自定義指令由于硬件邏輯連接到NiosII處理器的算術(shù)邏輯單元上,只能實現(xiàn)“局部”加速。從實現(xiàn)結(jié)果來說,實現(xiàn)同樣的功能,自定義外設的執(zhí)行效率是自定義指令的十幾倍以上;而隨著系統(tǒng)頻率的升高,這個差距會越來越大。如果系統(tǒng)在120MHz,差距會在50倍左右。

            結(jié)語

            本文對SOPC系統(tǒng)中自定義外設和自定義指令的性能進行了詳細對比,并且給出了對比的詳細參數(shù)。在SOPC系統(tǒng)中,如果實時性要求非常高,那么采取自定義外設加DMA來完成系統(tǒng)中的關鍵處理模塊無疑是最佳選擇。

            參考文獻:

            [1] Altera Corporation. Nios II Software Developer's Handbook,2006.

            [2] Altera Corporation. QuartusII Verision 6.0 Handbook,2006.

            [3] 潘松,黃繼業(yè). SOPC技術(shù)實用教材[M]. 北京:清華大學出版社,2005.

            [4] 彭澄廉,等. 挑戰(zhàn) SOC——基于Nios的 SOPC設計與實現(xiàn)[M]. 北京:清華大學出版社,2004.



          評論


          相關推薦

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

          關閉
          看屁屁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); })();