最专业的FPGA ZYNQ论坛--黑金动力社区

 找回密码
 注册
查看: 17702|回复: 89

niosii 的自学之路(比较坎坷 持续更新)

  [复制链接]
reset 发表于 2010-8-2 21:52:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
就一个niosii 的电灯程序憋了三天,今天总算令自己满意了!
给自己来个总结,也给后来者指个方向
XiaomaGee 发表于 2010-8-2 23:54:54 | 显示全部楼层
慢慢来,迈出第一步是最难的。
XiaomaGee 发表于 2010-8-2 23:59:09 | 显示全部楼层
希望楼主能把自己学习的经验与大家分享,以免大家也走同样的弯路!
avic 发表于 2010-8-3 19:38:24 | 显示全部楼层
支持,希望大家把自己的感言都写出来,大家互相帮助,这样才能共同进步。
 楼主| reset 发表于 2010-8-3 19:50:03 | 显示全部楼层
窃以为,入门主要分为以下几个步骤:

第一步,FPGA开发概念的建立
   FPGA就是一堆没有连接的与或非门,和一个内部引导其电路配置的RAM(比CPLD高明之处!)。通过Verilog等硬件描述语言,我们对这些没有连接的与或非门进行了有序连接的说明。最终Verilog被相关软件编译成可供机器识别的连接文件(跟C语言的汇编过程很像啊),然后将连接文件直接下载到芯片上就可以运行了。
   应为FPGA是有片内的RAM来配置的,所以可以有两种下载方式:

1、直接下载到配置电路连接的片内RAM里面,程序会直接运行,但是断电后RAM数据会丢失(所谓的JTAG模式),由于数据线较宽,同时擦写比FLASH快,所以这种下载速度极快,方便调试。
2、下载到和FPGA相配套的EPCS(一种FLASHF,FPGA专用的配制芯片,每次上电自动将内部的连接文件下载到FPGA片内RAM)里面,下载完成后程序不会直接运行,必须断电 上电程序才能从EPCS里面配置到FPGA的RAM里面,同时由于EPCS以串行方式擦写,速度较慢,但是断电不丢失。

相比CPLD,FPGA是有内部RAM来配置的,所以可以编程无数次,而CPLD却只有2k次左右
 楼主| reset 发表于 2010-8-3 20:01:53 | 显示全部楼层
第二步,Verilog语言与FPGA的硬件配置
    虽然高手都是把Verilog当做电路绘图工具来用,但是像我这样的菜鸟还远没到那个级别。但编写也去注意它的实现,比如延时语句无法实现;for循环等待,分频等语句就很自然的会想到计数器硬件,同时在程序编译成功后,会刻意看看它的网表,虽然现在还不会优化调整,先混个脸熟吧,哈哈
    Verilog学来就是用的,不是忘的。所以学以致用是个很好的习惯。最简单的先点灯吧,点灯虽然简单,但可以熟悉整个工程 和module 的结构,以及quartus的开发流程,入门很不错,同时熟悉程序的下载方式JTAG 和AS方式。(比较简单,就不罗嗦了 哈哈)
XiaomaGee 发表于 2010-8-3 20:26:27 | 显示全部楼层
精华
 楼主| reset 发表于 2010-8-3 20:28:50 | 显示全部楼层
第三步,niosii的点灯范例,()
    个人感觉这块当时概念很费神,又是Verilog又是c代码,同时下呢?还是分开下? 下到哪里去? 以什么样的方式?而且因为有niosii IDE 还有quartus用哪个下呢? 很是纠结。
现在一点一点展开吧,不要着急。

熟悉一下SOPC的开发,最少得有 CPU, JTAG UART, ram,IO 就可以跑了

以上设置就可以通过jtag调试。RAM 可以用片外的SRAM  DRAM 或onchip-ram。

如果要在把程序保存到硬件里面,使其断电不丢失,上电自动工作(最终产品必须的是这种方式)。那么还有两种方式可供选择:
1、把FPGA的配置文件和C语言的编译代码都下载到EPCS里面,如果EPCS够大这样挺方便,而且节省硬件。 请教高手一下 在这里如何查看我的EPCS利用了多少还有多少空余? 一般一个FPGA所有资源都耗尽时,它的配置文件在EPCS里面能有多大? 这样就不要担心EPSC够不够用了

