NIOS硬件架构

0.NIOS硬件框架结构

在这里插入图片描述

1.寄存器

用来存放数据的一些小型存储区域,很靠近CPU。暂时存放参与运算的数据和运算结果。包括32个32bit的通用寄存器、32个32bit控制寄存器、影子寄存器组。

1.1 通用寄存器

  • 通用寄存器,多用途,可以暂存指令,数据和地址
    • 通用寄存器表,程序会产生异常,复位异常,外部中断也会有异常,后面重点关注ea这个异常返回地址。在这里插入图片描述

1.2 控制寄存器

  • 控制寄存器,用于控制和确定NIOS处理器的操作模式以及当前执行任务的特性
    • 控制寄存器表在这里插入图片描述
    • 状态寄存器(ctl0)
      在这里插入图片描述
      • PIE(peripheral interrupt enable):外设中断允许位(1表示允许外设中断,0表示禁止外设中断)
      • U:反应计算机当前状态(1处于用户模式,0表示管理员模式)
      • EH:异常处理程序模式位(若系统没有MMU,EH始终为零)
      • IH:中断处理方式位(IH为1,表示NIOS处理器需要一个中断)
    • estatus、bstatus都是status寄存器的备用寄存器,发生断点或异常的时候会用于保存status寄存的值,处理完毕后将原status的值放回。
    • ienable,中断使能寄存器,每一bit控制一个中断通道,该寄存器是32bit因此QSYS系统最多支持32个中断。第0位为1表示允许0通道中断发生。
    • ipending:中断发生标志位,每一bit反应一个中断是否发生。第0位为1表示第0号中断发生。
    • cpuid:保存处理器的ID,在NIOS系统生成时候就有了,作为CPU的标志,在多核处理时用于分辨CPU。在NIOS processor中的Advanced Feature中通过assign cpuid进行设置。

1.3 影子寄存器组

  • 影子寄存器组,用来备份通用寄存器和控制寄存器中的状态寄存器。通常会和外部中断控制器联合使用。

2. 算数逻辑单元(ALU)

对存储在通用寄存器中的数据进行操作,ALU从寄存器中取一个或者两个操作数,经过计算后将结果存回通用寄存器。支持下面四种运算:

  • 算数运算:加减乘除
  • 关系运算:有/无符号数的等于、不等于、大于等于和小于等于运算
  • 逻辑运算:与或非、异或
  • 移位运算:逻辑右移(左)、算数右移(左)、循环右移(左)
  • 通过在NIOS Processor页面进行设置运算的实现方式,可以使用FPGA的硬件资源来实现软核的运算,速度会更快。

3. 复位信号

  • 外部输入reset:全局硬件的复位信号,是外部输入的,高电平有效,可使QSYS、FPGA逻辑立即进入复位。
  • cpu_resetrequest:本地软复位信号,高电平有效,可以只让CPU复位,QSYS中其他IP不受影响。并非立即复位,会等待当前指令执行完毕后复位,复位也要持续多个指令周期,复位完毕后会发出cpu_resettaken信号反馈。(在NIOS Processor页面进行设置,勾选advance features有Include cpu_resetrequest and cpu_resettaken选项,则CPU连连看的地方会多出来一个接口cpu_resetrequest _conduit,将它连接到外部则会在产生例化模板时多出来上述两个端口)

4. 异常(中断是其中一类,最重要,与用户相关)

在这里插入图片描述

4.1 内部中断(中断控制在CPU内部)

最常用,是由内部中断控制器(Internal Interrupt Controller,IIC)处理的中断。NIOS支持32个内部中断(irq0~irq31),优先级通过QSYS来定,每一中断对应独立的一个中断通道。针对每一个中断输入,处理器ienable中断允许寄存器都有响应的bit与之对应,处理器可通过ienable寄存器控制中断的使能与否。处理器也可以通过控制寄存器中的状态寄存器中的PIE位来使能或屏蔽所有中断。

  • 若具备以下条件,系统才会产生硬件中断:
    • 1.状态寄存器的最低位PIE为1
    • 2.在ienable寄存器中,该中断源的相位为1,即被使能
    • 3.某中断的irq有效
      在这里插入图片描述
  • 内部中断处理流程
    • 1、状态寄存器内容复制到estatus寄存器,保存当前处理器状态
    • 2、状态寄存器的PIE位置零,禁止所有硬件中断
    • 3、把异常返回地址写入ea寄存器(r29)
    • 4、跳转到异常处理地址

