XU.J.P

MAX10上第一个NIOSII系统

0
阅读(5746)

软件使用版本:Quartus II 14.1 + NiosII14.1 EDS

硬件平台:MAX10

很长时间没写博客了,最近拿到一个MAX10的小板子,正好项目空闲间,玩玩这个小板子,顺便学学NiosII平台的搭建。很多人说NiosII不值得学,其实我也这样认为的。但是,存在必然合理,反正学了也不会有坏处,对以后学ARM还是起到一定帮助的吧。闲话不多说,搭建NIOSII搞起。

首先当然是新建工程了。第一个NIOSII系统的平台包含下面这些。


这里面,采用全局时钟复位,nios2_gen2输入时钟100M,应该能够满足绝大部分的应用了。其Reset_Vector_memory和Exception_Vector_memory分别选用onchip-flash.data和new_sdram_controller.s1。充分利用板子上的八个LED灯。至于jtag_uart和sysid_qsys必要组件,也没什么说的了。生成的.bdf文件如下:

这样搭建的硬件平台如下图:

这里将NiosII的复位取消掉,直接将其接VCC。SDRAM的地址最高位直接拉高。NiosII的输入时钟和SDRAM_CLK选用PLL分频出来的,都为100MHZ。SDRAM_CLK存在90度相移。采用tcl文件引脚分配完成后,编译综合成功。到此硬件平台已经完成。

直接跳转到软件平台,新建一个Max10_soft的工程。Max10_soft工程下同样新建dev,inc,main三个文件夹。分别放置主文件(main文件),头文件(.h文件)和执行文件(.c文件)。这样做为了以后方便程序移植和管理。文档结构如下:

在main.c文件中先写个LED等实验来验证系统能否正确运行。代码如下:

 * main.c
 *
 *  Created on: 2015年1月13日
 *      Author: lenovov
 */

#include 
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"

void delay(alt_u32 cnt);
int main()
{
	alt_u8 LED=0xff;
	alt_u8 count=0;
	IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, LED);
	 while(1)
	 {
	  printf("Hello from Nios II!\n");
	  LED=0x0f;
	  IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,LED);
	  delay(100000);
	  LED=0xf0;
	  IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,LED);
	  delay(100000);
	  for(count=0;count<8;count++)
	  {
		  IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,~(0xfc<

    clean project之后再编译工程。先下载硬件平台中生成的sof文件,再将软件生成的.elf文件下载到板子中。

    程序下载完成,LED运行正常。

哈哈,第一个在MAX10 FPGA上运行的NIOSII系统成功了。在实验中,遇到很多问题,其中最主要的一个问题是elf文件无法下载。总结出可能是由于以下原因引起的。

1、硬件和软件不搭配,sof文件下载的NIOSii硬件系统已经过时了,导致elf文件无法下载成功;

2、SDRAM_CLK由PLL生产,没做相移。硬件平台没搭好。

总之,如果软件和硬件都编译完成,却存在无法下载elf文件的现象,那肯定是FPGA内部硬件没有搭好。

之后会逐渐将MAX10开发板上其他硬件加入NIOSii系统当中,写完继续努力中。。。。。