原创 NIOSII 使用点滴

2012-12-3 13:10 6716 10 11 分类: FPGA/CPLD 文集: ALTERA FPGA

在使用niosii有一些问题以及一些体会,摘录在此:


1、NIOSII IDE写C代码的时候一行末尾斜杠“\”代表一句代码中本行写不完,两行代码或多行代码是一句。


 


2、如何在NIOSII中操作PIO?


举个例子来说明,运行NIOSII IDE向导,在NIOSII下新建一个hello_led的工程。其中Hello_led.c是这样写IO口的:IOW_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led);


首先在Altera_pio_regs.h找到定义:


#include


#define IOWR_ALTERA_AVALON_PIO_DATA(base,0) IORD(base,0)


#define IOWR_ALTERA_AVALON_PIO_DATA(base,0,data) IOWR(base,0,data)


因此在NIOSII中可以调用#include 库函数 IOWR/IORD来操作PIO。


接着在system.h有以下内容:


#define LED_PIO_TYPE "altera_avalon_pio"


#define LED_PIO_BASE 0X00004000  //具体的LED的基地址


在sopcBuilder中有关NIOSII的配置就是通过system.h来传递给IDE的。


最后,用IOWR(0X00004000,0led);替代IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,LED)完成PIO操作。  


 


3、最后一步假如要将硬件配置数据也放到flash中,在进行NIOSII Flash Programming的时候,必须首先将硬件配置好。即先将sof文件下载到FPGA,再进行.sop——>.flash转换和下载。


看到站里一篇技术文章,里面有讲到利用NIOSII来“在应用”配置FPGA,摘来收藏:


1 系统的硬件设计


  系统主要由Cyclone FPGA、EPCS、Flash和串行通信等组成,硬件结构如图1所示。


点击看大图


2.2 编程文件


  编程文件为Flash格式的文件,即S—reeorld(简称“SREC”)格式。SREC格式是Motorola公司制定的一种烧写格式标准。SREC格式文件是由一组ASCII码组成,所有的十六进制数据均为大写形式,结构说明如下:


  ①起始代码。以S作为一个数据行的开始。


  ②记录类型。1个十进制数字(O~9),定义数据域的类型。


  ③字节数。1个字节,定义字节数之后除地址字节、校验字节之外其他字节的个数。


  ④地址。由4(或6、8)个字节组成,定义了第一个数据字节存储的位置。


  ⑤数据字节。由n个字节组成,数据字节为实际有效的编程信息。


  ⑥校验字节。1个字节,作校验使用,所有十六进制字节相加后取8位,为0xFF。


3.1 硬件配置的更新


  如图3所示,FPGA的配置过程分为:复位、配置和初始化。


点击看大图


         (1)复位FPGA


  上电复位:在用户模式下,当nCONFIG引脚持续低电平40μs时,FPGA将进入复位状态。复位时,FP—GA采样MSEL引脚的电平值,以确定采用的配置方式;同时,nSTATUS和CONF_DONE引脚由FPGA置为低电平,所有I/0引脚为三态且FPGA内部配置寄存器被清空。


  FPGA复位的2种方法:


  ①外加RC复位电路或者复位芯片,自动产生上电复位脉冲。

 


  ②参考芯片手册。如果芯片提供了上电复位脉冲(一般是全局复位信号),则使用它作为复位信号;若没有提供,则查找芯片是否给出了寄存单元上电默认值(一般是O),利用该特性复位或者产生复位脉冲。


  (2)配置FPGA


  复位后,nCONFIG被外部上拉电阻拉高,进入配置阶段。此时,nSTATUS被FPGA释放并由外部上拉电阻拉为高电平后进入配置状态。Cyclone芯片通过将nCSO输出的信号置低来使能串行配置芯片,nCS0引脚连接配置芯片的片选段(nCS),用串行时钟(DCLK)和串行数据输出(ASDO)引脚来发送操作指令,及/或将地址信号读到串行配置芯片中。接着配置芯片将数据送到串行数据输出(DATA)引脚,DATA引脚连接Cyclone芯片的DATA0输入脚。配置数据在DCLK时钟的上升沿载入FPGA。当接收完所有的配置位后(CRC校验无误),Cyclone芯片悬空CONF_DONE引脚,该引脚由外部10 kΩ电阻拉高;同时,停止驱动DCLK信号。只有当CONF_DONE到达一定的逻辑高电平后,初始化才开始。


  (3)初始化阶段


  在Cyclone芯片中,初始时钟源是Cyclone芯片的lOMHz(典型的)内部晶振,或者是可供选择的CLKUSR引脚。内部晶振是默认的初始化时钟源。如果用了内部时钟,则Cyclone芯片为正确的初始化提供足够的时钟。使用内部时钟的好处在于,初始化时不需要从外部发送其他的时钟到CLKUSR引脚,而且可以把CLKUSR引脚当作I/O引脚。


  (4)用户模式


  初始化结束后,FPGA进入用户模式。在用户模式下,用户I/O引脚不再有弱上拉电阻,而是执行设计中分配的功能。Cyclone芯片可以通过将nCONFIG拉低而开始重新配置。nCONFIG低信号应该至少持续40μs。当nCONFIG被拉低时,Cyclone芯片被复位并进入复位阶段。Cyclone芯片也会把nSTATUS和CONF_DONE拉低,所有的I/O引脚处于三态。一旦nCONFIG回到逻辑高电平,Cyclone芯片将释放nSTATUS,重新开始配置。


  (5)配置时出现的错误


  如果在配置时出现错误,则Cyclone芯片将nSTA—TUS信号置低来表明一个数据帧错误,CONF_DONE信号为低。如果在Quartus软件的Device&Pin Options窗口的General项中,选中Auto—restart configuration aftererror选项,则Cyclone芯片通过激活nCSO来实现复位,在复位失效时间(40μs)后释放nSTATUS,并再次尝试配置。如果该选项未被选中,则外部系统必须监视nSTA—TUS信号以防出错,然后将nCONFIG信号拉低并持续至少40μs来重新配置。


  计算机与目标板上的Nios程序建立连接,通过通信接口将Flash文件传输给FPGA;Nios程序判断出传输文件的针对目标后,将编程数据存放在EPCS或Flash中。接收到的数据首先暂存入SDRAM,而不是直接对EPCS和Flash进行操作。这样做的好处是,一旦传输失败或中止,不会破坏原有EPCS和Flash中的数据。


  通过sof2Flash命令来生成Flash文件时,可以通过SOPC Builder打开NioslI command shell,使用“sof2 Flash—epcs-input=<输入文件名.sof>一output=<输出文件名.Flash>”命令,生成的Flash文件存在于工程目录下。也可以将sof文件复制到“〈quartus安装目录〉\kits\nios2_60\examples”下,直接打开NiosII command shell,使用“sof2Flash-epcs—input=<输入文件名.sof>一output=<输出文件名.Flash>”,生成的Flash文件存在于“〈quartus安装目录〉\kits\nios2_60\examples”下。


 


 


 


 


 

