niosii入门手册_第1页
niosii入门手册_第2页
niosii入门手册_第3页
niosii入门手册_第4页
niosii入门手册_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、建立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)此时,工程已经建立完成,接下来需要建立一个原理图输入

2、文件,点击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为时钟值双击可修改其值。即软核的时钟就是100。()建立nios ii处理器点击rocessors -> Nios ii Processor 如图2.3所示图2.3点击后,将出现下图,在下图

3、中选择软核的类型。这里提供了三种类型,Nios II/e占用资源最少600-800LEs,功能也最简单,速度最慢。Nios II/s占资源比,前者多一些,功能也多了,速度也忚一些Nios II/f占资源最多,功能也最多,速度就最快,用户可根据实际的需要选择不同的类型。此处选择Nios II/f型,速度和功能都能满足。下方Reset Vector是复位后启动的Memory类型和偏移量。待SDRAM设置号以后再来设置此处。图2.4点击Next,如下图所示,将Data Cache设置为None,即关闭Data Cache。图2.5接下来连续点击Next 3次,此时的界面如下图所示。图2.6在这里设置

4、JTAG Debug Module,即是Jtag调试时所用到的功能模块,功能越多,所占用的资源也就越多。从上图可以看见Level1 ->Level4功能逐渐增多,占用的资源也随之增加。此处选择Level1。点击Finish如图2.7所示,右击cpu_0 ->Rename可修改处理器的名称。图2.7(3)建立JATG URAT模块JTAG UART是实现PC和Nios II系统间的串行通信接口,它用于字符的输入和输出,是Nios ii系统开发调试中重要的工具,具体设置如图2.8所示。双击Interface Protocos ->Serial->JTAG UART图2.8点

5、击Interface Protocos ->Serial->JTAG UART如图2.9所示图2.9此项无需修改点击Next直至完成即可。此时显示的界面如图2.10所示:图2.10(4)建立SDRAM模块首先应建立SDRAM控制器,具体设置如图2.11所示图2.11双击SDRAM Controller,显示如下界面。图中Presets选项为SDRAM的型号此处选择Custom,以下几项按照SDRAM数据手册上的参数来设置即可。具体设置如下:图2.12点击Finish即可完成SDRAM控制器的设置。设置好SDRAM后如下图所示。图2.13双击CPU_0显示如下,将Reset Vect

6、or项和Exception Vector设置为SDRAM_0。图2.14至此基本模块已经建立完成。实验1 LED闪烁实验在以上模块的基础上建立PIO模块,具体设置如下图所示。图2.15双击PIO(Parallel I/O)后如下图所示,图中第一个设置项为PIO的数据宽度。第二个设置项伟IO口的方向设置,类型从上到下依次为双向口、只输入、输入输出、只输出。最后一项为IO口复位的初始值。图2.16接着点击Finish完成PIO模块的建立,并将其改名为LED,如下图所示图2.17接着进行基地址的自动分配,具体设置如下图所示。图2.18到此,LED闪烁实验所用到的软核已经构建完成。接下来就开始编译了,

7、首先保存一下,再点击Generate,开始编译,编译会用较长的时间,编译结束后显示如下点击Exit,进入Quartus ii软件调用刚刚生成的软核,双击Quartus ii软件中的空白处,弹出如下窗口点击led即可调用led软核。接下来为软核添加引脚,如下图所示:右击软核,选择Generate Pin For Symbol Parts 将显示下图接下来需要建立一个锁相环为SDRAM提供时钟具体过程如下,双击空白处,设置如下点击显示如下,点击Next。接下来点击IO- > Altpll,在填入PLL的名称,点击Next。在下图的第二选项中选择锁相环的输入时钟,此处选择50Mhz, 接着点击

8、Next。进行如下设置下图中第一个选项框中填入倍频系数,第二个选项框中填入分频系数,可根据需要进行设置,由于Nios ii软核的时钟设置的时100M,故在第一个选项框中填入2,第三个选项框为锁相环输出时钟的起始相位,如下图所示。接着点击Next连续点击Finish即可完成锁相环的设置。然后双击空白处接着点击Project调用PLL,并生成端口,进行如下连接接着,进行如下设置在出现的窗口中选择项,出现下图所示的界面点击Unused Pin 进行如下设置,将所有未用到的引脚设置为三态输入,以免功耗过大烧坏FPGA芯片图3-1然后点击ok即可,接下来编译Quartus ii工程编译结束后就可以分配引