4.2 外部中断(中断控制在CPU外,用Vectored Interrupt Controler IP控制)

  • 外部中断控制器(External Interrupt Controller),在NIOS processor中的Advanced Features可以选择是内部中断还是外部中断。下面是影子寄存器需求数量,中断来了之后可以让CPU运行所需的寄存器都切换为影子寄存器,中断完毕后,回到通用寄存器中执行。以此来进行现场保护。只有NIOS/f支持外部中断控制器。
  • 当用外部中断时,需要调用另一个IP(Vectored Interrupt Controler,VIC),一个VIC同样最多有32个中断,若要实现大于32个中断,需要调用2个VIC并且使能菊花链,通过将它们串联来实现多于32个的中断。(内部中断最多32,外部最多64,每一个对应一个影子寄存器组)
  • 外部中断控制器的应用场景(响应迅速、性能更好、大于32个中断源):
    在这里插入图片描述
  • 影子寄存器组是外部中断控制器快的原因。他是通用寄存器组、状态寄存器的拷贝,用以中断快速现场保护和中断响应。同时,为该中断的执行配备了专用的影子寄存器支持其快速响应。
    在这里插入图片描述
    Sstatus影子状态控制寄存器,和之前的状态控制寄存器类似。
    在这里插入图片描述
  • SRS(Switched register set bit),切换寄存器bit位,为1表示中断来了,要切换到影子寄存器中去执行。
  • CRS(Current register set field),当前执行的寄存器组
  • PRS(previous register set field),之前执行的寄存器组

4.3 外部中断控制器处理流程

在这里插入图片描述

  • 正常运行下,是在0号寄存器下运行。各个影子寄存器组中的PRS/CRS/SRS都是0。
  • 每一个外部中断源对应一个影子寄存器组,当中断来临,EIC产生RRS(6bit,表示哪个中断来,正常为0,即运行在0号寄存器组);CPU对比CRS和RRS是否相同,若不同则外部中断来了;SRS置位表示要切换寄存器组;之后RRS被CPU写入CRS中表示中断将要在该2号影子寄存器中执行;与此同时PRS也被更新为CRS的值。
  • 接下来CPU利用2号影子寄存器进行当前的运算,中断处理完毕后再换回。不像内部中断需要保留现场、拷贝地址、地址跳转等复杂流程,外部中断可以借助影子寄存器完成中断无缝衔接处理。
    在这里插入图片描述

5. 存储器和IO

  • NIOS存储器和IO非常灵活,这是NIOS II和传统微控制器的显著区别。NIOS系统可配置,存储器和外设随着NIOS处理器配置的不同而不同。最终存储器和IO结构随着系统不同而变化。
  • NIOS软核可使用多个方式访问存储器和IO:
    • 指令主端口:Avalon主端口,通过Avalon系统互联结构连接到指令存储器
    • 数据主端口:Avalon主端口,通过Avalon系统互联结构连接到数据存储器
    • 指令高速缓存:指令cache
    • 数据高速缓存:数据cache
    • 紧耦合指令或数据存储端口:与NIOS核内外的快速SRAM相连
      在这里插入图片描述

5.1 指令、数据master端口、cache

  • 指令mater端口:32bit的Avalon-MM master端口。只有一个功能:对处理器将要执行的指令进行取值,指令主端口不执行任何写操作。因此需要将程序运行的RAM和EPCQ与CPU的指令master进行连接。
  • 数据master端口:32bit的Avalon-MM master端口。有两个功能:1、当处理器load指令时,从存储器或外设中读取数据;2、当处理器执行存储指令时,将数据写入存储器或外设。因此QSYS几乎所有的IP都需要连接CPU的数据master端口。
  • 指令和数据分开处理的结构,即哈佛结构。指令、数据分开,处理速度更快。常用的数据和指令存储在cache中,在处理器设置界面同样可以对cache的大小进行指定。可以改善系统的平均性能,但是会使得程序的执行时间难以预测,若所需的指令、数据在cache中那么执行速度很快,若不在那么就必须从存储器中读取。这对于响应时间要求苛刻的场景来说是不合适的。
  • MMU(memory management unit),内存管理单元,只有fast等级支持MMU去实现虚拟内存。
  • MPU(memory protection unit),内存保护单元,只有fast等级支持。防止用户去对关键的内存关键系统资源进行改写。比如有内核模式、用户模式,要想实现就需要有MPU这个硬件进行支持。只是提供存储器保护,不支持内存映射和管理。

