nios2+c语言编程方法Nios2系列教程
NIOS2完整教程
![NIOS2完整教程](https://img.taocdn.com/s3/m/dc90066e443610661ed9ad51f01dc281e53a56a3.png)
NIOS2完整教程NIOS II 是一款高度可配置的32位嵌入式软核处理器,由Intel旗下的Altera(现在归属于英特尔)推出。
它具有低功耗、高性能和可扩展性的特点,适用于各种嵌入式应用领域。
下面是一份简要的NIOSII完整教程,帮助您了解如何开始使用NIOSII。
1. Nios II 架构Nios II 架构包括处理器核、总线接口、存储器和外设设备。
处理器核包括CPU和一些协处理器,如乘法器、除法器等。
总线接口用于连接处理器核、存储器和外设设备。
存储器用于存储指令和数据。
外设设备包括UART、GPIO、SPI、I2C等。
2. Nios II 开发环境搭建首先,您需要安装Altera的Quartus软件来进行Nios II的开发。
Quartus提供了一个开发工具套件,包括编译器、仿真器和调试器。
您还需要安装Nios II EDS,这是一个集成开发环境,用于配置和生成Nios II处理器的软件。
安装完软件后,您可以创建一个新的Nios II项目。
3. Nios II 项目配置在Quartus中创建新的Nios II项目时,您需要指定处理器类型、时钟频率和存储器大小等参数。
您还可以选择添加外设设备和协处理器。
一旦项目创建完成,您可以使用Nios II EDS来配置处理器和外设设备,并生成相关的软件。
4. Nios II 软件开发Nios II 支持多种软件开发工具,包括C/C++编译器、汇编器和调试器。
您可以使用C/C++编译器来编写和调试应用程序。
您还可以使用汇编器来编写高性能的关键代码。
调试器可以帮助您检测和修复应用程序中的错误。
5. Nios II 系统调试在开发过程中,您可能需要进行系统调试,以解决应用程序的问题。
Nios II 支持硬件和软件调试。
硬件调试通过连接JTAG接口进行,可以在硬件级别上进行调试。
软件调试使用Nios II调试器进行,可以在软件级别上进行调试。
6. Nios II 系统验证在完成软件开发和调试后,您可以进行系统验证,确保系统的正确性和稳定性。
niosII操作图解
![niosII操作图解](https://img.taocdn.com/s3/m/bccaa4ea998fcc22bcd10ded.png)
1、打开quaratusII软件2、打开low_cost_lcd工程打开的工程:3、打开sopcbuilder正在打开:Sopc builder中建立的niosII系统4、选择system generationSystem generation界面5、点击run niosII IDE 正在读取中间会提示选择workplace点browse选择在你电脑中的low_cost_lcd文件夹中的software---workspace作为工作空间这是在我电脑中的情况之后等待一会儿,根据电脑的配置不同时间也不同。
可以从上图看到workspace文件夹上面还有一些文件夹。
这些就是存放c/c++例程的地方:这就是存储c文件的地方这个文件夹中就是你所熟悉的c语言程序。
好了言归正传,现在niosII ide 应该已经启动好了,如下显示:6、打开一个你向下载到实验板上的c程序,我以flash_test为例:点击flash_test:7、因为这些文件都是编译过的,就可以不编译了,当然在编译一次也没关系:点project-build project8、先把qaratusII的工程下载到实验板上9、实验板不要断电,下载软件程序注意控制台中显示的内容显示到这一步你的程序就成功了最后讲一下如何建立新的软件工程:1、现在新建一个工程:2、点next选择空白工程3、为你的工程起个名字这时会在旁边出现一个新的工程---flash_test_26、新建一个c/c++文档:出现如下的对话框:7、上面是选择父目录,下面打入文件名8、完成:这时在左侧的工程池中出现了你刚建的文件:9、我先把flash_test.c中的程序复制了,flash_test.c文件的位置上文已经提过了在low_cost_lcd---software---flash_test中。
10、打开文件,然后把刚才复制过的内容粘贴进去,一个新的niosII软件工程就做好了。
编译下载。
第7章 Nios II 常用外设编程 SOPC技术与应用
![第7章 Nios II 常用外设编程 SOPC技术与应用](https://img.taocdn.com/s3/m/1a648900bed5b9f3f90f1c7b.png)
第1节并行输入/输出内核并行输入/输出(PIO)内核提供了Avalon存储器映射从端口和通用IO端口直接的接口。
I/O端口连接到片内的用户逻辑或是连到与FPGA片外设备相连的引脚上。
PIO内核提供对用户逻辑或外部设备简单的I/O访问,应用实例如下:∙控制LED∙获取开关数据∙控制显示设备∙配置并与片外设备通信,例如专用标准产品(ASSP)的设备。
PIO内核可以基于输入信号而发出中断请求 (IRQ) 输出。
SOPC Builder 中提供了现成的 PIO内核,可以很容易地将PIO内核集成到SOPC Builder生成的系统中。
7.1.1 PIO 寄存器描述每个PIO内核可提供多达32I/O端口,用户可以添加一个或多个PIO内核。
CPU通过读/ 写PIO接口的映射寄存器来控制PIO端口。
在CPU的控制下,PIO内核在输入端口捕获数据,驱动数据到输出端口。
当PIO端口直接连到了I/O管脚,通过写控制寄存器,CPU能够将管脚置成三态。
图7-1是一个PIO应用的例子,本例使用了多个 PIO内核。
图7-1 使用PIO内核的系统实例当集成到SOPC Builder生成的系统中,PIO内核有两个特性对用户是可见的。
∙具有四个寄存器的存储器映射的寄存器空间,4个寄存器是data、direction、 interruptmask和edgecapture。
∙1到32个的I/O端口。
有些寄存器在某些硬件配置下不是必需的,这时相应的寄存器就不存在了。
对一个不存在的寄存器进行读操作,则返回一个未定义的值;一个不存在寄存器进行写操作则没有任何结果。
表7-1给出了PIO寄存器的描述。
1. 数据寄存器(Data Input & Output)PIO内核I/O端口可以连接到片上或片外的逻辑。
内核可以配置成仅有输入端口,或仅有输出端口,或两者都有。
如果内核用于控制设备上的双向I/O 管脚,内核提供具有三态控制的双向模式。
nios2 c语言编程
![nios2 c语言编程](https://img.taocdn.com/s3/m/20df551010a6f524ccbf8538.png)
nios2 c语言编程方法来自:/bbs/thread-66-1-1.htmlIORD(base, 0) //读数据寄存器DATAIORD(base, 1) //读方向寄存器DIRECTIONIORD(base, 2)//读中断标志寄存器interruptmaskIORD(base, 3) //读边沿触发寄存器edgecaptureIOWR(base, 0, data)// 写数据寄存器DATAIOWR(base, 1, data)//写方向寄存器DIRECTIONIOWR(base, 2, data)//写中断标志寄存器interruptmaskIOWR(base, 3, data)//写边沿触发寄存器edgecapturealt_irq_register(EX_IRQ,edge_cap_ptr,Ex_Interrupt); //注册外部中断,对应的参数分别为中断优先级,传递到中断服务函数的参数,和中断服务函数。
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(EX_BASE,0x1); //使能按键中断位,这里在定义硬件时只用了1位IOWR_ALTERA_AVALON_PIO_EDGE_CAP(EX_BASE,0x0); //边沿捕获寄存器清零int main(void)__attribute__((weak,alias("alt_main"))); //将函数入口改为alt_main,由用户自己加载,以减小代码大小。
IORD(base, 0) //读数据寄存器DATAIORD(base, 1) //读方向寄存器DIRECTIONIORD(base, 2)//读中断标志寄存器interruptmaskIORD(base, 3) //读边沿触发寄存器edgecaptureIOWR(base, 0, data)// 写数据寄存器DATAIOWR(base, 1, data)//写方向寄存器DIRECTIONIOWR(base, 2, data)//写中断标志寄存器interruptmaskIOWR(base, 3, data)//写边沿触发寄存器edgecapturealt_irq_register(EX_IRQ,edge_cap_ptr,Ex_Interrupt); //注册外部中断,对应的参数分别为中断优先级,传递到中断服务函数的参数,和中断服务函数。
NiosII 快速入门
![NiosII 快速入门](https://img.taocdn.com/s3/m/3dc21323cc17552707220866.png)
NiosII 快速入门(在QuartusII中使用上述niosII系统) 3:在QuartusII中使用上述niosII系统在SOPC Builder正确运行完毕后,可以在QuartusII中,打开SOPC Builder生成的niosII_e.bsf,检查一下引脚,看看跟你的设想是否有误,如下图,niosII_e有两个input:clk,reset_n,一组output:out_port_from_the_piop[7:0]如下图:你可以使用上述的niosII_e,来构造你自己的系统。
如下图,我简单得创建了nisoSmall.bdf,来使用该niosII_e。
nios clk to clkniso reset_n to VCCout_port_from_the_pio_0[7:0] to LED[7:0]第三节:编写程序。
在Alter SOPC Builder中,点击Run Nios II IDE,启动Nios II IDE,如下图:在Nios II IDE中,选择File -> New -> Project,开启New Project 对话框选择C/C++ Application,如下图。
然后选择Next,进入下一步。
填写你自己的Project Name,比如我填写hello_led_1;在Select Project Template中,我选择Hello LED(因为存放程序的sram只有2kbytes,所以许多Template不可用),如下图。
然后选择Next,进入下一步。
选择Create a new system library named:,最后点击Finish,创建项目。
如下图:打开项目中的文件:hello_led.c,进行适当的修改。
比如,我将PIO的基地址修改为PIO_0_BASE;while(i<200000)修改为while(i<20000).你可以依照你的需求修改!然后选择Project->Build All(Ctrl+B),编译整个项目。
NIOS II处理器c程序编写基本流程
![NIOS II处理器c程序编写基本流程](https://img.taocdn.com/s3/m/b779817bf524ccbff021843a.png)
NIOS II处理器c程序编写基本流程总结:对NIOS II处理器编写程序主要是用来控制NIOS II外围设备如片上存储器,PIO内核,定时器,SDRAM内核,UART内核,DMA内核以及用户自定义内核等。
其本质是对NIOS II外围设备的相关寄存器进行读写操作。
如下图所示NIOS II处理器即cpu的输入信号主要有时钟,复位信号,中断请求信号,读数据等。
Cpu输出信号主要有地址线,读使能,写使能,写数据,字节选择等。
NIOS II处理器c程序经过编译后产生.elf文件(其内容包括对存储器初始化的.hex文件)下载到FPGA中,其本质主要是将c程序(包括用户自定义的程序和系统自带的库)编译产生的机器代码存储到程序存储器里(一般为rom),为c程序中定义的变量(本质是通过寄存器间接寻址实现)在数据存储器(一般为ram)中分配存储空间。
异常程序的引导程序一般放在ram里以提高异常情况的处理速度。
NIOS II处理器的逻辑模块如下图所示,由此可知NIOS II处理器主要实现读取指令,翻译指令,读写数据,异常控制,中断控制等功能。
步骤一:打开ecplise软件。
步骤二:在QUARTUS II工程文件夹中新建workspace文件夹作为ecplise工作文件夹。
系统会在workspace中自动生成.metadata文件,.metadata文件包含如下图所示的几个文件夹。
步骤三:新建ecplise工程。
选择ecplise工程所需的.sopcinfo文件(之前建立NIOS II处理器系统时产生的文件,此处为mynios.sopcinfo),给ecplise工程命名(此处为mynios_software)。
此时系统自动生成software文件夹,software文件夹中包含以ecplise工程名命名的文件夹(此处为mynios_software)和以ecplise工程名_bsp命名的文件夹(此处为mynios_software_bsp)。
nios-ii-入门手册教学文案
![nios-ii-入门手册教学文案](https://img.taocdn.com/s3/m/6d6e8a2d9b6648d7c0c7460d.png)
n i o s-i i-入门手册一、建立quartus ii工程首先,双击quartus ii 9.1图标打开软件,界面如下图1.1所示图1.11.1新建工程(1)点击file –>New Project Wizard 出现图1.2所示的对话框。
图1.2(2)点击Next。
如图1.3所示:第一行是工程的路径,二、三行为实体名。
填好后点击Next。
图1.3(3)此处可选择加入已设计好的文件到工程,点击Next。
图1.4(4)选择设计器件如图1.5所示。
接着点击Next。
图1.5(5)接着点击Next。
无需改动,点击finish,显示如下图所示。
图1.6(6)此时,工程已经建立完成,接下来需要建立一个原理图输入文件,点击file –>New ->Block Diagram/Schematic File 后如图1.7所示。
图1.7二、构建一个nios ii 软核(1)首先点击Tools ->Sopc Builder图2.1在System Name中输入软核的名称,注意:软核的名称不能和quartus工程的实体名相同,否则编译会出现错误,接着点击ok。
图2.2图中clk_0为时钟名称,100.0为时钟值双击可修改其值。
即软核的时钟就是100MHZ。
(2)建立nios ii处理器点击Processors -> Nios ii Processor 如图2.3所示图2.3点击后,将出现下图,在下图中选择软核的类型。
这里提供了三种类型,Nios II/e占用资源最少600-800LEs,功能也最简单,速度最慢。
Nios II/s占资源比,前者多一些,功能也多了,速度也忚一些Nios II/f占资源最多,功能也最多,速度就最快,用户可根据实际的需要选择不同的类型。
此处选择Nios II/f型,速度和功能都能满足。
下方Reset Vector是复位后启动的Memory类型和偏移量。
待SDRAM设置号以后再来设置此处。
NIOS_II手把手入门
![NIOS_II手把手入门](https://img.taocdn.com/s3/m/d128f2c22cc58bd63186bd4c.png)
NIOS II手把手入门前言:NIOS II是什么?也许你第一次听到这个词。
通俗地讲,NIOS II其实是一个软核,那什么是软核?软核是一个基于哈佛结构的可配置处理器。
哈佛结构,联想到了吧,其实51单片机也是基于哈佛结构的处理器。
至于为什么是哈佛结构,我觉得可能是哈佛结构的处理速度较快,因为他可以在一个周期读取数据和指令。
(关于哈佛结构的详细信息请自己查阅!)因此NIOS II是把指令存储器和数据存储器分开的。
在此我想详细介绍下可配置处理器的概念。
我们都知道51单片机或者ARM里面的硬件资源都是固定的,是固化的,不能修改的。
但是软核可配置就不一样啦,它里面的CPU,外围器件都是可选择的。
因此我们可以根据实际的情况来选择需要的资源,这样可以提高利用率。
总之,大家把它当做单片机来学习就行了!讲了一大堆,相信大家还是有点模糊,下面就以流水灯介绍NIOS II吧,让我们进入NIOS II的神奇世界!(在此相信大家都已经掌握quartus的基本使用和安装了与quartus 同样版本的NIOS II软件!)Quartus环境操作:第一步:建立一个Quartus II工程和原理图文件第二步:打开配置NIOS II窗口第三步:配置NIOS II内核和外围器件(双击system contents窗口中component library下拉菜单的Nios II processor)接下来选择程序存储区和数据存储器还有通用8位IO 口。
然后配置通用IO口:(下面是选择器件区窗口,可以看到上面配置的器件!!)双击CPU,把复位矢量和异常矢量分配好:第四步:好了,到现在为止我们已经配置好一个简单的NIOS II内核,接下来就是漫长的等待吧!第五步:在原理图中添加内核symbol(其中内核复位信号是低电平复位!!)第六步:软件(C或C++)编程现在看一下NIOS II软件编写窗口吧,是不是跟单片机开发的有点类似!清空其他工程后,建立一个应用项目:file—new—Nios II C/C++ Application然后建立一个C程序文件:大家可以先把程序写下来,按下保存!等下会有相应的解释。
NIOSii配置及例程使用教程
![NIOSii配置及例程使用教程](https://img.taocdn.com/s3/m/2c683b9385254b35eefdc8d376eeaeaad1f316f9.png)
NIOSii配置及例程使用教程NIOS ii 配置及例程使用教程本教程为nios ii在FPGA板上的配置入门教程,仅使用在xsyan 设计制作EP2C5/EP2C8开发板上。
下面将会详细的说明如何使用nios ii在FPGA上配置一个altera公司提供的CPU,并利用这个CPU 来调试和执行相应C程序。
并且,最后会有两个例程。
一,硬件要求:1,EP2C5/EP2C8开发板一块。
2,USB电源线一条。
3,并口线一条。
4,串口线一条。
二,软件要求:1,quartus II 7.0.2,MegaCore IP 7.0.3,Nios II EDS 7.0.三,主要步骤:1,在quartus上创建一个工程。
2,在此工程里面调用SOPC,并配置CPU。
3,创建cpu.4,定义FPGA引脚并综合。
5,调用NIOS,配置相应设置。
6,再次编译综合工程。
7,下载FPGA。
四,详细步骤:1,在quartus上创建一个工程。
a)打开quartus,选择File->New project wizard.b)在打开的窗口上选择Nextc)选择工程路径,并且指定工程名字。
d)添加文件,因为没有设计文档,所以跳过,直接Next。
e)选择器件,请根据自己的开发板选择EP2C5T144C8/ EP2C8T144C8f)然后直接点Finish,创建工程完毕。
2,用SOPC配置一个CPU。
a)在quartus里面调用SOPC。
b)在打开的SOPC里面,输入系统名字,选择HDL语言种类c)点确定后开始配置CPU,双击左边栏的Nios ii Processor.d)这里选择经济型,然后点Next,直到下个页面。
e)然后点finish,Process配置结束,双击UART,配置串口f)直接用默认配置,点Finish即可,然后双击on-chip-memory 配置memory。
g)配置如上图配一个8K内部ram后点Finish,用来存放程序代码和初始化代码,然后继续创建memory用来存放变量,再创建两个4K内部ram,步骤同上。
NIOS II 系列程序
![NIOS II 系列程序](https://img.taocdn.com/s3/m/8fe9a5d4195f312b3169a5fd.png)
NIOS II S沧1、。
沧2、 minio@yeah址net minio@yeah址net沧沧NIOS II :1. LED_ PIO_BASE个个 SOPC PIO(Parallel I/O)( Avalon Modules -> Other , LED_PIO, PIO_0IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led); 1. sopc PIO LED_PIO ;2. hello_led.c LED_PIO_BASE #define LED_PIO_BASE 0x00001800 SOPC .2. NIOSII PIO个个 hello_led.c IOIOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);altera_avalon_pio_regs.hi nclude#define IORD_ALTERA_AVALON_PIO_DATA(base) IORD(base, 0)#define IOWR_ALTERA_AVALON_PIO_DATA(base, data) IOWR(base, 0, data)NIOSII i nclude IORD/IOWR PIOsmallsoftwarehello_led_0_syslibDebugsystem_des cription system.h, :#define LED_PIO_TYPE "altera_avalon_pio"#define LED_PIO_BASE 0x00004000LED_PIO_BASE IO 0x00004000 SOPCBuilder !( SopcBuilder NiosII , system.h IDE !)IOWR(0x00004000, 0, led);IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led); , , !3. :Linking hello_world_0.elf.../cygdrive/e/DE2Project_restored/software/hello_world_0_syslib/Debug/libhello_world_0_syslib.a(alt_main.o)(.text+0x60): In function `alt_main':/cygdrive/c/altera/72/nios2eds/components/altera_hal/HAL/src/alt_main.c:163: undefined reference to `main'collect2: ld returned 1 exit statusmake: *** [hello_world_0.elf] Error 1Build completed in 1.953 seconds: .int main(void), int mian()!!!!!!4.IOWR_ALTERA_AVALON_PIO_DATA ?:IOWR_ALTERA_AVALON_PIO_DATA altera_avalon_pio_regs.h io.h NiosII IDE NiosII Cache IO ( IOWR_ PIO IORD_ PIO )LED_PIO_BASE system.h LED_PIOIOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led) LED_PIO ledAltera_embeded_peripherals PIONiosII_software_developer's_handbook AlteraNIOS_II :<stdio.h> "system.h"system.h HALIDE “altera_avalon_pio_regs.h ” I/O.IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led)led LED_PIO_BASE I/O led LEDFPGA “alt_types.h”alt_8 8alt_u8 8alt_16 16alt_u16 16alt_32 32alt_u32 32IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf);IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x0);IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE)alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts)"altera_avalon_pio_regs.h"#define IOWR_ALTERA_AVALON_PIO_IRQ_MASK(base,data)IOWR(base,2,data)#define IOWR_ALTERA_AVALON_PIO_EDGE_CAP(base,data)IOWR(base,3,data)#define IORD_ALTERA_AVALON_PIO_EDGE_CAP(base)IORD(base,3)0xf 0x73alt_irq_register ISR IRS extern int alt_irq_register(alt_u32 id,void*context,void(*irq_handler)(void*,alt_u32));handle_button_interrupts init_button_pio():1.#include "system.h"#include "altera_avalon_pio_regs.h"#include "alt_types.h"#include "stdio.h"#include "unistd.h"int main (void) __attribute__ ((weak, alias ("alt_main")));int alt_main (void){unsigned char led = 0;while (1){for(led=0;led<8;led++){IOWR_ALTERA_AVALON_PIO_DATA(LED_GREEN_BASE, 1<<led);usleep(500000); // 0.5}}return 0;}2.count_binary.h#ifndef COUNT_BINARY_H_#define COUNT_BINARY_H_#include "alt_types.h"#include <stdio.h>#include <unistd.h>#include "system.h"#include "sys/alt_irq.h"#include "altera_avalon_pio_regs.h" #define ESC 27#define ESC_TOP_LEFT "[1;0H"#define ESC_COL2_INDENT5 "[2;5H" #define ESC_CLEAR "K"#define ECS_COL1_INDENT5 "[1;5H" #endif /*COUNT_BINARY_H_*/main.c :#include "count_binary.h"int main(void){int i;int data;while(1){i=0;data=0x80;for(i=0;i<8;i++){IOWR(LED_GREEN_BASE,0,data);data>>=1;usleep(500000);}}}/*:IOWR(BASE, REGNUM, DATA)BASE REGNUM DATAREGNUM*/3.count_binary.hmain.c/*:DE24 4 ( ,4 ) */#include "count_binary.h"int alt_main(){int key,data;data=0x00;while(1){key=IORD(BUTTON_PIO_BASE,0);if(key==0x7)data=0x80;key=IORD(BUTTON_PIO_BASE,0);if(key==0xb)data=0x40;key=IORD(BUTTON_PIO_BASE,0);if(key==0xd)data=0x20;key=IORD(BUTTON_PIO_BASE,0);if(key==0xe)data=0x10;IOWR(LED_GREEN_BASE,0,data);}}/*IOIORD(BASE, REGNUM)BASE REGNUMBASE REGNUM*/:, ptf , DE2 , !4./*:DE2*/#include "count_binary.h"volatile int edge_capture;/* ( , )*/static void handle_button_interrupts(void *context,alt_u32 id);/* */static void init_button_pio(){void *edge_capture_ptr=(void*)&edge_capture;/* ( )*/IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf);/* */IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x0);/* */alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts); }/* */int main(void){init_button_pio();while(1){switch(edge_capture){/* 3 8 1*/case 0x08:IOWR(SEG7_DISPLAY_BASE,0,0x11111111);break;case 0x04:IOWR(SEG7_DISPLAY_BASE,0,0X22222222);break;case 0x02:IOWR(SEG7_DISPLAY_BASE,0,0X33333333);break;/* 0 8 4*/case 0x01:IOWR(SEG7_DISPLAY_BASE,0,0x44444444);break;}}}/* */static void handle_button_interrupts(void *context,alt_u32 id) {volatile int * edge_capture_ptr=(volatile int *)context;/* */*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);/* */IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);}5.#include "count_binary.h"int alt_main(){int second=0;while(1){usleep(100000);second++;IOWR(SEG7_DISPLAY_BASE,0,second);}}6.1602lcd.h#ifndef LCD_H_#define LCD_H_#define lcd_write_cmd(base,data) IOWR(base,0,data)#define lcd_read_cmd(base) IORD(base,1)#define lcd_write_data(base,data) IOWR(base,2,data) #define lcd_read_data(base) IORD(base,3)void lcd_init();void lcd_show_text(char * text);void lcd_line2();void lcd_test();#endif /*LCD_H_*/main.c/* :DE2* :quaters II 7.2,NIOS II 7.2* :1602*/#include <unistd.h>#include <string.h>#include <io.h>#include "system.h"#include "lcd.h"void lcd_init(){/* 8 , */lcd_write_cmd(LCD_16207_0_BASE,0X38);usleep(2000);/* , */lcd_write_cmd(LCD_16207_0_BASE,0X0C);usleep(2000);/* */lcd_write_cmd(LCD_16207_0_BASE,0X01);usleep(2000);/* , */lcd_write_cmd(LCD_16207_0_BASE,0X06);usleep(2000);/* */lcd_write_cmd(LCD_16207_0_BASE,0X80);usleep(2000);}/* */void lcd_show_text(char * text){int i;for(i=0;i<strlen(text);i++){lcd_write_data(LCD_16207_0_BASE,text[i]);usleep(2000);}}void lcd_line1(){lcd_write_cmd(LCD_16207_0_BASE,0X80);usleep(2000);}/* , */void lcd_line2(){lcd_write_cmd(LCD_16207_0_BASE,0XC0);usleep(2000);}int main(){char text1[16]="Wu Qin De Shi";char text2[16]="Jie,Wu Qin De Ni";lcd_init();//while(1){/* */lcd_line1();/* */lcd_show_text(text1);/* */lcd_line2();/* */lcd_show_text(text2);usleep(4000000);lcd_write_cmd(LCD_16207_0_BASE,0X01);//usleep(2000);/* */lcd_line1();lcd_show_text("Liu Ya Li,");lcd_line2();/* */lcd_show_text("I Love You!");usleep(4000000);}return 0;}7.1602 NIOS II fprintf/* :DE2* :quaters II 7.2,NIOS II 7.2* :1602* NIOS II fprintf lcd !*/#include <unistd.h>#include <stdio.h>#include <string.h>#include <io.h>#include "system.h"int main(void){FILE *lcd;lcd=fopen("/dev/lcd_16207_0","w");/*1602 */fprintf(lcd,"I love NIOS II!\n");/*1602 */fprintf(lcd,"I love you!");fclose(lcd);return 0;}8.count_binary.h#ifndef COUNT_BINARY_H_#define COUNT_BINARY_H_#include "alt_types.h"#include <stdio.h>#include <unistd.h>#include "system.h"#include "sys/alt_irq.h"#include "altera_avalon_pio_regs.h"#define ESC 27#define ESC_TOP_LEFT "[1;0H"#define ESC_COL2_INDENT5 "[2;5H"#define ESC_CLEAR "K"#define ECS_COL1_INDENT5 "[1;5H"#endif /*COUNT_BINARY_H_*/main.c#include "count_binary.h"static alt_u8 count;volatile int edge_capture;#ifdef BUTTON_PIO_BASEstatic void handle_button_interrupts(void *context,alt_u32 id){volatile int *edge_capture_ptr=(volatile int *)context;*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);}static void init_button_pio(){void *edge_capture_ptr=(void *)&edge_capture;IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0XF);IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0X0);alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts);}#endif#ifdef SEG7_DISPLAY_BASEstatic void sevenseg_set_hex(int hex){static alt_u8 segments[16]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84, 0x88,0xe0,0xf2,0xc2,0xb0,0xb8};unsigned int data=segments[hex&15]|(segments[(hex>>4)&15]<<8);IOWR_ALTERA_AVALON_PIO_DATA(SEG7_DISPLAY_BASE,data);}#endifstatic void lcd_init(FILE *lcd){fprintf(lcd,"%c%s Counting will be displayed below...",ESC,ESC_TOP_LEFT);}static void initial_message(){}static void count_led(){#ifdef LED_RED_BASEIOWR_ALTERA_AVALON_PIO_DATA(LED_RED_BASE,count);#endif}static void count_sevenseg(){#ifdef SEG7_DISPLAY_BASEsevenseg_set_hex(count);#endif}static void count_lcd(void *arg){FILE *lcd=(FILE*)arg;fprintf(lcd,"%c%s 0x%x\n",ESC,ESC_COL2_INDENT5,count); }static void count_all(void *arg){count_led();count_sevenseg();count_lcd(arg);printf("%02x, ",count);}static void handle_button_press(alt_u8 type,FILE *lcd){if(type=='c'){switch(edge_capture){case 0x1:count_led();break;case 0x2:count_sevenseg();break;case 0x4:count_lcd(lcd);break;case 0x8:count_all(lcd);break;default:count_all(lcd);break;}}}int main(void){int i;int wait_time;FILE *lcd;count=0;lcd=fopen("/dev/lcd_16207_0","w");#ifdef BUTTON_PIO_BASE//init_button_pio();init_button_pio();#endifinitial_message();while(1){usleep(100000);if(edge_capture!=0){handle_button_press('c',lcd);}else{count_all(lcd);}if(count==0xff){fprintf(lcd,"%c%s Waiting...\n",ESC,ESC_TOP_LEFT,ESC,ESC_CLEAR, ESC,ESC_COL2_INDENT5);edge_capture=0;fprintf(lcd,"%c%s",ESC,ESC_COL2_INDENT5,ESC,ESC_CLEAR);wait_time=0;for(i=0;i<70;++i){wait_time=i/10;fprintf(lcd,"%c%s",ESC,ESC_COL2_INDENT5,wait_time);if(edge_capture!=0){handle_button_press('w',lcd);usleep(100000);}}initial_message();lcd_init(lcd);}count++;}fclose(lcd);return(0);}9. 1 +#include <stdio.h>#include <sys/unistd.h>#include <io.h>#include <string.h>#include "system.h"#include "altera_avalon_pio_regs.h"#include "altera_avalon_timer_regs.h"#include "alt_types.h"#include "sys/alt_irq.h"static void timer1_init(void); //int i = 0;/* */int main(void){// Timertimer1_init();while(1);return 0;}/* 1 */static void ISR_timer1(void *context, alt_u32 id){// 8 LEDIOWR_ALTERA_AVALON_PIO_DATA(LED_GREEN_BASE, 1<<i);i++;if(i == 8)i = 0;// TimerIOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_1_BASE, 0x00);}/* 1 */void timer1_init(void) //{// Timer1IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_1_BASE, 0x00);// Timer1 T=25000000/5000000=0.5s// 16IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_1_BASE,25000000);// 16IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_1_BASE,25000000 >> 16);//Timer1IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_1_BASE, 0x07);// Timer1alt_irq_register(TIMER_1_IRQ, (void *)TIMER_1_BASE, ISR_timer1);}10. 1+#include <stdio.h>#include <sys/unistd.h>#include <io.h>#include <string.h>#include "system.h"#include "altera_avalon_pio_regs.h"#include "altera_avalon_timer_regs.h"#include "alt_types.h"#include "sys/alt_irq.h"static void timer1_init(void); //unsigned long int i = 0;/* */int main(void){// Timertimer1_init();while(1);return 0;}/* 1 */static void ISR_timer1(void *context, alt_u32 id){// 8 7IOWR(SEG7_DISPLAY_BASE,0,i);i++;// TimerIOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_1_BASE, 0x00);}/* 1 */void timer1_init(void) //{// Timer1IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_1_BASE, 0x00);// Timer1 T=25000000/5000000=0.5s// 16IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_1_BASE,25000000);// 16IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_1_BASE,25000000 >> 16);//Timer1IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_1_BASE, 0x07);// Timer1alt_irq_register(TIMER_1_IRQ, (void *)TIMER_1_BASE, ISR_timer1);}11. 1 2+ +/* :DE2* :NIOS II7.2,QUATERS II 7.2* 1* 2 1* */#include <stdio.h>#include <sys/unistd.h>#include <io.h>#include <string.h>#include "system.h"#include "altera_avalon_pio_regs.h"#include "altera_avalon_timer_regs.h"#include "alt_types.h"#include "sys/alt_irq.h"/* : DE2 system.h TIMER_0 TIMER_1** system.h* #define TIMER_0_BASE 0x00681020* #define TIMER_0_IRQ 3* #define TIMER_1_BASE 0x00681040* #define TIMER_1_IRQ 4* :*/#define TIMER1_IRQ 3#define TIMER2_IRQ 4#define TIMER1_BASE 0x00681020#define TIMER2_BASE 0x00681040static void timer_init(void); //int i = 0,j = 0,flag;alt_u32 timer_prd[4] = {5000000, 10000000, 50000000, 100000000};// //T1 0.1s,0.2s,1s,2sint main(void){// Timertimer_init();while(1);return 0;}static void ISR_timer1(void *context, alt_u32 id){// 8 LEDIOWR(LED_GREEN_BASE,0,i);//IOWR(SEG7_DISPLAY_BASE,0,i);i++;if(i == 255)i = 0;// TimerIOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE, 0x00);}/* 2 1 */static void ISR_timer2(void *context, alt_u32 id){// 1 T1=timer_prd[j]/50M( : )IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER1_BASE, timer_prd[j]);IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER1_BASE, timer_prd[j] >> 16);//IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER1_BASE, 0x07);//if(j == 0)flag = 0;if(j == 3)flag = 1;if(flag == 0){j++;}else{j--;}//IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER2_BASE, 0);}void timer_init(void) //{// Timer1IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE, 0x00);// Timer1IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER1_BASE,80000000);IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER1_BASE, 80000000 >> 16);// Timer1IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER1_BASE, 0x07);// Timer1alt_irq_register(TIMER1_IRQ, (void *)TIMER1_BASE, ISR_timer1);// Timer2IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER2_BASE, 0x00);// Timer2 T2=400M/50M=8s;IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER2_BASE,400000000);IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER2_BASE, 400000000 >> 16);// Timer2IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER2_BASE, 0x07);// Timer2alt_irq_register(TIMER2_IRQ, (void *)TIMER2_BASE, ISR_timer2);}12./* DE2* NIOS II 7.2,QUATERS II 7.2** 1. 1* 2. 0-9 9 0-9* *//* 115200*/#include "altera_avalon_uart_regs.h"#include "system.h"#include "altera_avalon_pio_regs.h"#include "alt_types.h"#include "sys/alt_irq.h"#include <stdio.h>#include <string.h>#define UART_BASE 0x00681000#define UART_IRQ 2#define TIME_DELAY 1000000//1M,//UARTvoid Uart_send(unsigned char data){alt_u16 status;status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);while(!(status&0x0040))//status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE,data);}//UARTvoid Uart_send_n(unsigned char *ptr){while(*ptr){Uart_send(*ptr);ptr++;}Uart_send(0x0a);//}//UARTint Uart_receive(void){alt_u16 status;int temp;status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);while(!(status&0x0080))//status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);temp=IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);return temp;}//void Uart_ISR(void * context,alt_u32 id){unsigned char temp;temp=IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);switch(temp){case '0':IOWR(SEG7_DISPLAY_BASE,0,0x00000000);break;case '1':IOWR(SEG7_DISPLAY_BASE,0,0x11111111);break;case '2':IOWR(SEG7_DISPLAY_BASE,0,0x22222222);break;case '3':IOWR(SEG7_DISPLAY_BASE,0,0x33333333);break;case '4':IOWR(SEG7_DISPLAY_BASE,0,0x44444444);break;case '5':IOWR(SEG7_DISPLAY_BASE,0,0x55555555);break;case '6':IOWR(SEG7_DISPLAY_BASE,0,0x66666666);break;case '7':IOWR(SEG7_DISPLAY_BASE,0,0x77777777);break;case '8':IOWR(SEG7_DISPLAY_BASE,0,0x88888888);break;case '9':IOWR(SEG7_DISPLAY_BASE,0,0x99999999);break;}}//void Uart_init(){IOWR_ALTERA_AVALON_UART_CONTROL(UART_BASE, 0x80);// IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0x0);//// IOWR_ALTERA_AVALON_UART_RXDATA(UART_BASE, 0x0);// alt_irq_register(UART_IRQ,0,Uart_ISR);}int main(){Uart_init();while(1){Uart_send_n("Liu Ya Li,I love u!");//Uart_send_n(64);usleep(TIME_DELAY);//}}13. 1 2 timer0 timer1 timer2 2#define timer2#ifdef timer2#include <stdio.h>#include <sys/unistd.h>#include <io.h>#include <string.h>#include "system.h"#include "altera_avalon_pio_regs.h"#include "altera_avalon_timer_regs.h"#include "alt_types.h"#include "sys/alt_irq.h"//#define TIMER_2_BASE 0x01b02060//#define TIMER_2_IRQ 9static void timer2_init(void); //unsigned long int i = 0;/* */int main(void){// Timertimer2_init();while(1);return 0;}/* 2 */static void ISR_timer2(void *context, alt_u32 id){// 8 7IOWR(SEG7_DISPLAY_BASE,0,i);i++;// Timer2IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_2_BASE, 0x00);}/* 1 */void timer2_init(void) //{// Timer2IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_2_BASE, 0x00);// Timer2 T=1s// 16IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_2_BASE,100000000);// 16IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_2_BASE,100000000 >> 16);//Timer1IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_2_BASE, 0x07);// Timer2alt_irq_register(TIMER_2_IRQ, (void *)TIMER_2_BASE, ISR_timer2);}#else#include <stdio.h>#include <sys/unistd.h>#include <io.h>#include <string.h>#include "system.h"#include "altera_avalon_pio_regs.h"#include "altera_avalon_timer_regs.h"#include "alt_types.h"#include "sys/alt_irq.h"static void timer1_init(void); // unsigned long int i = 0;/* */int main(void){// Timertimer1_init();while(1);return 0;}/* 1 */static void ISR_timer1(void *context, alt_u32 id) {// 8 7IOWR(SEG7_DISPLAY_BASE,0,i);i++;// TimerIOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_1_BASE, 0x00);}/* 1 */void timer1_init(void) //{// Timer1IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_1_BASE, 0x00);// Timer1 T=1s// 16IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_1_BASE,100000000);// 16IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_1_BASE,100000000 >> 16);//Timer1IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_1_BASE, 0x07);// Timer1alt_irq_register(TIMER_1_IRQ, (void *)TIMER_1_BASE, ISR_timer1);}#endif14. SDRAMmemestmemest (please type "man memset" in your shell)void *memset(void *s, int c, size_t n);memset:: c n .char a[20] , memset(a, 0, 20)memset(a, 20, 0): memset, , , : char buffer[20];memset(buffer, 0, sizeof((char)*20));strcpy(buffer, "123");memset . , .: memset, memsetint some_func(struct something *a){……memset(a, 0, sizeof(a));…}: memset ?memset( &Address, 0, sizeof(Address)):1. ()char buf[5]CString str,str1 //memset(buf,0,sizeof(buf)) for(int i = 0 i<5 i++) { str.Format(“%d “,buf[i]) str1 +=str } TRACE(“%s\r\n“,str1)2. 0 memset MessageBox 0 NULL:demo 1#include <iostream>#include <cstring>using namespace std;int main(){char a[5];memset(a,'1',5);for(int i = 0;i < 5;i++)cout<<a[i]<<" ";system("pause");return 0;}#include <stdio.h>//#include "../inc/sopc.h"#include "system.h"#include "string.h"#include "unistd.h"#include "altera_avalon_pio_regs.h"/* DE2 system.h SDRAM_0_BASE* #define SDRAM_0_BASE 0x00800000,*/#define SDRAM_BASE 0x00800000unsigned short * ram = (unsigned short *)(SDRAM_BASE+0x10000); //SDRAM int main(void){int i;memset(ram,0,100);// SDRAM// ram ram ram (SDRAM_BASE+0x10100) for(i=0;i<100;i++){*(ram++) = i;}// ramfor(i=0;i<100;i++){printf("%d\n",*(--ram));}for(i=100;i<200;i++){*(ram++) = i;}// ramfor(i=100;i<200;i++){IOWR(SEG7_DISPLAY_BASE,0,*(--ram));printf("%d\n",*(--ram));usleep(1000000);}return 0;}15. API#include "system.h"#define _LEDtypedef struct{unsigned long int DATA;unsigned long int DIRECTION;unsigned long int INTERRUPT_MASK;unsigned long int EDGE_CAPTURE;} PIO_STR;#ifdef _LED#define LED ((PIO_STR *)LED_GREEN_BASE)#endif#include "unistd.h"#include "stdio.h"unsigned int i=0;CPU NIOS II/f none CPU16. 1+ptf ptf/* DE2* QUATERS II 7.2,NIOS II 7.2* 2010.7.17* 8 1* 1 T=timer_1_period/50000000* */#include "system.h"#include "altera_avalon_pio_regs.h"#include "altera_avalon_timer_regs.h"#include "sys/alt_irq.h"#include <io.h>#define timer_1_period 50000#define uint unsigned int#define uchar unsigned charalt_u32 count=0;uchar seg_table[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f};void isr_timer_1();/* 1 */void timer_1_init(){/* 1 */IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_1_BASE,0X00);/* 16 */IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_1_BASE,timer_1_period);/* 16 */IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_1_BASE,timer_1_period>>16);/* 1 */IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_1_BASE,0X07);/* 1 */alt_irq_register(TIMER_1_IRQ, (void *)TIMER_1_BASE, isr_timer_1);}/* 1 */void isr_timer_1(){count++;/* 1 */IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_1_BASE,0X00);}/* */void seg_display(alt_u32 z){if(z<10){IOWR(SEG0_DISPLAY_BASE,0,seg_table[z%10]);IOWR(SEG1_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG2_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG3_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG4_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG5_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG6_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG7_DISPLAY_BASE,0,seg_table[10]);}else if(z<100){IOWR(SEG0_DISPLAY_BASE,0,seg_table[z%10]);IOWR(SEG1_DISPLAY_BASE,0,seg_table[z%100/10]);IOWR(SEG2_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG3_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG4_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG5_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG6_DISPLAY_BASE,0,seg_table[10]);IOWR(SEG7_DISPLAY_BASE,0,seg_table[10]);}else if(z<1000){IOWR(SEG0_DISPLAY_BASE,0,seg_table[z%10]);IOWR(SEG1_DISPLAY_BASE,0,seg_table[z%100/10]);IOWR(SEG2_DISPLAY_BASE,0,seg_table[z%1000/100]);IOWR(SEG3_DISPLAY_BASE,0,seg_table[10]);。
第五章 Nios II 常用组件与编程
![第五章 Nios II 常用组件与编程](https://img.taocdn.com/s3/m/37b86d5d33687e21ae45a917.png)
例2,8只七段数码管显示两屏幕信息sum #include “count-binary.h" int alt_main (void) { int sum; while(1) { sum=0x20130322; IOWR(SEG7_DISPLAY_BASE,0,sum); usleep(1000000);延时1s sum=0x00105959; IOWR(SEG7_DISPLAY_BASE,0,sum); usleep(1000000);}}
前一页 后一页 4
三、SOPC Builder例化
前一页 后一页
5
四、软件编程
(1)NIOSII IDE 提供了定义PIO核寄存器的HAL系统库头文件
Altera_avalon_pio_regs.h
定义了通用的PIO核的寄存器映射 (2)多个PIO设备的个性信息在 system.h 中定义
前一页 后一页
前一页 后一页
12
பைடு நூலகம்
例3:18只红色发光二极管依次向左或向右 移位发光,用按钮KEY0来控制LED移位 方向 #include “count-binary.h" int alt_main (void) { int i,data,key; while(1) { key=IORD(BUTTON_PIO_BASE,0);
6
(1)Altera_avalon_pio_regs.h
前一页 后一页
7
(2)system.h
前一页 后一页
8
(3)对PIO设备的访问
读IO口 或:IORD(base,0) 写IO口
或:IOWR(base,0,data)
前一页 后一页
9
以最简单的Hello程序为例,NIOSII开发的整个流程
![以最简单的Hello程序为例,NIOSII开发的整个流程](https://img.taocdn.com/s3/m/bf4abc54ce84b9d528ea81c758f5f61fb7362820.png)
以最简单的Hello程序为例,NIOSII开发的整个流程废话不多说,我们来开始最简单、最基本的NiosII程序,首先打开quartusII 9.1,双击即可,打开如下界面:点击File→New Project Wizard 如下图:出现如图:点击第一个后面的。
将新建的文件放入自己事先建好的文件夹hello内千万记住路径中不能有中文完成后如图:再第二个填入hello中即可,之后点击next,出现如下图:继续next,不要犹豫……在Device family 中选择Cyclone III(由于我们的板子芯片是这个系列的),其他的不用动。
在available devices中选择EP3C10E144C8,完成后点击next,这里我们不做仿真,直接点击next点击finish,完成新建真正的工作马上开始:在这点击File→New都可跳出如下界面:选择Block Diagram/Schematic File,双击,出现如下界面在工具栏()中选择SOPC,单击,出现如下界面其中的System Name 命名为kernal ,Target HDL选为VHDL将时钟改为100M,Name也改为clk(改不改都行)下一步选择CPU,也就是nios的处理器,双击选择完毕后,出现这样的对话框对话框中可看到三种nios核(从e核最简单,占用空间最小,第三个f核是快速的,但是占用空间最大的,中间的S核是介于e与f之间的,性能与占用空间比较平衡的核。
)这里我们选择f核(方便以后开发使用)这里Memory后面可选的部分暂时没有东西,暂且放一边,待我们建立好SDRAM与EPCS 再回来选择即可☺接下来,点击next其中Data cache 选择none(原因在后面介绍☺)点击next点击next 继续next其中有很多级别,这里我们选择level1即可点击完成,出现如下界面其中cpu_0即为我们要使用的核,右键rename改为cpu,下面要做的就是接外设,让cpu工作起来首先加入sdram双击sdram,出现选择Presets:Custom;Data with:16,其他的都不变。
NIOS2完整教程
![NIOS2完整教程](https://img.taocdn.com/s3/m/a1f1d608ce84b9d528ea81c758f5f61fb636287d.png)
NIOS2完整教程NIOSII是一种32位可配置的软核处理器,支持使用硬件描述语言(HDL)进行快速设计和开发。
下面是一个完整的NIOSII教程,介绍了NIOSII的基本概念和使用方法。
第一部分:NIOSII概述(300字)NIOS II是Altera公司推出的一种可配置软核处理器。
它可以根据需要进行配置,包括选择处理器指令集的大小和功能,以及设置外设和存储器的接口。
NIOS II是基于经典的RISC架构,具有高性能和灵活性。
第二部分:NIOSII的基本构成(300字)NIOSII处理器由五个核心组件组成:指令集体系结构(ISA)、处理器核心、数据存储器、指令存储器和外设接口。
ISA定义了NIOSII支持的指令集,包括整数指令、浮点指令和多媒体指令。
处理器核心执行指令,并且可以执行单周期、多周期或流水线处理。
数据存储器用于存储数据,指令存储器用于存储程序指令。
外设接口用于连接NIOSII处理器和外部设备。
第三部分:NIOSII的配置和开发环境(300字)第四部分:NIOSII的应用场景(300字)NIOSII可用于各种应用场景,包括但不限于嵌入式系统、通信系统、工业自动化和军事应用。
NIOSII的可配置性使得它非常适合于各种需求和资源约束的项目。
NIOSII的性能和可扩展性使得它能够满足高带宽和实时性要求的应用。
此外,NIOSII的软件开发环境也非常成熟和易于使用,可以加快开发过程。
第五部分:NIOSII的优势和挑战(300字)NIOSII相对于其他软核处理器的主要优势在于其可配置性和性能。
NIOSII可以根据需求进行定制,并且可以实现高度优化的硬件和嵌入式软件系统。
然而,NIOSII的可配置性也带来了一些挑战,例如设计复杂性和调试困难。
此外,NIOSII的性能也受限于硬件资源的可用性和设计的质量。
总结(200字)在本教程中,我们介绍了NIOSII的基本概念和使用方法。
NIOSII是一种可配置的软核处理器,支持使用HDL进行快速设计和开发。
NIOSII教程
![NIOSII教程](https://img.taocdn.com/s3/m/a6279119bf23482fb4daa58da0116c175e0e1e13.png)
NIOSII教程1.NIOSII概述:介绍NIOSII的特点、应用领域和产品系列。
2.NIOSII架构和指令集:介绍NIOSII的架构和指令集。
NIOSII的架构包括处理器核、存储器和外设接口等。
处理器核由五个主要部分组成:指令译码器、执行单元、数据通路、存储器接口和外设接口。
NIOSII的指令集包括常见的RISC指令,如加载、存储、算术逻辑和分支等。
3.NIOSII的软件开发环境:介绍NIOSII的软件开发环境和相关工具。
4.NIOSII的软件编程:介绍NIOSII的软件编程方法和技术。
在NIOSII上进行软件编程可以使用C语言和汇编语言。
用户可以使用开发工具来编写、调试和运行自己的软件。
此外,NIOSII还支持外设驱动程序的编写和集成,以实现与外部设备的交互。
5.NIOSII硬件设计:介绍如何进行NIOSII的硬件设计和集成。
6.NIOSII的调试和性能优化:介绍如何进行NIOSII的调试和性能优化。
在NIOSII的开发过程中,调试和性能优化是非常重要的环节。
用户可以使用调试器来调试和分析程序的执行过程,以发现和修复错误。
此外,用户还可以通过改进代码结构和算法来提高程序的性能。
7.NIOSII的应用案例:介绍一些NIOSII在实际应用中的案例。
总结:NIOSII教程主要介绍了NIOSII的概述、架构、指令集、软件开发环境、软件编程、硬件设计、调试优化和应用案例等内容。
通过学习NIOSII教程,用户可以获得关于NIOSII的全面知识,并能够利用NIOSII 进行快速设计和开发嵌入式系统。
nios2+c语言编程方法Nios2系列教程
![nios2+c语言编程方法Nios2系列教程](https://img.taocdn.com/s3/m/a96294fa250c844769eae009581b6bd97f19bc60.png)
nios2+c语言编程方法Nios2系列教程最小的Nios2系统前言2003年Altera推出了第一代32位Nios系统,开创了FPGA内构建高性能单片机的先河。
随之2004年,Nios系统升级为Nios2系统,解决了软硬件开发中一些不方便的问题,软件开发环境从命令行编译转移到Eclips的IDE集成开放环境。
Nios2开发环境从1.0、1.1到 1.2逐步升级。
后来为了和QuartusII软件升级同步,从QuartusII5.0版本开始Nios2的版本号正式和QuartusII统一。
作者我亲身经历过整个Nios2发展历程,深知Nios2的不同版本发生的巨大变化。
目前网上流行的Nios2教程针对的版本相对较老,已经对初学者学习Nios2起不到指导作用,并且应广大爱好者的强烈要求,我在此使用QuartusII和Nios2的8.0版本详细叙述Nios2的开发流程。
构建一个Nios2最小系统需要什么构建一个Nios2最小系统需要具备以下资源:★Nios2软核处理器★内存★Jtag_uart调试接口1. Nios2软核处理器:这就是Nios2处理器的核心CPU,所有的外设都是和这个CPU通过Avalon总线连接到一起的。
2. 内存:编译后的程序代码需要通过下载线下载到该内存中,然后CPU的程序指针跳转到内存的首地址开始执行程序。
3. Jtag_uart调试接口:想要用单步调试等调试功能控制程序执行和查看程序变量,那么就需要这个调试接口。
开始构建一个再简单不过的Nios2工程整个步骤由2部分组成,第一部分建立Nios2硬件SOPC工程,第二部分建立Nios2软件工程。
1.建立Nios2硬件SOPC工程建立Nios2硬件SOPC工程就是设计一个软核CPU和它的外设,编译成硬件电路放到FPGA芯片里面。
这时候可以认为FPGA就是一个32位的单片机了,下面的软件开发都是针对这个单片机的。
打开QuartusII软件,新建一个工程选择EP2C8Q208C8芯片。
NIOS ii 配置及例程使用教程
![NIOS ii 配置及例程使用教程](https://img.taocdn.com/s3/m/fc4c327e5acfa1c7aa00cc01.png)
NIOS ii 配置及例程使用教程本教程为nios ii在FPGA板上的配置入门教程,仅使用在xsyan设计制作EP2C5/EP2C8开发板上。
下面将会详细的说明如何使用nios ii在FPGA上配置一个altera公司提供的CPU,并利用这个CPU来调试和执行相应C程序。
并且,最后会有两个例程。
一,硬件要求:1,EP2C5/EP2C8开发板一块。
2,USB电源线一条。
3,并口线一条。
4,串口线一条。
二,软件要求:1,quartus II 7.0.2,MegaCore IP 7.0.3,Nios II EDS 7.0.三,主要步骤:1,在quartus上创建一个工程。
2,在此工程里面调用SOPC,并配置CPU。
3,创建cpu.4,定义FPGA引脚并综合。
5,调用NIOS,配置相应设置。
6,再次编译综合工程。
7,下载FPGA。
四,详细步骤:1,在quartus上创建一个工程。
a)打开quartus,选择File->New project wizard.b)在打开的窗口上选择Nextc)选择工程路径,并且指定工程名字。
d)添加文件,因为没有设计文档,所以跳过,直接Next。
e)选择器件,请根据自己的开发板选择EP2C5T144C8/ EP2C8T144C8f)然后直接点Finish,创建工程完毕。
2,用SOPC配置一个CPU。
a)在quartus里面调用SOPC。
b)在打开的SOPC里面,输入系统名字,选择HDL语言种类c)点确定后开始配置CPU,双击左边栏的Nios ii Processor.d)这里选择经济型,然后点Next,直到下个页面。
e)然后点finish,Process配置结束,双击UART,配置串口f)直接用默认配置,点Finish即可,然后双击on-chip-memory配置memory。
g)配置如上图配一个8K内部ram后点Finish,用来存放程序代码和初始化代码,然后继续创建memory用来存放变量,再创建两个4K内部ram,步骤同上。
说明该指南将会使你熟悉niosiiide和microcosii开发流程
![说明该指南将会使你熟悉niosiiide和microcosii开发流程](https://img.taocdn.com/s3/m/558ffd30a300a6c30d229f11.png)
说明:该指南将会使你熟悉niosII IDE和MicroC/OS-II开发流程。
niosII IDE提供设计者一个充足的niosII开发平台。
niosII IDE包含MicroC/OS-II实时操作系统,为设计者提供快速地搭建基于niosII处理器的MicroC/OS-II应用程序的能力。
该指南提供了搭建一个基于MicroC/OS-II实时操作系统的简单程序的步骤说明。
基于niosII处理器的MicroC/OS-II操作系统的详细叙述请参阅the Nios IISoftware Developer’s Handbook(niosII软件开发手册)的“MicroC/OS-II Real-Time Operating System”(MicroC/OS-II实时操作系统)章节。
硬件与软件:一下是该指南所需要的硬件与软件:需求:Quartus® II4.1版sp1 或更高版本NiosII 嵌入式处理器1.01版或更高版本niosII开发板Stratix™ II 版, Cyclone™ 版,Stratix 版, 或Stratix 专业版altera的USB-Blaster™ 或ByteBlaster™下载电缆要完成该指南的全部功能,你必须安装Nios II IDE并且将你的nios开发板与pc主机相连接,参见the Nios II Development Kit Getting StartedUser Guide。
指南文件niosII开发包包含该设计向导。
该硬件设计是标准参考设计,软件设计是一个Nios II IDE模板。
当你安装了niosII开发包后,你能发现设计文件在niosII开发包的目录引索中。
硬件标准参考设计文件位于<Nios II kit path>\examples\<verilog or vhdl>\<Nios development board>\standard directory.MicroC/OS-II软件设计指南文件位于<Nios II kit path>\examples\software\ucosii_tutorial directory.你不需移动或复制这些软件文件,因为Nios II IDE自动复制了它们到你的工作工程目录。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最小的Nios2系统前言2003年Altera推出了第一代32位Nios系统,开创了FPGA内构建高性能单片机的先河。
随之2004年,Nios系统升级为Nios2系统,解决了软硬件开发中一些不方便的问题,软件开发环境从命令行编译转移到Eclips的IDE集成开放环境。
Nios2开发环境从1.0、1.1到1.2逐步升级。
后来为了和QuartusII软件升级同步,从QuartusII5.0版本开始Nios2的版本号正式和QuartusII统一。
作者我亲身经历过整个Nios2发展历程,深知Nios2的不同版本发生的巨大变化。
目前网上流行的Nios2教程针对的版本相对较老,已经对初学者学习Nios2起不到指导作用,并且应广大爱好者的强烈要求,我在此使用QuartusII和Nios2的8.0版本详细叙述Nios2的开发流程。
构建一个Nios2最小系统需要什么构建一个Nios2最小系统需要具备以下资源:★Nios2软核处理器★内存★Jtag_uart调试接口1. Nios2软核处理器:这就是Nios2处理器的核心CPU,所有的外设都是和这个CPU通过Avalon总线连接到一起的。
2. 内存:编译后的程序代码需要通过下载线下载到该内存中,然后CPU的程序指针跳转到内存的首地址开始执行程序。
3. Jtag_uart调试接口:想要用单步调试等调试功能控制程序执行和查看程序变量,那么就需要这个调试接口。
开始构建一个再简单不过的Nios2工程整个步骤由2部分组成,第一部分建立Nios2硬件SOPC工程,第二部分建立Nios2软件工程。
1.建立Nios2硬件SOPC工程建立Nios2硬件SOPC工程就是设计一个软核CPU和它的外设,编译成硬件电路放到FPGA芯片里面。
这时候可以认为FPGA就是一个32位的单片机了,下面的软件开发都是针对这个单片机的。
打开QuartusII软件,新建一个工程选择EP2C8Q208C8芯片。
打开Tools->SOPC Builder菜单,进入SOPC Builder界面,新建一个名为nios32的SOPC文件,语言可以选择VHDL或者VerilogHDL。
我们一共要添加3个IP模块:Nios2处理器、片上内存和Jtag_uart 调试接口。
1.1在左边的IP导航栏里面双击选择NiosII Processor,然后选择Nios II/e型的处理器。
这个处理器占用FPGA逻辑资源最小。
此时CPU的Reset Vector和Exception Vector都是不可选的,因为还没有设置内存。
在添加了内存后,还要回到这个CPU设置里面设置这两项信息。
1.2在左边的IP导航栏里选择On-Chip Memory(RAM or ROM)使用默认设置就可以了,RAM类型,32位数据宽度,4KB字节容量。
1.3在左边的IP导航栏里选择jtag_uart使用默认设置就可以了。
1.4最后建成的Nios2系统见下面的连接关系图:Avalon总线的连接关系图下图:图中实心的圆圈代表连接,空心的圆圈代表不连接。
cpu做为主设备Onchip_mem和jtag_uart作为从设备,从设备通过数据总线和指令总线连接到主设备上。
Onchip_mem比较特殊,它既连接到cpu的指令总线上,又连接到数据总线上。
这跟我们设计有关,我们是通过调试接口将程序下载到Onchip_mem中,程序然后从Onchip_mem开始执行指令。
程序中产生的变量同时也是存放在Onchip_mem中的。
1.5新建一个Block Diagram/Schematic File作为工程的顶层文件,将刚才制作的Nios32的symbol添加到bdf文件里。
添加时钟和复位信号管脚,定义管脚的管脚号。
最后编译工程,这样Nios2硬件部分的开发就算完成了,可以看到生成的sof和pof下载文件。
2.建立Nios2软件工程建立Nios2软件工程和开发51单片机程序差不多,但是具体细节设置的地方有很多差异的地方。
2.1新建工程打开Nios2软件IDE开发环境,新建一个NiosII C/C++ Application 的工程。
Nios2开发环境还自带了很多模版例子工程,我们这里选择Hello World Small工程。
和51开发不同的是,Nios2可以自定义很多外设。
因此不同的Nios2工程添加的外设可能都不同,需要在新建工程的时候指定你所要开发的那个Nios2硬件工程。
这点很关键,这就是软件工程和硬件工程结合的地方。
一般新建一个工程时,系统会同时建立一个和该应用程序对应的库工程。
库工程里面编译了指定Nios2硬件的外设驱动程序等api函数。
这样就将应用程序和驱动库分离开来,方便用户管理。
开发不同的应用程序时,可以共享一个驱动库。
2.2编译工程建立工程后我们会在导航栏里面看到又两个新建的工程:hello_world_small_0和hello_world_small_0_syslib。
点击编译按钮直接编译工程,最后查看编译结果。
最终生成hello_world_small_0.elf二进制文件,程序代码大小为560个直接,内存剩余3536个字节。
2.3软件在线调试工程工程编译成功后就可以用下载线调试你的程序了。
在Run->Debug菜单里设置下载线和需要调试的软件工程。
Main页面和Target Connection页面里的设置完成后可以点击Debug按钮进行调试。
此时Nios2的开发环境将刚才编译的二进制代码通过USB Blaster下载电缆,下载到FPGA片内的onchip-memory中,然后将Nios2的指令指针指向程序的第一条语句。
注意,在调试程序前必须将硬件开发过程中生成的sof文件下载到FPGA里,否则FPGA里面是没有Nios2的CPU软核,程序将无法下载。
这时程序会停在man函数的第一条语句,点击全速运行按键,我们会在控制台里面看到程序运行的结果。
程序在控制台里打出一段字符串,这就是整个程序的运行结果。
总结上面我们通过建立一个Nios2的最小系统,带领大家走过了从硬件到软件整个开发流程,看到了Nios2运行的结果。
通过这个简单的例子,我们劈开了很多复杂繁琐的设置过程,让Nios2清晰的展现在大家面前。
Nios2的开发不是想象中那么神秘,我们只要循序渐进的学习才能真正领会Nios2的强大和灵活。
上面的例子只是展示了一个可以运行的Nios2,它的功能非常简单,简单到只能完成打印一行字符串。
由于受到FPGA片内存储器资源的限制,我们不能构建功能更加强大的代码,因此需要片外扩展Sdram来存储更大的程序代码。
另外,我们的程序是在线下载到内存里面的,断电后程序代码也会消失,我们需要一个外部非易失的存储器如Flash 来存储CPU的软件代码。
下一篇教程,我们将介绍如何扩展外部存储器Sdram和Flash。
程序代码:nios2 c语言编程方法Nios2系列教程2nios2的C语言和X86或者单片机C语言很相似,上层的标准C库函数都是一样的,区别在于与底层硬件相关的各个外设寄存器的结构不同。
如果我们把访问底层硬件寄存器的函数封装起来供上层调用,平台之间的移植就显得很容易了。
下面我总结了一些外设的寄存器结构以及用于访问寄存器的函数。
1.可编程输入、输出口PIO//Defined in pio_struct.h// PIO Peripheral// PIO Registerstypedef volatile struct{int np_piodata; // read/write, up to 32 bitsint np_piodirection; // write/readable, up to 32 bits, 1->output bitint np_piointerruptmask; // write/readable, up to 32 bits, 1->enable interruptint np_pioedgecapture; // read, up to 32 bits, cleared by any write} np_pio;#define IOADDR_ALTERA_A V ALON_PIO_DATA(base) __IO_CALC_ADDRESS_NATIVE(base, 0)#define IORD_ALTERA_A V ALON_PIO_DATA(base) IORD(base, 0)#define IOWR_ALTERA_A V ALON_PIO_DATA(base, data) IOWR(base, 0, data)#define IOADDR_ALTERA_AV ALON_PIO_DIRECTION(base) __IO_CALC_ADDRESS_NATIVE(base, 1)#define IORD_ALTERA_A V ALON_PIO_DIRECTION(base) IORD(base, 1)#define IOWR_ALTERA_A V ALON_PIO_DIRECTION(base, data) IOWR(base, 1, data)#define IOADDR_ALTERA_A V ALON_PIO_IRQ_MASK(base) __IO_CALC_ADDRESS_NATIVE(base, 2)#define IORD_ALTERA_A V ALON_PIO_IRQ_MASK(base) IORD(base, 2)#define IOWR_ALTERA_A V ALON_PIO_IRQ_MASK(base, data) IOWR(base, 2, data)#define IOADDR_ALTERA_A V ALON_PIO_EDGE_CAP(base) __IO_CALC_ADDRESS_NATIVE(base, 3)#define IORD_ALTERA_A V ALON_PIO_EDGE_CAP(base) IORD(base, 3)#define IOWR_ALTERA_A V ALON_PIO_EDGE_CAP(base, data) IOWR(base, 3, data)2。
可编程定时器// Timer Peripheral// Timer Registerstypedef volatile struct{int np_timerstatus; // read only, 2 bits (any write to clear TO)int np_timercontrol; // write/readable, 4 bitsint np_timerperiodl; // write/readable, 16 bitsint np_timerperiodh; // write/readable, 16 bitsint np_timersnapl; // read only, 16 bitsint np_timersnaph; // read only, 16 bits} np_timer;// Timer Register Bitsenum{np_timerstatus_run_bit = 1, // timer is runningnp_timerstatus_to_bit = 0, // timer has timed outnp_timercontrol_stop_bit = 3, // stop the timernp_timercontrol_start_bit = 2, // start the timernp_timercontrol_cont_bit = 1, // continous modenp_timercontrol_ito_bit = 0, // enable time out interruptnp_timerstatus_run_mask = (1<<1), // timer is runningnp_timerstatus_to_mask = (1<<0), // timer has timed outnp_timercontrol_stop_mask = (1<<3), // stop the timernp_timercontrol_start_mask = (1<<2), // start the timernp_timercontrol_cont_mask = (1<<1), // continous modenp_timercontrol_ito_mask = (1<<0) // enable time out interrupt};#define IOADDR_ALTERA_A V ALON_TIMER_STATUS(base) __IO_CALC_ADDRESS_NATIVE(base, 0) #define IORD_ALTERA_A V ALON_TIMER_STATUS(base) IORD(base, 0)#define IOWR_ALTERA_A V ALON_TIMER_STATUS(base, data) IOWR(base, 0, data)#define ALTERA_A V ALON_TIMER_STATUS_TO_MSK (0x1)#define ALTERA_A V ALON_TIMER_STATUS_TO_OFST (0)#define ALTERA_A V ALON_TIMER_STATUS_RUN_MSK (0x2)#define ALTERA_A V ALON_TIMER_STATUS_RUN_OFST (1)#define IOADDR_ALTERA_A V ALON_TIMER_CONTROL(base) __IO_CALC_ADDRESS_NATIVE(base, 1) #define IORD_ALTERA_A V ALON_TIMER_CONTROL(base) IORD(base, 1)#define IOWR_ALTERA_A V ALON_TIMER_CONTROL(base, data) IOWR(base, 1, data)#define ALTERA_A V ALON_TIMER_CONTROL_ITO_MSK (0x1)#define ALTERA_A V ALON_TIMER_CONTROL_ITO_OFST (0)#define ALTERA_A V ALON_TIMER_CONTROL_CONT_MSK (0x2)#define ALTERA_A V ALON_TIMER_CONTROL_CONT_OFST (1)#define ALTERA_A V ALON_TIMER_CONTROL_START_MSK (0x4)#define ALTERA_A V ALON_TIMER_CONTROL_START_OFST (2)#define ALTERA_A V ALON_TIMER_CONTROL_STOP_MSK (0x8)#define ALTERA_A V ALON_TIMER_CONTROL_STOP_OFST (3)#define IOADDR_ALTERA_A V ALON_TIMER_PERIODL(base) __IO_CALC_ADDRESS_NATIVE(base, 2) #define IORD_ALTERA_A V ALON_TIMER_PERIODL(base) IORD(base, 2)#define IOWR_ALTERA_A V ALON_TIMER_PERIODL(base, data) IOWR(base, 2, data)#define ALTERA_A V ALON_TIMER_PERIODL_MSK (0xFFFF)#define ALTERA_A V ALON_TIMER_PERIODL_OFST (0)#define IOADDR_ALTERA_A V ALON_TIMER_PERIODH(base) __IO_CALC_ADDRESS_NATIVE(base, 3) #define IORD_ALTERA_A V ALON_TIMER_PERIODH(base) IORD(base, 3)#define IOWR_ALTERA_A V ALON_TIMER_PERIODH(base, data) IOWR(base, 3, data)#define ALTERA_A V ALON_TIMER_PERIODH_MSK (0xFFFF)#define ALTERA_A V ALON_TIMER_PERIODH_OFST (0)#define IOADDR_ALTERA_A V ALON_TIMER_SNAPL(base) __IO_CALC_ADDRESS_NATIVE(base, 4) #define IORD_ALTERA_A V ALON_TIMER_SNAPL(base) IORD(base, 4)#define IOWR_ALTERA_A V ALON_TIMER_SNAPL(base, data) IOWR(base, 4, data)#define ALTERA_A V ALON_TIMER_SNAPL_MSK (0xFFFF)#define ALTERA_A V ALON_TIMER_SNAPL_OFST (0)#define IOADDR_ALTERA_A V ALON_TIMER_SNAPH(base) __IO_CALC_ADDRESS_NATIVE(base, 5) #define IORD_ALTERA_A V ALON_TIMER_SNAPH(base) IORD(base, 5)#define IOWR_ALTERA_A V ALON_TIMER_SNAPH(base, data) IOWR(base, 5, data)#define ALTERA_A V ALON_TIMER_SNAPH_MSK (0xFFFF)#define ALTERA_A V ALON_TIMER_SNAPH_OFST (0)// Timer Routinesint nr_timer_milliseconds(void); // Starts on first call, hogs timer1.// file: timer_milliseconds.c//// A simple milliseconds counter that REQUIRES a timer// named na_timer1, and hogs it completely up.//#include "excalibur.h"#ifdef na_timer1static void timer_isr_handler(int context);static int milliseconds_count;int nr_timer_milliseconds(void){static int running_yet = 0;if(!running_yet){milliseconds_count = 0;nr_installuserisr(na_timer1_irq,timer_isr_handler,0);na_timer1->np_timerperiodl = (nasys_clock_freq_1000) & 0x0000ffff;na_timer1->np_timerperiodh = (nasys_clock_freq_1000 >> 16) & 0x0000ffff;na_timer1->np_timercontrol =np_timercontrol_start_mask| np_timercontrol_cont_mask| np_timercontrol_ito_mask;running_yet = 1;}return milliseconds_count;}static void timer_isr_handler(int context){milliseconds_count++;na_timer1->np_timerstatus = 0; // write to clear the IRQ }#endif// end of file3。