2017-09-28 17:07:23 shusheng404865350 阅读数 945

上一篇博客写了NIOS II烧写epcs过程中出现不能识别epcs的问题,用哪个方法是可以下载进去了但是下载特别慢,而且貌似烧写进去不能正常运行。

又重新研究该怎么弄,发现epcs烧写过程中需要注意几个问题:

1.在建立软核的过程中需要使用epcs需要将epcs中断号设置为0,将jtag中断号设置为1,其余中断号以此设置,我们在添加完各部分模块后会自动生成中断号,这会打乱我们自己设置的中断号,很多无法正常下载或者无法正常运行的问题由这个引起。

2.对于环境的设置需要将不用的端口设置为三态也就是As input tri-stated with weak pull-up,在将Device中的unused Pins目录下,另外在Dual-Purpose Pins目录下将Dual-purpose pins全部设置为use as regular I/O,再在Configuration中勾选use configuration device 并将器件选择成为所用epcs器件,勾选下面的Generate compressed bitstreams

3.在新建NIOS ii工程的时候一定要注意添加的sopc是不是本项目的,因为nios ii这个软件不是很智能,他不能有效识别你的工程目录,这个错了怎么都不会成功的。

以上即为楼主在nios ii烧写epcs过程中的成功总结。

2015-09-25 19:24:12 XNJIMILI 阅读数 853

Nios II下载程序到EPCS的方法

初次的博客,给别人整理的简单教程

1.      通过AS口下载.pof文件到FPGA板


2.      断电,连接JATG口,下载sof文件到FPGA板


3.      进入Nios,在Tool菜单下选择FLASH Programmer,弹出窗口如下


4.      设置connection


5.      Options选项勾选以下4个选项


6.      File->new新建Setting File,选择BSP文件


在弹出对话框后一定要退回到顶层文件夹,查看选中的是哪个工程, 选择...\software\XXX_bsp文件夹下的settings.bsp文件


 

 

 

7.      点击Add,依然要退回到顶层文件夹(一般会保存上次固化时的设定),选择.sof文件


8.      点击Add,依然要退回到顶层文件夹(一般会保存上次固化时的设定),在YJ_NiosTest文件夹下,选择.elf文件(设置一下File of type,方便找到)

 

添加完成如下:


9.      点击Start,运行,直至看到打印出leaving targetprocessor parsed


10.  重启FPGA开发板,连接USB线,运行上位机

2020-02-06 16:49:36 zgmxs 阅读数 61

本文由FPGA爱好者小梅哥编写,未经作者许可,本文仅允许网络论坛复制转载,且转载时请标明原作者。

 

 

1、保证EPCS FLASH中没有任何与NIOS II相关的固件,可以通过擦除EPCS存储器的方法实现。为啥要擦除,如果EPCS里面存储有与NIOS II相关的固件,就有可能导致调试时,Eclipse将程序下载进板子后触发板子复位,而板子复位后受EPCS固件中的NIOS II启动代码影响,转而去执行EPCS中存储的程序代码。如果不懂原理,不要紧,按我说的做,准没问题。如何擦除EPCS?1、找一个该板卡对应的jic文件,不管是什么程序什么功能的,要他做个桥而已,具体什么内容,无所谓。
2、添加后,勾选erazer,然后starter即可,如下图:

2、每次调试时按照下述流程进行:
1、开发板断电
2、开发板上电
3、下载sof文件
4、在eclipse中执行run。

 

2 程序编译报错了怎么办,很多人都遇到程序编译报错,然后截个图问我这错哪儿了?看看下图,我哪儿知道你错哪儿了,一个有用的报错信息都没有。你应该看console窗口撒,那个窗口里面才会显示完整具体的报错信息。

比如下图就是上面报错信息对应的具体的错误信息。

2012-12-18 13:48:56 cometwo 阅读数 1189

概述:此处,我以Lcd12864(ST7920)作为范例,进行粗浅讲解,望各位网友踊跃拍砖。

 

0 软硬件环境

软件:Altera Quartus II 9.1 + Nios II  9.1 Software Build Tools for Eclipse

硬件:艾米电子EP2C8开发板(EP2C8Q208C8 + 16 bit SDRAM 64MB + EPCS4)

 

1 硬件部分

1.1 Avalon-MM接口(读作:阿窝龙妹妹接口)

