基于NIOS-II软核流水灯实现
实验目标:学习 Quartus 、Platform Designer、Nios-II SBT 的基本操作;初步了解 SOPC 的开发流程,基本掌握 Nios-II 软核的定制方法;掌握 Nios-II 软件的开发流程,软件的基本调试方法。
-
在DE2-115开发板上分别用 Verilog和 Nios软件编程两种方式完成LED流水灯显示,理解两种方式的差异;
-
分别用Verilog和Nios软件编程, 实现DE2-115开发板串口输出"Hello Nios-II"字符到笔记本电脑串口助手。
一、实验内容及设备环境
1、实验设备及环境
硬件:PC 机、DE2-115 FPGA 实验开发平台;
软件:Quartus Prime 18.1、Platform Designer、Nios II SBT
2、实验内容
使用 FPGA 资源搭建一个简单 Nios II 处理器系统,具体包括:
(1) 在 Quartus Prime 中建立一个工程;
(2) 使用 PD 建立并生成一个简单的基于 Nios II 的硬件系统;
(3) 在 Quartus Prime 工程中编译基于 Nios II 的硬件系统并生成配置文件.sof;
(4) 在 Nios II SBT 中建立对应硬件系统的用户 C/C++工程,编写一简单用户程序,在
Nios II SBT 中编译程序生成可执行文件.elf;
(5) 将配置文件.sof 和可执行文件.elf 都下载到 FPGA 进行调试运行。
二、NIOS-II软核简介
2004年,Altera 正式推出了Nios II系列32位RISC嵌入式处理器。Nios II系列软核处理器是Altera的第二代FPGA嵌入式处理器,其性能超过200DMIPS,在Altera FPGA中实现仅需35美分。Altera的Stratix 、Stratix GX、 Stratix II和 Cyclone系列FPGA全面支持Nios II处理器,以后推出的FPGA器件也将支持Nios II。
Nios II包括3种产品,分别是:Nios Ⅱ/f(快速)------最高的系统性能,中等FPGA使用量;Nios Ⅱ/s(标准)------高性能,低FPGA使用量;Nios Ⅱ/e(经济)------低性能,最低的FPGA使用量。这3种产品具有32位处理器的基本结构单元------32位指令大小,32位数据和地址路径,32位通用寄存器和32个外部中断源;使用同样的指令集架构(ISA),100%二进制代码兼容,设计者可以根据系统需求的变化更改CPU,选择满足性能和成本的最佳方案,而不会影响已有的软件投入
本次实验需要在FPGA上通过Nios Ⅱ软核完成流水灯控制,由于控制 LED 灯闪烁的用户程序代码很小,可将其固化在片内 ROM 来执行。变量、堆栈等空间使用片内 RAM,不使用任何片外存储器。整个系统的框图如图 1.1 所示。
从图 1.1 控制 LED 闪烁的系统框图可知,其它逻辑与 Nios II 系统一样可存在于 FPGA中。Nios II 系统可与其它片内逻辑相互作用,取决于整个系统的需要。为了简单起见,本实验在 FPGA 内不包括其它逻辑。

三、硬件部分设计
1、新建项目、选择芯片类型
1)、新建项目就不在赘述,可以参考以下链接 link
2)芯片选择

2、Qsys系统设计
1、点击 Tools 下拉菜单下的 Platform Designer 工具,启动 Platform Designer 后,点击 File-save,在文件名中填写为kernel,具体如下图所示:

2、点击file,选择 save as,同时命名
3、双击clk_0,时钟设置为50MHZ
4、左侧输入process,选择Nios II Procee,然后点击add,保持默认设置,点击fiish即可
5、右键重命名为"cpu",并按图操作进行时钟线连接。时钟和时钟连接,复位和复位连接
6、添加JTAG并配置,左边选择JTAG_UART_Intel_FPGA_IP,点击Add。同时将其重命名为uart。然后连线
7、添加RAM,选择On-Chip Memory (RAM or ROM) Intel FPGA,点击Add加入。
size选择40960
这里注意s1的连线
8、添加PIO,左边选择PIO,将其加入进来。
连线如下:
将其命名为out_led
9、添加System ID Peripheral
按图操作:
连线如下:

10、双击cpu,进入Vector,按图操作:
如果没有这个选项请回到第七步
11、点击System -> Assign Base Address
12、接着
13、点击generate即可
3、Quartus设计
1 添加原理图文件
返回到Quartus页面,新建原理图文件

双击空白处,加入生成的bsf文件:
在原理图(BDF)文件中添加 PD 生成的系统符号,在空白处双击将已生成的 kernel 加入 top_level.bdf 中。如下图所示:
然后点击
2.添加qid文件
加入 Quartus II IP File 文件,为了以后编译成功,请务必将对应的 Quartus II IP File (.qip) 加入项目中。步骤如下:
点击 Assignments-Settings,添加 kernel.qip 文件,如下图所示:
添加完后需要点击apply
4、引脚绑定

然后点击分析综合,绑定引脚

我只连了4个灯做测试
最后进行一次全编译即可
四、软件设计部分
1、按照下图所示点击 Nios II Software Build Tools for Eclipse 打开 Nios II SBT for

2、选择默认路径即可

3、建立新的软件应用,如下图所示:
添加该文件

4、写入代码
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
const alt_u8
led_data[8]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};
int main (void)
{
int count=0;
alt_u8 led;
volatile int i;
while (1)
{ if (count==7)
{count=0;}
else
{count++;}
led=led_data[count];
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);
i = 0;
while (i<500000)
i++;
}
return 0;
}
5、右键单击项目名称,在弹出的菜单中选择 Build Project,如下图所示:


6、如下图所示,添加下载文件。然后点击 Start 开始下载,下载成过后关闭,回到 Eclipse 主机界面。
添加的文件是outfile中后缀为.sof的文件

如果没有该文件就是没有全编译
7、运行/调试程序
用户将运行程序来观察编译代码的执行。用户可以在目标硬件上或 Nios II 指
令集仿真器(ISS)上运行程序。本节实验只讲述在目标硬件上调试和运行程序。在 C/C++ Projects 视图中右击 hello_led_0 工程文件夹,然后在弹出的快捷菜单中选择 Run As→Nios II Hardware 运行程序,也可以在菜单栏中选择 Run →Run Configurations,如下图所示:
8、实验效果
(我只绑定了4个灯的引脚)
直接运行未修改的代码,即可看到串口信息
五、verilog实现
直接上代码
module LED(
input clk,//25M
output [7:0]led
);
reg [31:0]cnt=0;
reg clk1hz=0;
always@(posedge clk)
begin
if(cnt==32'd12500000-1)
begin
cnt<=0;
clk1hz<=!clk1hz;
end
else
cnt<=cnt+1;
end
reg[7:0]c1=8'd1;
always@(posedge clk1hz)
begin
if(c1[7]==1)
c1<=8'd1;
else
c1<=c1<<1'b1;
end
assign led=c1;
endmodule
实验效果类似,不在展示
六、实验心得
本次实验首次接触了FPGA软核,为FPGA学习打开了一扇新的大门,在复杂逻辑难以实现的情况下可通过软核进行C编程搭配Verilog的硬件编程,以此实现项目所需功能。
同时使用软核进行C编程搭配Verilog的硬件编程在比较少的代码时,显然verilog实现比较方便,但是涉及到更多的代码,用软核可以节省时间。