一、LED流水灯
1.实验原理
控制 LED 灯闪烁的用户程序代码很小,可将其固化在片内 ROM 来执行。变量、堆栈等空间使用片内 RAM,不使用任何片外存储器。整个系统的框图如下所示
2.实验步骤
硬件部分
1)建立新项目
2)进行 Qsys 系统设计
点击 Tools 下拉菜单下的 Platform Designer 工具
启动 Platform Designer 后,点击 File-save,在文件名中填写为 kernel后点击 OK
鼠标放在 clk_0 处点击右键 Edit 或是双击 clk_0 元件,对 Clock 进行时钟设置,设为为 50M
添加 CPU 和外围器件。从 PD 的元件池中选择以下元件加入到当前设计的系统中:
Nios II 32-bit CPU、jtag uart、片上存储器、PIO、system ID
① 添加 Nios II 32-bit CPU
a. 在“component library”标签栏中找到“Nios II Processor”后点击 Add(在查找窗口
输出 nios 即可)。
b. 在 Nios Core 栏中选择 Nios II/f 选项,其他保持默认选项
c. 在”Caches and Memory Interfaces”标签栏中保持默认设置(Instruction Cache 选择4Kbytes)
d. 在”Advanced Features”标签栏中保持默认设置
e. 在”MMU and MPU Settings”标签栏中保持默认设置
f. 在”JTAG Debug Module”标签栏中保持默认设置(注意勾选 Include JTAG Debug)
g. 点击 Finish 回到 PD 界面。
h. 将 nios2_qsys_0 重命名为 cpu
i. 将 cpu 的 clk 和 reste_n 分别与系统时钟 clk_0 的 clk 和 clk_reset 相连
注意:对模块命名要遵循以下规则:
名字最前面应该使用英文;
能使用的字符只有英文字母、数字和下划线“_”;
不能连续使用“_”符号,在名字的最后也不能使用“_”。
② 添加 jtag uart 接口。jtag uart 接口是 Nios II 嵌入式处理器新添加的接口元件,通过内嵌在 Intel FPGA 内部的 JTAG 电路,可以实现在 PC 主机与Qsys 系统之间进行串行字符流通信。
a. 从下图左侧”Component Library”标签栏中的查找窗口输入 jtag 找到”JTAG UART ”,然后点击 Add
b. 在 JTAG UART-jtag-uart_0 的设置向导中保持默认选项,点击 Finish
c. 返回”System Contents”标签栏可以看到新加入的”JTAG UART”核。在”Name”
列中将 jtag-uart_0 重命名为 jtag-uart。
d. 进行 clk、reset 以及 master-slave 的连线
e. 进行中断 irq 连线
③ 添加片上存储器 On-Chip Memory(RAM)核
a. 从下图左侧”Component Library”标签栏中的查找窗口输入 On Chip 找到”On-Chip Memory(RAM or ROM)”后点击 Add
b. 在”Size”栏中的”Total memory size”窗口中输入 40960(即片上内存的大小为 40KB),其余选项保持默认,点击 Finish
c. 返回”System Contents”标签栏可以看到新加入的”On-Chip Memory”核。在”Name”
列中将 onchip_memory2_0 改名为 onchip_ram。
d. 进行时钟、数据端口、指令端口的连接
④ 添加 PIO 接口
a. 从下图左侧”Component Library”标签栏中的查找窗口输入 pio 找到”PIO”后点击Add
b. 确定以下选项:Width 为 8bits,Direction 选择 output,其余选项保持默认,点击Finish
c. 返回”System Contents”标签栏可以看到新加入的”PIO”核。在”Name”列中将pio_0 改名为 pio_led。并在在 Export 栏处双击,把输出口引出来,并命名为 out_led。
d. 进行时钟、数据端口、指令端口的连接
⑤ 添加片 System ID Peripheral 核
a. 从下图左侧”Component Library”标签栏中的查找窗口输入 sys 找到” System ID Peripheral”后点击 Add
b. 保持默认选项,单击 Finish
c. 返回”System Contents”标签栏可以看到新加入的” System ID Peripheral”核。在”Name”
列中将 sysid_qsys_0 改名为 sysid。
d. 进行时钟、数据端口的连接
4) 完成 Qsys 设计的后续工作
基地址分配:点击 PD 主界面菜单栏中的”System”下的”Assign Base Addresses”
完成后”Base”栏将出现不会重复的具体的地址
分配中断号:在”IRQ”标签栏下点选”Avalon_jtag_slave”和 IRQ 的连接点就会
为”jtag_uart”核添加一个值为 0 的中断号
指定 NIos II 的复位和异常地址:从”System Contents”标签栏
双击建立好的 cpu 进入 Nios II Processor 的配置界面,配置 Reset Vector 和 Exception Vector 为””onchip_ram.s1”,点击 Finish
点击 Qsys 主界面菜单栏中的”System”下的”Create Global Reset Network”。
完成后会自动连接所有复位端口
(最终完成的连接图)
生成 Qsys 系统:点选”Generation HDL”标签栏中 Generate 按
钮生成 Qsys 系统
点击 Close 后关闭窗口后,再关闭 Platform Designer 主界面
在原理图(BDF)文件中添加 PD 生成的系统符号
加入 Quartus II IP File 文件,为了以后编译成功,请务必将对应的 Quartus II IP File (.qip) 加入项目中
3)进行逻辑连接和生成管脚
(1)逻辑连接。开发板晶振为 50M,与系统默认一致,因此,这里我们不需要修改。
(2)在 kernel 模块内点击鼠标右键选取 Generate Pin for Symbol Ports 生成管脚。
4)回到 Quartus II 主界面后编译项目。如下图所示,编译成功后,点击 OK 完成
5)分配物理针脚
完成后关闭 Pin Planner,回到 Quartus Prime 主界面后再次编译项目。至此完成项目的硬件设计。
软件部分
1)启动 Nios II SBT
(1)按照下图所示点击 Nios II Software Build Tools for Eclipse 打开 Nios II SBT for Eclipse
(2)启动 Workspace 选择当前的项目目录,点 OK。
(3)出现 Nios II SBT for Eclipse 主界面
2)创建工程
(1)建立新的软件应用
(2)在”SOPC Information File name”窗口中选择 kernel.sopcinfo 文件,以便将生成硬件配置信息和软件应用关联,CPU 栏会自动选择”CPU”。在”Project name”输入”hello_world,”Project template”选择 Hello_World。点击 Finish。
系统会自动生成一个打印“hello_world”的软件工程,在 hello_world.c 中我们可以看到相应代码
3)修改程序
在 hell_word.c 里修改流水灯控制程序。
#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;
}
4)编译工程
右键单击项目名称,在弹出的菜单中选择 Build Project
二、小结
此次实验在设计部分完成得比较顺利,但是在实验室用开发板运行时出了点状况,在Build Project后,虽然编译成功,却没有生成sof烧录文件,所以导致实验没有顺利完成,因此也没有实现效果。
但是本次实验依然让我学会了Nios-II的一些基本操作。