9、脚了,具体设置如下设置后出现如下图所示的界面,在引脚名称后填入对应的编号即可接下来再次编译Quartus ii工程。同时将Nios ii 9.1 IDE 进入如下界面关闭Welcome,出现如下界面。点击File->New->Project 出现如下界面 ,点击下图蓝色处点击Next出现下图所示界面,第一行是工程名在Browse,选择路径为Quartus ii工程的存储路径,从中加入ptf文件,加入后会在下面出现一个CPU,如下图所示点击Finish即可。出现下图所示的界面图3-2将原程序拷入再进行如下设置,点击Run - >Run,进入如下界面再点击Target Conne

10、ction进行如下设置在JTAG cable中选择USB_Blaster,JTAG Device中选择EPCS,点击Apply,然后点击Close。在上图中点击Project ->Build All编译工程,或者是快捷键(Ctrl+B)由于第一次编译工程要对很多库文件进行编译,所以第一次编译的时间会很长,以后的时间会较短,注意:每次编译之前要进行保存,在编译时文件不会自动保存,也不会提示用户该文件没有保存。编译完后再进行如下设置点击Tool ->Programmer,出现如下的界面。在Mode中选择JTAG,再点击ADD File,出现如下界面双击led.sof文件即可,在下图所示

11、的界面中点击Start执行此项即将Quartus II 中的软核下载到fpga中,接下来就是将Nios ii中得出程序下载到软核中去,具体方法是点击Run ->Run As ->Nios ii Hardware 。执行后,用户可以看见fpga核心板上的led在不断地闪烁。接下来解释一下如下出现#include "system.h"#include "altera_avalon_pio_regs.h"#include "alt_types.h"#include "unistd.h"#define led_

12、on IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 0x01) #define led_off IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 0x00) void fun();void main (void) while (1) /if (IORD_ALTERA_AVALON_PIO_DATA(KEY)=0) fun(); void fun(void) led_on; usleep(90000); led_off; usleep(90000); 出现中的#define led_on IOWR_ALTERA_AVALON_PIO_DAT

13、A(LED_BASE, 0x01) #define led_off IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 0x00) 为在指定的地址输出低电平和高电平。 usleep(90000);为Nios ii库函数中得延时函数,基本延时为1us即(usleep(1)的延时为1us)。实验二 外部中断实验首先进入Sopc Builder,按照前面所讲的方法,将cpu,sdram,jtag配置好,如下图所示。 图4-1图中的interr的配置按如下方式进行。点击Peripherals ->Microcontroller Peripherals ->pio弹出

14、如下窗口。选择input ports only,点击next选择input ports only,点击next出现如下界面。图中Generate IRQ为产生中断,即该端口具有中断的功能。Level为中断的类型,电平中断Edge为边沿中断,选择电平中断,注意:电平中断默认是高电平有效,点击Finish。接着再配置一个只输出的引脚来验证是否进入中断,配置方法和实验一的是相同的。接着自动分配基地址,中断优先级可手动修改。然后点击Generate生成软核。接着在Quartus ii 中调用软核进行如下连接。接着编译工程,并将未用到的端口设置为三态输入。设置方法见图3-1所示。分配引脚,再次编译工程,

15、结束后将程序下载到fpga中。打开Nios ii软件,按照实验1的步骤进行设置,打开软件以后将出现3-2所示的界面。首先编译工程,接着将在System.h中可以看见如下程序#define INTRERR_NAME "/dev/intrerr"#define INTRERR_TYPE "altera_avalon_pio"#define INTRERR_BASE 0x01001000#define INTRERR_SPAN 16#define INTRERR_IRQ 1#define INTRERR_IRQ_INTERRUPT_CONTROLLER_ID

16、0#define INTRERR_DO_TEST_BENCH_WIRING 0#define INTRERR_DRIVEN_SIM_VALUE 0#define INTRERR_HAS_TRI 0#define INTRERR_HAS_OUT 0#define INTRERR_HAS_IN 1#define INTRERR_CAPTURE 0#define INTRERR_DATA_WIDTH 1#define INTRERR_RESET_VALUE 0#define INTRERR_EDGE_TYPE "NONE"#define INTRERR_IRQ_TYPE &quo