Avalon Memory-Mapped接口,简称为 Avalon-MM接口,用于在存储映射系统中描述主从元件(component)的读/写接口。

图1.1 Amy_S_lcd12864 IP与System Interconnect Fabric的连线框图

图1.1 Amy_S_lcd12864 IP与System Interconnect Fabric的连线框图

图1.2 某带有Amy_S_lcd12864 IP的Avalon系统框图

图1.2 某带有Amy_S_lcd12864 IP的Avalon系统框图

 

1.2 从设备读写时序

请参考手册《Avalon Interface Specification》,此处略去。

1.3 HDL模块及说明

1.3.1 模块介绍

表1.1 Amy_S_lcd12864 IP的HDL源代码模块介绍

文件名称 功能描述
Amy_S_lcd12864_avalon_interface.v Amy_S_lcd12864 Avalon接口文件
1.3.2 源代码

注:本文所涉及verilog代码,是按照Verilog 2001规范编写的。Avalon信号类型命名参考图1.3。

Naming Convention for Avalon Signal Type

图1.3 Naming Convention for Avalon Signal Type

1.3.2.1 Amy_S_lcd12864_avalon_interface.v
001 /*-----版权声明-----
002  *     艾米电子工作室——让开发变得更简单
003  *     网站:http://www.amy-studio.com
004  *     淘宝:http://amy-studio.taobao.com
005  *     QQ(邮箱):amy-studio@qq.com
006  *-----文件信息-----
007  *     文件名称:Amy_S_lcd12864_avalon_interface.v
008  *     最后修改日期:3.20, 2010
009  *     描述:Lcd12864的Avalon接口描述文件
010  *------------------
011  *     创建者:张亚峰
012  *     创建日期:3.20, 2009
013  *     版本:1.0
014  *     描述:原始版本
015  *------------------
016  *     修改者:
017  *     修改日期:
018  *     版本:
019  *     描述:
020  *-------------------
021  */
022  
023 module Amy_S_lcd12864_avalon_interface(
024   // Clcok Input
025   input         csi_clk,
026   input         csi_reset_n,
027   // Avalon-MM Slave
028   input         avs_chipselect,
029   input [1:0]   avs_address,
030   input         avs_write,
031   input [31:0]  avs_writedata,
032   input         avs_read,
033   output [31:0] avs_readdata, 
034   // Conduit End
035   // lcd12864 interface
036   output reg    coe_e,
037   output reg    coe_rw,
038   output reg    coe_rs,
039   inout [7:0]   coe_data_io
040 );
041  
042 //++++++++++++++++++++++++++++++++++++++
043 // 写 开始
044 //++++++++++++++++++++++++++++++++++++++
045 reg  [7:0] coe_data_o;
046  
047 always@(posedge csi_clk, negedge csi_reset_n)
048 begin
049   if (!csi_reset_n)
050   begin
051     coe_e      <= 1'b0;
052     coe_rw     <= 1'b0;
053     coe_rs     <= 1'b0;
054     coe_data_o <= 8'b0;
055   end
056   else if (avs_chipselect & avs_write)
057   begin
058     case (avs_address)
059       0: coe_e      <= avs_writedata[0];
060       1: coe_rw     <= avs_writedata[0];
061       2: coe_rs     <= avs_writedata[0];
062       3: coe_data_o <= avs_writedata[7:0];
063     endcase
064   end
065 end
066 //--------------------------------------
067 // 写 结束
068 //--------------------------------------
069  
070 //++++++++++++++++++++++++++++++++++++++
071 // 读 开始
072 //++++++++++++++++++++++++++++++++++++++
073 reg  [7:0] readdata_r;
074 wire [7:0] coe_data_i;
075  
076 always@(posedge csi_clk)
077   if (avs_chipselect & avs_read)
078   begin
079     if (avs_address == 3)
080       readdata_r  <= coe_data_i;
081     else
082       readdata_r  <= 8'b0;
083   end
084   else
085     readdata_r <= 8'b0;
086      
087 assign avs_readdata = {24'b0, readdata_r};
088 //--------------------------------------
089 // 读 结束
090 //--------------------------------------
091  
092  
093 //++++++++++++++++++++++++++++++++++++++
094 // 双向口 开始
095 //++++++++++++++++++++++++++++++++++++++
096 reg coe_data_o_en;
097  
098 always@(posedge csi_clk)
099   if (avs_chipselect & avs_write)
100     coe_data_o_en <= 1'b0;
101   else if (avs_chipselect & avs_read)
102     coe_data_o_en <= 1'b1;
103  
104 assign coe_data_i   = coe_data_io;
105 assign coe_data_io  = coe_data_o_en ? 8'bz : coe_data_o;
106 //--------------------------------------
107 // 双向口 结束
108 //--------------------------------------
109    
110 endmodule
1.3.3 一些说明

ST7920的E、RW和RS都是单向的,而DATA总线是双向的;故在此处nios既需要写数据给ST7920,又需要从ST7920读数据。

从42行到68行,即nios向ST7920写数据。注意,谁给nios写数据呢?请看图1.4。

图1.4 NII、nios cpu和ST7920通信框图

图1.4 NII、nios cpu和ST7920通信框图

从70行到90行,是nios从ST7920读数据。由于只有DATA总线需要读,其他的管脚就不写了,呵呵。

从93行到108行,是对DATA双向总线的处理。读或写只是简单由Avalon的读、写信号来控制的。这个技巧是我从open-cores里面的基于wishbone总线的IIC从设备的IP上学到的。注意:ST7920是低速设备,此处只做简单处理;高速设备请大家自行斟酌。

还有一点需要说明,chipselect在Nios II 9.0之后就不是必须的信号,此处加上,只为和以前的版本兼容。

2012-11-06 11:37:08 cqhaotian 阅读数 1890

                                                 NIOS II 软核中EPCS配置芯片的存储操作

EPCS4配置芯片除了存储FPGA配置信息和NIOS II程序外,还有很多存储空间剩余未使用,可以用来做用户配置信息存储。

ALTERA提供的HAL函数来调用EPCS相关的函数,在“altera_avalon_epcs_flash_controller.c”函数(路径为:\\altera\72\ip\sopc_builder_ip\altera_avalon_epcs_flash_controller\HAL\src)中。

一个老外写的关于NIOS IICPCS器件操作的帖子,他是花了一个多月才摸索到怎么操作,然后给出了一个简单的例子。

先看一下这个简单程序

#include <stdio.h>

#include <unistd.h>

#include "system.h"

#include "alt_types.h"

#include "sys/alt_flash.h"

#include "sys/alt_flash_dev.h"

alt_u8 epcsbuf[32];

int ret_code;

flash_region *regions;
int number_of_regions;

alt_flash_fd* my_epcs;//定义句柄

main()

{

my_epcs = alt_flash_open_dev("/dev/epcs_controller");//打开FLASH器件,获取句柄

    ret_code = alt_epcs_flash_get_info (my_epcs, &regions, &number_of_regions);//获取配置芯片信息

    if(my_epcs) //信息获取成功

    {

    //example application, read general data from epcs address 0x70000

       ret_code = alt_epcs_flash_erase_block(my_epcs, regions->offset+0x70000);//擦除第8

ret_code = alt_epcs_flash_write(my_epcs, regions->offset+0x70000, epcsbuf, 32); //32字节

        ret_code = alt_epcs_flash_read(my_epcs, regions->offset+0x70000, epcsbuf, 32); //32字节

    }

    while(1)

    {

    }

}

上面的程序就是对EPCS配置芯片操作的流程和方式。首先打开器件获取句柄my_epcs,然后的读写及擦除操作都是通过句柄my_epcs来操作的。“/dev/epcs_controller”中的“epcs_controller”是用户在配置NIOS核时自命名的,可以在system.h中查到,即“EPCS_CONTROLLER_NAME”。通过IDE调试的话可以查看my_epcs指向的FLASH相关参数。EPCS器件只有一个区(regions),EPCS4区内有8个块(block),每个块是65536字节。(注:只有EPCS1每个块32768字节,其余配置芯片是每块65536字节。

alt_epcs_flash_erase_block(my_epcs, regions->offset+0x70000);//擦除第8

这个函数是擦除整块的函数,第一个参数是刚才获得的句柄,用于指示是对刚刚打开的FLASH进行擦除,第二个regions->offset的值其实是0,是由EPCS控制模块自己管理的。FPGA配置文件和NIOS核中的程序是从前边存储的,即从regions->offset+0x00000开始的地址。我的用掉不到4个块,还剩4个块可以用于自定义的存储。为便于将来进行功能扩展,尽量空余低块以备将来使用,优先使用高地址空间(第8块,起始地址为regions->offset+0x70000)进行用户配置信息存储。

alt_epcs_flash_write(my_epcs, regions->offset+0x70000, epcsbuf, 32); //32字节

epcsbuf数组中的连续32字节写入regions->offset+0x70000开始的EPCS4芯片内。如果是写入第6块的第0x100开始的地址,那么可用regions->offset+0x60100代替regions->offset+0x70000

alt_epcs_flash_read(my_epcs, regions->offset+0x70000, epcsbuf, 32); //32字节

EPCS4中的第8段起点regions->offset+0x70000读取连续32字节存到epcsbuf数组内。

调试过程中可以在执行alt_epcs_flash_write前手动修改epcsbuf数组内的值,在执行alt_epcs_flash_read前再更改epcsbuf数组内的值为其他值,如果执行alt_epcs_flash_readepcsbuf数组内的值恢复到执行alt_epcs_flash_write前的值,那么对EPCS芯片的读写操作已经成功了

 注意:EPCS的擦写是针对整个块的,也可以不用擦写,直接写数据,因为重新写入时会发生覆盖。

 

EPCS操作相关的头文件有以下:

#include "system.h"

#include "alt_types.h"

#include "sys/alt_flash.h"

#include "sys/alt_flash_dev.h"

当然系统还需要一些相关的标准头文件,执行一些操作。

 

其他参考程序:

1First of all init the flash device and possibly get extra info about the flash device, like block size:

flash_region *regions;
int numRegions;
int error = 0;
pFlashDevice = alt_flash_open_dev(FLASH_CONTROLLER_NAME);
if (pFlashDevice <= 0)
error = -1;
if (!error)
error = alt_epcs_flash_get_info(pFlashDevice, &regions, &numRegions);
if (!error)

 {flash_block_size = regions->block_size;
flash_max_addr = regions->region_size;
This is for erasing a single block:
alt_epcs_flash_erase_block(pFlashDevice, block_address);
This is for writing any data to a previously erased area:
int buf[10] = { 1, 2,3,4,5,6,7,8,9,10 };
rv = alt_epcs_flash_write_block(pFlashDevice, block_address,
data_offset_inside_block , buf, 10);
Then, read back data with:
alt_epcs_flash_read(pFlashDevice, addr, buf, len);

 

问题:

First of all init the flash device and possibly get extra info about the flash device, like block size:

flash_region *regions;
int numRegions;
int error = 0;
pFlashDevice = alt_flash_open_dev(FLASH_CONTROLLER_NAME);
if (pFlashDevice <= 0)
error = -1;
if (!error)
error = alt_epcs_flash_get_info(pFlashDevice, &regions, &numRegions);
if (!error) {
flash_block_size = regions->block_size;
flash_max_addr = regions->region_size;

i am using cfi, is it the same? besides, my pFlashDevice is <= 0. i dunno why. is it sth to do with reset vector as my reset vector is sdram.

This is for writing any data to a previously erased area:
int buf[10] = { 1, 2,3,4,5,6,7,8,9,10 };
rv = alt_epcs_flash_write_block(pFlashDevice, block_address,
data_offset_inside_block , buf, 10);

why need rv when write data?

Then, read back data with:
alt_epcs_flash_read(pFlashDevice, addr, buf, len);

where is the data when we read it from the flash? like i want to print out the data.
please help me with the ques in bold. thanks!

 

 

回答:

why need rv when write data?
This is not mandatory, but recommended to check if data has been written correctlywhere is the data when we read it from the flash? like i want to print out the data.
???
What's the problem? The buf array contains your data.
Maybe this way is clearer:
int buf[10];
alt_flash_read(pFlashDevice, addr, buf, 10);Remark:
remove epcs_ from the previous post. I copied and pasted from a project using epcs instead of parallel flash and forgot to change function names.

 

注:此程序为altera论坛问答帖子,如何在DE2上使用flash的问题,具体链接地址为,http://www.alteraforum.com/forum/archive/index.php/t-27526.html

Nios II 开发之flash

阅读数 245

没有更多推荐了,返回首页