sopc实验(三).doc_第1页
sopc实验(三).doc_第2页
sopc实验(三).doc_第3页
sopc实验(三).doc_第4页
sopc实验(三).doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

SOPC实验指导书上海电力学院计算机与信息工程学院20093第1章 DE2实验开发平台1.1 DE2实验板资源与布局 DE2实验平台是Altera公司针对大学和研究机构推出的FPGA开发平台,它为用户提供了丰富的外设,涵盖了常用的各类硬件和接口,如各类存储器、USB、以太网、视频、音频、SD卡、液晶显示等,除此之外,DE2还提供扩展接口供用户定制使用,可用于多媒体开发、SOPC嵌入式系统和DSP等各类应用的实验和开发。 DE2实验板布局图如图1.1所示。图1.1 DE2开发板布局DE2平台提供的主要资源有:(1) Altera CycloneII系列FPGA芯片EP2C35F672C6(U16)。(2) 主动串行配置器件EPCS16(U30)。(3) 编程调试接口USB Blaster,支持JTAG模式和AS模式,其中U25是实现USB Blaster的USB接口芯片FT245B;U26为CPLD芯片EPM3128,用以实现JTAG模式和AS模式配置,可以用SW19选择配置模式;USB Blaster的USB口为J9 。(4) 512K 字节SRAM(U18)。(5) 8M 字节SDRAM(U17)。(6) 1M字节闪存(U20)。(7) SD卡接口(U19)。(8) 4个手动按钮(KEY0-KEY3)和18个拨动开关(SW0-SW17)。(9) 9个绿色LED(LEDG0-LEDG8)和18个红色LED(LEDR0-LEDR17)。(10) 板上时钟源(50MHz晶振Y1和27MHz晶振Y3),外部时钟接口(J5)。(11) 音频编解码芯片WM8371(U1),麦克风输入(J1)、线路输入(J2)、线路输出(J3)。(12) VGA数模转换芯片ADV7123(U34),VGA输出接口(J13)。(13) TV解码器ADV7178B(U33),TV接口(J12)。(14) 10/100M以太网控制器DM9000AE(U35),网络接口(J4)。(15) USB主从控制器ISP1362(U31),USB主机接口(J10),设备接口(J11)。(16) RS232收发器(U15),DB9连接器(J6)。(17) PS/2鼠标/键盘连接器(J7)。(18) IRDA红外收发器(U14)。(19) 带二极管保护的40针扩展口(JP1、JP2)。(20) 2X16字符LCD模块(U2)。(21) 总电源开关(SW18),直流9V供电(J8)。1.2 DE2 实验平台结构DE2平台上包含了丰富的硬件接口,组成结构如图所示27MHz时钟/50MHz时钟/外部时钟CycloneIIFPGAEP2C3516bit音频CODECUSB2.0主机/设备10bit VGA DAC10/100M以太网TV解码器SD卡8个绿色LEDIRDA红外收发器18个红色LED1MByte闪存16X2字符LCD模块8MByte SDRAMPS2/RS232端口512Kbyte SRAM18个拨动开关8个7段数码管4个按钮2个40脚扩展口USBBlasterEPCS16配置器件图1.2 DE2平台结构DE2平台的核心是Altera公司的FPGA芯片EP2C35F672,该芯片是Altera公司CycloneII系列产品之一。EP2C35F672采用Fineline BGA 672脚的封装,可以提供多达475个I/O引脚供使用者使用。第2章 SOPC开发环境2.1 Altera SOPC系统设计的软件工具本书实验都是针对Altera公司的NiosII软核处理器设计的。基于32位的NiosII软核处理器进行嵌入式系统设计包含了硬件配置、硬件设计、硬件仿真、软件设计以及软件调试等多个步骤。Altera提供了SOPC系统设计的完整的软件工具,主要有如下几部分:QuartusII:用于完成Nios系统的综合、硬件优化、适配、编程下载和硬件系统调试;SOPC Builder: Nios嵌入式处理器软件开发包,用于实现Nios系统的配置、生成及软件调试平台的建立,SOPC Builder工具集成在QuartusII软件中;Megacore IP:集成了Altera 公司提供的知识产权(IP) 内核NiosII IDE:Nios嵌入式系统软件开发集成环境,用于软件调试;DSP Builder:和Matlab软件协同工作,可用于生成Nios系统的硬件加速器,适用于内嵌DSP处理模块的FPGA系列;在进行SOPC系统设计前,需要安装QuartusII和NiosII开发软件,如果需要使用DSP Builder,则要先安装MATLAB7.0以上的版本。本书以Windows环境下QuartusII6.1和NiosII EDS6.1为例。l 需安装软件当你获得正版的QuartusII软件包后,需要安装以下几部分内容:(1)QuartusII 6.1(2)MegaCore IP 6.1(3)NiosII EDS 6.1(4)DSP Builder v6.1除此以外,还可以安装Modelsim等第三方仿真软件来配套使用。l 软件的获得和下载你可以通过代理购买QuarutusII软件包,获得安装DVD。除此以外,你可以直接到Altera公司的FTP网站去下载相应的软件包,下载地址为/outgoing/release,你可以选择下载所需版本的QuartusII软件包内容,比如windows版QuartusII 6.1版本的文件为61_quartus_windows.exe,MegaCore6.1文件为61_ip_windows.exe,NiosII EDS6.1文件为61_nioseds_windows.exe等,以此类推。l 软件使用许可的设置软件安装完成后,如果你拥有正版的license许可文件,则可以按如下步骤设置软件许可,打开QuartusII软件环境,选Tools菜单,运行License Setup,在License File输入框中输入你包含路径的License文件名然后确认即可,如果你使用的是网络版的使用许可,则输入许可服务器的端口号和IP地址,如:27000 ,其含义表示license运行在IP地址为的服务器的27000端口上。 2.2 SOPC开发流程SOPC系统的开发流程一般分为硬件和软件两大部分,硬件开发主要是创建以NiosII处理器为核心并包含了相应外设的系统,作为应用程序运行的平台;软件开发主要是根据系统应用的需求,利用C/C+语言和系统所带的API函数编写实现所需功能的程序。这样软件运行在相应的硬件上,就构成了完整的SOPC应用系统。可以将NiosII开发流程简化为以下几个步骤:1)在QuartusII中建立工程2)在SOPC Builder中建立NiosII系统模块3)在QuartusII中的图形编辑界面中进行管脚连接、锁定工作4)编译工程后下载到FPGA中5)在NiosII IDE中根据硬件建立软件工程6)编译后,经过简单设置下载到FPGA中进行调试、验证。第3章 SOPC基础实验3.1 实验一 流水灯实验l 实验目的(1)掌握SOPC基本的开发流程。(2)熟悉QuartusII软件的使用。(3)熟悉NiosII IDE集成开发环境。l 实验内容将8位LED灯点亮,进行流水灯控制。l 实验步骤第一步:硬件部分设计(1) 在D:sopcworks下建立一个hello_led文件夹(2) 打开QuartusII,点击下拉菜单中的New project Wizard会弹出如图3.1.1对话框图3.1.1 建立工程(3) 输入工程存放目录,或点击工程路径右面的按钮设置工程存放目录,在第二栏中输入工程名称,这里输入为led;点击finish,此时我们建立好了LED工程文件;(4) 点击Assignments菜单中的Device,选择芯片EP2C35F672C6如下图3.1.2所示;图3.1.2 选定器件(5) 点击Tools下拉菜单下的SOPC Builder工具,出现如图3.1.3对话框:图3.1.3 设定名称(6) 在系统名称(System Name)中填写为NiosII32,选择语言为VHDL后点击OK,在Device Family中选择使用芯片的系列,这里选Cyclone II,更改系统频率为75MHz,在Board中暂时先不选,使用Unspecified Board,如图3.1.4所示;图3.1.4 设定芯片及系统时钟(7) 在左面元件池中选择元件,我们这里需要使用NiosII 32BIT CPU、调试串口、led PIO、RAM,首先选择如图3.1.5所示的Nios Processor,双击后会弹出如图3.1.6所示对话框;在JTAG Debug Module栏中选择level 1,点击Finish按钮后返回SOPC Builder窗口,将CPU_0重新命名为CPU如图3.1.7所示;图3.1.5 选择NiosII图3.1.6 NiosII 设置图3.1.7 重命名CPU注意:对模块命名要遵循以下规则: 名字最前面应该使用英文; 能使用的字符只有英文字母、数字和下划线“_”; 不能连续使用“_”符号,在名字的最后也不能使用“_”。(8) 添加JTAG UART Interface,通过该接口,我们可以在PC主机和SOPC Builder系统之间进行串行字符流更新,主要用来调试、下载数据等,也可以作为标准输入、输出来使用;A选择Communication-JTAG UART加入,会出现设置向导如图3.1.8所示:图3.1.8 JTAG UART设置B保持默认选项,点击Finish,返回SOPC Builder窗口。C将jtag_uart_0重命名为jtag_uart.(9) 添加内部RAM,RAM为程序运行空间,该空间越大越有利,这里使用4Kbytes;A. 选择Memory-On-Chip Memory,双击加入,会出现如图3.1.9所示设置向导;图3.1.9 RAM设置B设置后如上图所示,点击Finish,返回到SOPC Builder窗口,命名为ram;(10) 加入led_pio,此元件为IO口,可以根据需要配置设置选项;A选择Other-PIO,双击加入,出现如图3.1.10所示设置向导:图3.1.10 添加led_pioB选择Output ports only,点击Finish,重新命名为led_pio;(11) 指定基地址和分配中断号,SOPC Builder会给用户的NiosII系统模块分配默认的基地址,用户也可以更改这些默认地址。选择执行System下拉菜单中的Auto-Assign Base Address;选择执行System下拉菜单中的Auto-Assign IRQs;(12) 进行系统设置,选择More “CPU” Settings,按照图3.1.11所示对系统进行设置;图3.1.11 设置系统运行空间(13) 生成系统模块,A选择System Generation栏,如图3.1.12所示图3.1.12 生成CPUB在System Generation中选中HDL选项,若安装了Modelsim软件并需要仿真设计,可以选择Simulation选项。C点击Generation,SOPC Builder会根据用户不同的设定生成系统,在系统生成完成后点击Exit,退出SOPC Builder。(14) 将刚才生成的NiosII32模块以图标形式添加到BDF文件中,SOPC Builder在进行System Generaion的过程中会生成系统模块的图标(Symbol),可以将该图标像一般QuartusII图标一样添加到当前工程的BDF文件中。A单击File-New,弹出图3.1.13所示对话框;图3.1.13 加入原理图文件B选择Block Diagram/Schematic File,如上图所示,点击OK;C在图中单击右键,选择Insert-Symbol,如图3.1.14所示:图3.1.14 加入symbolD在如图3.1.15所示的弹出对话框中选择Project-niosII32,双击加入,点击保存,系统会自动命名为LED,不要再对此修改;图3.1.15 加入NiosII32元件(15) 加入锁相环锁相环能提供精确的系统时钟频率,在图中单击右键,选择Insert-Symbol,弹出对话框如图3.1.16所示,先在megafunction-IO文件夹下选择altpll,此时如图3.1.17所示, MegaWizard Plug-In Manager变为可操作。图3.1.16 加入锁相环图3.1.17进入锁相环设置向导A. 双击MegaWizard Plug-In Manager按钮进入锁相环的设置向导。如图3.1.18所示:图3.1.18 新建锁相环B选中Create a new custuom megafunction variation,点击Next按钮后弹出如图3.1.19所示对话框,在左边列表中选择ALTPLL,在右边输出文件类型选项选择VHDL,在输出文件名输入框中输入altpll0后,点击Next:图3.1.19 建立PLL 模块C弹出如图3.1.20 PLL设置窗口,将输入时钟设为50Mhz,点击Next;图3.1.20 ALTPLL 设置输入时钟D弹出如图3.1.21 PLL设置窗口,去掉areset输入和locked输出选项,点击Next;图3.1.21 设置PLL输入输出选项E弹出inclk1设置窗口,点击Next;F弹出c0输出设置窗口如图3.1.21,将输出时钟频率设为50Mhz,点击Next;图3.1.21 设置c0输出频率G弹出c1输出设置窗口,点击Next;H弹出c2输出设置窗口,点击Next;I在后面两个显示的窗口中继续点击Next和Finish;J系统回到Symbol设置对话框如图3.1.22,可以看到右边显示出ALTPLL0模块,点击OK后回到原理图编辑窗口,将altpll0模块放到合适的位置;图3.1.22 生成altpll0模块(16) 在原理图中点击右键,选择Insert-Symbol,在primitives-pin文件夹下选择input或output,在图中相应位置加入输入输出pin,如图3.1.23连接各模块,将输入输出脚分别命名为CLOCK_50、TD_RESET和LEDG7.0,其中LEDG7.0为8位总线连接。(注意:引脚名称不可修改,因为后面引脚分配时需要导入已有的分配文件,所以此处的引脚名称必须和分配文件中的引脚名称相同才可以)图3.1.23 加入输入输出pin(17) 点击按钮编译工程,检查是否有语法错误。(18) 编译通过后,选择菜单Assignments-Pins,打开引脚配置窗口。这时所有引脚都还未分配,选择菜单Assignments-Import Assignments,打开引脚配置文件导入窗口,选择文件“DE2_pin_assignments.csv”即可,如图3.1.24所示。图3.1.24 引脚配置文件的导入(19) 重新编译并配置FPGA,将编译生成的SOF文件下载到目标板上,选择Tools-Programmer目标文件下载,选择JTAG下载模式,用USB电缆通过J9下载。第二步:软件部分设计(1) 打开NiosII IDE,选择File-New-Project,弹出如图3.1.25对话框:图3.1.25 添加NiosII IDE新工程(2) 选择C/C+ Applicaion,如上图所示;点击Next,弹出图3.1.26所示对话框:图3.1.26 选择工程模板(3) 在Select Project Template中选择Hello LED;在SOPC Builder System中选择我们刚才建立好的工程,CPU栏会自动选择,如上图所示,点击Finish,系统会自动生成一个循环点亮LED的软件工程,在hello_led.c中我们可以看到相应代码;(4) 右键单击工程,选择Build Project,弹出如图3.1.27所示信息:图3.1.27 编译软件工程(5) 选择RUN-RUN,并弹出如图3.1.28所示对话框,点击Nios II Hardware,系统会自动侦测JTAG连接电缆,在Main列表中的Project中显示我们建立的工程Hello_led_0: 图3.1.28 在硬件上运行软件(6) 点击RUN后,目标板上的灯会出现逐个灭的状态,简单流水灯实验软硬件就此完成。(7) 程序代码更改如下:#include system.h#include altera_avalon_pio_regs.h#include alt_types.hconst alt_u8 led_data8=0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF; int main (void) int count=0; alt_u8 led; volatile int i; while (1) if (count=7) count=0; else count+; led=led_datacount; IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led); i = 0; while (iPIO,双击加入,弹出如图3.2.1所示对话框,选择Input ports only;然后点击Input Options栏,弹出图3.2.2 所示对话框,在Edge Capture Register下选取Synchronously Capture,选择Either Edge;在Interrupt下选取Generate IRQ,选择Edge;点击Finish,将其命名为key_pio;图3.2.1 PIO基本设置图3.2.2 PIO输入设置(2)其它设置同前一实验,生成CPU NiosII32。在图形文件中加入altpll0和生成的NiosII32模块,然后加入引脚CLOCK_50、TD_RESET、KEY3.0和LEDG7.0,如图3.2.3所示。图3.2.3 图形文件(3)生成配置文件后下载到FPGA中;二 软件设计在NIOSII IDE下,根据刚生成的硬件建立一个空工程文件,然后编写软件代码如下。代码(一)的功能是读取KEY的数据,再把数据写给LED,让led灯显示出来。代码(二)的功能是判断是哪个按键按下,并根据不同的按键亮不同的灯。代码(一):#include #include system.h#include altera_avalon_pio_regs.h#include alt_types.hvoid initpio(void) IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_PIO_BASE,0xff); IOWR_ALTERA_AVALON_PIO_DIRECTION(KEY_PIO_BASE,0x00); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_PIO_BASE,0x00); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_PIO_BASE,0x00); int main (void) alt_u8 key,led; initpio(); while(1) key=IORD_ALTERA_AVALON_PIO_DATA(KEY_PIO_BASE); led=key; IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led); return 0;代码(二):#include #include system.h#include altera_avalon_pio_regs.h#include alt_types.h#include sys/alt_irq.hvolatile int edge_capture=0;void key_interrupts(void* context,alt_u32 id) volatile int* edge_capture_ptr = (volatile int*)context; *edge_capture_ptr= IORD_ALTERA_AVALON_PIO_EDGE_CAP(KEY_PIO_BASE); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_PIO_BASE,0); void initpio(void) void* edge_capture_ptr = (void*)&edge_capture; IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_PIO_BASE,0xff); IOWR_ALTERA_AVALON_PIO_DIRECTION(KEY_PIO_BASE,0x00); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_PIO_BASE,0xff); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_PIO_BASE,0x00); alt_irq_register(KEY_PIO_IRQ,edge_capture_ptr,key_interrupts);int main (void) alt_u8 data1,data2,data3,data4; data1=0x0f; data2=0x3c; data3=0xf0;data4=0xff;initpio(); while(1) switch(edge_capture) case 0x00:break; case 0x01: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,data1);break; case 0x02: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,data2);break; case 0x04: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,data3);break; case 0x08: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,data4);break; edge_capture=0; return 0;l 实验总结A、 谈谈对按键中断的认识程度;B、 根据实验代码总结按键中断流程;C、 更改本实验代码,要求为每个按键制定一种特定功能,例如分别实现加、减、乘、除和移位等功能。3.3 实验三 定时器实验l 实验目的:(1)熟悉NiosII处理器定时器的相关设置。(2)了解定时中各寄存器的作用。(3)在NiosII IDE开发环境中对定时器进行编程。l 实验内容编写程序,利用定时器功能设计秒表。l 实验原理在SOPC Builder中添加的定时器是一个32位递减计数器,在软件开发中需要配置几个相关的寄存器来控制该定时器的工作。定时器主要包含6个寄存器,分别是状态寄存器status、控制寄存器control、周期寄存器periodl和periodh、快照寄存器snapl了和snaph。表3.3.1 定时器寄存器定义偏移名称R/W说明/位描述15。32100statusRWrunto1controlRWstopstartcontito2periodlRW定时器周期低16位3periodhRW定时器周期高16位4SnaplRW定时器内部计数器低16位快照5snaphRW定时器内部计数器高16位快照控制定时器工作需要执行以下几个步骤:(1) 设置定时器的定时周期,主要是分别向寄存器periodl和periodh中写入32位周期值得低16位和高16位数值;(2) 配置定时器控制寄存器向start位或stop位写1来开启或停止定时器工作;向ito定时中断使能位写1或0来使能和禁止定时器中断;向cont位写1或0来设置定时器连续工作或单次工作模式;(3) 读写定时器快照寄存器快照寄存器中的值是定时器内部的当前计数值,对其进行写操作可以重置计数器当前计数值。l 实验步骤一、SOPC硬件设计 该实验的硬件需要在前一实验的基础上添加两个模块:SDRAM模块、定时器模块。(1)添加SDRAM模块A. 在SOPC Builder窗口中,选择Memory-SDRAM Controller,弹出对话框如图3.3.1,在Data Width中选择16;Chip Select选1;Banks选4,Row选12,Column选8;图3.3.1 设置SDRAM控制器参数B单击Next,在出现的对话框中设置SDRAM时序参数如图3.3.2所示。点击Finish,将其命名为“sdram”。图3.3.2 设置SDRAM控制器时序参数(2)添加定时器模块A在SOPC Builder窗口中,选择Other-Interval Timer,弹出对话框如图3.3.3所示。图3.3.3 系统时钟定时器设置B定时器的时间设置为20ms,寄存器的三个选项“Writable period、Readable snapshot和Start/Stop control bits”全部选中。再把定时器重命名为“sys_clock_timer”,作为系统的系统时钟定时器。C用同样的方法再添加一个定时器,其设置如图3.3.4所示。时间设置为10s,而硬件设置选择“Watchdog”预设值。再把该定时器重命名为“watchdog”,作为系统的看门狗定时器。图3.3.4 看门狗定时器的设置(3)修改系统设置。选择More “CPU” Settings属性页,设置CPU的Reset Address和ExceptionAddress为sdram。(4)生成系统。在图形文件中更新Nios系统,双击锁相环模块,打开锁相环属性窗口;选择output clocks选项页的clk c1,选中use this clock,以此增加一个输出时钟“c1”作为SDRAM的时钟,c1的设置如图3.3.5所示。图3.3.5 锁相环的设置(4)引脚连接。保持原来的引脚连接不变,再增加SDRAM的相关引脚,最后的原理图如图3.3.6所示。图3.3.6 原理图与SDRAM有关的引脚连接关系如图3.3.7所示,引脚的命名必须严格按照图中所标示的。注意: 1) DRAM_DQ15.0为双向引脚,选择引脚时需选择“bidir”,而不是“output”。2) DRAM_CLK与锁相环的c1输出口相接,见图3.3.6。3) SOPC生成的端口“zs_ba_from_the_sdram1.0”是2位的矢量,而DE2的引脚配置文件“DE2 pin assignments.csv”中,却把2位的DRAM_BA分为两个独立的1位引脚分别是DRAM_BA_0和DRAM_BA_1。这就无法像其他引脚那样直接连接,而需要使用中转线,做法如下:首先从系统端口“zs_ba_from_the_sdram1.0”处画一根总线,右键单击选择属性“Properties”,在其属性页的“name”处设置为“DRAM_BA1.0”;其次在原理图的空白处添加两个“output”引脚,分别命名为“DRAM_BA_0”和“DRAM_BA_1”;最后从这两个引脚处画两根线,并在其属性窗口中把两根线的“name”分别设置为“DRAM_BA0”和“DRAM_BA1”即可。最后结果如图3.3.7所示。4) 端口“zs_dqm_from_the_sdram1.0”的情况与3)中所描述的相同,其做法一样,引脚的命名见图3.3.7。图3.3.7 sdram引脚连接图(5)项目编译、下载,硬件设计完成。二、软件设计(1)打开NiosII IDE建立基于刚刚生成的CPU的新工程,选择Hello LED模板。(2)右键单击项目文件夹,在弹出的快捷菜单中选择System Library Properties,打开工程属性设置页,如图3.3.8所示;设置stdout、stderr和stdin为jtag_uart,设置system clock timer为sys_clock_timer,设置几项memory为sdram。图3.3.8 系统库属性设置(3)编写程序。(A)利用系统时钟定时器产生1s的周期性事件,并借此控制LED灯。打开hello_led.c文件,把代码修改如下:#include #include system.h#include altera_avalon_pio_regs.h#include alt_types.h#include sys/alt_alarm.hstatic alt_alarm alarm;static unsigned char led=0xff;alt_u32 my_alarm_callback(void *context) if (led=0xff) led=0x00; else led=0xff; IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led); return alt_ticks_per_second();int main() IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led); printf(Hello from Nios II!n); if(alt_alarm_start(&alarm,alt_ticks_per_second(),my_alarm_callback,NULL)0) printf(No system clock availablen); while(1); return 0;该程序调用了alt_alarm_start()函数登记报警设备。int alt_alarm_start ( alt_alarm* alarm, alt_u32 88 nticks, alt_u32 (*callback) (void* context), void* context); 在逝去的nticks 之后调用callback函数(即用户回调函数)。当调用 callback 函数时, 输入参数context作为callback 函数的输入参数;输入参数alarm指向的结构通过调用 alt_alarm_start()函数进行初始化,故不必在对其初始化了。注意:在callback函数中不要实现复杂的功能,因为callback函数实际是定时器中断服务函数的一部分。callback函数对报警设备复位,返回到下一个调用该函数为止之间的 ticks 数量值。返回值为0表示停止报警。实验结果可以看见LED交替闪烁,时间间隔为1s。当然如果想要LED闪烁的快一点,可以把alt_ticks_per_second()改成你需要的时间间隔,单位是你设定的间隔整数倍。 alarm就是一个定时中断。对于一个操作系统而言,当一个进程需要等待某个事件发生又不想永远的等待,该进程会设置一个超时timeout。当到达这个超时时,系统就会发出一个alarm,提醒进程。alt_ticks_per_second ( )为每秒系统时钟的“滴答”数。(B)利用看门狗功能,使得系统在死机的情况下,被强行复位。运行程序,首先对LED灯显示进行控制,同时“喂狗”;然后让系统进入死循环,等待看门狗复位。把程序修改如下:#include #include #include system.h#include altera_avalon_pio_regs.h#include altera_avalon_timer_regs.h#include alt_types.h#include sys/alt_alarm.hvoid wdtfeed(void) IOWR_ALTERA_AVALON_TIMER_PERIODL(WATCHDOG_BASE,0x1234); void initwdt(void) IOWR_ALTERA_AVALON_TIMER_CONTROL(WATCHDOG_BASE,0x4);int main(void) alt_u8 i; initwdt(); wdtfeed(); printf(The system start now.n);for(i=0;i8;i+) IOWR(LED_PIO_BASE,0,0XFF); usleep(1000000); IOWR(LED_PIO_BASE,0,0x00); usleep(1000000); wdtfeed(); IOWR(LED_PIO_BASE,0,0X10); while(1); return(0);看门狗实际是个定时器,看门狗定时器从复位后处于休眠状态(看门狗不工作)。软件可以通过向控制寄存器的start位写1来启动看门狗。看门狗一旦启动,永远不会停止。一旦内部计数器到达0,看门狗产生一个reset_out输出脉冲。如果在SOPC生成器系统中使用看门狗定时器,reset_out输出脉冲会造成系统复位。软件可以通过向period1或periodh寄存器进行写操作(写入的数据忽略不计)重新启动看门狗,内部计数器从预置值开始计数。为了防止系统复位,软件必须重复重新启动看门狗定时器(重复向periodl或periodh寄存器写入数据) 。看门狗的操作分两步:第一步是开启看门狗;第二步是“喂狗”。1)开启看门狗可通过修改其控制寄存器中的start位,命令是:IOWR_ALTERA_AVALON_TIMER_CONTROL(WATCHDOG_BASE,0x4);2)喂狗操作,实际上是向定时器的周期寄存器进行写操作(写入的数可以是任意数),使得内部计数器从预置值开始计数,命令是:IOWR_ALTERA_AVALON_TIMER_PERIODL(WATCHDOG_BASE,0x1234);另外,程序中利用usleep(n)函数实现延迟n微秒,这里n设置为1000000表示延迟1秒。usleep函数在unistd.h头文件中定义,所以在使用该函数时需要包含该头文件。l 实验总结1. 尝试加快或降低LED灯闪烁的频率。2. 尝试实现秒表的功能。附录 DE2引脚分配表DE2平台上FPGA芯片EP2C35F672与外围各接口的引脚分配表 DE2对应器件FPGA引脚 DE2对应器件FPGA引脚 DE2对应器件FPGA引脚 SW0 PIN_N25 DRAM_CLK PIN_AA7 FL_ADDR12 PIN_W16 SW1 PIN_N26 DRAM_CS_N PIN_AC3 FL_ADDR13 PIN_W15 SW2 PIN_P25 DRAM_DQ0 PIN_V6 FL_ADDR14 PIN_AC16SW3 PIN_AE14 DRAM_DQ1 PIN_AA2 FL_ADDR15 PIN_AD16SW4 PIN_AF14 DRAM_DQ2 PIN_AA1 FL_ADDR16 PIN_AE16SW5 PIN_AD13 DRAM_DQ3 PIN_Y3 FL_ADDR17 PIN_AC15SW6 PIN_AC13 DRAM_DQ4 PIN_Y4 FL_ADDR18 PIN_AB15SW7 PIN_C13 DRAM_DQ5 PIN_R8 FL_ADDR19 PIN_AA15SW8 PIN_B13 DRAM_DQ6 PIN_T8 FL_ADDR20 PIN_Y15 SW9 PIN_A13 DRAM_DQ7 PIN_V7 FL_ADDR21 PIN_Y14 SW10 PIN_N1 DRAM_DQ8 PIN_W6 FL_CE_N PIN_V17 SW11 PIN_P1 DRAM_DQ9 PIN_AB2 FL_OE_N PIN_W17 SW12 PIN_P2 DRAM_DQ10 PIN_AB1 FL_DQ0 PIN_AD19SW13 PIN_T7 DRAM_DQ11 PIN_AA4 FL_DQ1 PIN_AC19SW14 PIN_U3 DRAM_DQ12 PIN_AA3 FL_DQ2 PIN_AF20SW15 PIN_U4 DRAM_DQ13 PIN_AC2 FL_DQ3 PIN_AE20SW16 PIN_V1 DRAM_DQ14 PIN_AC1 FL_DQ4 PIN_AB20SW17 PIN_V2 DRAM_DQ15 PIN_AA5 FL_DQ5 PIN_AC20DRAM_ADDR0 PIN_T6 DRAM_

温馨提示

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

评论

0/150

提交评论