NiosIISOPC开发.ppt
5.3 Nios II嵌入式系统开发软件,SOPC Builder是Altera公司推出的一种可加快在PLD内实现Nios II嵌入式处理器及其相关接口的设计工具。其功能与PC机应用程序中的“引导模板”类似,设计者可以根据需要确定处理器模块及其参数,选择所需的外围控制电路(如存储器控制器、总线控制器、I/O控制器、定时器等)和外设(如存储器、鼠标、按钮、LED、LCD、VGA等),创立一个完整的嵌入式处理器系统。SOPC Builder还允许用户修改已经存在的设计,为其添加新的设备和功能。,2023/7/7,1,5.3.1 Nios II的硬件开发 Nios II是一个用户可以自行定制的CPU,用户可以增加新的外设,增加新的指令,分配外设的地址等。Nios II的硬件开发就是由用户定制合适的CPU和外设。SOPC Builder提供了大量的IP Core来加快Nios II外设的开发速度,用户也可以使用VHDL或Verilog HDL来定制外设。Nios II的硬件开发必须得到特定的开发板的硬件支持。下面以DE2(含DE2 70)开发板为例,介绍Nios II(9.0版本)硬件开发的具体流程。在DE2开发板上,支持Nios II系统的外部设备包括SDRAM、SRAM、FLASH、LCD、七段数码管、发光二极管、按钮开关、电平开关、VGA、ISP1362、I2C器件等,大部分外部都采用Nios II软件提供的组件,但SRAM、七段数码管、VGA控制器和I2C器件属于DE2开发板自定义的组件,因此在进行Nios II系统开发之前,应将这些组件的程序包加入到Nios II的用户自定义组件(User Logic)中。,2023/7/7,2,在DE2开发板提供的用户光盘的DE2DE2_NIOS_HOST_MOUSE_VGA工程文件夹(或其他工程文件夹)中,包含SRAM、七段数码管、VGA控制器、I2C器件的程序包,它们分别是user_logic_SRAM_16Bits_512K、user_logic_SEG7_LUT_8、user_logic_VGA_Controller和user_logic_Open_I2C。将这些程序包(文件夹)复制到用户工程(如SOPC_DE2)目录中,打开SOPC Builder软件后,在其组件库的“User Logic”项下,就可以找到这些自定义组件。对于新版DE2开发板上的组件程序包,DE2的组件名分别为SRAM_16Bits_512K、SEG7_LUT_8、Binary_VGA_Controller等,将这些组件的文件夹复制到工程目录中后,这些组件会出现在SOPC Builder软件组件库的“Terasic Technologies Inc”栏目下。,2023/7/7,3,1.新建SOPC设计项目 设计前首先需要在Quartus II中建立一个设计项目,并选择Cyclone II系列的EP2C35F672C6或EP2C70F896C6器件为目标芯片(EP2C35F672C6是DE2开发板上的目标芯片,EP2C35F672C6是DE2 70开发板上的目标芯片)。执行“Tools”菜单的“SOPC Builder”命令,打开Quartus II集成环境的SOPC开发工具,呈现的SOPC Builder软件窗口界面。执行SOPC Builder软件窗口“File”菜单的“New system”命令,弹出“Create New System”对话框,在对话框中输入需要建立的SOPC系统的名称(例如使用nios_0为工程名称),设定语言为VHDL或Verilog HDL(建议使用Verilog HDL)。完成设定后用鼠标单击“OK”按钮,进入SOPC Builder设计。,2023/7/7,4,SOPC Builder界面分成三个部分,界面左边是组件(Nios II嵌入式系统元件)选择栏,用树型结构列出了SOPC Builder的组件;右边空白处用于加入用户定制Nios II系统的组件;下方是提示栏,用于显示SOPC Builder的提示信息和警告错误信息。在界面的右上方,可以选择器件系列和系统工作频率。,SOPC Builder软件窗口界面,2023/7/7,5,2.加入Nios II系统的组件 基本的SOPC系统大致可以分为FPGA、存储器和外围元件三个部分。FPGA部分的核心是NIOS CPU CORE(CPU核),设计工作主要在FPGA部分进行。基于DE2开发板的Nios II系统包含NIOS CPU CORE(CPU核)、通用异步通信总线JTAG UART、串口UART、按钮开关BUTTON PIO、电平开关SW PIO、绿色LED、红色LED、七段数码管、Avalon三态总线桥、片外SRAM、Timer(定时器)、LCD(液晶显示器)、Flash(快闪存储器)、FLASH控制器、SDRAM控制器、系统ID组件、I2C(I2C组件)、VGA控制器和ISP1362(USB控制器)。,2023/7/7,6,(1)加入NIOS CPU CORE(CPU核)在SOPC Builder的组件库中,用鼠标双击Component Library(组件库)中的“Nios II Processor”项,弹出添加新的Nios II(CPU核)对话框。在对话框中提供Nios II系列微处理器的三个成员供选择:Nios II/e(经济型)成员,具有占用最小逻辑的优化,占用600700LEs(逻辑元件)。Nios II/f(快速型)成员,具有高性能的优化,占用14001800LEs。Nios II/s(标准型)成员,在占用逻辑和高性能优化方面的性能居中,占用12001400LEs。,2023/7/7,7,本设计选择标准型Nios II/s成员。完成设置后,系统将“cpu_0”作为一个CPU核组件已经加入SOPC系统,并显示该系统已经有instruction_Master(指令主控器)、data_Master(数据总线主控器)和jtag_debug_module(JTAG调试模式)存在。用鼠标右键点击选中“cpu_0”,弹出组件操作快捷菜单,在快捷菜单中选择“Rename”项,可以更改组件名称(本设计保持默认为“cpu_0”)。在快捷菜单中还可以选择“Edit”(编辑)、“Lock Base Address”(锁定地址)等操作。,2023/7/7,8,(2)加入JTAG UART JTAG UART(JTAG通用异步通信总线)用于Flash存储器的读写控制。用鼠标双击组件库中的“Interfase”“Serial”栏目下的“JTAG UART”项,在弹出加入JTAG UART属性对话框中。对话框中各参数保持默认值不变,完成JTAG UART组件的加入后,组件名称保持默认的“jtag_uart_0”不变。,加入JTAG UART对话框,2023/7/7,9,加入UART对话框,(3)加入UART UART是常用的串口,Nios II系统可以通过UART串口与计算机通信,也用于NIOS系统的仿真调试。用鼠标双击组件库中的“Interfase”“Serial”栏目下的“UART(RS232 series port)”项,弹出UART属性对话框。在对话框中选择波特率为115200,其余参数保持默认设置,完成UART的加入后,组件名称保持默认的“uart_0”不变。,2023/7/7,10,(4)加入BUTTON PIO DE2开发板上有4只按钮开关key3key0,设计中需要加入一个4位的按钮PIO。用鼠标双击组件库中的“Peripherals”“Microcontroller Peripherals”栏目下的“PIO”项,弹出加入PIO的“Basic setting”对话框。在对话框中设置“Width”(位宽)为4位,在“Direction”栏目下选择“Input Ports Only”(输入)模式。然后用鼠标单击“Next”进入PIO的“Input Options”选项设置对话框页面,在此对话框页面中可选择产生中断请求(IRQ)的触发模式,包括“Level”(电平)和“Edge”(边沿)两种触发模式;在选择“Edge”触发模式下,还要选择触发边沿的类型,其中有“Rising Edge”(上升沿)、“Falling Edge”(下降沿)和“Either Edge”(任意边沿或双边沿)三种边沿类型。在本设计中选择“Edge”触发模式下的“Either Edge”类型。完成PIO的加入后,将组件名称更改为“button_pio”。,2023/7/7,11,(5)加入电平开关SW PIO DE2开发板上有18只按钮开关SW17SW0,设计中需要加入一个18位的SW PIO。用鼠标双击组件库中的“Peripherals”“Microcontroller Peripherals”栏目下的“PIO”项,在弹出的加入PIO的“Basic setting”对话框中,设置“Width”为18位,在“Direction”栏目下选择“Input Ports Only”(输入)模式。完成电平开关组件的加入后,将组件名称更改为“switch_pio”。,(6)加入绿色LED DE2开发板上有9只绿色发光二极管LEDG8LEDG0,设计中需要加入发光二极管PIO。在加入PIO对话框中,设置“Width”为9位,在“Direction”栏目下选择“Output Ports Only”(输出)模式。完成绿色LED组件的加入后,将组件名称更改为“led_green”。,2023/7/7,12,(7)加入红色LED DE2开发板上有18只红色发光二极管LEDR17LEDR0,设计中需要加入发光二极管PIO。在加入PIO对话框中,设置“Width”为18位,在“Direction”栏目下选择“Output Ports Only”(输出)模式。完成红色LED组件的加入后将组件名称更改为“led_red”。,(8)加入七段数码管 DE2开发板上有8只七段数码管hex7hex0,设计需要加入8个七段码数码管。用鼠标双击组件库中“User Logic”的“SEG7_LUT_8”项,加入七段数码管PIO。完成七段数码管组件的加入后,将组件名称更改为“SEG7_Display”。,2023/7/7,13,(9)加入片外SRAM DE2开发板上有一片51216KB的SRAM,属于自定义组件。用鼠标双击组件库中“User Logic”的“SRAM_16Bits_512K”项,加入SRAM。完成片外SRAM组件的加入后,将组件名称更改为“sram_0”。,(10)加入定时器Timer 用鼠标双击SOPC Builder界面的组件库中“Preripherals”“Microcontroller Preripherals”下的“Interval Timer”项,弹出加入Timer对话框,一切都按照对话框默认值配置,完成Timer的加入,组件名称保持默认的“timer_0”不变。,2023/7/7,14,(11)加入LCD(液晶显示器)用鼠标双击SOPC Builder界面的组件库中的“Preripherals”“Display”的“Character LCD”项,完成LCD的加入。完成LCD组件加入后,将组件名称更改为“lcd_16207_0”。添加的LCD的型号为Optrex 16207,支持2行字符显示,每行16个字符。,(12)加入Avalon三态总线桥 NIOS CPU与SRAM等外部扩展器件相连时需要Avalon三态总线桥。用鼠标双击组件库中“Bridges and Adapters”“Memory Mapped”的“Avalon-MM Tristate Bridge”项,在加入Avalon三态总线桥对话框中,参数设置采用系统默认值。组件名称保持默认的“tri_state_bridge_0”不变。,2023/7/7,15,(13)加入Flash(快闪存储器)用鼠标双击SOPC Builder界面的组件库中的“Memory and Memory Controllers”的“Flash Memory Interface”项,弹出加入Flash对话框,在对话框的“Attributes”页面的“Presets”下拉菜单中,选择“(Custom)”(惯例)项,并在对话框的“Size”栏目下,填入Address Width(地址宽度)为20bits,Data Width(数据宽度)为8bits。用鼠标单击对话框上部的“Timing”按钮(或下部的“Next”按钮),进入Flash参数设置的“Timing”页面,此页面用于对Flash的建立(Setup)时间、等待(Water)时间和保持(Hold)时间参数进行设置,将Setup时间设置为40(ns),Water时间设置为160(ns),Hold时间设置为40(ns)。完成Flash组件的加入后,组件名称保持默认的“cfi_flash_0”不变,并将其输入端口“s1”与Avalon三态总线桥组件的“tristate_master”端口连接。,2023/7/7,16,(14)加入FLASH控制器 FLASH控制器用于控制Flash存储器的操作。用鼠标双击SOPC Builder界面的组件库中的“Memory and Memory Controllers”“Memory”的“EPCS Serial Flash Controller”项,弹出加入Flash控制器对话框。完成FLASH控制器的加入,保持组件默认的名称“epcs_flash_controller”不变。,(15)加入SDRAM控制器 SDRAM控制器用于控制SDRAM存储器的操作。用鼠标双击SOPC Builder界面的组件库中的“Memory and Memory Controllers”“SDRAM”的“SDRAM Controller”项,弹出加入SDRAM控制器对话框的“Memory Profile”页面。在页面的“Presets”栏目中选择“Custom”(常规),设置“Data Width”(数据宽度)为16Bits,其他参数保持默认值。,2023/7/7,17,用鼠标单击对话框上方的“Timing”按钮(或用鼠标单击下方的“Next”按钮),进入对话框的“Timing”页面,保持此页面参数的默认设置。完成SDRAM控制器的加入后,保持组件默认的名称“sdram_0”不变。,(16)加入系统标识System ID组件 系统标识system ID是SOPC中的一个简单只读组件。Nios II处理器系统利用它来检验软件程序和配置与在FPGA中的硬件电路是否一致。如果运行程序的ID号和FPGA中的系统标识不一致,软件将不能正确运行。用鼠标双击组件库中“Peripherals”“Debug and Performance”的“System ID Peripheral”项,弹出加入System ID组件对话框。完成System ID组件的加入后,将组件的名称更改为“sysid”。,2023/7/7,18,5.3.2 调整SDRAM地址 首先进入cpu_0的编辑方式,将设置复位地址(Reset Address)和其余的程序和数据(Exception Address)放在sdram_0中,然后执行SOPC窗口“System”菜单中的“Auto-Assign Base Addresses”命令,系统将自动调整SDROM和其他设备的基本地址。完成cpu_0的编辑修改后,用鼠标单击SOPC窗口下的“Generate”按钮,启动系统生成Nios II开发者的SOPC系统。至此Nios II核(nios_0)已生成,用鼠标单击SOPC窗口“Exit”按钮,退出SOPC Builder窗口界面(也可以不退出)。,2023/7/7,19,5.3.3 生成Nios II硬件系统 Nios II核生成后还要将其下载到目标芯片中,转换成实际的硬件电路并进行调试,验证设计的正确性。生成Nios II硬件系统需要建立相应的顶层设计文件,顶层设计文件可以用原理图编辑法实现,也可以用HDL文本编辑法实现。基于DE2开发板的Nios II硬件系统的顶层文件,采用Verilog HDL文本编辑方式实现。,1.编辑Nios II顶层文件 在基于DE2开发板的Nios 系统中,需要一块复位电路Reset_Delay实现系统的复位操作,还需要一块锁相环电路SDRAM_PLL产生50MHz和27MHz的系统时钟。用户的Nios 系统加入了I2C组件和VGA组件,也需要把I2C控制器文件I2C_Controller.v、I2C配置文件I2C_AV_Config.v和VGA控制器文件VGA_Controller.v复制到自己的工程文件夹中。,2023/7/7,20,2.引脚锁定 由于DE2开发板中的电路是固定的,Nios II系统的引脚锁定也是唯一的,因此可以利用DE2开发板提供的引脚锁定文件,节省引脚锁定操作的时间。将DE2/DE2_NIOS_HOST_MOUSE_VGA/目录下的顶层文件的引脚锁定文件DE2_NIOS_HOST_MOUSE_VGA.qsf,复制或以“另存为”方式生成用户自己的引脚锁定文件(如SOPC_DE2.qsf)即可。完成引脚锁定后,再次编译顶层设计文件。至此,基于DE2开发板的Nios II系统的开发完成。,2023/7/7,21,5.3.4 Nios II系统的调试 对于初学,建立一个新的Nios II系统是困难而复杂的,但任何一个SOPC开发系统(如DE2或DE2 70),都有自己的示例,每个示例均有相应的Nios II系统,可以利用SOPC开发系统上建立的Nios II系统来完成嵌入式系统的开发或研究。下面以DE2(或DE2 70)开发板为例,介绍Nios II系统的IDE调试方法。在Quartus II的主窗口,打开DE2的一个实例的工程,如“DE2_demonstrations”或“DE2_70_demonstrations”文件夹下的“DE2_NIOS_HOST_MOUSE_VGA”工程。执行主窗口“Tools”菜单的“SOPC Builder”命令,进入该工程的SOPC Builder开发环境。,2023/7/7,22,点击SOPC Builder主窗口的“System Generation”页面中的“Nios II IDE”命令(或者直接点击桌面上“Nios II IDE”图标),进入Nios II的IDE调试方式。在进入IDE软件界面之前,一般先弹出“Workspace Launcher”(工作间选择)窗口。在此窗口选择用户工程目录(如F:DE2_demonstrationsDE2_NIOS_HOST_MOUSE_VGA)。当工作间选择结束后,弹出Nios II IDE主窗口界面(在Nios II IDE主窗口执行“File”“Switch Workspace”命令,也可以进行工作间选择)。,工作间选择对话框,2023/7/7,23,在Nios II IDE主窗口界面,上部是主菜单和工具栏,中下部是工作界面。每个工作界面都包括一个或多个窗口,如C/C+工程浏览器窗口、编辑区窗口、提示信息浏览器窗口等。,2023/7/7,24,1.新建软件工程 执行IDE软件的“File”“New”命令,弹出“New project”(新建工程)快捷菜单,在菜单中选择“C/C+Application”命令,进入新建工程(New Project)对话框。在新建软件工程对话框的“Select Project Template”(选择工程模板)栏目中,是已经做好的软件工程设计模板,用户可以选择其中的某一个模板来创建自己的工程。也可以选择“Blank Project”(空白工程),完全由用户来编写所有的代码。如果选择已经做好的软件工程(如“Hello LED”、“Hello world”、“Count Binary”等),用户可以根据自己的需要,在其基础上更改程序,完成C/C+应用出现的编写。一般情况下使用做好的软件工程比从空白工程做起来容易得多,也方便得多。,2023/7/7,25,本例在“Select Project Template”中选择“Count Binary”模板,工程项目名会自动变为“count_binary_0”(第2次选择该模板时工程项目名会变为“count_binary_1”),并出现在新建工程对话框的“Name”栏目中,此新建的工程名称可以由用户更改。用鼠标单击新建工程对话框的“Finish”按钮后,新建工程就会添加到工作区中,同时Nios II IDE会创建一个系统库项目syslib(例如count_binary_0_syslibnios_0)。在新建的count_binary_0工程中,count_binary.c是该工程C/C+主程序,用户可以根据需要对count_binary.c程序进行补充或修改。,2023/7/7,26,count_binary.c是一个PIO控制程序,在程序中使用一个8位的整型变量不断重复地从0计数到ff,然后用4个按钮(SW0-SW3)来控制计数结果分别输出到发光二极管LED、七段数码管和LCD上。count_binary.c程序比较复杂,不适于初学。为了便于初学与调试,下面以一个简单的C/C+调试程序替换原来的count_binary.c程序。即把count_binary.c程序中的原有内容除了头文件count_binary.h外,其余全部清除,然后将用户的应用程序重新编辑输入到count_binary.c中作为主程序。简单C/C+调试程序如下:,2023/7/7,27,#include count_binary.hint alt_main(void)int second;while(1)usleep(100000);/延迟0.1s second+;IOWR(SEG7_DISPLAY_BASE,0,second);/IOWR_ALTERA_AVALON_PIO_DATA(SEG7_DISPLAY_BASE,0,esecond)IOWR(LED_RED_BASE,0,second);上述调试程序中,用一个变量second记录0.1s的延迟次数,并用DE2开发板上的七段数码管和红色发光二极管显示second中的数据。,2023/7/7,28,2.编译工程 完成用户C/C+应用程序的编写后,用鼠标右键点击选中的工程名(如count_binary_0),在弹出的编辑工程快捷菜单中选择“Builder Project”项,或执行“Project”菜单的“Builder Project”命令,开始编译工程文件(也可以执行“Project”菜单的“Builder All”命令,对全部已建工程进行编译)。编译开始后,Nios II IDE会首先编译系统库工程以及其他相关工程,然后再编译主工程,并把源代码编译到.elf文件中。编译完成后会在Tasks浏览器中显示警告和错误信息。,2023/7/7,29,3.调试工程 用鼠标右键点击选中的工程名(如“count_binary_0”)在弹出的快捷菜单中选择“Debug As”中的“Nios II Instruction Set Simulator”项,进入仿真模式调试方式。进入仿真模式后,IDE软件将生成C/C+程序的汇编程序代码,并呈现在“Disassembly”窗口中,把主窗口引导到适合软件调试的“Debug perspective”工作界面。在主窗口执行“Run”菜单的“Run As”的“Nios II Instruction Set Simulator”命令,或直接按动工具栏上的“Run”命令按钮,开始对设计工程进行仿真调试。开始仿真调试后的信息和仿真结果将呈现在信息浏览器的“Console”(控制台)窗口中。,2023/7/7,30,4.运行工程 运行工程是通过Nios II IDE将C/C+应用软件的机器代码文件(.elf)下载到用户Nios II系统的工作存储器SDRAM中,通过执行程序实现相应的功能。在运行工程之前,首先执行IDE主窗口“Tool”菜单的“Quartus II Programmer”命令,把顶层设计的编程下载文件(如SOPC_DE2.sof)下载到DE2开发板的目标芯片中。然后执行“Run”菜单的“Run”命令,弹出运行设置对话框,对运行工程进行设置。运行设置对话框共有“Main”、“Target Connection”、“Debugger”、“Source”和“Common”5个页面。在“Main”页面的“Project”栏目中填入或选择运行的工程名称,如“count_binary_0”。,2023/7/7,31,用鼠标单击选中运行设置对话框左面“Configurations”栏目中的“count_binary_0 Nios II HM Configurations”,进入“Target Connection”页面。在此页面的“JTAG Cable”栏目中选择工程目标代码下载使用的接口电缆,如果连接了多条JTAG电缆,就需要从“JTAG cable”的下拉菜单中选择与目标芯片开发板相连的电缆,如果开发板(如EDA6000)通过并行接口与计算机连接,则选择“ByteBlasterMVLPT1”,若是通过USB接口(如DE2开发板)与计算机连接,则选择“BSB-BlasterUSB-0”。在“JTAG Device”栏目中选择下载的目标芯片类型,这里选择“automatic”或“1EP2C35”。在“Communication device”栏目中选择“jtag_uart_0”,表示选择使用UART接口。如果试验中不需要使用UART接口则选择该栏目中的“none”项。,2023/7/7,32,运行设置对话框中的其他页面可以按默认设置。运行设置结束后,用鼠标单击对话框下方的“Run”按钮,开始程序下载、复位处理器和运行程序的过程。在完成一次运行设置后,对于同一个工程没有必要每次运行前都设置,只要这些Nios 主窗口中的“Run As”“Nios Hardware”命令,就可以直接运行工程。,2023/7/7,33,5.3.5 Nios II的常用组件与编程 在一个基于Nios II的SOPC系统上,常用组件包括通用异步串口UART、发光二极管LED、七段数码管、按钮、LCD、存储器、定时器、鼠标、VGA等。另外,Nios II还允许用户创建自己的外围设备,并通过用户逻辑接口向导将其集成到Nios II处理器系统中。这种自动化工具能够检验VHDL或Verilog HDL源代码,识别顶层端口并将这些端口连接到合适的处理器总线信号上,整个过程用户介入很少,使电路与系统设计方便而快捷。下面以基于DE2(或DE2 70)开发板的Nios II系统为例,介绍Nios II系统的常用组件的硬件结构和软件编程,让读者进一步掌握Nios II嵌入式系统的开发技能。,2023/7/7,34,1.通用输入输出端口PIO 通用输入输出端口PIO包括输入IO(如按钮)、输出IO(如发光管LED、七段数码管等)和双向三态IO(如液晶显示屏LCD)。(1)红色发光二极管LEDR 在DE2开发板有18只红色发光二极管,硬件设备命名为LEDR17LEDR0,Nios II系统命名为LED_RED。采用Nios II IDE方式调试运行C+应用程序,利用Nios II IDE的“count_binary”工程模板(或其他模板)建立C+工程时,在系统为工程自动生成system.h头文件。,2023/7/7,35,例如,让DE2开发板上的18只红色发光二极管LEDR17LEDR0依次向左移位发光,的C/C+源程序LEDR18.c如下:#include count_binary.hint alt_main(void)int i,data;while(1)data=0 x01;for(i=0;i18;i+)IOWR(LED_RED_BASE,0,data);/IOWR_ALTERA_AVALON_PIO_DATA(LED_RED_BASE,0,data)data=1;usleep(100000);/延迟,2023/7/7,36,(2)绿色发光二极管LEDG 在DE2开发板有9只绿色放光二极管LEDG8LEDG0,Nios II系统命名为LED_GREEN。让DE2开发板上的9只绿色发光二极管LEDG8LEDG0依次向右移位发光的C/C+源程序如下:#include count_binary.hvoid main(void)int i,data;while(1)data=0 x01;for(i=0;i8;i+)IOWR(LED_GREEN_BASE,0,data);data=1;usleep(100000);,2023/7/7,37,(3)七段数码管 在DE2上有8只七段数码管HEX7HEX0,Nios II系统命名为SEG7_DISPLAY。让DE2开发板上的8只七段数码管HEX7HEX0以两屏显示sum数据的C/C+源程序如下:#include count_binary.hint alt_main(void)int sum;while(1)sum=0 x20090101;IOWR(SEG7_DISPLAY_BASE,0,sum);usleep(1000000);/延迟 sum=0 x00235959;IOWR(SEG7_DISPLAY_BASE,0,sum);usleep(1000000);/延迟,2023/7/7,38,(4)电平开关SW 在DE2上有18只电平开关SW17SW0,Nios II系统命名为SWITCH_PIO。例如,用key变量读取DE2开发板上18只电平开关SW上的数据,并用七段数码管显示读出的数据的C/C+源程序如下:#include count_binary.hint alt_main(void)int key;while(1)key=IORD(SWITCH_PIO_BASE,0);IOWR(SEG7_DISPLAY_BASE,0,key);,2023/7/7,39,(5)按钮BUTTON 在DE2开发板上有4只按钮KEY3KEY0,在nios_0系统上命名为BUTTON_PIO。例如,让ED2开发板上的18只红色发光二极管LEDR17LEDR0依次向左移位或向右移位发光,用按钮KEY0来控制LED移位的方向的C/C+源程序如下:#include count_binary.hint alt_main(void)int i,key,data;while(1)key=IORD(BUTTON_PIO_BASE,0);if(key/延迟,2023/7/7,40,else data=0 x20000;for(i=0;i=1;usleep(100000);,2023/7/7,41,在nios_0系统加入按钮组件BUTTON_PIO时,是把它设置为具有中断功能的按钮,BUTTON_PIO有一个用于储存按钮值的边沿捕获寄存器edge_capture_ptr,采用中断方式时,每当任何按钮按下,其值就被边沿捕获寄存器捕获并保存其中。用边沿捕获寄存器捕获按钮数据的语句格式为:*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);另外,采用中断方式时还需要对按钮进行开放中断、复位边沿捕获寄存器和登记中断源的初始化处理过程。按钮初始化过程语句如下:void*edge_capture_ptr=(void*),2023/7/7,42,/*复位边沿捕获寄存器.*/IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0 x0);/*登记中断源.*/alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts);例如,编写一个按钮控制程序,在DE2开发板用3个按钮(KEY3KEY1)分别控制七段数码管显示不同的数据,其C/C+源程序button_2.c见教材。,2023/7/7,43,2.定时器 Nios II系统中的定时器是SOPC Builder组件库中的一个组件模块,该定时器是一个32位的可控减法计数器,在Nios II软件开发中,主要通过对定时器中的几个寄存器进行读写操作来定制该定时器实现定时。例如,编写一个秒显示程序,利用usleep()函数实现1秒定时,定时到后让秒计数器second加1,然后在DE2开发板的七段数码管上显示秒计数的结果,其C/C+应用程序如下:#include count_binary.hint main(void)int second;while(1)usleep(1000000);second+;IOWR(SEG7_DISPLAY_BASE,0,second);,2023/7/7,44,3.液晶显示器LCD 对LCD的编程可以采用直接在底层开发应用程序、调用标准函数开发和使用标准函数控制I/O设备3种方式,其中使用标准函数控制I/O设备方式最简单,下面介绍这种方式。使用标准输入(stdin)、标准输出(stdout)和标准错误(stderr)函数是最简单的控制I/O设备的方法。例如,将字符“hello world!”发送给任何一个与stdout相连的C/C+源程序如下:#include stdio.hint main()printf(hello world!);return 0;,2023/7/7,45,在编译此源程序之前,用鼠标右键点击Nios II IDE的工作界的C/C+工程浏览器窗口中的软件工程名(如count_binary_0),在弹出的编辑工程快捷菜单中选择“System Library Properties”项,弹出count_binary_0工程参数进行设置的对话框(Properties for count_binary_0_syslib)。,工程参数进行设置对话框,2023/7/7,46,如果在对话框中的“stdout”(标准输出)、“stderr”(标准错误)和“stdin”(标准输入)栏目中都选择“lcd_16207_0”(DE2开发板上的LCD命名)项,则应用程序的信息或变量变化的数据将在LCD上显示;如果都选择“jtag_uart_0”(DE2开发板上的JTAG总线命名),则上述信息将在IDE软件界面的“Console”(控制台)上显示。,2023/7/7,47,