1、实验目的
(1)学习 Quartus Prime 、Platform Designer、Nios II SBT 的基本操作;
(2)初步了解 SOPC 的开发流程,基本掌握 Nios II 软核的定制方法;
(3)掌握 Nios II 软件的开发流程,软件的基本调式方法。
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 进行调试运行。
3、实验步骤
建立工程,芯片为
选择
修改名字
右键点击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_0 重命名为 jtag-uart。
搜索On Chip,点击添加,设置内存为40960
搜索pio,点击添加,Width 为 8bits,Direction 选择 output
重命名为pio_led,在 Export 栏处双击,把输出口引出来,并命名为 out_led
搜索System ID Peripheral,点击添加,
重命名为sysid。
端口连接总图如下:
添加基地址:
选择Address
指定 NIos II 的复位和异常地址:选中CPU,单击右键,点击edit 进入 Nios II
Processor 的配置界面,配置 Reset Vector 和 Exception Vector 为
”onchip_ram.s1”:
点击 Qsys 主界面菜单栏中的 ”System” 下的 ”Create Global Reset Network”。完成后会自动连接所有复位端口。
选择create
生成Qsy系统
选择HDL
在原理图文件中添加我们生成的Qsy文件。
点击菜单 Project-add/remove files in project,点击右侧浏览按钮找到qip 文件,选择并点击 add 添加。
编辑引脚
点击 Tools,然后点击 Nios II Software Build Tools for Eclipse 打开 Nios II SBT for Eclipse。
创建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;
}
然后build一下,就可以烧录了
然后run一下程序看下结果
4、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
一开始建工程那里添加一个文件就行
然后编译,烧录
参考链接
https://blog.csdn.net/zhoushuaiyxlmwan/article/details/130132662?spm=1001.2014.3001.5502
https://blog.csdn.net/cjhz2333/article/details/130187654?spm=1001.2014.3001.5502