实验所用板子为altera经典的DE2板子,FPGA为Cyclone II:EP2C35F672C6,quartus版本为13.0

1.建立工程,导入管脚图DE2_pin_assignments.csv文件,写入硬件代码并编译。最终的硬件verilog代码如下(部分代码需要在生成Qsys文件之后才能编译通过):

module work(
	CLOCK_50,
	KEY,
	SW,
	LEDR
	);
input CLOCK_50;
input [3:0]KEY;
input [17:0]SW;
output [17:0]LEDR;
wire rst;
assign rst = KEY[0];
assign LEDR = SW;//用LEDR判定程序是否烧录成功

wire pio_out;
reg [31:0]fifo_in;//写入片内FIFO的数据
wire fifo_in_en;//写使能信号
wire fifo_full;//NiOS输出
NiOS_ii u0 ( //之后的代码在生成NiOS核之后再写入
        .clk_clk        (CLOCK_50),        //     clk.clk
        .reset_reset_n  (KEY[0]),  //   reset.reset_n
        .pio_out_export (pio_out),  // pio_out.export
	.fifo_in_writedata   (fifo_in),   // fifo_in.writedata
        .fifo_in_write       (fifo_in_en),       //        .write
        .fifo_in_waitrequest (fifo_full)  //        .waitrequest
    );

always @(posedge CLOCK_50 or negedge rst) begin
	if (!rst) begin
		// reset
		fifo_in <= 32'h0;
	end
	else if (fifo_in == 32'hffff_ffff) begin
		fifo_in <= 32'b0;
	end
	else if (fifo_in_en) begin//fifo_in_en写使能信号有效时数据跳变
		fifo_in <= fifo_in + 1'b1;
	end
	else begin
		fifo_in <= fifo_in;
	end
end

assign fifo_in_en = !fifo_full;//fifo_full为NiOS核输出的片内FIFO是否已满的信息

endmodule


2.创建Qsys工程,完成连接

Tools -> Qsys,分别添加

NiOS II Processor: Nios II/e

on-chip memory(ram): 12288bytes

on-chip memory(fifo): depth=16 width=32

PIO(out): 1bit

jtag_uart: 默认

连线,分配地址


双击CPU,修改Reset vector和Exception vctor


Generation -> Generate生成工程,保存为NiOS_ii.qsys

3.完成硬件工程

Hierarchy -> work上右键settings,添加NiOS_ii.qsys文件,完成代码并编译。

之后烧录板子中。


4.建立软件工程

Tools ->  Nios II Software Build Tools for Eclipse,选择软件工作环境为工程,进入Eclipse工作界面。

File -> New,选第一个,正常建立工程haha(我自己建立的名字)。

在hello_world.c主文件中写入如下代码:

#include "altera_avalon_fifo_regs.h"
#include "altera_avalon_fifo_util.h"
#include "system.h"
#include "sys/alt_irq.h"
#include <stdio.h>
#include <stdlib.h>
#define ALMOST_EMPTY 2
#define ALMOST_FULL FIFO_IN_CSR_FIFO_DEPTH-5
volatile int input_fifo_wrclk_irq_event;

int main()
{
  printf("Hello from Nios II!\n");

  int i;
  int return_code;
  long int data[200];
  int level;

  return_code = altera_avalon_fifo_init(FIFO_IN_CSR_BASE, 0, ALMOST_EMPTY,ALMOST_FULL);//初始化FIFO

  level = altera_avalon_fifo_read_level(FIFO_IN_CSR_BASE);//检查FIFO中有多少数据
  printf("\nlevel=%u\n",level);
  if(level != 0)
  {
	  for(i=0;i<=200;i++)
	  {
		  data[i] = altera_avalon_fifo_read_fifo(FIFO_OUT_BASE,FIFO_IN_CSR_BASE);//读取FIFO数据
		  printf("data_%d=%lu\t",i,data[i]);
	  }
  }

}

5.编译软件

haha_bsp右键,进入Properties,改变支持的库类型


Nios II -> BSP Editer,generate编译bsp库,如果页面为空,在file中选择一下


haha主文档右键 -> Bulid Project

Run -> run as -> Nios II Hardware烧录

6.查看结果
可以看到FPGA中的数据已经成功传入了NiOS ii中,然而
读入的数竟然是从9开始的,看来关于时序还有待进一步探究,希望能有大神指导了~~本人也是小白一枚

7.自己的思考
通过这个实验,看来片内FIFO的fifo_full是自动改变的,输入信号由外接的fifo_in_en信号控制,不需要在片内代码控制。