最小的Nios2系统
前言
2003年Altera推出了第一代32位Nios系统,开创了FPGA内构建高性能单片机的先河。随之2004年,Nios系统升级为Nios2系统,解决了软硬件开发中一些不方便的问题,软件开发环境从命令行编译转移到Eclips的IDE集成开放环境。Nios2开发环境从1.0、1.1到1.2逐步升级。后来为了和QuartusII软件升级同步,从QuartusII5.0版本开始Nios2的版本号正式和QuartusII统一。
作者我亲身经历过整个Nios2发展历程,深知Nios2的不同版本发生的巨大变化。目前网上流行的Nios2教程针对的版本相对较老,已经对初学者学习Nios2起不到指导作用,并且应广大爱好者的强烈要求,我在此使用QuartusII和Nios2的8.0版本详细叙述Nios2的开发流程。
构建一个Nios2最小系统需要什么
构建一个Nios2最小系统需要具备以下资源:
★ Nios2软核处理器
★ 内存
★ Jtag_uart调试接口
1. Nios2软核处理器:这就是Nios2处理器的核心CPU,所有的外设都是和这个CPU通过Avalon总线连接到一起的。
2. 内存:编译后的程序代码需要通过下载线下载到该内存中,然后CPU的程序指针跳转到内存的首地址开始执行程序。
3. Jtag_uart调试接口:想要用单步调试等调试功能控制程序执行和查看程序变量,那么就需要这个调试接口。
开始构建一个再简单不过的Nios2工程
整个步骤由2部分组成,第一部分建立Nios2硬件SOPC工程,第二部分建立Nios2软件工程。
1.建立Nios2硬件SOPC工程
建立Nios2硬件SOPC工程就是设计一个软核CPU和它的外设,编译成硬件电路放到FPGA芯片里面。这时候可以认为FPGA就是一个32位的单片机了,下面的软件开发都是针对这个单片机的。
打开QuartusII软件,新建一个工程选择EP2C8Q208C8芯片。
打开Tools->SOPC Builder菜单,进入SOPC Builder界面,新建一个名为nios32的SOPC文件,语言可以选择VHDL或者VerilogHDL。我们一共要添加3个IP模块:Nios2处理器、片上内存和Jtag_uart调试接口。
1.编程语言下载1在左边的IP导航栏里面双击选择NiosII Processor,然后选择Nios II/e型的处理器。这个处理器占用FPGA逻辑资源最小。此时CPU的Reset Vector和Exception Vector都是不可
1.建立Nios2硬件SOPC工程
建立Nios2硬件SOPC工程就是设计一个软核CPU和它的外设,编译成硬件电路放到FPGA芯片里面。这时候可以认为FPGA就是一个32位的单片机了,下面的软件开发都是针对这个单片机的。
打开QuartusII软件,新建一个工程选择EP2C8Q208C8芯片。
打开Tools->SOPC Builder菜单,进入SOPC Builder界面,新建一个名为nios32的SOPC文件,语言可以选择VHDL或者VerilogHDL。我们一共要添加3个IP模块:Nios2处理器、片上内存和Jtag_uart调试接口。
1.编程语言下载1在左边的IP导航栏里面双击选择NiosII Processor,然后选择Nios II/e型的处理器。这个处理器占用FPGA逻辑资源最小。此时CPU的Reset Vector和Exception Vector都是不可
选的,因为还没有设置内存。在添加了内存后,还要回到这个CPU设置里面设置这两项信息。
1.2在左边的IP导航栏里选择On-Chip Memory(RAM or ROM)
使用默认设置就可以了,RAM类型,32位数据宽度,4KB字节容量。
1.3在左边的IP导航栏里选择jtag_uart
使用默认设置就可以了。
1.4最后建成的Nios2系统见下面的连接关系图:
Avalon总线的连接关系图下图:
图中实心的圆圈代表连接,空心的圆圈代表不连接。cpu做为主设备Onchip_mem和jta
1.2在左边的IP导航栏里选择On-Chip Memory(RAM or ROM)
使用默认设置就可以了,RAM类型,32位数据宽度,4KB字节容量。
1.3在左边的IP导航栏里选择jtag_uart
使用默认设置就可以了。
1.4最后建成的Nios2系统见下面的连接关系图:
Avalon总线的连接关系图下图:
图中实心的圆圈代表连接,空心的圆圈代表不连接。cpu做为主设备Onchip_mem和jta
g_uart作为从设备,从设备通过数据总线和指令总线连接到主设备上。Onchip_mem比较特殊,它既连接到cpu的指令总线上,又连接到数据总线上。这跟我们设计有关,我们是通过调试接口将程序下载到Onchip_mem中,程序然后从Onchip_mem开始执行指令。程序中产生的变量同时也是存放在Onchip_mem中的。
1.5新建一个Block Diagram/Schematic File作为工程的顶层文件,将刚才制作的Nios32的symbol添加到bdf文件里。添加时钟和复位信号管脚,定义管脚的管脚号。最后编译工程,这样Nios2硬件部分的开发就算完成了,可以看到生成的sof和pof下载文件。
2.建立Nios2软件工程
建立Nios2软件工程和开发51单片机程序差不多,但是具体细节设置的地方有很多差异的地方。
2.1新建工程
打开Nios2软件IDE开发环境,新建一个NiosII C/C++ Application的工程。Nios2开发环境还自带了很多模版例子工程,我们这里选择Hello World Small工程。和51开发不同的是,Nio
1.5新建一个Block Diagram/Schematic File作为工程的顶层文件,将刚才制作的Nios32的symbol添加到bdf文件里。添加时钟和复位信号管脚,定义管脚的管脚号。最后编译工程,这样Nios2硬件部分的开发就算完成了,可以看到生成的sof和pof下载文件。
2.建立Nios2软件工程
建立Nios2软件工程和开发51单片机程序差不多,但是具体细节设置的地方有很多差异的地方。
2.1新建工程
打开Nios2软件IDE开发环境,新建一个NiosII C/C++ Application的工程。Nios2开发环境还自带了很多模版例子工程,我们这里选择Hello World Small工程。和51开发不同的是,Nio
s2可以自定义很多外设。因此不同的Nios2工程添加的外设可能都不同,需要在新建工程的时候指定你所要开发的那个Nios2硬件工程。这点很关键,这就是软件工程和硬件工程结合的地方。
一般新建一个工程时,系统会同时建立一个和该应用程序对应的库工程。库工程里面编译了指定Nios2硬件的外设驱动程序等api函数。这样就将应用程序和驱动库分离开来,方便用户管理。开发不同的应用程序时,可以共享一个驱动库。
2.2编译工程
建立工程后我们会在导航栏里面看到又两个新建的工程:hello_world_small_0和hello_world_small_0_syslib。
点击编译按钮直接编译工程,最后查看编译结果。
一般新建一个工程时,系统会同时建立一个和该应用程序对应的库工程。库工程里面编译了指定Nios2硬件的外设驱动程序等api函数。这样就将应用程序和驱动库分离开来,方便用户管理。开发不同的应用程序时,可以共享一个驱动库。
2.2编译工程
建立工程后我们会在导航栏里面看到又两个新建的工程:hello_world_small_0和hello_world_small_0_syslib。
点击编译按钮直接编译工程,最后查看编译结果。
最终生成hello_world_small_0.elf二进制文件,程序代码大小为560个直接,内存剩余3536个字节。
2.3软件在线调试工程
工程编译成功后就可以用下载线调试你的程序了。在Run->Debug菜单里设置下载线和需要调试的软件工程。
Main页面和Target Connection页面里的设置完成后可以点击Debug按钮进行调试。此时Nios2的开发环境将刚才编译的二进制代码通过USB Blaster下载电缆,下载到FPGA片内的onchip-memory中,然后将Nios2的指令指针指向程序的第一条语句。注意,在调试程序前必须将硬件开发过程中生成的sof文件下载到FPGA里,否则FPGA里面是没有Nios2的CPU软核,程序将无法下载。
这时程序会停在man函数的第一条语句,点击全速运行按键,我们会在控制台里面看到
2.3软件在线调试工程
工程编译成功后就可以用下载线调试你的程序了。在Run->Debug菜单里设置下载线和需要调试的软件工程。
Main页面和Target Connection页面里的设置完成后可以点击Debug按钮进行调试。此时Nios2的开发环境将刚才编译的二进制代码通过USB Blaster下载电缆,下载到FPGA片内的onchip-memory中,然后将Nios2的指令指针指向程序的第一条语句。注意,在调试程序前必须将硬件开发过程中生成的sof文件下载到FPGA里,否则FPGA里面是没有Nios2的CPU软核,程序将无法下载。
这时程序会停在man函数的第一条语句,点击全速运行按键,我们会在控制台里面看到
程序运行的结果。程序在控制台里打出一段字符串,这就是整个程序的运行结果。
总结
上面我们通过建立一个Nios2的最小系统,带领大家走过了从硬件到软件整个开发流程,看到了Nios2运行的结果。通过这个简单的例子,我们劈开了很多复杂繁琐的设置过程,让Nios2清晰的展现在大家面前。Nios2的开发不是想象中那么神秘,我们只要循序渐进的学习才能真正领会Nios2的强大和灵活。
上面的例子只是展示了一个可以运行的Nios2,它的功能非常简单,简单到只能完成打印一行字符串。由于受到FPGA片内存储器资源的限制,我们不能构建功能更加强大的代码,因此需要片外扩展Sdram来存储更大的程序代码。另外,我们的程序是在线下载到内存里面的,断电后程序代码也会消失,我们需要一个外部非易失的存储器如Flash来存储CPU的软件代码。
下一篇教程,我们将介绍如何扩展外部存储器Sdram和Flash。
程序代码:
总结
上面我们通过建立一个Nios2的最小系统,带领大家走过了从硬件到软件整个开发流程,看到了Nios2运行的结果。通过这个简单的例子,我们劈开了很多复杂繁琐的设置过程,让Nios2清晰的展现在大家面前。Nios2的开发不是想象中那么神秘,我们只要循序渐进的学习才能真正领会Nios2的强大和灵活。
上面的例子只是展示了一个可以运行的Nios2,它的功能非常简单,简单到只能完成打印一行字符串。由于受到FPGA片内存储器资源的限制,我们不能构建功能更加强大的代码,因此需要片外扩展Sdram来存储更大的程序代码。另外,我们的程序是在线下载到内存里面的,断电后程序代码也会消失,我们需要一个外部非易失的存储器如Flash来存储CPU的软件代码。
下一篇教程,我们将介绍如何扩展外部存储器Sdram和Flash。
程序代码:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论