含義
是用戶讓Nios II軟核完成的功能,功能由電路模組來實現,電路模組用硬體描述語言(HDL)描述,連線到Nios II軟核的算術邏輯部件上,如圖2。
自定義外設和自定義指令性能分析
引言NiosII是一個嵌入式軟核處理器,除了可以根據需要任意添加已經提供的各種外設以外,用戶還可以通過定製自定義外設和自定義指令的方式來滿足各種套用需求。定製用戶外設和用戶指令是使用NiosII嵌入式軟核處理器的重要特徵。定製的用戶外設能夠以“硬體加速器”的形式實現各種各樣用戶要求的功能;同時定製的用戶指令,可以把一個複雜的標準指令序列簡化為一條用硬體實現的單個指令,以增強對實時軟體算法的處理能力。近來,隨著國內SOPC開發的逐步深入,這兩者的性能開始成為一個關注的焦點。本文通過CRC32對SOPC系統中的自定義外設和自定義指令的實現以及對性能差異所作的詳細分析,給廣大SOPC開發人員提供參考。CRC自定義外設的實現SOPC系統中自定義外設的組成和結構
自定義外設作為NiosII軟核處理器超強靈活性的體現,其開發遵循一定的規律。一個用戶自定義外設必須進行硬體設計,也就是說,必須用硬體描述語言來描述出硬體的邏輯組成。一般來說,一個自定義外設主要由下列部分組成:
① 描述自定義外設邏輯的硬體描述檔案部分(主要是HDL程式)。
② 軟體檔案,一個用來定義外設暫存器的C語言頭檔案,以及讓程式設計師控制這個元件的軟體驅動程式。
③ 元件的描述檔案(class.ptf)。該檔案定義了元件的架構,提供了SOPC。
Builder將該元件集成到一個系統的各種信息。該檔案由元件編輯器根據用戶提供的硬體和軟體檔案以及在圖形用戶界面中設定的各個選項和參數自動生成。圖1給出了帶Avalon從連線埠的自定義外設組成框圖。
從圖中可以看出,一個典型的自定義外設主要由下列功能模組組成:
① 任務邏輯。任務邏輯實現外設的基本功能,是必不可少的組成部分。
② 暫存器檔案。暫存器檔案部分提供任務邏輯和外界交換信息的橋樑。有了暫存器檔案,用戶就可以通過Avalon接口採用“基地址+地址偏移量”的方法來訪問外設內部的各個暫存器。
③ Avalon接口。Avalon接口為暫存器檔案提供了一個標準的Avalon前端。該模組使用Avalon規定的信號來訪問暫存器檔案,並且支持任務邏輯的傳輸類型。
1.2 CRC32自定義外設的實現
CRC32校驗可以由軟體或硬體來實現。現多採用超大規模積體電路晶片以硬體方式實現。例如:
其硬體實現原理如圖2所示。
編碼運算過程如下:
開關關閉,k位數據移入暫存器,同時送到外部。當k位信息全部送到外部時,除法運算也正好進行完畢,暫存器中的r位數據就構成了餘項的係數序列,即形成了校驗碼。然後切斷除法反饋電路,將移位暫存器的每一位逐次輸出到信道中。這些校驗碼與原來的數據位一起構成了完整的碼字。
採用HDL語言來描述出CRC32的硬體實現,命名為crc.v。在SOPC Builder元件編輯器中加入該元件,其中自定義外設的接口信號和Avalon信號類型的一一對應關係如表1所列。
當把自定義外設加入到SOPC系統中時,系統自動生成一個system.h檔案。在system.h中生成的CRC自定義外設的相關信息如下:
#defineCRC_NAME "/dev/crc"
#defineCRC_TYPE "avalon_crc"
#defineCRC_BASE 0x06210880
根據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接口採用“基地址+地址偏移量”的方法來訪問外設內部的各個暫存器,以實現NiosII CPU對CRC IP核的控制。
指令集
CPU依靠指令來計算和控制系統,每款CPU在設計時就規定了一系列與其硬體電路相配合的指令系統。指令的強弱也是CPU的重要指標,指令集是提高微處理器效率的最有效工具之一。從現階段的主流體系結構講,指令集可分為複雜指令集和精簡指令集兩部分,而從具體運用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)和AMD的3DNow!等都是CPU的擴展指令集,分別增強了CPU的多媒體、圖形圖象和Internet等的處理能力。我們通常會把CPU的擴展指令集稱為"CPU的指令集"。
在最初發明計算機的數十年里,隨著計算機功能日趨增大,性能日趨變強,內部元器件也越來越多,指令集日趨複雜,過於冗雜的指令嚴重的影響了計算機的工作效率。後來經過研究發現,在計算機中,80%程式只用到了20%的指令集,基於這一發現,RISC精簡指令集被提了出來,這是計算機系統架構的一次深刻革命。RISC體系結構的基本思路是:抓住CISC指令系統指令種類太多、指令格式不規範、定址方式太多的缺點,通過減少指令種類、規範指令格式和簡化定址方式,方便處理器內部的並行處理,提高VLSI器件的使用效率,從而大幅度地提高處理器的性能。
RISC指令集有許多特徵,其中最重要的有:
指令種類少,指令格式規範:RISC指令集通常只使用一種或少數幾種格式。指令長度單一(一般4個位元組),並且在字邊界上對齊。欄位位置、特別是操作碼的位置是固定的。
定址方式簡化:幾乎所有指令都使用暫存器定址方式,定址方式總數一般不超過5個。其他更為複雜的定址方式,如間接定址等則由軟體利用簡單的定址方式來合成。
大量利用暫存器間操作:RISC指令集中大多數操作都是暫存器到暫存器操作,只以簡單的Load和Store操作訪問記憶體。因此,每條指令中訪問的記憶體地址不會超過1個,訪問記憶體的操作不會與算術操作混在一起。
簡化處理器結構:使用RISC指令集,可以大大簡化處理器的控制器和其他功能單元的設計,不必使用大量專用暫存器,特別是允許以硬體線路來實現指令操作,而不必像CISC處理器那樣使用微程式來實現指令操作。因此RISC處理器不必像CISC處理器那樣設定微程式控制存儲器,就能夠快速地直接執行指令。
便於使用VLSI技術:隨著LSI和VLSI技術的發展,整個處理器(甚至多個處理器)都可以放在一個晶片上。RISC體系結構可以給設計單晶片處理器帶來很多好處,有利於提高性能,簡化VLSI晶片的設計和實現。基於VLSI技術,製造RISC處理器要比CISC處理器工作量小得多,成本也低得多。
加強了處理器並行能力:RISC指令集能夠非常有效地適合於採用流水線、超流水線和超標量技術,從而實現指令級並行操作,提高處理器的性能。目前常用的處理器內部並行操作技術基本上是基於RISC體系結構發展和走向成熟的。
正由於RISC體系所具有的優勢,它在高端系統得到了廣泛的套用,而CISC體系則在桌面系統中占據統治地位。而在如今,在桌面領域,RISC也不斷滲透,預計未來,RISC將要一統江湖。
對於CPU來說,在基本功能方面,它們的差別並不太大,基本的指令集也都差不多,但是許多廠家為了提升某一方面性能,又開發了擴展指令集,擴展指令集定義了新的數據和指令,能夠大大提高某方面數據處理能力,但必需要有軟體支持。
MMX(Multi Media eXtension,多媒體擴展指令集)指令集是Intel公司於1996年推出的一項多媒體指令增強技術。MMX指令集中包括有57條多媒體指令,通過這些指令可以一次處理多個數據,在處理結果超過實際處理能力的時候也能進行正常處理,這樣在軟體的配合下,就可以得到更高的性能。MMX的益處在於,當時存在的作業系統不必為此而做出任何修改便可以輕鬆地執行MMX程式。但是,問題也比較明顯,那就是MMX指令集與x87浮點運算指令不能夠同時執行,必須做密集式的交錯切換才可以正常執行,這種情況就勢必造成整個系統運行質量的下降。
SSE(Streaming SIMD Extensions,單指令多數據流擴展)指令集是Intel在Pentium III處理器中率先推出的。其實,早在PIII正式推出之前,Intel公司就曾經通過各種渠道公布過所謂的KNI(Katmai New Instruction)指令集,這個指令集也就是SSE指令集的前身,並一度被很多傳媒稱之為MMX指令集的下一個版本,即MMX2指令集。究其背景,原來"KNI"指令集是Intel公司最早為其下一代晶片命名的指令集名稱,而所謂的"MMX2"則完全是硬體評論家們和媒體憑感覺和印象對"KNI"的 評價,Intel公司從未正式發布過關於MMX2的訊息。
而最終推出的SSE指令集也就是所謂勝出的"網際網路SSE"指令集。SSE指令集包括了70條指令,其中包含提高3D圖形運算效率的50條SIMD(單指令多數據技術)浮點運算指令、12條MMX 整數運算增強指令、8條最佳化記憶體中連續數據塊傳輸指令。理論上這些指令對目前流行的圖像處理、浮點運算、3D運算、視頻處理、音頻處理等諸多多媒體套用起到全面強化的作用。S SE指令與3DNow!指令彼此互不兼容,但SSE包含了3DNow!技術的絕大部分功能,只是實現的方法不同。SSE兼容MMX指令,它可以通過SIMD和單時鐘周期並行處理多個浮點數據來有效地提高浮點運算速度。
SSE2(Streaming SIMD Extensions 2,Intel官方稱為SIMD 流技術擴展 2或數據流單指令多數據擴展指令集 2)指令集是Intel公司在SSE指令集的基礎上發展起來的。相比於SSE,SSE2使用了144個新增指令,擴展了MMX技術和SSE技術,這些指令提高了廣大應用程式的運行性能。隨MMX技術引進的SIMD整數指令從64位擴展到了128 位,使SIMD整數類型操作的有效執行率成倍提高。雙倍精度浮點SIMD指令允許以 SIMD格式同時執行兩個浮點操作,提供雙倍精度操作支持有助於加速內容創建、財務、工程和科學套用。除SSE2指令之外,最初的SSE指令也得到增強,通過支持多種數據類型(例如,雙字和四字)的算術運算,支持靈活並且動態範圍更廣的計算功能。SSE2指令可讓軟體開發員極其靈活的實施算法,並在運行諸如MPEG-2、MP3、3D圖形等之類的軟體時增強性能。Intel是從Willamette核心的Pentium 4開始支持SSE2指令集的,而AMD則是從K8架構的Sledgehammer核心的Opteron開始才支持SSE2指令集的。
SSE3(Streaming SIMD Extensions 3,Intel官方稱為SIMD 流技術擴展 3或數據流單指令多數據擴展指令集 3)指令集是Intel公司在SSE2指令集的基礎上發展起來的。相比於SSE2,SSE3在SSE2的基礎上又增加了13個額外的SIMD指令。SSE3 中13個新指令的主要目的是改進執行緒同步和特定應用程式領域,例如媒體和遊戲。這些新增指令強化了處理器在浮點轉換至整數、複雜算法、視頻編碼、SIMD浮點暫存器操作以及執行緒同步等五個方面的表現,最終達到提升多媒體和遊戲性能的目的。Intel是從Prescott核心的Pentium 4開始支持SSE3指令集的,而AMD則是從2005年下半年Troy核心的Opteron開始才支持SSE3的。但是需要注意的是,AMD所支持的SSE3與Intel的SSE3並不完全相同,主要是刪除了針對Intel超執行緒技術最佳化的部分指令。
由AMD公司提出的3DNow!指令集應該說出現在SSE指令集之前,並被AMD廣泛套用於其K6-2 、K6-3以及Athlon(K7)處理器上。3DNow!指令集技術其實就是21條機器碼的擴展指令集。
與Intel公司的MMX技術側重於整數運算有所不同,3DNow!指令集主要針對三維建模、坐標變換 和效果渲染等三維套用場合,在軟體的配合下,可以大幅度提高3D處理性能。後來在Athlon上開發了Enhanced 3DNow!。這些AMD標準的SIMD指令和Intel的SSE具有相同效能。因為受到Intel在商業上以及Pentium III成功的影響,軟體在支持SSE上比起3DNow!更為普遍。Enhanced 3DNow!AMD公司繼續增加至52個指令,包含了一些SSE碼,因而在針對SSE做最佳化的軟體中能獲得更好的效能。
目前最新的Intel CPU可以支持SSE、SSE2、SSE3指令集。早期的AMD CPU僅支持3DNow!指令集,隨著Intel的逐步授權,從Venice核心的Athlon 64開始,AMD的CPU不僅進一步發展了3DNow!指令集,並且可以支持Inel的SSE、SSE2、SSE3指令集。不過目前業界接受比較廣泛的還是Intel的SSE系列指令集,AMD的3DNow!指令集套用比較少。