3.2 软件程序的更新


  如前所述,软件程序既可以存放在Flash中,也可以存放在EPCS中。生成软件Flash文件的最简单的方式是,在NiosII IDE环境下对系统进行编译,生成的Flash文件存在于“<目标工程>\software\debug\<软件工程>\Debug\obj\”目录下。


  Nios程序可以存放在Flash中,在SDRAM或On—chip RAM(以下统称“RAM”)中运行。这种情况需要有一个专门的Bootloader,该文件存在于“ quartus安装目录>\kits\nios2_60\components\altera_nios2”目录下,名称为“boot_loader_cfi.srec”。它把存放在Flash中的各个程序段搬到程序执行时各个段真正的位置。

 


  如图4所示,Bootloader代码位于Flash的低地址处,NiosII就被逻辑中的复位电路复位,从reset地址处开始执行代码。如果reset地址设置在Flash中,那么复位后首先运行Flash前面的Bootloader代码,由Bootloader代码将后面的用户程序引导到指定位置。执行elf2Flash应用程序在elf文件前会插入一个引导复制(Boot—copier)程序,前提是,elf将被链接到RAM中运行。


点击看大图


  Bootloader的工作流程如图5所示。


点击看大图


  NiosII C程序在运行之前需要做一些初始化工作。如果程序直接从Flash中运行,则Crt0.S是最先执行的代码;如果程序不是直接从Flash中运行,则Crt0.S是执行完Bootloader后最开始执行的代码。


  运行完Bootloader后仍然要执行CrtO.s,但此时Crt0.s的流程和程序在Flash中直接运行的情况有一些区别:它没有初始化指令Cache,也不会企图去装载别的段,这些步骤已经在Boot—loader中完成。程序映像已经包含这些段,在搬移程序映像的同时也装载了相应的段(.rodata段,.rwdata段和.exceptions段)。程序映像中不包含.bss段和栈,所以仍然需要清.bss段,以及设置栈指针sp和全局指针gp。Bootloader没有读写存储器数据,因此没有初始化数据Cache,所以Crt0.S仍然要初始化数据Cache。如图6所示,当Bootloader读取到L时,L=0表示前面所有的程序记录已经处理完毕,这是最后的程序记录,所以就直接跳到地址A的地方执行。显然A必须是程序的入口地址。如果L=Oxffffffff(即一1),那么就忽略A并停机,这样,即使是一个只有FPGA配置数据而没有程序的EPCS也是安全的。当一个EPCS只有配置数据而没有程序时,sof2Flash会在配置数据的末尾增加4个字节的Oxff,使Bootloader不会有误动作。Bootloader的工作流程与Flash中相同,如图5所示。


