实验所用板子为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烧录