17、t;LEVEL"#define INTRERR_BIT_CLEARING_EDGE_REGISTER 0可以看见INTRERR_IRQ 1与图4-1中所示的INTRERR的中断优先级一样的,都为1。接下来讲解一下Nios ii的硬件中断,首先介绍一下与硬件中断相关的内容,让用户对 Nios ii 的硬件中断有一个概括性的了解。 ISR(Interrupt Service Routine)中断服务函数是为硬件中断服务的子程序。Nios ii处理器支持32 个硬件中断,每一个使能了的硬件中断都应该有一个ISR与之对应。中断产生时,硬件中断处理器会根据检测到的有效中断级别,调用相应的 IS

18、R为其中断服务。要完成硬件中断工作,需要做两件事: 第一,注册中断函数ISR,它的原函数型如下所示:Int alt_irq_register(alt_u32 id, void* context, void(*handler) (void*,alt_u32);id:中断优先级,即所注册的ISR是为哪个中断优先级的中断服务的。中断优先级在 SOPC Builder 中分配的,如下图所示红圈标示。中断的优先级可人为修改,0的优先级最高。接下来介绍Context和Handler两个参数。Context,为所注册的 ISR传递参数,可以是NULL;Handler,中断服务函数ISR的指针。再来说返回值,

19、返回值是 0 时,表示中断注册成功;返回为负数,表明中断注册失败。此处有一个需要注册的地方,如果 handler 不是NULL,则该优先级中断在注册成功后将自动使能,也即是说,只要在handler 处有相应的ISR,就不需要再进行使能处理了。接下来分析外部中断的程序#include "altera_avalon_pio_regs.h"#include "stdio.h" #include "system.h"#include "alt_types.h" #include <io.h>#include&l

20、t;inter.h>#include<LED.C>int flag;void led(void);int init_key(void);void isr_key(void *context ,unsigned long id);int main() IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INTRERR_BASE,1);/使能中断 while(1) if (!init_key() printf("sucessfull"); else printf("unsucessfull"); if(flag) led();

21、return 0;void isr_key(void *context ,unsigned long id) IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INTRERR_BASE,0);/禁止中断 flag=flag; printf("okn%dn",flag);int init_key(void) IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INTRERR_BASE,1); return alt_irq_register(INTRERR_IRQ,INTRERR_BASE,isr_key);/注册中断处理函数void led(void

22、) IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,1); usleep(100000); IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0); usleep(100000);其中init_key(void)函数的功能是使能外部中断,并注册中断处理函数。在语句alt_irq_register(INTRERR_IRQ,INTRERR_BASE,isr_key);第一个参数INTRERR_IRQ即为中断优先级号,可在system.h中查得;第二个参数为所注册的中断处理函数的传递参数,此处为INTRERR_BASE,即INTRERR的基地址;第三

23、个参数isr_key即为中断处理函数。在程序中void isr_key(void *context ,unsigned long id)即为中断处理函数,在函数中首先禁止中断,允许下次中断。接着将标志位flag取反,并在Nios ii的下方打印出ok。在主函数中循环检测中断是否注册成功,如果注册成功,将打印输出successful,否则打印输出unsuccessful。接下来再次编译工程,点击Project ->Build All,如下图所示。编译完成后,再点击hello_world_0 ->Run As ->Nios ii Hardware可以看见下方窗口打印出得字符,如下

24、图所示。能够打印出ok说明中断注册成功并产生了中断,此处为低电平产生中断,由于Nios ii默认是高电平产生中,在Quartus ii 中的interr引脚前加入了一个反相器,所以此处为低电平产生中断。实验三 Nios ii 控制lcd-12864想要驱动lcd-12864液晶,首先要知道12864液晶的使用方法和编程方法,接下来将要介绍12864液晶的基础知识。一、 带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点

25、ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。二、 基本特性:(1)、低电源电压(VDD:+3.0-+5.5V)(2)、显示分辨率:128×64点 (3)、内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) (4)、内置 128个16×8点阵字符 (5)

