第一篇:实验四 Nios II 嵌入式处理器关浩亮2012029180002
关浩亮2012029180002 实验四 Nios II 嵌入式处理器
一、实验要求:
1、实现一个由Nios II控制的由18个发光二级管组成的流水灯效果;
2、为了点亮LED灯,程序运行速度不要太快,需要进行适当延时。
二、实验目的:
1,掌握基于SOPC Builder和Nios SBT实现嵌入式系统的硬件、软件设计过程; 2,学会根据需求定制一个Nios II硬件系统,并在此基础上编写应用程序。
三、实验原理和实验内容:
1、SOPC技术
SOPC(System On a Programmable Chip)是指用可编程逻辑技术把整个系统放到一块硅片上。它是一种特殊的嵌入式系统。一方面,它是片上系统(SOC),即由单个芯片完成整个系统的主要逻辑功能;另一方面,它是可编程系统,具有灵活的设计方式,可裁减、扩充、升级,并具备软硬件在系统可编程的功能。这项技术将EDA、计算机设计、嵌入式系统、DSP等技术融为一体。SOPC 结合了SOC 和PLD、FPGA 各自的优点,一般具备以下基本特征:至少包含一个嵌入式处理器内核;具有小容量片内高速RAM 资源;丰富的IP Core 资源可供选择;足够的片上可编程逻辑资源;处理器调试接口和FPGA 编程接口;可包含部分可编程模拟电路;单芯片,低功耗,微封装。
随着EDA 技术的发展和大规模可编程器件性能的不断提高,SOPC 技术已被广泛应用于许多领域。首先,SOPC 在极大提高了许多电子系统性能价格比的同时,还开辟了许多新的应用领域,如高端的数字信号处理、通信系统、软件无线电系统的设计、微处理器及大型计算机处理器的设计等等;同时,由于SOPC 具有基于EDA 技术标准的设计语言与系统测试手段、规范的设计流程与多层次的仿真功能以及高效率的软硬件开发与实现技术,使得SOPC 及其实现技术无可争议地成为现代电子技术最具时代特征的典型代表。与基于ASIC 的SOC 相比,SOPC 具有更多的特点与吸引力:开发软件成本低,硬件实现风险低,产品上市效率高,系统结构可重构及硬件可升级等,它还具有设计者易学易用、高附加值、产品设计成本低等优势。
关浩亮2012029180002 Nios II是Altera公司推出的新一代软核嵌入式处理器。借助于Nios II、FPGA和Altera公司完整的开发套件,可以快速实现设计和验证,有效提高系统性能。
2、基于Nios II的硬件开发基本过程
(1)定义NiosⅡ嵌入式处理器系统:使用SOPC Builder系统综合软件选取合适的CPU、存储器以及外围器件,并定制其功能。
(2)指定目标器件、分配引脚、编译硬件:使用QuartusⅡ选取Altera器件系列,并对SOPC Builder生成的HDL设计文件进行布局布线;再选取目标器件,分配管脚,进行硬件编译选项或时序约束的设置。编译,生成网表文件和配置文件。
(3)硬件下载:使用QuartusⅡ软件和下载电缆,将配置文件下载到开发板上的FPGA中。
3、基于Nios II的软件开发基本过程
(1)在使用SOPC Builder/Qsys进行硬件设计的同时,就可以开始编写独立于器件的C/C++软件,比如算法或控制程序。用户可以使用现成的软件库和开放的操作系统内核来加快开发过程。
(2)在NiosⅡSBT中建立新的软件工程时,SBT会根据SOPC Builder/Qsys对系统的硬件配置自动生成一个定制HAL(硬件抽象层)系统库。这个库能为程序和底层硬件的通信提供接口驱动程序。
(3)使用NiosⅡSBT对软件工程进行编译、调试。
(4)将硬件设计下载到开发板后,就可以将软件下载到开发板上并在硬件上运行。
4、基于Nios II的流水灯实现
在Nios II处理器定制完成后,编写程序控制与发光二极管相连的引脚电平,循环点亮每一个发光二极管,同时熄灭其它二极管,实现简单的流水灯效果。其基本结构如下图所示:
关浩亮2012029180002 CLKPIO_0PIO_1LED_0LED_1CPURESETPIO_171.图中,CLK为CPU的运行时钟;RESET为CPU的复位信号,一般与电源VCC相连,当系统上电时自动完成处理器的复位;并行I/O引脚PIO_0~PIO_17分别与发光二极管相连,用于控制二极管的发光和熄
„„LED_17四.实验设计及仿真波形结果:
硬件设计步骤为:(1)(2)创建QuartusⅡ工程
Nios II 软核配置:启动SOPC Builder,对系统进行命名,添加Nios II Processor,经济型内核“Nios II/e”,JTAG Debug Module配置,配置存储器,配置并行I/O口,(3)完成硬件设计:完成Nios II 软核配置后,回到Quartus II ; • 在原理图编辑窗口中单击鼠标右键将打开一个浮动菜单,选择“Insert→Symbol”命令打开电路符号“Symbol”选择对话框,或者双击原理图空白处。在对话框左侧的“Libraries”选择栏中选择Project下的“Nios2WalLd”,右边的符号窗口将出现对应的电路符号。这个模块就是SOPC Builder工具产生的Nios II软核处理器系统。
• Nios II软核处理器系统引脚“clk_50”应该与时钟输入连接; 复位信号输入端“reset_n”与电源符号“VCC”连接,当芯片上电时自动完成
关浩亮2012029180002 处理器的复位;引脚“pio_18led[17...0]”分别与18个发光二级管连接。
• 执行命令Assignments->Import Assignments„导入板载FPGA的引脚分配文件DE2_115_pin_assignments.csv,并正确命名原理图上的引脚名,使之与正确引脚一一对应。• 正确编译。软件设计步骤为:
Nios II嵌入式开发环境的软件开发工作需要前面产生的Nios II软核处理器系统硬件的支持。在SOPC Builder的“System Generation”选项卡的“Nios II Tools”栏目中单击“Nios II Software Builder Tools for Eclipse”按钮可以打开Nios II SBT开发平台。Nios II SBT工程建立 :
在Quartus工程目录下,建立“software”文件夹;
File->Switch Workspce->Other„,切换为上述“software”文件夹 建立项目
Nios II SBT工程设置 :
选择Quartus工程目录下的SOPC Information File,设定项目名,并选择参考模板中的“Blank_project”,会自动载入相关信息。C源程序设计: File→New→Source File 编译:
“Project→Build Project 编译完成后,“console”栏目将给出储存器的占用情况。之后硬件下载,然后调试/运行程序。C语言程序代码为:
关浩亮2012029180002 #include “system.h” #include “altera_avalon_pio_regs.h” void delay(void);int alt_main(void){
} void delay(void){ unsigned int i;i=1000000;unsigned char led_data;unsigned int led_code;while(1){
IOWR_ALTERA_AVALON_PIO_DATA(PIO_18LED_BASE,led_code);
} return 0;} delay();for(led_data=0;led_data<18;led_data++){ led_code = 0x001< 关浩亮2012029180002 } while(i>0){ } i--;实验板仿真结果如下: 关浩亮2012029180002 关浩亮2012029180002 关浩亮2012029180002 实验结果分析: 在实验板上,正确显示了流水灯依次点亮的实验现象,图示为流水灯依次点亮间隔时间的图像结果,满足实验要求,该实验成功的完成了。 五、问题及思考: 1、如何通过软件设计,将实验中的简单流水灯效果设计得更加多样化? 在while循环语句中添加下面的程序段: for(led_data=0;led_data<18;led_data++) IOWR_ALTERA_AVALON_PIO_DATA(PIO_18LED_BASE,led_code);} { led_code =led_data>>0x001;delay(); 关浩亮2012029180002 可实现左右来回循环的流水灯,增加流水灯的设计效果。 2、如果将流水灯效果用实验板上的LCD来实现,硬件和软件上应该做哪一些修改? LCD为液晶显示屏,在硬件上需要将显示屏的按键连接到原理图的输入输出上。在软件中,要将液晶屏初始化,并添加按键实现灯亮的程序块。 六,心得体会: 本实验完成了流水灯的实现,根据课件的实验步骤内容,基本掌握了基于SOPC Builder和Nios SBT实现嵌入式系统的硬件、软件设计过程;学会了根据需求定制一个Nios II硬件系统,并在此基础上编写应用程序。程序需用C语言来写,利用已有的Nios II嵌入式处理器实现了简单的流水灯依次点亮的实验。本实验使我明白了如何利用已设计好的嵌入式处理器来实现所需的具体实验。 专业:自动化1402 日期:2016.11.01 地点:教2-104 成绩:________________ 实验报告 同组学生姓名:施兴棋 学号:3140103039 同组学生姓名:______________________________ 学号:_____________________________________ 课程名称: 《嵌入式系统》 实验序号: 实验名称: 基于μC/OS-II的LED流水灯控制实验 摘要: 利用μC/OS-II操作系统实现LED流水灯与蜂鸣器控制任务 一、实验目的 (1)掌握LPC2200专用工程模板(for μC/OS-II)的使用 (2)能够在SmartARM2200教学实验开发平台上运行基于μC/OS-II操作系统的程序。(3)掌握基于μC/OS-II的LED操作系统的用户程序的编写风格 二、实验内容 仔细阅读给定程序,建立3个μC/OS-II的任务,1个任务用于分别控制两个LED(P2.30,P2.31)流水灯循环点亮,这里称之为流水灯循环控制任务,一个任务用于检测KEY1按键输入(P0.20口的输入),这里称之为按键检测任务;另外一个任务用于控制蜂鸣器响,这里称之为蜂鸣器控制任务。蜂鸣器控制任务平时处于等待状态,当按键检测任务检测到有效按键输入时,立即唤醒蜂鸣器控制任务,并挂起LED流水灯循环任务,当无有效按键时,两个LED循环点亮,蜂鸣器无输出。 三、实验前准备工作 (1)连接EasyJTAG仿真器和SmartARM2200教学实验开发平台,然后安装EasyJTAG仿真器的驱动程序。(若已经安装过,此步省略。) (2)为ADS1.2增加LPC2200专用工程模板。(若已增加过,此步省略。) (3)建立一个项目目录μC/OS-II,增加μC/OS2.52源代码和移植代码(arm文件夹)。还要将移植的PC服务代码Arm_Pc复制到项目目录μC/OS-II下。 (4)启动ADS1.2,使用ARM Executable Image for μC/OS-II(for LPC2200)工程模板建立一个工程GPIO,工程存储在μC/OS-II目录下。 (5)打开工程窗口user组中的main.c文件,根据给定的例程编写实验程序并保存。(6)根据程序设计更改Os_cfg.h文件,配置μC/OS-II操作系统(本实验可默认配置)。(7)选用DebugInExRam生成目标,然后编译链接工程。 (8)将SmartARM2200教学实验开发平台上的JP2,JP4跳线短接,JP10跳线设置为Bank0-RAM、Bank1-FLASH(生成目标为DebugInExRam)。 (9)选择Project-Debug,启动AXD进行JTAG仿真调试。/ 4 (10)全速运行程序,然后按下/放开KEY1键,监听蜂鸣器是否蜂鸣,LED流水灯是否按要求开通与关断。 (11)当仿真器调试通过后关闭AXD,在ADS1.2集成开发环境中选用RelOutChip生成目标,然后编译链接工程。 (12)将SmartARM2200教学实验开发平台上的JP2、JP4跳线短接,JP1跳线断开,JP10跳线设置为Bank0-FLASH、Bank1-RAM,JP9跳线设置为OUTSIDE。 (15)选择Project-Debug,启动AXD进行JTAG仿真调试。此时EasyJTAG仿真器将会把程序下载到FLASH上。 注意:使用RelOutChip生成目标时,需要在H-JTAG中Load L“PC2200.hfc”文件来配置。(16)按SmartARM2200教学实验开发平台上的RST复位键,观察程序是否能脱机运行。 实验程序编写: #include “config.h” #include “stdlib.h” #define KEY1(1 << 20) /* P0.20为KEY1 */ #define BEEP(1 << 7) /* P0.07为蜂鸣器 */ #define LEDCON 0xf0000000 #define TaskStkLengh 64 //Define the Task0 stack length OS_STK TaskStk0[TaskStkLengh];//Define the Task0 stack 定义用户任务0的堆栈 OS_STK TaskStk1[TaskStkLengh];//Define the Task1 stack 定义用户任务1的堆栈 OS_STK TaskStk2[TaskStkLengh];//Define the Task1 stack 定义用户任务2的堆栈 void Task0(void *pdata); //Task0 任务0 void Task1(void *pdata); //Task0 任务1 void Task2(void *pdata); //Task0 任务2 int main(void){ OSInit(); OSTaskCreate(Task0,(void *)0, &TaskStk0[TaskStkLengh1], 3); OSTaskCreate(Task2,(void *)2, &TaskStk2[TaskStkLengh-1], 5);for(;;) { OSTaskSuspend(OS_PRIO_SELF); OSTaskSuspend(5); IO2SET=0xffffffff; IO0CLR = BEEP; OSTimeDly(OS_TICKS_PER_SEC / 8); IO0SET = BEEP; OSTimeDly(OS_TICKS_PER_SEC / 4); IO0CLR = BEEP; OSTimeDly(OS_TICKS_PER_SEC / 8); IO0SET = BEEP; OSTimeDly(OS_TICKS_PER_SEC / 4); OSTaskResume(5); } } /*************Task1 任务1********************************************/ void Task1(void *pdata){ pdata = pdata; /* 避免编译警告 */ for(;;) { OSTimeDly(OS_TICKS_PER_SEC / 50); /* 延时20毫秒 */ if((IO0PIN & KEY1)!= 0) { continue; } OSTimeDly(OS_TICKS_PER_SEC / 50); /* 延时20毫秒 */ if((IO0PIN & KEY1)!= 0) { continue; } OSTaskResume(2); while((IO0PIN & KEY1)== 0) { OSTimeDly(OS_TICKS_PER_SEC / 50); /* 延时20毫秒 */ OSTaskSuspend(5);//挂起任务2 } OSTaskResume(3); OSTaskResume(5); } } /************************Task2 任务2*************************************/ void Task2(void *pdata){ uint32 seed= 1;/ 4 } pdata = pdata;for(;;seed = seed>>1 |(seed &1)<<1){ IO2CLR = seed <<30 & LEDCON;OSTimeDly(OS_TICKS_PER_SEC/4);IO2SET = ~0;} 四、实验结果及分析 (1)简单描述μC/OS-II应用程序的基本结构。 每一个uC/OS-II应用程序至少要有一个任务,而且每一个任务必须被写成无限循环的形式。(2)能否将实验参考程序的两个任务组合成一个任务?这样做有什么利弊? 可以。合并的话,优点是免除了不少通信交流工作,减少共享资源的数量,减轻操作系统的负担,但缺点是任务的功能变繁杂,任务设计变得复杂,不利于整体程序的编写。 (3)在实验参考程序中,如何设置任务的优先等级?若在例程中设置按键检测任务的优先级高于蜂鸣器控制任务的优先级,程序应如何运行? 可以用OSTaskCreate函数设置任务的优先等级。当同时发生时,程序会先运行按键检测任务,然后再运行蜂鸣器控制任务。 (4)按要实验要求完成实验程序编写 五、心得体会 1.实验的时候粗心大意没有注意到应该使用ARM Executable Image for μC/OS-II(for LPC2200)工程模板来建立工程,依旧使用之前的模板导致浪费了许多时间。2.编写完程序后进行编译,一开始出现的实验现象是按键后蜂鸣器响而流水灯循环不变,修改程序后变为:按键后蜂鸣器响流水灯循环停止,第二次按键后流水灯任务恢复;再请教老师后,发现问题在于任务1没有设置好流水灯任务(即任务2)的挂起与恢复。正确设置任务2的挂起后,发现现象为:按键后蜂鸣器响流水灯循环停止,按住按键不放流水灯任务恢复,但在此过程中蜂鸣器鸣叫了两次。严格要求的老师验收后不予通过,继而我只好继续修改程序,最终达到了老师的要求。 3.最终的实验现象为:按下按键后流水灯任务挂起,蜂鸣器响;长按按键流水灯任务挂起蜂鸣器响,松开后流水灯任务恢复而蜂鸣器不响。/ 4 实验四 LCD显示实验 一、LCD显示原理 LCD显示器是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。因此,LCD的驱动控制归于对每个液晶单元通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使用光线通过(也有刚好相反的,即不通电时光线通过,通电时光线不通过)。 光源的提供方式有两种:透射式和反射式。笔记本电脑的LCD显示屏即为透射式,屏后面有一个光源,因此外界环境可以不需要光源。而一般微控制器上使用的LCD为反射式,需要外界提供光源,靠反射光来工作。 LCD的驱动控制 – 总线驱动方式: 一般带有驱动模块的LCD显示屏使用总线驱动方式,这种LCD可以方便地与各种低档单片机进行接口,如8051系列单片机。由于LCD已经带有驱动硬件电路,因此模块给出的是总线接口,便于与单片机的总线进行接口。驱动模块具有八位数据总线,外加一些电源接口和控制信号。而且还自带显示缓存,只需要将要显示的内容送到显示缓存中就可以实现内容的显示。由于只有八条数据线,因此常常通过引脚信号来实现地址与数据线复用,以达到把相应数据送到相应显示缓存的目的。 扫描器控制方式LCD显示屏没有驱动电路,需要与驱动电路配合使用。这种LCD体积小,但需要另外的驱动芯片。通常可以使用带有LCD驱动能力的高档MCU驱动,如ARM系列的S3C44B0。 S3C44B0中具有内置的LCD控制器,它具有将显示缓存中的图象数据传输到外部LCD驱动电路的逻辑功能。S3C44B0中内置的LCD控制器可支持灰度LCD和彩色LCD。可以支持单色、4 级灰度和16 级灰度模式的灰度LCD以及256级彩色。对于不同尺寸的LCD,具有不同数量的垂直和水平象素、数据接口的数据宽度、接口时间及刷新率,而LCD控制器可以进行编程控制相应的寄存器值,以适应不同的LCD显示板。二 JXARM9-2410 LCD图形显示原理: JXARM9-2410的LCD显示模块由S3C2410的LCD控制器和256色其显示方式以直接操作显示缓冲区的内容进行,LCD控制器会通过DMA从显示缓冲区中获取数据,不需要CPU干预。彩色LCD显示器组成。本系统采用的LCD分辨率为320X240,工作在256色彩色显示模式,在该模式下,显示缓冲区中的一个字节数据代表LCD上的一个点的颜色信息,因此,所需要的显示缓冲区大小为320X240X1字节。其中每个字节的彩色数。 其中每个字节的彩色数据格式如下图所示: JXARM9-2410 LCD控制器初始化: 初始化LCD端口,由于LCD控制端口与CPU的GPIO端口是复用的,因此必须设置相应寄存器为LCD驱动控制端口。 申请显示缓冲区,大小为320X240X1字节。初始化LCD控制寄存器,包括设置LCD分辨率,扫描频率,显示缓冲区等。HZK组成:每个汉字占用32个字节,每个区为94个汉字。 在计算机中,汉字是以机内码的形式存储的,每个汉字占用两个字节:第一个字节为区码(qh),为了与ASCII码区别,范围从十六进制的0A1H开始(小于80H的为ASCII码字符),对应区位码中区码的第一区;第二个字节为位码(wh),范围也是从0A1H开始,对应某区中的第一个位码。 这样,将汉字机内码减去0A0AH就得该汉字的区位码。因此,汉字在汉字库中的具体位置计算公式为: location =(94*(qh-1)+wh-1)*一个汉字字模占用字节数 一个汉字字模占用的字节数根据汉字库的汉字大小不同而不同。以HZK16点阵字库为例,字模中每一点使用一个二进制位(Bit)表示,如果是1,则说明此处有点,若是0,则说明没有。这样,一个16×16点阵的汉字总共需要16*16/8=32个字节表示。 字模的表示顺序为:先从左到右,再从上到下,也就是先画左上方的8个点,再是右上方的8个点,然后是第二行左边8个点,右边8个点,依此类推,画满16×16个点。因此,HZK16中汉字在汉字库中具体位置的计算公式为:(94*(qh-1)+(wh-1))*32。 汉字“房”的机内码为十六进制的“B7BF”,其中“B7”表示区码,“BF”表示位码。所以“房”的区位码为0B7BFH-0A0A0H=171FH。将区码和位码分别转换为十进制得汉字“房”的区位码为“2331”,即“房”的点阵位于第23区的第31个字的位置,相当于在文件HZK16中的位置为第32×[(23-1)×94+(31-1)]=67136B以后的32个字节为“房”的显示点阵。 三、实验基本步骤: 1.将仿真器及usb线,com串行线,S3C2410实验板与电脑连接好。 2.添加asm、common、include、misc、五个文件,在软件ADT中新建文件,建立工程。 3.设置运行所需要的参数:将一般设置设为arm9usb,添加相应的脚本文件。 4.main函数及显示函数如下: *********************************************************************/ void Main(void){ /* 配置系统时钟 */ ChangeClockDivider(1,1); // 1:2:4 ChangeMPllValue(0xa1,0x3,0x1); // FCLK=202.8MHz /* 初始化端口 */ Port_Init(); /* 初始化串口 */ Uart_Init(0,115200); Uart_Select(0); /* 打印提示信息 */ PRINTF(“n---LCD测试程序---n”);PRINTF(“n请将UART0与PC串口进行连接,然后启动超级终端程序(115200, 8, N, 1)n”); /* LCD初始化 */ Lcd_Port_Init();#ifdef STN_LCD Lcd_Init(MODE_CSTN_8BIT); Glib_Init(MODE_CSTN_8BIT); Lcd_CstnOnOff(1); Glib_ClearScr(0xff, MODE_CSTN_8BIT);#else #ifdef TFT_8_0 rGPCCON &= ~(3<<8); rGPCCON |=(2<<8); Lcd_Init(MODE_TFT_16BIT_640480); Glib_Init(MODE_TFT_16BIT_640480); Glib_ClearScr(0xffff, MODE_TFT_16BIT_640480); Lcd_PowerEnable(0, 1); Lcd_EnvidOnOff(1); #else Lcd_Init(MODE_TFT_16BIT_240320); Glib_Init(MODE_TFT_16BIT_240320); Glib_ClearScr(0xffff, MODE_TFT_16BIT_240320); Lcd_PowerEnable(0, 1); Lcd_EnvidOnOff(1); #endif #endif #define LCD_DISP_CHAR #ifdef LCD_DISP_CHAR Lcd_Disp_Char();#else Lcd_Disp_Grap();#endif while(1){ } } void Lcd_Disp_Char(void){ /* 显示字符串 */ Glib_disp_hzk16(30,100,“武汉创维特信息技术有限公司”, 0x0);while(1);} void Lcd_Disp_Grap(void){ int i,j; for(j=0;j<240;j++)for(i=0;i<320;i++)//RRRGGGBB PutPixel(i,j,((i/40)<<5)+((j/30)<<2)+(((j/15)%2)<<1)+((i/20)%2));} 5.编译工程文件-->连接-->下载-->全速运行; 6.Lcd将会显示汉字“武汉创维特信息技术有限公司”。 7.至此实验完毕。 四.实验小结: 通过本次试验,通过了lcd显示实验效果,使我更加直观的看到嵌入式实验的功能与其强大的功能,对自己选择嵌入式为学习对感到十分骄傲和自豪,我一定会努力学习相关知识,在嵌入式方面获得更多地提高。第二篇:嵌入式实验四实验报告
第三篇:嵌入式应用实验报告,实验四 LCD显示实验信科10级cumt