一.背景介绍
介于最近在使用FPGA( altera芯片 CYCLONE IV E ) 做项目开发,遂在之前基础上深入探索。使用NIOS II 软内核开发FPGA,在损失一部分FPGA内存资源和逻辑资源的情况下,NIOS能够帮开发者实现类似在ARM、DSP中才能做了复杂逻辑、复杂计算和分析工作。
- 二.工具
1) Quartus ii V13.14 Bit32
2 ) 内部集成工具 Qsys 和 Eclipes等
- 三.Qsys实现操作过程
直接来干货,实现步骤如下 :
1)首先,建立NIOS II 内核,在Qsys中;具体过程在本人上一章中有具体描述;
2)在Qsys工程里,添加 EPCS 控制器模块
3)EPCS模块配置;跟其他模块配置方式相同,
a) 复位引脚配置到CLK模块和JTAG-UART模块,重点:必须两个RESET都连接。
b) 时钟正常配置,连接CLK的时钟;数据总线和NIOS 模块的数据总线连接。
c) External引脚配成外部引脚,重点:必须是外部引脚,在Quartus工程中需要用到。
d) EPCS定义起始地址:这里之前我配置成0x0000的起始地址,导致在ECLIPSE 用FLASH PROGRAM 过程使用无法通道,提示"No EPCS registers found:tried looking at addresses 0x00001000 …"故障;
这个地方网上找了很多排故方式,都徒劳。最后灵光一闪;将它改成 0x7000。后面编译通过下载成功。。。如果有朋友知道真正原因,请指导。
4)生成代码 Gernerate
- 四. Quartus 工程实现
1) 将上述生产的HDL文件,添加到自己的Quartus工程中,(所有都添加)不然容易报错缺少.V文件。
2)在顶层文件中添加刚刚生成的NIOS HDL文件模块名,实例化。
3)将实例化中的EPCS芯片操作引脚分配到FPGA的外部EPCS实际管脚上,这步非常重要;决定了NIOS 能够操作EPCS芯片。注意:这里容易遇到一个问题,EPCS芯片操作引脚无法配置的问题,Quartus提示报错,这里也有解决办法。
工程>Device>Device advanced options > Dual-purpose > 将所有引脚都选 Use as regular I/O 模式,简单理解成这几个EPCS专用引脚配置成通用型引脚。
4)最后编译该工程;生成了JTAG 配置的 sof 文件;
5)将sof文件下载到FPGA中,此时FPGA的内部NIOS就已经跑起来了。只是程序仅仅在FPGA内部RAM中,没有存到外部FLASH内,掉电即消失。
- 五. Eclipse 工程实现
1) 在Quartus工程中启动 Eclipe工具;新建工程 Filse > New > Nios ii application and BSP from Template ,意思是建立实例工程;包含了应用工程和FPGA底层驱动工程。如下所示:三步,第一选择Quartus工程里的"xx.sopcinfo"配置文件,一个工程只有一个;第二步取个名称;第三步骤选择工程模版,这里选用Hellow Word Small ,占用内存小。
2)出现两个工程,其中bsp结尾的是库工程,即FPGA的内存、引脚等等分配说明;
3)我们需要操作的仅仅只有TT2该应用工程;简单举例,在main中添加如下
#include “sys/alt_stdio.h”
#include “altera_avalon_pio_regs.h” // 在bsp工程中的FPGA 操作库
int main()
{
alt_putstr(“Hello from Nios II!
”);
while (1)
{
IOWR_ALTERA_AVALON_PIO_DATA(0x6000,0xFFFF);
usleep(100000);
IOWR_ALTERA_AVALON_PIO_DATA(0x6000,0x0000);
usleep(100000);
}
return 0;
}
4)测试在RAM中运行;
选择工程,在菜单RUN中RUN AS > NIOS II HARDWARE ;这个时候在ECLIPE 的窗口可以看到运行情况;如果添加了指示灯,在开发部的LED灯将会闪烁。
说明NIOS 运行正常。
5)在进行最后一步,保存ECLIPSE工程与Quartus固件库工程同时到FLASH前;要处理的问题。Eclipse自身问题,需要配置一个文件“ nios2-flash-override.txt ”
首先该文件的目的是,告诉Eclipes软件,你所使用的外部FLASH芯片是什么配置。
然后,操作方法是,直接网上DOWNLOAD,或者新建txt文件,添加下面内容。
[EPCS-202011] # EPCS1N (lead-free)
sector_size = 32768
sector_count = 4
[EPCS-202013] # EPCS4N (lead-free)
sector_size = 65536
sector_count = 8
[EPCS-C22013] # EPCS4N (lead-free)
sector_size = 65536
sector_count = 8
[EPCS-202013] # EPCS4N (lead-free)
sector_size = 65536
sector_count = 8
[EPCS-202015] # EPCS16N (lead-free)
sector_size = 65536
sector_count = 32
[EPCS-202017] # EPCS64N (lead-free)
sector_size = 65536
sector_count = 128
[EPCS-010215] #EPCS32N(lead-free)
sector_size = 65536
sector_count = 64
[EPCS-010216] # EPCS64N (lead-free)
sector_size = 65536
sector_count = 128
[EPCS-FF] # EPCS64N (lead-free)
sector_size = 65536
sector_count = 128
[EPCS-012018] #EPCS128N(lead-free)
sector_size = 262144
sector_count = 64
重点:当你不知道你的外部FLASH名称时,不着急,直接在后面的步骤中看到报故障信息里,会告诉你的FLASH名称。上面加粗的信息是我的FLASH信息。
当然,该TXT文件必须放在 NIOS安装目录下bin文件夹中,才能被识别到。
6)最后一步,写如外部FLASH 。FLASH PROGRAM 工具,在Eclipe软件菜单中NIOS II > FLASH PROGRAM 打开。
a) 添加固件库文件 File > New
添加 Eclipe 的 bsp工程中的固件库设置文件 “settings.bsp”
b) 在 Connection 中 测试 USB Blaster 和 SYStem ID
c) 添加 Quartus的工程文件 .sof 和 Eclipes应用工程文件 .LEF文件
d) 添加 Quartus的工程文件 .sof 和 Eclipes应用工程文件 .LEF文件
将菜单里的OPTIONS,最后四个都勾选。
e) START ,完成。上电重启即可。
f) 最后补充一点:在Qsys配置NIOS内核中,Reset Vator 必须选择 EPCS外设路径。这样启动才会从外部FLASH.
- 六. FLASH总结
1)Eclipse 工程,两个工程,想要使用Qys配置的NIOS外部模块时,必须查看bsp工程。比如:给GPIO输出电平,. IOWR_ALTERA_AVALON_PIO_DATA(0x6000,0xFFFF);
2)Flash Progarm 问题;主要是 START后遇到各种报错;
首先解决,Eclipse不认识FLASH芯片问题,添加上面的txt文件;
然后,在Qsys配置中,设置EPCS芯片的起始地址,如果0x0000,则报错。改为0X7000后正常。
3)对于刚入门的朋友,过程比较曲折,该教程希望能给你带来帮助,少走弯路。