zoukankan      html  css  js  c++  java
  • 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: 默认

    连线,分配地址


    双击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!
    ");
    
      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("
    level=%u
    ",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	",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信号控制,不需要在片内代码控制。












  • 相关阅读:
    Mycat适合场景及不适合场景
    solr与Elasticsearch对比
    分布式搜索之搭建Solrcloud(Solr集群)
    Mysql索引最左匹配原则
    CAS实现单点登录SSO执行原理及部署
    Spring Cloud,Dubbo及HSF对比
    Dubbo支持的协议的详解
    Dubbo架构设计详解
    几种分布式锁的实现方式
    深入分析volatile的实现原理
  • 原文地址:https://www.cnblogs.com/mingmingruyue99/p/7202022.html
Copyright © 2011-2022 走看看