2、把FPGA的配置文件下载到EPCS里,把C代码的编译文件下载到FLASH里(SOPC中应该设置FLAH接口),这样做有点浪费东西,但是EPCS太小也没办法 呵呵

总结起来,niosii的下载方式有三种。后面将对其详细分析,重点说明菜鸟容易出错的地方(以我的经历展开 哈哈)
 楼主| reset 发表于 2010-8-3 20:32:40 | 显示全部楼层
其实上面的东西,黑金nios 讲的很细,也不用废话的 呵呵  下面会有调nios的个人受挫经历,供大家消遣
avic 发表于 2010-8-4 00:21:33 | 显示全部楼层
不错,支持楼主!
 楼主| reset 发表于 2010-8-6 15:05:14 | 显示全部楼层
今天把 IO口的中断彻底研究明白了 再来一段吧  哈哈

首先是sopc的管教配置,需要注意一下几点:

1、存储器的数据总线接口问题,由于DRAM,SDRAM,flash,等都有数据总线和地址总线,地址总线和其他的控制总线理所当然的就是输出类型 即OUTPUT, 但是数据总线却是双向接口,细心的你可能都发现了,在sopc工具生成的模块中数据口的总线都是绿色的(而地址线都是紫色的)。这是我的一个失误点,它让我憋了两天,呵呵

2、还有SOPC在加入外存储器后,常常会出错,影响编译,其实如果耐下性子读一读,你就会发现原来是地址重复了,怎么办呢? 很简单 system菜单下 auto—assign-address 点下试试看

3、大家都知道程序有两种下载方式。下到RAM或flash里面。下到RAM里面很简单,首先从quartusii下载,下载完成后别断电,别reset, 然后再nios中点run 就OK了,很简单
当时我的问题是,下到RAM里面好使,但是下到EPCS就下不进去,这是为什么呢?
猜测一下 epcs太小了装不了了, 或者  那块设置有问题
就一个点灯程序,epcs4放不下,貌似不太可能,所以问题很有可能是第二种
最有一个不经意之间,往RAM下完后,再向EPCS下载竟然成功了
 楼主| reset 发表于 2010-8-6 15:10:41 | 显示全部楼层
前思后想,窃以为(经过了多次实践),从niosii IDE 中向FLASH 或EPCS下载程序,只能是以jtag方式下载(不像quartus有两种方式),那么此种下载方式就需要FPGA硬件的配合,所以先将以jtag方式从quartus里下载程序,然后再从niosii IDE 中下载
 楼主| reset 发表于 2010-8-6 21:56:35 | 显示全部楼层
关于今天的IO中断中断调试:
中断程序如下:
void ISR_KEY(void * context, unsigned long id)
{
KEY->EDGE_CAPTURE = 0;
KEY->INTERRUPUT_MASK = 0;
}

因为多加了句KEY->INTERRUPUT_MASK = 0; 关中断,所以程序一直在中断里面,不停地中断
想了很多可能的原因:
1.没有去抖
2.由于enable-bitclearing没设置正确
3.由于edge—lever的设置问题
 楼主| reset 发表于 2010-8-6 22:04:57 | 显示全部楼层
最后一一排查,当看到KEY中断申名函数 突然觉的可能那里出问题了
改了以后就好了
但是还是把后面的内容都进行了排查
1.削抖有作用,但是对程序的执行没有任何影响
2.enable-bitclearing 也没有任何作用
3.关于 变沿捕获 和  电平中断,这两个先就分开用吧 具体还是不明白。但是程序都分别好使了。
 楼主| reset 发表于 2010-8-7 20:40:01 | 显示全部楼层
本帖最后由 reset 于 2010-8-7 20:41 编辑

再加一点点今天调的定时器  感谢小马哥加精  呵呵

