nios ii FIFO读取FPGA数据交互实验1

简介: nios ii FIFO读取FPGA数据交互实验1

实验所用板子为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: 默认

连线,分配地址

ec627b8f5ec6b7e596a61157dc29182c_Center.png

双击CPU,修改Reset vector和Exception vctor

4ec5bfae31d0bcd7293846d6319610a1_Center.png

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

3.完成硬件工程

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

之后烧录板子中。

214873f6ef6c0e05fb1db22120100470_Center.png

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,改变支持的库类型

8f89897d5d959f264fb24374d8c7451c_Center.png

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

c3e1accc57dd320245ef643ea70050e7_Center.png

haha主文档右键 -> Bulid Project

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

6.查看结果

可以看到FPGA中的数据已经成功传入了NiOS ii中,然而

读入的数竟然是从9开始的,看来关于时序还有待进一步探究,希望能有大神指导了~~本人也是小白一枚

7ec518dad6771ad12cf50e0dd85ce770_Center.png

7.自己的思考

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


相关文章
|
6月前
|
芯片 异构计算
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管(一)
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管
147 2
|
6月前
|
芯片 异构计算
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管(三)
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管
147 4
|
6月前
|
异构计算
FPGA片内ROM测试实验(二)
FPGA片内ROM测试实验
83 1
|
异构计算
【FPGA】基本实验步骤演示 | Verilog编码 | 运行合成 | 设备/引脚分配 | 综合/实施 | 设备配置 | 以最简单的逻辑非为例
【FPGA】基本实验步骤演示 | Verilog编码 | 运行合成 | 设备/引脚分配 | 综合/实施 | 设备配置 | 以最简单的逻辑非为例
101 0
|
6月前
|
存储 芯片 异构计算
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管(二)
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管
136 4
|
6月前
|
存储 数据格式 异构计算
FPGA片内ROM测试实验(一)
FPGA片内ROM测试实验
99 1
|
12月前
|
存储 算法 异构计算
基于FPGA的ECG心电信号峰值检测和心率计算,包括testbench测试文件和ECG数据转换为coe文件程序
基于FPGA的ECG心电信号峰值检测和心率计算,包括testbench测试文件和ECG数据转换为coe文件程序
|
异构计算
FPGA片内RAM读写测试实验 2
FPGA片内RAM读写测试实验
207 0
|
存储 异构计算
FPGA片内RAM读写测试实验 1
FPGA片内RAM读写测试实验
288 0
|
存储 算法 异构计算
m基于FPGA的数据串并并串转换系统verilog实现,包含testbench,可以配置并行数量
m基于FPGA的数据串并并串转换系统verilog实现,包含testbench,可以配置并行数量
368 0