YangLyu

Nios II CPU体系分析

0
阅读(2693)


        很多人喜欢学一个东西能够尽快上手,但是当你熟悉了工具的使用和它基本的设计概念之后,如果想要深入SOC/SOPC系统,有必要从最最基本的地方开始,深挖细节和底层,才能面对Altera的“类Unix”风格的API知其然,知其所以然。从各公司提供的文档的角度来看,相对于Xilinx的文档,相比之下笔者更喜欢Altera的文档风格,Altera公司的文档给人一种更加系统化,像教科书一样细致的风格。当然啦,作为工程师来讲,既然是要使用它们的器件,无论如何都要仔细研究他们的文档。

        Nios IIAltera借助于它那各种javaperltcl脚本控制生成,并以加密的HDL形式给出。特点如下:

132位指令总线与数据总线分开的处理器结构,无MMU情况下,地址空间只能寻址31位,存在MMU的情况下可以实现4G的寻址空间;

232个通用寄存器;

332个外部中断源;

4)可以配置的硬件乘法器、除法器、浮点运算单元、MMUMPU等;

5)支持自定义指令集,按照Altera规定的格式和指令OP Code,实现所谓硬件加速。

        Nios II CPU的结构如下:

 

       和一般的RISC体系一样,包括寄存器,算术逻辑单元,异常管理,中断控制器,指令总线,数据总线,指令/数据缓存,还有自定义指令接口等等。值得注意的是,在Altera的实现中,Nios II的寄存器包括R0R1...R31,一共有3232位的寄存器,实际上有两组这样的寄存器,所谓register bank aregister bank b,一组作为控制寄存器组。Nios II CPU运行的时候分为管理模式和用户模式,当然在没有MMU/MPU的情况下没有这个区别。


        关于异常处理,Nios II的异常处理较为简单,异常的入口地址在Qsys建立Nios II CPU的时候设置,所有的异常类型为精确异常,即当异常发生而进入异常处理程序,不会执行异常处理之后的程序,当清除异常标志后,CPU可以继续执行异常发生前的程序指令。

       Nios II似乎为其准备了32word的入口。异常包括复位,硬件暂停,中断,自陷,非法指令,非对齐的地址以及和MPU/MMU运行模式相关的异常等。

        中断的入口在硬件上只对应于一个异常入口,而Nios II的中断源来源于Avalon总线上的irq,或者irq_n信号,一个中断源对应一位,即支持32个。这种结构就意味着,虽然我们在Qsys中分配了中断号,但是实际上的优先级是由软件决定的,中断的发生和中断源的判定均由软件来完成,因为所有外部中断入口只有一个,全局中断的开关位于CPU status寄存器的PIE位。每一位的使能通过ienable寄存器实现的。即:

assign W_ienable_reg_nxt = ((E_wrctl_ienable & E_valid) ? E_src1[31 : 0] : W_ienable_reg) & 32'hffffffff;

        Nios II CPU的控制寄存器的访问有专门的指令完成,即wrctl ctlNrA,以及wrprs rCrArdctl等。

对于写汇编程序而言,有些指令对于汇编器及指令的运行有特别的含义,其他通用寄存器用作什么无所谓,但是我们使用C/C++的编译器的时候,寄存器的使用要有约定的规则。Nios II规定,类似于MIPS32体系,R0寄存器不可写,只可读,并且始终为0。具体的含义,具体可以参照Nios II Processor Reference Handbook

Nios II32个控制寄存器,如下:

 

        具体可以参照Nios II Processor Reference Handbook,以及各referenced documents

    指令格式:

I型:两个5位寄存器编号A B,一个16位立即数,最后是6OP码。

R型:三个寄存器5位编号A B C,一个11OPX,最后是6OP码。

J型:26位立即数,6OP码。可以直接通过calljmpi指令实现256MB的空间内跳转。

        那么问题来了,自定义指令Altera是如何实现的呢?实际上就是对R型指令的扩展,因为32位的指令,总有很多是空闲的,对于OPX,作为自定义指令集。

        接下来,与编程相关的,各指令集,数据传送类指令,算术与逻辑运算类指令,Move,比较跳转指令、跳转指令、移位指令、程序控制指令(call ret等)、条件分支指令、与CPU密切相关的控制指令(trapbreakwrctlrdctl)等等,具体请参考Nios II Instruction Set Reference