NIOS软核处理器入门实验

NIOS软核处理器入门实验

脚本方式的优势:

•便于工程的复制和搬移, 命令脚本能够较好的解决文件路径的相对关系
•便于参数的集中修改,命令脚本的参数相对集中, 在配置文件的集中区域可以完成所有的设定
•执行效率较高,所有必要的调试动作均有专门命令对应, 调试过程中,没有多余动作

软核处理器的定义:

在FPGA电路设计领域, 所谓软核处理器, 是指使用FPGA芯片内部的逻辑资源构建实现的处理器, 我们知道FPGA芯片拥有大量的逻辑、存储、I/O 和 计算资源, 这些资源也可以用来构建一个处理器系统并且在其上运行软件。

软核处理器的特点(与硬核处理器相比):

•灵活的可裁剪性, 能够通过EDA工具控制处理器内部组件的规模和数量。
•较好的调试可见性, 可以数字电路的调试工具, 把软核处理器作为一个数字电路进行观测和调试
•与FPGA专用逻辑之间较好的耦合性, 可以使用FPGA内部的互联资源直接耦合至其他专用逻辑
•峰值频率较低, 软核处理器使用通用逻辑资源构建, 因此其底层的定制优化程度低于专用的硬核处理器, 由于时序性能的限制, 通常来说应用中软核处理器的主频不超过200MHz

NIOS软核处理器结构 图NIOS软核处理器入门实验_第1张图片

浅蓝色为必要组件,其他为可选或可配置调节的

软核处理器适用场景

系统中需要使用FPGA

■通常我们不会为了使用软核处理器而在系统中添加一颗FPGA芯片
■但是有时我们在FPGA中使用了软核处理器之后, 可以从系统的电路板上去掉一颗单片机芯片
■元器件的减少, 对物料管理成本和批量焊接成品率会产生一定帮助

•FPGA内部的应用逻辑模块或与FPGA接口的外部芯片, 存在大量的需要配置的寄存器

■现代电子系统中的专用处理模块有时会异常复杂
■例如一个以太网接口控制器 或 某种图像采集/处理的专用电路模块,可能会存在大量的(十几个到上百个)寄存器需要配置。
■使用C语言编程来控制寄存器比用HDL电路要灵活许多,可以快速修改,编译,下载,测试。

•需要用FPGA 实现某种低速的、需要频繁修改调试的算法

■使用HDL语言设计的专用电路的长处是实现简单算法的高速数据流的处理逻辑 。
■使用高级语言编程的处理器系统则不同, 更加适合实现低速数据流的复杂处理算法。
■尤其是当该算法需要频繁的 “修改-编译-下载-调试” 的开发场景, 使用处理器更加有开发效率优势。

软核处理器的开发工具链

•数字电路设计者视角:处理器系统是一系列导线、逻辑门、触发器、存储器、接口单元的集合。

•体系结构设计者视角:处理器系统是由两部分构成的,硬件部分和软件部分

■处理器系统的硬件部分由各种总线单元构成,例如:处理器内核,程序存储器, 数据存储器, 中断控制器, 总线控制器,以及挂载于总线上的各种功能单元。例如 DMA(直接访存控制器),定时器, 外存控制器,通用接口单元(GPIO)等。
■处理器系统的软件部分有各种系统函数和硬件抽象函数构成。例如,字符打印, 内存拷贝, 通过总线地址访问外设寄存器, 中断服务函数等。
■体系结构的软硬件之间, 联系两者的最重要纽带是“存储映射和访问地址”
■所有可以编程控制的硬件单元在软件层次都是一系列访存地址。得益于C语言指针的灵活特性, 软件和硬件可以方便的通过访存地址进行沟通

•应用程序开发视角:处理器系统在系统函数和硬件抽象函数的支持下, 完成应用逻辑的执行动作。

上述的开发者的不同视角, 在实际的开发工作中是以工具链中的一系列工具来体现的, 每个视角均有一个工具用于开发。 以Altera的NIOS处理器软核为例。

