第7章 Nios II 常用外设编程 SOPC技术与应用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第1节并行输入/输出内核并行输入/输出(PIO)内核提供了Avalon存储器映射从端口和通用IO端口直接的接口。I/O端口连接到片内的用户逻辑或是连到与FPGA片外设备相连的引脚上。PIO内核提供对用户逻辑或外部设备简单的I/O访问,应用实例如下:控制LED获取开关数据控制显示设备配置并与片外设备通信,例如专用标准产品(ASSP)的设备。PIO内核可以基于输入信号而发出中断请求(IRQ)输出。SOPCBuilder中提供了现成的PIO内核,可以很容易地将PIO内核集成到SOPCBuilder生成的系统中。7.1.1PIO寄存器描述每个PIO内核可提供多达32I/O端口,用户可以添加一个或多个PIO内核。CPU通过读/写PIO接口的映射寄存器来控制PIO端口。在CPU的控制下,PIO内核在输入端口捕获数据,驱动数据到输出端口。当PIO端口直接连到了I/O管脚,通过写控制寄存器,CPU能够将管脚置成三态。图7-1是一个PIO应用的例子,本例使用了多个PIO内核。图7-1使用PIO内核的系统实例当集成到SOPCBuilder生成的系统中,PIO内核有两个特性对用户是可见的。具有四个寄存器的存储器映射的寄存器空间,4个寄存器是data、direction、interruptmask和edgecapture。1到32个的I/O端口。有些寄存器在某些硬件配置下不是必需的,这时相应的寄存器就不存在了。对一个不存在的寄存器进行读操作,则返回一个未定义的值;一个不存在寄存器进行写操作则没有任何结果。表7-1给出了PIO寄存器的描述。1.数据寄存器(DataInput&Output)PIO内核I/O端口可以连接到片上或片外的逻辑。内核可以配置成仅有输入端口,或仅有输出端口,或两者都有。如果内核用于控制设备上的双向I/O管脚,内核提供具有三态控制的双向模式。读数据寄存器返回输入端口上的数据,写数据寄存器则提供驱动到输出端口的数据。这些端口是独立的,读数据寄存器不会返回之前写入的数据。2.方向寄存器(direction)如果端口是双向的,方向寄存器控制每个PIO端口的数据方向。当方向寄存器的第n为被置为1,端口n驱动数据寄存器中相应位的值。方向寄存器只有当PIO内核配置为双向模式时才存在,模式(输入、输出或双向)在系统生成时指定,在运行时无法更改。在input-only或output-only模式下,方向寄存器不存在。这种情况下,读方向寄存器返回一个未定义的值,写方向寄存器则没有结果。复位之后,方向寄存器的所有位都是0,即所有双向的I/O端口配置为输入。如果PIO端口连接到设备的管脚,则管脚保持高阻状态。3.中断掩码寄存器(interruptmask)设置中断掩码寄存器某位为1,则将相应的PIO输入端口中断使能。中断的行为依赖PIO内核的硬件的配置。.中断掩码寄存器只有当硬件配置产生中断请求(IRQ)时才存在。如果内核不能产生中断请求,读指定掩码寄存器返回一个未定义的值,写中断掩码寄存器则没有任何结果。复位之后,所有的中断掩码寄存器位都为零,即所有PIO端口中断被禁止。4.边沿捕获寄存器PIO内核可配置在输入端口上捕获脉冲边沿,可捕获由低到高的跳变、由高到底的跳变,或两种跳变。当输入端口检测到一个脉冲的边沿,则边沿捕获寄存器会作出相应的反映。检测的边沿种类在系统生成时指定,并且不能通过写寄存器来改变。5.中断请求产生PIO内核可以配置成在某个输入的情况下产生中断请求。产生中断请求的条件可以是:电平触发——PIO内核硬件检测到高电平则产生中断请求。通过在内核外部加一个非门来实现对低电平敏感。边沿触发——内核的边沿捕获配置决定哪种边沿会导致中断请求。每个端口的中断可以被屏蔽,中断掩码可以决定哪个端口可以产生中断。有关PIO硬件配置请看第二章电子钟的硬件设计,其中用到了PIO。7.1.2软件编程这部分讨论PIO内核的软件编程模型。Altera提供了定义PIO内核寄存器的HAL系统库头文件。PIO内核不属于HAL支持的通用设备模型的种类,所以不能通过HALAPI或者ANSIC标准库来访问它。NiiosIIEDS提供了几个演示PIO内核使用的例子。count_binary.c例子中使用PIO内核来驱动LED,使用PIO内核边沿检测中断来检测按钮按下。7.1.2.1软件文件Altera提供了PIO内核的寄存器头文件altera_avalon_pio_regs.h。该文件定义了内核的寄存器映射,提供了对底层硬件的符号化的访问。下面的代码为Altera提供的寄存器头文件。#ifndef__ALTERA_AVALON_PIO_REGS_H__#define__ALTERA_AVALON_PIO_REGS_H__#includeio.h#defineIOADDR_ALTERA_AVALON_PIO_DATA(base)__IO_CALC_ADDRESS_NATIVE(base,0)#defineIORD_ALTERA_AVALON_PIO_DATA(base)IORD(base,0)#defineIOWR_ALTERA_AVALON_PIO_DATA(base,data)IOWR(base,0,data)#defineIOADDR_ALTERA_AVALON_PIO_DIRECTION(base)__IO_CALC_ADDRESS_NATIVE(base,1)#defineIORD_ALTERA_AVALON_PIO_DIRECTION(base)IORD(base,1)#defineIOWR_ALTERA_AVALON_PIO_DIRECTION(base,data)IOWR(base,1,data)#defineIOADDR_ALTERA_AVALON_PIO_IRQ_MASK(base)__IO_CALC_ADDRESS_NATIVE(base,2)#defineIORD_ALTERA_AVALON_PIO_IRQ_MASK(base)IORD(base,2)#defineIOWR_ALTERA_AVALON_PIO_IRQ_MASK(base,data)IOWR(base,2,data)#defineIOADDR_ALTERA_AVALON_PIO_EDGE_CAP(base)__IO_CALC_ADDRESS_NATIVE(base,3)#defineIORD_ALTERA_AVALON_PIO_EDGE_CAP(base)IORD(base,3)#defineIOWR_ALTERA_AVALON_PIO_EDGE_CAP(base,data)IOWR(base,3,data)#endif/*__ALTERA_AVALON_PIO_REGS_H__*/一个NiosII嵌入式系统中可能有多个用PIO内核的设备,这些设备的配置、基地址中断优先级等信息在system.h头文件中定义。在第二章的电子钟设计中用到了Button_PIO,在system.h头文件中关于Button_PIO的定义的代码如下:#defineBUTTON_PIO_NAME/dev/button_pio#defineBUTTON_PIO_TYPEaltera_avalon_pio#defineBUTTON_PIO_BASE0x00000860#defineBUTTON_PIO_SPAN16#defineBUTTON_PIO_IRQ2#defineBUTTON_PIO_DO_TEST_BENCH_WIRING0#defineBUTTON_PIO_DRIVEN_SIM_VALUE0x0000#defineBUTTON_PIO_HAS_TRI0#defineBUTTON_PIO_HAS_OUT0#defineBUTTON_PIO_HAS_IN1#defineBUTTON_PIO_CAPTURE1#defineBUTTON_PIO_EDGE_TYPEANY#defineBUTTON_PIO_IRQ_TYPEEDGE#defineBUTTON_PIO_FREQ50000000#defineALT_MODULE_CLASS_button_pioaltera_avalon_pio即寄存器头文件定义了通用的PIO内核硬件结构,所有用到PIO内核的设备的个性信息在system.h文件中定义。对Button_PIO的读访问可以使用下面两个函数:IORD_ALTERA_AVALON_PIO_DATA(BUTTON_PIO_BASE)IORD(BUTTON_PIO_BASE,0)即用BUTTON_PIO_BASE来代替函数中的参数,那对其他的设备的访问代入其它设备的基地址的宏定义即可,不要用直接硬件的地址。第2节定时器具有Avalon接口的定时器内核是32位的间隔定时器,可用于基于Avalon总线的处理器系统,比如NiosII处理器系统。定时器提供如下的特性:可控制启动、停止和复位定时器。两种计数模式:一次递减和连续递减。递减周期寄存器当递减到零时,可屏蔽中断请求。可选的看门狗定时器特性——当定时器计时零时,复位系统。可选的周期脉冲产生器特性——当定时器计时到零时,输出一个脉冲。兼容32位和16位的处理器,在HAL系统库中提供了NiosII处理器的定时器的驱动程序。定时器内核在SOPCBuilder中现成的IP,而且很容易集成到任何SOPCBuilder生成的系统。图7-2显示了定时器内核结构,定时器内核对用户可见的特性:提供对6个16位寄存器访问的Avalon存储器映射接口可用作脉冲产生器的可选的脉冲输出所有的寄存器都是16位的,使得定时器能够兼容16位和32位的处理器。某些寄存器只有在特定的配置下才在硬件上存在。例如,如果定时器配置成具有一个固定的周期,硬件上就没有周期寄存器(periodregisters)了7.2.1定时器寄存器描述如果使用NiosII处理器HAL系统库提供的标准的特性,程序开发者可以不必通过寄存器来直接访问定时器。通常,寄存器映射只是对开发驱动程序的人员有用处。对于定时器共有6个用户可以访问的16位的寄存器。表7-2给出了定时器寄存器的映射。1.状态寄存器状态寄存器有两个定义位,如表7-3所示。2.控制寄存器控制寄存器有4个控制位,如表7-4所示。7.2.2软件编程下面讨论定时器内核的编程模型,包括寄存器的映射和软件声明。定时器内核属于HAL支持的通用设备类型中的种类。Altera为NiosII处理器的用户提供了硬件抽象层(HAL)系统库驱动程序,使用户可以使用HALAPI(应用程序接口)来访问定时器内核。7.2.2.1HAL系统库支持Altera提供的驱动程序集成到HAL系统库中。可能的话,HAL用户应该使用HALAPI访问定时器,而不是访问定时器的寄存器。Altera为两种HAL定时器设备模型:系统时钟定时器和timestamp定时器都提供驱动程序。1.系统时钟驱动程序当配置为系统时钟,定时器以周期方式连续运行,周期使用的是SOPCbuilder的设置值。系统时钟服务作为这个定时器中断服务的一部分。驱动程序是中断驱动的,因此在系统硬件上,定时器必须连接有中断信号。NiosIIIDE允许用户指定在系统库属性中指定哪个定时器设备被用作系统时钟定时器。参看第六章相关内容。2.Timestamp驱动程序如果定时器内核满足如下的条件,可用作timestamp设备:定时器具有一个可写的周期(period)寄存器,这可在SOPCBuilder中配置。定时器没有被设置成系统时钟。NiosIIIDE允许在系统库属性中用户指定哪个定时器设备用作timestamp定时器。如果定时器硬件没有设置成具有可写的周期寄存器,则调用alt_timestamp_start()API函数不会复位timestamp计数器。其它的HALAPI调用则如预期的一样。NiosII(EDS)提供了几个使用定时器内核的设计实例。7.2.2.2软件文件定时器内核提供了下面的软件文件。这

1 / 27
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功