一、前言
实验内容及步骤
使用 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 进行调试运行。
实验原理
控制 LED 灯闪烁的用户程序代码很小,可将其固化在片内 ROM 来执行。变量、堆栈
等空间使用片内 RAM,不使用任何片外存储器。整个系统的框图如图 1 所示。
从图 1.1 控制 LED 闪烁的系统框图可知,其它逻辑与 Nios II 系统一样可存在于 FPGA
中。Nios II 系统可与其它片内逻辑相互作用,取决于整个系统的需要。为了简单起见,本实
验在 FPGA 内不包括其它逻辑。
二、实验过程记录
2.1 设计硬件
1、新建项目
创建了一个名为helloworld的项目
2、Qsys系统设计
打开Qsys设计界面,点击【File】→【Save】保存文件
点击edit,并时钟设为 50M Hz。
添加 Nios II 32-bit CPU,在搜索框输入nios
右击添加的 Nios II 32-bit CPU 元件,点击【Rename】,重命名为【cpu】
cpu 的 clk 和 reset_n 分别与系统时钟 clk_0 的 clk 和 clk_reset 相连
同样的方法添加 jtag uart 接口
重命名为【jtag_uart】
进行 clk、reset、avalon_jtag_slave 的连线,以及中断 irq 连线,中断号设为 0。
同样的方法添加片上存储器 On-Chip Memory(RAM)核
配置窗口内,设置内存为 40960(40 KB)
重命名为onchip_ram并连接 clk1、s1、reset1
同样的方法添加 PIO 接口
确定 Width 为 8 bits,Direction 选择 output
重命名为 pio_led并引出管脚:双击 Export 列的 external_connection ,命名为 out_led
同样的方法添加片 System ID Peripheral 核。
重命名为 sysid 再连接 clk、reset、control_slave
整体如下图所示:
3、配置Qsys系统
完成基地址分配
点击【System】→【Assign Base Addresses】
【Base】一列不再出现重复的具体的地址
指定 Nios II 的复位和异常地址。
双击 cpu 配置属性,在【Core Nios II】栏
配置 Reset Vector 和 Exception Vector 为【onchip_ram.s1】
使用 FPGA 资源。
点击【Generate】
如果提示是否保存 .qsys 文件,选择保存。
点击【Generate】,再点击【Save】
generate成功
4、设计原理图
关闭Qsys页面
新建原理图文件
点击元件按钮,搜索刚创建的元件,放置在原理图上
加入 Quartus II IP File 文件。
点击【Assignments】→【Settings】
选择 kernel.qip 文件
点击【Add】
右击 kernel 模块,点击【Generate Pin for Symbol Ports】生成管脚
双击管脚名进行重命名
芯片引脚设置。
点击【Assignments】→【Device】
点击【Device Pin Options】(如图所示)
将未用的引脚设置为【As input tri-stated】
将特殊引脚设置为常规引脚【Use as regular I/O】,最后点击【OK】
此时保存原理图文件
5、配置物理针脚
首先编译原理图文件
点击【Pin Planner】快捷键
如图所示配置物理针脚
2.2 软件设计
点击【Tools】→【Nios II Software Build Tools for Eclipse】
进入eclipse后,新建工程
如图所示
选择 kernel.sopcinfo 文件,再输入工程名,选择 Hello World
打开 hello_world.c 文件,修改为如下代码:
#include <stdio.h>#include "system.h"#include "altera_avalon_pio_regs.h"#include "alt_types.h"const alt_u8led_data[8]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};int main (void) {int count=0;alt_u8 led;volatile int i;//串口打印printf("Hello world!\n");//流水灯循环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<5000000)i++;}return 0;}
右击工程名,点击【Build Project】编译
编译完成
2.3 运行项目
连接开发板并给开发板上电
启动【Quartus Prime Programmer】
下载完成后,可以看到 Console 里打印信息:Hello World
板子上看到流水灯效果
三、总结
在此次流水灯及串口输出实验中,我掌握了SOPC开发流程,基本掌握 Nios-II 软核的定制方法;掌握 Nios-II 软件的开发流程,软件的基本调试方法。感受到了软硬件结合的开发方式的有利之处。
如果觉得《【Nios II】以SOPC开发流程完成流水灯以及串口输出实验》对你有帮助,请点赞、收藏,并留下你的观点哦!