26、、2MHZ时钟频率 (6)、显示方式:STN、半透、正显 (7)、驱动方式:1/32DUTY,1/5BIAS (8)、视角方向:6点 (9)、背光方式:侧部高亮白色LED,功耗仅为普通LED的1/51/10 (10)、通讯方式:串行、并口可选 (11)、内置DC-DC转换电路,无需外加负压 (12)、无需片选信号,简化软件设计(13)、工作温度: 0 - +55 ,存储温度: -20 - +60模块接口说明:*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

27、*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。2.2并行接口管脚号管脚名称电平管脚功能描述1VSS0V电源地2VCC3.0+5V电源正3V0-对比度(亮度)调整4RS(CS)H/LRS=“H”,表示DB7DB0为显示数据RS=“L”,表示DB7DB0为显示指令数据5R/W(SID)H/LR/W=“H”,E=“H”,数据被读到DB7DB0R/W=“L”,E=“HL”, DB7DB0的数据被写到IR或DR6E(SCLK)H/L使能信号7DB0H/L三态数据线8DB1H/L三态数据线9DB2H/L三态数据线10DB3H/L三态数据线11DB4H/L三态数据线12DB5H/L

28、三态数据线13DB6H/L三态数据线14DB7H/L三态数据线15PSBH/LH:8位或4位并口方式,L:串口方式16NC-空脚17/RESETH/L复位端,低电平有效18VOUT-LCD驱动电压输出端19AVDD背光源正端(+5V)(见注释3)20KVSS背光源负端了解了引脚的功能,还需知道其操作时序。如下图如果如何在 NIOS 下驱动液晶屏。从以上资料可知,需要程序控制的引脚有RS,R/W,EN,DB0-DB7。首先,我们需要在软核中四个PIO模块,如下图所示图中lcd_data与是液晶的数据总线,由于液晶需要读忙标志,所以设置lcd_data为双向口位宽为8位,RS,RW,EN均设置为输

29、出。Cpu,sdram,jtag,设置和实验一相同。设置好以后,自动分配基地址,中断优先级,再进行编译。然后回到Quartus ii中分配好引脚。至此硬件部分设置就已结束了。接下来打开Nios ii软件,建立好工程以后第一步进行工程的编译。在本节将要介绍如何在Nios ii中在线调试,这也是一个非常重要的工具。编译结束后,需要编写一个12864的驱动函数,在编写驱动函数之前,先介绍一下几个常用的函数函数原型:IORD(BASE, REGNUM) 输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量函数说明:从基地址为BASE的设备中读取寄存器中偏移量为REGNU

30、M的单元里面的值。寄存器的值在地址总线的范围之内。返回值:  函数原型:IOWR(BASE, REGNUM, DATA)输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量,DATA为要写入的数据函数说明:往偏移量为REGNUM寄存器中写入数据。寄存器的值在地址总线的范围之内。返回值:  函数原型:IORD_32DIRECT(BASE, OFFSET)输入参数:BASE为寄存器的基地址,OFFSET为寄存器的的偏移量函数说明:从地址位置为BASE+OFFSET的寄存器中直接读取32Bit的数据。返回值: 

31、; 函数原型:IORD_16DIRECT(BASE, OFFSET) 输入参数:BASE为寄存器的基地址,OFFSET为寄存器的的偏移量函数说明:从地址位置为BASE+OFFSET的寄存器中直接读取16Bit的数据。返回值:  函数原型:IORD_8DIRECT(BASE, OFFSET) 输入参数:BASE为寄存器的基地址,OFFSET为寄存器的的偏移量函数说明:从地址位置为BASE+OFFSET的寄存器中直接读取8Bit的数据。返回值:  函数原型:IOWR_32DIRECT(BASE, O

32、FFSET, DATA)输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量,DATA为要写入的数据。函数说明:往地址位置为BASE+OFFSET的寄存器中直接写入32Bit的数据。返回值: 函数原型:IOWR_16DIRECT(BASE, OFFSET, DATA)输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量,DATA为要写入的数据。函数说明:往地址位置为BASE+OFFSET的寄存器中直接写入16Bit的数据。返回值: 函数原型:IOWR_8DIRECT(BASE, OFFSET, DAT

33、A)输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量,DATA为要写入的数据。函数说明:往地址位置为BASE+OFFSET的寄存器中直接写入8Bit的数据。返回值: 接着写12864的驱动函数。具体函数如下#include "altera_avalon_pio_regs.h"#include "stdio.h"#include "string.h" / strlen() #include "system.h"#include "alt_types.h" #include