点击看大图



 


 


  4 软件编程


  Altera公司提供给客户两种类型的函数:SimpleFlash Access(简单的Flash访问),以及Fine—GrainedFlash Access(细粒度Flash访问)。本文使用Fine—Grained Flash Access函数,虽然比Simple Flash Access复杂一些,但可以避免通常的跨块擦除问题。因为Flash是按照块(Block)组织起来的,通常一次擦除一整个块。如果写Flash的地址与Flash块的组织结构不吻合,比如跨越了Flash块的边缘,那么可能会擦除掉其余的数据。在使用Flash的读写函数时,头文件中要包含“sys/alt_Flash.h”和“sys/alt_Flash_dev.h”,这两个头文件提供了访问Flash器件的驱动接口。


  使用之前要打开Flash。打开Flash,就像C程序打开硬盘中的数据文件一样。这里使用alt_Flash_open_dev()打开Flash,它返回一个句柄。例如:


点击看大图



 


 


  其中,fd是alt_Flash_open_dev()返回的句柄;offset是相对Flash基地址的偏移量,是读操作中要读出数据第一个字节的地址;length是本次操作的数据长度,单位是字节。当返回值为时,表示读操作成功。


点击看大图



 


 


  其中,fd是a1t_Flash_open_dev()返回的句柄;offset是相对Flash基地址的偏移量,是写操作中要写入的数据第一个字节的地址;length是本次操作的数据长度,单位是字节。当返回值为O时,表示写操作成功。


  使用完后别忘记关闭该Flash,就像读写完硬盘中的数据文件后要关闭一样。其原型如下:


  void alt_Flash_close_dev(alt_Flash_fd*fd);


  其中,fd是alt_Flash_open_dev()返回的句柄。


  编者注:Flash器件读写程序略。


   目前,在FPGA的开发过程中,每次进行程序的调试和更新时都需要将产品与计算机直连,进行在线操作,这样就限制了程序调试和更新的空间范围。而基于FPGA的在应用编程技术就是为了打破这种限制而设计的。在应用编程技术对硬件要求极低,只要满足FPGA是Cy—clone系列,具有Flash器件,具有上下位机的通信能力,无需增加太多的硬件资源,都可以实现在应用编程。如果产品具有网络功能或无线功能,那么在恶劣的工业现场和野外可以免除到现场反复拆卸、调试的麻烦。对于保密产品,该项技术可以保护知识产权,通过网络更新产品的软硬件,增加了更新过程中被**的难度。


 


 


 


 


 


 


 


4、NIOSII常用函数:https://static.assets-stash.eet-china.com/album/old-resources/2009/6/10/965b3d25-848c-4dfa-8cc1-45725e167e48.rar。


 


5、自由电子的NIOSII Stp by Step:part1;part2。

文章评论1条评论)

登录后参与讨论

用户1820967 2015-8-26 14:41

最近在学习原语,我看过你的博客,对做TDC的人来说帮助很大。不过网络上关于CycloneII的原语原始资料不多,不知道你能否共享一下CycloneII的原语资料呢?wlg123572@163.com, 谢谢

coyoo 2014-3-13 13:05

经确认,所谓的QFBK的意思是Q端反馈,即feedback of Q

coyoo 2009-2-20 10:49

我在自己的板子上实现了将sof和elf文件统一烧到flash中,并成功实现配置运行。 下一步即根据文章所述,实现在应用更新,期待。。。。
相关推荐阅读
coyoo 2024-12-03 12:20
比较器检测模拟脉冲说明(四)
概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解...
coyoo 2024-11-16 13:54
不同ADC采样同一前端模拟信号时转换用时差异分析
概述 同一组前端模拟信号接入由不同型号ADC组成的模数转换电路时,采样后在FPGA中发现采样用时差异较大。本文主要分析这个时间差异形成的原因,并记录该差异产生对系统造成的影响。系统数字化简介 项目前端...
coyoo 2024-11-10 13:04
ALTERA Cyclone 10器件的使用-7:FPGA片内RAM资源利用率思考
概述 项目使用的FPGA目标器件为Cyclone 10 GX系列规模最大一颗料,由于功能升级增加了功能模块更多,发现器件片内RAM不够使用了。为了探索片内RAM使用的利用率问题,从代码RTL级与编译软...
coyoo 2024-11-10 12:30
转知乎:幽灵般的人体成像技术-PET
幽灵般的人体成像技术——PET - 知乎...
coyoo 2024-11-09 10:26
AD9633默认情况下调试记录(二)
概述 所谓默认情况,即如器件手册中图2所标示那样。对应AD9633的调试,除了涉及到ADC自身,还需要兼顾前端驱动器,系统中AD9633驱动器使用了差分运算放大器,这里不在赘述,笔者已有相关文章论述。...
coyoo 2024-11-07 10:40
AD9633默认情况下调试记录(一)
AD9633在旁路SPI接口时如何在FPGA逻辑中确认字边界概述 AD9633与FPGA之间的LVDS接口初调试,ADC可以通过SPI接口对其内部寄存器进行各项配置。在SPI接口未调通之前,对LVDS...
我要评论
1
10
关闭 站长推荐上一条 /2 下一条