•电路逻辑, 用于完成数字电路逻辑的编译合成, Quartus环境
•体系结构硬件部分, 用于在总线系统中放置各种处理器系统功能单元, SOPC Builder(早期版本)/ QSys(当前版本)(Quartus11以后)
注:Qsys 是Altera公司提供的一个在FPGA上构建SOPC(可编程片上系统)系统的软件工具,集成在Quartus II中,用以软核平台的开发,软核包括Nios II及相应外设。简单来说,就是通过Qsys可以做一个包括CPU,总线,内存和外设的硬件系统,在上面可以跑程序。
•体系结构软件部分, 根据系统的总线地址布局, 生成处理器系统的底层硬件驱动函数和 C 编程环境底层代码, BSP Editor
注:BSP板级支持包,介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行于硬件主板。
•应用程序开发, 基于GUI图形环境的 NIOS IDE 和基于命令行环境的 NIOS Shell(一个运行在Cygwin bash 的GNU GCC 编译工具链)

参考设计硬件结构

NIOS软核处理器入门实验_第2张图片
•该参考设计通过一个按键和每组4个共两组LED和用户交互
•第一组LED,由定时器控制, 每过1秒钟改变一次发光图样
•第二组LED,由按键触发, 每按下一次按键改变一次发光图样

参考设计软件流程

NIOS软核处理器入门实验_第3张图片
•系统启动,硬件抽象层(HAL)代码将C环境系统变量初始化完毕, 跳转到main()函数入口
•main()函数 用户初始化其应用程序变量,进入工作循环入口
•读取当前工作循环中定时器连接的GPIO数值, 和上次循环中的数值比较
•若计数值发生变化则更新第一组 LED 发光图样
•读取当前工作循环中按键计数器连接的GPIO数值, 和上次循环中的数值比较
•若计数值发生变化则更新第二组 LED 发光图样
•重新跳转至循环入口

运行参考设计

注:文件打开目录不能含有中文目录,低版本的Quartus不能打开高版本的Quartus工程。
•使用 Quartus 13 打开目录prj_q10.1/ 下的 Quartus项目,nios_small_pio.qpf
•在 Quartus环境的 Tools菜单 - Qsys目,启动Qsys工具
•在Qsys 工具界面, file-open,打开目录下 的nios_cpu.sopc,然后在点击Generation下的Generate按钮,工具会生成电路逻辑编译所需的Verilog文件。
•回到Quartus工具, 点击”Processing-Start Compilation“菜单,启动电路编译过程
注:此时编译会提示有关实体名的错误,需要加入nios_cpu.qip文件(点击左侧file——右键Add file inproject—file name里找到后缀为.qip文件) QIP应该就是Quartus IP的缩写,就是我们在Quartus II里面是有Altera的IP的时候产生的一个文件。
•编译完成后,在Quartus工具, 点击 ”Tools - Netlist Viewer - RTL V,iewer“观察电路RTL结构图
•电路RTL如下图所示, 按钮计数器和定时计数器 分别连接至NIOS处理器的两个输入GPIO

顶层电路RTL结构

NIOS软核处理器入门实验_第4张图片

硬件逻辑

观察 Quartus 的 RTL Viewer
•可以见到除了NIOS处理器之外,还有2个RTL 逻辑模块
•Timer 和 Button Counter
•Timer 模块用于每秒 对其计数值加1
■该模块由1个秒脉冲发生器和1个8比特计数器级联构成
•Button Counter 对按键0的按键次数 计数
■该模块由按键去抖、边沿捕获、8比特计数器级联构成
•两者的数值分别被NIOS的GPIO读入
NIOS软核处理器入门实验_第5张图片
Timer和Button Counter的RTL 结构
##体系结构-总线单元
NIOS软核处理器入门实验_第6张图片
•cpu_0 ,这是NIOS处理器的一个例化实体
•ONCHIP_RAM,片上RAM, 用于存储NIOS的运行代码和C环境变量数据
■该模块分别连接到NIOS的指令总线和数据总线
•pio 0/1/2/3 ,一共4个GPIO 模块例化实体
■pio 0/1 用于输出至LED控制其发光
■pio 2/3 用于读取定时器和按键计数器的数值
•jtag_uart_0 ,使用JTAG调试通道的字符打印模块
■该模块用于和调试字符终端输入
■例如printf() 和scanf() 函数
•sysid_0,该模块用于保存一个处理器系统ID
■用于编译工具识别硬件系统标识, 用户不必对其操作
注意观察每个模块的总线地址
双击 cpu 0 模块 ,观察一下CPU地址设定。
•Reset Vector 是复位的启动地址
■本例子中,该地址设定指向到ONCHIP RAM
•Exception Vector 是处理器的代码执行地址
■本例子中,该地址设定指向到ONCHIP RAM
•注意, 因为本设计把CPU代码保存至片上RAM,则导致两个地址指向同一个存储器
•当使用了不同的存储方案时
■例如 代码存储在EPCS存储器中,然后拷贝到SDRAM中执行
■则Reset Vector指向 EPCS存储器
■Exception Vector 指向 SDRAM
NIOS软核处理器入门实验_第7张图片
CPU的地址设定
最后观察一下 nios_cpu.sopcinfo 文件,使用一个文本编辑器将其打开
•该文件是一个XML格式的描述文件
•该文件由SOPC Builder 在Generate 阶段生成
•该文件用于保存处理器系统的所有参数配置信息
•软件工具链BSP生成器根据该文件生成系统的底层驱动代码