34、 "unistd.h" #include <stdio.h>#include <sys/unistd.h>#include <io.h>void Lcd12864a_WrChar(alt_u8 row,alt_u8 col,alt_u8 *pCN,alt_u8 n);void Lcd1284a_Init(void) ;void Lcd12864a_WrCmd(alt_u8 cmd);void Lcd12864a_WrData(char data);void Lcd12864aa_WrData(unsigned char data);voi

35、d main() int i; IOWR_ALTERA_AVALON_PIO_DIRECTION(LCD_DATA_BASE, 0xff); Lcd1284a_Init(); Lcd12864a_WrCmd(0x80); char s="niosii_lcd12864液晶" Lcd12864aa_WrData(s); /* 函数原型:void Lcd1284a_Init(void) 功能 :初始化12864液晶 参数 :无 返回值 :无 */ void Lcd1284a_Init(void) Lcd12864a_WrCmd(0x30); usleep(100); Lcd12

36、864a_WrCmd(0x30); usleep(37); Lcd12864a_WrCmd(0x0F); usleep(100); Lcd12864a_WrCmd(0x01); usleep(100); Lcd12864a_WrCmd(0x02); usleep(100); Lcd12864a_WrCmd(0x06); usleep(100); /* 函数原型: void LCD12864a_CheckBusy(void) 功能 :判别12864液晶是否处于忙状态 参数 :无 返回值 :无 */ void LCD12864a_CheckBusy(void) IOWR_ALTERA_AVALON

37、_PIO_DATA(RS_BASE,0); IOWR_ALTERA_AVALON_PIO_DATA(WR_BASE,1); IOWR(EN_BASE,0,1); IOWR_ALTERA_AVALON_PIO_DIRECTION(LCD_DATA_BASE, 0x00); usleep(72); while(IORD_ALTERA_AVALON_PIO_DATA(LCD_DATA_BASE) & 0x80)=0x80);/查busy IOWR(EN_BASE,0,0); usleep(72); IOWR_ALTERA_AVALON_PIO_DIRECTION(LCD_DATA_BASE,

38、 0xff);/* 函数原型: void Lcd12864a_WrCmd(alt_u8 cmd) 功能 :向12864液晶写入命令 参数 :alt_u8 cmd 返回值 :无 */ void Lcd12864a_WrCmd(alt_u8 cmd) LCD12864a_CheckBusy(); IOWR_ALTERA_AVALON_PIO_DATA(RS_BASE,0); IOWR_ALTERA_AVALON_PIO_DATA(WR_BASE,0); IOWR_ALTERA_AVALON_PIO_DATA(EN_BASE,1); IOWR_ALTERA_AVALON_PIO_DATA(LCD_D

39、ATA_BASE,cmd); IOWR_ALTERA_AVALON_PIO_DATA(EN_BASE,0); usleep(72); /* 函数原型: void Lcd12864a_WrData(char data) 功能 :向12864液晶写入数据 参数 :char data 返回值 :无 */ void Lcd12864a_WrData(char data) int i=0x80,k=0; LCD12864a_CheckBusy(); IOWR_ALTERA_AVALON_PIO_DATA(RS_BASE,1); IOWR_ALTERA_AVALON_PIO_DATA(WR_BASE,0); IOWR_ALTERA_AVALON_PIO_DATA(EN_BASE,1); IOWR_ALTERA_AVALON_PIO_DATA(LCD_DATA_BASE,data); IOWR_ALTERA_AVALON_PIO_DATA(EN_BASE,0); usleep(72); /* 函数原型: void Lcd12864a_WrChar(alt_u8 row,alt_u8 col,alt_u8 *pCN,alt_u8 n) 功能 :向指定行列写入n个数据 参数 :alt_u8 row,alt_u8 col,alt_u8 *pCN,alt_u8 n 返回值 :无 */ vo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论