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

上一篇博客写了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 阅读数 797

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 阅读数 51

本文由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窗口撒,那个窗口里面才会显示完整具体的报错信息。

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

2016-11-05 07:01:44 leon_zeng0 阅读数 2520


我用fpga altera , 用的存储芯片是EPCS16,具体型号是M25P16, 其存储了系统的配置以及我的 nios2 软件。

我在研究如何读取 M25P16 的 ID, 所以需要如何操作芯片, 我用的Altera 15 下的Qsys ,芯片已经添加到系统了。

 如何对其进行spi 操作呢? 在网上闻询,查找了资料,顺带学习了其 读写,erase 操作,

先简要描述如下:

需要的几个关键文件: alt_type.h  alt_flash.h, alt_flash_dev 都是产生在hello_bsp 的 drivers\inc 下,

 drivers\src 下的 altera_avalon_epcs_flash_controller.c, epcs_commands.c, altera_avalon_spi.c 是值得研究的源代码。

主要的步骤是:

1: alt_flash_open_dev("/dev/epcs");//打开FLASH器件,获取句柄

  这个 /dev/epcs 的根据是用户在配置NIOS核时自命名的,可以在system.h中查到,即“EPCS_CONTROLLER_NAME”。

2:alt_epcs_flash_get_info (my_epcs, my_epcs->region_info,my_epcs->number_of_regions);//获取配置芯片信息

3: alt_epcs_flash_erase_block(my_epcs,my_epcs->region_info->offset+0x70000);//擦除第8块

  一块的大小是0x10000,

3a: 显示epcs 块的信息内容:

4: alt_epcs_flash_read(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 40); //读40字节

 显示 可以看到其结果都是0xff

5: alt_epcs_flash_write(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 32); //写32字节

 写的内容是 i+0x22

6: alt_epcs_flash_read(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 40); //读40字节 

  验证我们写入的内容正确。


程序如下:

main 函数里调用epcs(), main没有显示,我的项目程序里还有其他东西,我这里只是突出epcs 的操作。

结果显示不知怎么不能复制粘贴, 只有用贴图的方式了。


#include "system.h"
#include <stdio.h>
#include "alt_types.h"
#include "sys/alt_flash.h"
#include "sys/alt_flash_dev.h"
unsigned char  epcsbuf[32];

int ret_code;

alt_flash_fd*  my_epcs;//定义句柄

void epcs()

{
int i;

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

ret_code = alt_epcs_flash_get_info (my_epcs, my_epcs->region_info,my_epcs->number_of_regions);//获取配置芯片信息
printf("ret_code=%d",ret_code);
if(my_epcs) //信息获取成功
 {
 //example application, read general data from epcs address 0x70000
 ret_code = alt_epcs_flash_erase_block(my_epcs,my_epcs->region_info->offset+0x70000);//擦除第8块
 ret_code = alt_epcs_flash_read(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 40); //读32字节
 printf("offset=%d\n",my_epcs->region_info[0].offset);
 printf("size=%d\n",my_epcs->region_info[0].region_size);
 printf("numberOfBlock=%d\n",my_epcs->region_info[0].number_of_blocks);
 printf("blockSize=%d\n",my_epcs->region_info[0].block_size);
 printf("after erase:\n");
 for(i=0;i<40;i++)
 {
  printf("%x ",epcsbuf[i]);
 }
 printf("\nafter write:\n");
 for(i=0;i<32;i++)
  epcsbuf[i]=i+0x22;
 ret_code = alt_epcs_flash_write(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 32); //写32字节
 ret_code = alt_epcs_flash_read(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 40); //读32字节
 for(i=0;i<40;i++)
 {
  printf("%x ",epcsbuf[i]);
 }
 printf("\n");
 }
}


参考文章有:

http://m.blog.csdn.net/article/details?id=5701024

https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ug/ug_embedded_ip.pdf

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

概述:此处,我以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之后就不是必须的信号,此处加上,只为和以前的版本兼容。

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