标题：自定义指令集
含义
是用户让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!指令集应用比较少。