实验所用板子为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主文件中写入如下代码:
1. #include "altera_avalon_fifo_regs.h" 2. #include "altera_avalon_fifo_util.h" 3. #include "system.h" 4. #include "sys/alt_irq.h" 5. #include <stdio.h> 6. #include <stdlib.h> 7. #define ALMOST_EMPTY 2 8. #define ALMOST_FULL FIFO_IN_CSR_FIFO_DEPTH-5 9. volatile int input_fifo_wrclk_irq_event; 10. 11. int main() 12. { 13. printf("Hello from Nios II!\n"); 14. 15. int i; 16. int return_code; 17. long int data[200]; 18. int level; 19. 20. return_code = altera_avalon_fifo_init(FIFO_IN_CSR_BASE, 0, ALMOST_EMPTY,ALMOST_FULL);//初始化FIFO 21. 22. level = altera_avalon_fifo_read_level(FIFO_IN_CSR_BASE);//检查FIFO中有多少数据 23. printf("\nlevel=%u\n",level); 24. if(level != 0) 25. { 26. for(i=0;i<=200;i++) 27. { 28. data[i] = altera_avalon_fifo_read_fifo(FIFO_OUT_BASE,FIFO_IN_CSR_BASE);//读取FIFO数据 29. printf("data_%d=%lu\t",i,data[i]); 30. } 31. } 32. 33. }
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信号控制,不需要在片内代码控制。