5.2 紧耦合指令或数据存储端口

  • 紧耦合指令或数据存储端口,cache虽然改善平均性能,但是使得代码执行时间变得不可预测,实时性下降。为了改善这点,引入了紧耦合存储器。紧耦合存储器是紧挨内核的SRAM,可存储关键性的代码和数据,读取速度快并且读写时间确定。因此紧耦合存储器既可以提升性能又可以获得可预测的实时响应,可向对性能要求严格的应用提供低延时的访问。有单独的端口,与传统的指令数据互联结构区分开来,不需要复杂的选择,因此读写速度快。与其他通过Avalon互联结构的存储器件相同,占据连续地址空间,在生成系统时指定。
    • 中断频繁的应用能够将异常处理代码放在紧耦合存储器中来降低中断处理延时。
    • 若应用程序小,能够完全在片内实现,可以使用专门针对代码和数据的紧耦合存储器。若程序大,那就必须仔细选择放入紧耦合存储器中的内容,其余放在片外RAM中,从而达到成本性能平衡。
    • 在处理器配置界面中的caches and memory interfaces中可以选择紧耦合存储器的数量。在互联结构中可以看见,和Avalon指令、数据互联是完全并行的。
    • 紧耦合存储器的互联方式如下,可见指令master端口通过一个双口ram连接到NIOS处理器的Avalon数据总线。这是因为紧耦合指令master端口只能读取指令给CPU去执行,但是不能写。若没有为他配对一个双口ram,就没办法向指令紧耦合存储器中写任何东西,会使开发、调试困难。因此以双口ram为媒介,使得CPU可以通过Avalon data master port向双口ram中读写。数据紧耦合master可读写,因此连接一个单口ram即可。有了紧耦合存储器后,可将整个程序跑在紧耦合存储器中(可通过BSP editor的linker script进行设置),也只将异常处理部分运行在紧耦合存储器中(只需要在QSYS系统的控制器设置页面设置即可)。
      在这里插入图片描述
      在这里插入图片描述

6. JTAG调试模块

PC上的软件调试工具可以通过与JTAG调试模块通信,提供调试诊断功能。如:把程序下载到存储器中;启动和停止程序运行;设置断点和观察点;分析寄存器和存储器;采集实时的执行跟踪数据。
对于不同的功能要求,可以选择不同等级的JTAG,资源消耗差别很大。经济模式下只能有level1的功能,fast模式下可以选择使能更高级的功能。
在这里插入图片描述
fast模式最高能跑185MHZ,经济模式最高200M。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
NIOS输出浮点数可以通过使用浮点数库函数来实现。NIOS处理器本身并不支持硬件浮点运算,但可以使用软件实现的浮点数库函数进行浮点数的计算和输出。 首先,要在NIOS工程中引入浮点数库函数。在Quartus软件的Project窗口中,右键点击NIOS II processor,选择"New Component",然后选择"Floating Point Software Support"。添加后,可以在NIOS II软件开发环境中使用浮点数库函数。 接下来,在C语言代码中,我们需要包含相应的头文件来引入浮点数库函数。通常使用`math.h`头文件。然后,可以使用库函数来进行浮点数的计算和输出。 例如,我们想要将两个浮点数相加并输出结果。首先,定义两个浮点数变量,并通过输入等方式为其赋值。然后使用库函数`float fsum(float x, float y)`来计算两个浮点数的和。最后,使用输出函数将结果打印出来。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <math.h> int main() { float x, y, result; printf("请输入两个浮点数:"); scanf("%f %f", &x, &y); result = fsum(x, y); printf("相加结果为:%f\n", result); return 0; } ``` 在上面的代码中,通过`scanf`函数从用户输入获取两个浮点数的值,并将其存储在`x`和`y`变量中。然后使用库函数`fsum`计算两个浮点数的和,并将结果存储在`result`变量中。最后,使用`printf`函数将结果输出到终端。 需要注意的是,由于NIOS处理器不支持硬件浮点运算,因此浮点数的运算会比较耗时。所以在实际应用中,应尽量减少对浮点数的操作,以提高处理效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值