Nios-II入门实践

一、实验目的

(1)学习 Quartus Prime 、Platform Designer、Nios II SBT 的基本操作;
(2)初步了解 SOPC 的开发流程,基本掌握 Nios II 软核的定制方法;
(3)掌握 Nios II 软件的开发流程,软件的基本调式方法。

二、实验设备

硬件:PC 机、DE2-115 FPGA 实验开发平台;
软件:Quartus Prime 18.1、Platform Designer、Nios II SBT

三、实验内容

使用 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.建立工程

选择芯片,Cyclone IV E系列的EP4CE11529C7。

2.Qsys系统设计

点击 platform designer
在这里插入图片描述
修改名字为kernel,点击保存
在这里插入图片描述
右键点击clk_0,选择edit,设置50M。
在这里插入图片描述
添加外围器件:
搜索Nios II Processor,点击add
在这里插入图片描述
将 nios2_qsys_0 重命名为 cpu
将 cpu 的 clk 和 reste_n 分别与系统时钟 clk_0 的 clk 和 clk_reset 相连
添加 jtag uart 接口
搜索JTAG UART,点击添加,设置保持默认。
在这里插入图片描述
jtag-uart_0 重命名为 jtag-uart。
在这里插入图片描述
添加RAM核
搜索On Chip,点击添加,设置内存为40960
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加 PIO 接口
搜索pio,点击添加,Width 为 8bits,Direction 选择 output,其余选项保持默认。
在这里插入图片描述
在这里插入图片描述
重命名为pio_led,在 Export 栏处双击,把输出口引出来,并命名为 out_led。
在这里插入图片描述
添加片 System ID Peripheral 核
搜索System ID Peripheral,点击添加,保持默认设置。
在这里插入图片描述
重命名为sysid。
在这里插入图片描述
端口连接总图如下:
在这里插入图片描述
添加基地址:
在这里插入图片描述
指定 NIos II 的复位和异常地址:选中CPU,单击右键,点击edit 进入 Nios II
Processor 的配置界面,配置 Reset Vector 和 Exception Vector 为
”onchip_ram.s1”:
在这里插入图片描述
点击 Qsys 主界面菜单栏中的 ”System” 下的 ”Create Global Reset Network”。完成后会自动连接所有复位端口。
在这里插入图片描述
生成Qsy系统
在这里插入图片描述
在这里插入图片描述

3.逻辑连接

在原理图文件中添加我们生成的Qsy文件。
在这里插入图片描述
在这里插入图片描述
点击菜单 Project-add/remove files in project,点击右侧浏览按钮找到如图所示的 qip 文件,选择并点击 add 添加。
在这里插入图片描述
在这里插入图片描述
菜单里选择 Assignments-device,然后点击 Device and Pin Options,将未用引脚设置为 As input tri-stated
在这里插入图片描述

在这里插入图片描述
绑定引脚:
在这里插入图片描述
进行编译。

4.软件设计

点击 Tools,然后点击 Nios II Software Build Tools for Eclipse 打开 Nios II SBT for Eclipse。
在这里插入图片描述
创建工程:
在这里插入图片描述
按下图进行选择和设置。
在这里插入图片描述
代码:

#include "stdio.h"
#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)
	{
    
    
		printf("Hello world!\n");
		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;
}

右键 bsp,选择Nios II,Generate BSP
在这里插入图片描述
右键该项目,build project
在这里插入图片描述

5.烧录

点击软件工具栏上的按钮 ,则出现下载界面。第一次下载需安装硬件。即在下载界面中点击按钮“hardware setup…”,然后在弹出的对话框中选择“USBblaster”,再点击“ok”,则硬件被安装上。
安装好硬件后,在output_files中添加相应的下载文件。
在这里插入图片描述

在菜单栏中选择 Run →Run Configurations
在这里插入图片描述
依次点击下图中的refresh,apply,run。
在这里插入图片描述
运行结果:
在这里插入图片描述
点击按键会复位。
在这里插入图片描述

六、Verilog实现流水灯

此处由于工程建立和设置的方法都类似,只给出代码如下:

module waterlight (
    input wire 	    clk		,
	input wire	    rst_n	,
	output [7:0]    led
);
    parameter       CNT_MAX = 26'd5000_0000;

    reg [25:0]	    cnt_1s;//1s 计数器,计数最大值 5000_0000 - 1
	wire 		    flag_1s;//计数器每计满1s,使能一个时钟周期
    reg [7:0]	    led_reg;//输出信号的寄存信号
    //1s计数器
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			cnt_1s <= 26'd0;
		else if(cnt_1s >= CNT_MAX - 26'd1) //归零条件
			cnt_1s <= 26'd0;
		else
			cnt_1s <= cnt_1s + 26'd1;
	end
	
	assign flag_1s = cnt_1s >= CNT_MAX - 26'd1;

     //移位实现流水灯
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			led_reg <= 8'b1111_1111;//全灭
		else if(flag_1s)
			if(led_reg == 8'b1111_1111)
				led_reg <= 8'b0000_0001;
			else
				led_reg <= {
    
    led_reg[6:0],led_reg[7]};//拼接实现循环移位
		else
			led_reg <= led_reg;
	end

	assign led = led_reg;
endmodule

此处烧录运行结果与上次相同。

七、总结

本次实验主要是了解并熟悉了Nios-II软核的操作方法,自己动手配置了一遍Qsy文件,主要是对操作进行了熟悉和练习,也对Eclipse的使用方式和其如何连接FPGA开发板有了一些了解。

八、参考资料

基于NIOS-II软核与verilog语言的流水灯实现

猜你喜欢

转载自blog.csdn.net/cjhz2333/article/details/130187654
今日推荐