NIOS 定时器模块是32位的内部定时器,以下寄存器均为16位.
             寄存器名    status  位0 :   to位,内部计时器为0时,to 位置1
                                           位1:   run位,内部计时器运行时,run位置1,否则0
                              
                               control 位0:  ito 位,如果该位置1,则当状态寄存器的to 位置1(定时器溢出),计时器发出中断请求.若其置0,则不产生中断.
                                                   位1: cont 位 内部计时器为0时,,计时器重载preiodl和preiodh,若cont 为1,则定时器连续计时,只有写stop位停止,若cont 为0,则重 载初                                值后,停止计时.
                                                  位2: start 开始工作                                 
                                 位3: stop 停止工作
                                 periodl   计数器低16位
                                 periodh  计数器高16位
                                 snapl     计数器捕捉寄存器(读地位状态)
                                                  snaph    计数器捕捉寄存器(读高位状态)

若需要watch dog的话,则在SOPC中选择Timer,在Preset configration选择 watch dog
 楼主| reset 发表于 2010-8-7 20:44:02 | 显示全部楼层
本帖最后由 reset 于 2010-8-7 20:45 编辑

不会排版  大家凑合着看吧  不好意思
下面是相应的寄存器表

定时器寄存器表

定时器寄存器表
 楼主| reset 发表于 2010-8-7 21:25:46 | 显示全部楼层
status 是标志字,所以由计数器自动置位,但是在中断函数中 需要程序清零

contol  是控制字,需要用程序去控制,定时器的运行状态(上面说的很清楚 试试就知道了)
 楼主| reset 发表于 2010-8-8 17:06:55 | 显示全部楼层
IO口的中断再啰嗦几句:  在sopc中配置io中断时,可以看到一个参数叫做 width(1~32bits)即位宽设置。那么如果我想有 2个或多个IO都可以产生中断怎么办?  还有如果多个IO中断,在系统中占了据了几个中断(nios系统只有32级中断)?

第一个问题
其实很简单:
                DATA;
                DIRECTION;
                INTERRUPUT_MASK;
                EDGE_CAPTURE;
细心留意的话,以上几个寄存器 都是 long int 即32位,为什么要占用这么多的位? 很简单,32位即可以控制32位的输出(nios 是32位总线,一个IO最大也是32位)。所以如果要用两位的话直接控制两个位便可。KEY->INTERRUPUT_MASK = 3;就可以同时使能两个io的中断,它们两个的触发方式相同(沿触发电平触发或)


第二个问题: 更简单因为这两个io中断的优先级一样,所以它们属于同一个中断(nios系统有32级中断)。这样使用起来会有很大的优势,可以说nois的IO中断从理论上说能够达到32*32=1024个,很牛吧? 哈哈
avic 发表于 2010-8-8 18:03:27 | 显示全部楼层
继续支持,好贴!
 楼主| reset 发表于 2010-8-8 19:02:29 | 显示全部楼层
本帖最后由 reset 于 2010-8-9 00:31 编辑

回复 19# avic


   谢谢管理员支持,

关于niosii IDE再发几句牢骚吧,感觉这个玩意做的真不好(比MDK差远了)所有以前的工程都挤一块,看着很不爽,而且如果把存储的文件夹换个名字在里面打开都很费劲。
牢骚发了,还得用人软件。学着适应吧

1、如何打开一个工程(不是自己创建的)
对于一个niosii的工程 (有时候备份程序,或者下载的范例) 如何去打开呢?  它不像mdk或者quartusii那样只要找到工程文件,直接打开就可以了,在niosii的工程下找不到这种文件,而且通过SOPC打开也不行。怎么办呢?  首先打开niosii IDE 然后再工程栏空白处右击,会有import选项->general->Existing projects into workspace->next->选择工程所在的文件夹即可。 注意 还没完呢 然后再在工程上右击选择refresh,再右击选择clean project。现在终于OK了, control+B 就可以了

2、还有一个小问题,请大家注意
程序每次修改完后,必须得先保存 再 control+B 。不然的话 编译的程序都是以前保存的,并不是现在的程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|@2009-2016 芯驿电子科技(上海)有限公司|小黑屋|手机版|Archiver|黑金动力社区 ( 沪ICP备11013590沪公网安备 31011702000003号

GMT+8, 2017-11-18 18:18 , Processed in 0.084747 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表