体系结构-板级支持包(BSP)

•在Altera的Quartus 应用程序组里(即Quartus安装目录下NIOS2eds文件), 启动 Nios II Command Shell.bat文件
•注意:一定要用管理员身份启动,否则会有权限问题
NIOS软核处理器入门实验_第8张图片
启动Command Shell
•NIOS Shell 是一个运行在Windows系统的Linux仿真器, 叫做Cygwin
•注意:敲命令时,记得使用Tab键补全命令, 不用把命令敲完整,否则很累且易错
•首先在shell里, 进入到NIOS的software目录
•例如 如果你的项目保存在 d:\temp 目录下
•则你需要 进入到 D:\temp\Git_nios_small_pio_LAB\prj_q10.1\software 目录
•需要使用以下命令
cd cygpath -u "D:\temp\Git_nios_small_pio_LAB\prj_q10.1\software" •该命令稍长,请在电脑浏览器观看
•该命令的含义是
■使用cygpath 命令和-u选项, 把” “中的windows路径 换成unix格式的路径。
■Windows的路径使用反斜杠 \ 作为分隔符, 而Unix则用斜杠/ ,所以需要进行转换
■然后 用cd 命令进入到该路径(即:两个反引号 之间的部分)注:反引号为键盘制表符上面的按键
•进入software目录后, 确认一下路径正确, 使用 pwd 命令
■pwd 命令的输出应当是:/cygdrive/d/temp/Git_nios_small_pio_LAB/prj_q10.1/software
•在software目录下, 列出当前目录下的文件和子目录, 使用 ls 命令
•使用命令 cd bsp 进入到 bsp目录
■ls 一下,观察到里面有2个文件,create-this-bsp 和 settings.bsp
■使用命令, nios2-bsp-editor 启动 bsp 板级支持包编辑器
■bspeditor 会 会打开当前目录下的settings.bsp ,该文件包含了关于处理器的底层软件配置信息
•观察一下当前处理器系统的软件配置信息, 如下图:
■使用了小型的C编译库和精简版本的驱动代码
■使用jtag_uart 作为标准终端输出输出
注:命令行粘贴复制方法:任务栏窗口——右键——属性——勾选快速编辑模式 选中命令行——右键复制——然后在点击右键进行粘贴
BSP的C环境和标准终端配置
NIOS软核处理器入门实验_第9张图片
1.观察一下Linker页面的配置情况,从下图中可以看到
2..bss .heap 这一栏是编译器的各种代码段和数据段
3.各种缩写的含义请用搜索引擎检索缩写字母即可
4.linker region是用来保存代码段的链接器区域
5.链接器区域又被封装保存到不同的物理存储器中
6.本例中只有一个存储器,即ONCHIP RAM
NIOS软核处理器入门实验_第10张图片
BSP的Linker 配置
•观察完毕后, 点击界面下方的“Generate” 按钮
•然后回到bsp目录下使用ls命令,观察一下,bsp editor 生成了若干目录
•目录中包含着 C 文件和H文件,这些文件都是处理器的C环境需要的库函数文件

你可能感兴趣的:(FPGA)