当前位置:文档之家› 第7章 Nios II常用外设编程

第7章 Nios II常用外设编程

第7章 Nios II常用外设编程
第7章 Nios II常用外设编程

第7章 Nios II常用外设编程

在Nios II嵌入式的系统中包含各种的外围设备,用户的应用程序对这些外围设备进行控制和操作来实现各种功能。Altera提供了很多外设的IP,用户可以很方便地将所需的外设集成到Nios II系统中去。很多第三方的公司也提供外设的IP,用户也可以创建自己的外围设备,满足相应规范的第三方和用户自己创建的IP也可以很容易地集成到Nios II系统中。

本章主要介绍一些常用的外设的硬件结构和软件编程,使读者掌握Nios II嵌入式系统的软硬件协同开发的技能。

7.1 并行输入/输出内核

并行输入/输出(PIO)内核提供了Avalon存储器映射从端口和通用IO端口直接的接口。I/O端口连接到片内的用户逻辑或是连到与FPGA片外设备相连的引脚上。

PIO内核提供对用户逻辑或外部设备简单的I/O访问,应用实例如下:

控制LED

获取开关数据

控制显示设备

配置并与片外设备通信,例如专用标准产品(ASSP)的设备。

PIO内核可以基于输入信号而发出中断请求 (IRQ) 输出。SOPC Builder中提供了现成的PIO内核,可以很容易地将PIO内核集成到SOPC Builder生成的系统中。

7.1.1 PIO寄存器描述

每个PIO内核可提供多达32I/O端口,用户可以添加一个或多个PIO内核。CPU通过读/写PIO接口的映射寄存器来控制PIO端口。在CPU的控制下,PIO内核在输入端口捕获数据,驱动数据到输出端口。当PIO端口直接连到了I/O管脚,通过写控制寄存器,CPU能够将管脚置成三态。图7-1是一个PIO应用的例子,本例使用了多个PIO内核。

图7-1 使用PIO 内核的系统实例

当集成到SOPC Builder 生成的系统中,PIO 内核有两个特性对用户是可见的。

具有四个寄存器的存储器映射的寄存器空间,4个寄存器是data 、direction 、

interruptmask 和edgecapture 。

1到32个的I/O 端口。

有些寄存器在某些硬件配置下不是必需的,这时相应的寄存器就不存在了。对一个

不存在的寄存器进行读操作,则返回一个未定义的值;一个不存在寄存器进行写操作则没有任何结果。表7-1给出了PIO 寄存器的描述。 表7-1 PIO内核寄存器

偏移量

寄存器名 R/W (n-1) … 2 1 0 读访问

R PIO 输入端口当前的数据值。 0 数据寄存器(data) 写访问 W

向PIO 输出端口输出的新的数据值。 1 方向寄存器 (direction) ① R/W

控制每个I/O 端口的输入输出方向。 0值为输入,1值为输出。2 中断掩码寄存器 interruptmask ① R/W

每个输入端口的IRQ 使能或禁止。将某位设为1,则使能相应的端口的中断。 3 边沿捕获寄存器

edgecapture ①②

R/W 每个输入端口的边沿检测。 注:① 该寄存器可能不存在,这取决于硬件的配置。

② 写任意值到edgecapture ,将所有位清零。

1. 数据寄存器(Data Input & 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支持的通用设备模型的种类,所以不能通过HAL API或者ANSI C 标准库来访问它。

Niios II EDS提供了几个演示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__

#include

#define IOADDR_ALTERA_AVALON_PIO_DATA(base) __IO_CALC_ADDRESS_NATIVE(base, 0) #define IORD_ALTERA_AVALON_PIO_DATA(base) IORD(base, 0)

#define IOWR_ALTERA_AVALON_PIO_DATA(base, data) IOWR(base, 0, data)

#define IOADDR_ALTERA_AVALON_PIO_DIRECTION(base) __IO_CALC_ADDRESS_NATIVE(base, 1) #define IORD_ALTERA_AVALON_PIO_DIRECTION(base) IORD(base, 1)

#define IOWR_ALTERA_AVALON_PIO_DIRECTION(base, data) IOWR(base, 1, data)

#define IOADDR_ALTERA_AVALON_PIO_IRQ_MASK(base) __IO_CALC_ADDRESS_NATIVE(base, 2) #define IORD_ALTERA_AVALON_PIO_IRQ_MASK(base) IORD(base, 2)

#define IOWR_ALTERA_AVALON_PIO_IRQ_MASK(base, data) IOWR(base, 2, data)

#define IOADDR_ALTERA_AVALON_PIO_EDGE_CAP(base) __IO_CALC_ADDRESS_NATIVE(base, 3) #define IORD_ALTERA_AVALON_PIO_EDGE_CAP(base) IORD(base, 3)

#define IOWR_ALTERA_AVALON_PIO_EDGE_CAP(base, data) IOWR(base, 3, data)

#endif /* __ALTERA_AVALON_PIO_REGS_H__ */

一个Nios II嵌入式系统中可能有多个用PIO内核的设备,这些设备的配置、基地址中断优先级等信息在system.h头文件中定义。在第二章的电子钟设计中用到了Button_PIO,在system.h头文件中关于Button_PIO的定义的代码如下:

#define BUTTON_PIO_NAME "/dev/button_pio"

#define BUTTON_PIO_TYPE "altera_avalon_pio"

#define BUTTON_PIO_BASE 0x00000860

#define BUTTON_PIO_SPAN 16

#define BUTTON_PIO_IRQ 2

#define BUTTON_PIO_DO_TEST_BENCH_WIRING 0

#define BUTTON_PIO_DRIVEN_SIM_VALUE 0x0000

#define BUTTON_PIO_HAS_TRI 0

#define BUTTON_PIO_HAS_OUT 0

#define BUTTON_PIO_HAS_IN 1

#define BUTTON_PIO_CAPTURE 1

#define BUTTON_PIO_EDGE_TYPE "ANY"

#define BUTTON_PIO_IRQ_TYPE "EDGE"

#define BUTTON_PIO_FREQ 50000000

#define ALT_MODULE_CLASS_button_pio altera_avalon_pio

即寄存器头文件定义了通用的PIO内核硬件结构,所有用到PIO内核的设备的个性信息在system.h文件中定义。对Button_PIO的读访问可以使用下面两个函数:IORD_ALTERA_AVALON_PIO_DATA(BUTTON_PIO_BASE)

IORD(BUTTON_PIO_BASE, 0)

即用BUTTON_PIO_BASE来代替函数中的参数,那对其他的设备的访问代入其它设备的基地址的宏定义即可,不要用直接硬件的地址。

7.2 定时器

具有Avalon接口的定时器内核是32位的间隔定时器,可用于基于Avalon总线的处理器系统,比如Nios II处理器系统。

定时器提供如下的特性:

可控制启动、停止和复位定时器。

两种计数模式:一次递减和连续递减。

递减周期寄存器

当递减到零时,可屏蔽中断请求。

可选的看门狗定时器特性——当定时器计时零时,复位系统。

可选的周期脉冲产生器特性——当定时器计时到零时,输出一个脉冲。

兼容32位和16位的处理器,

在HAL系统库中提供了Nios II处理器的定时器的驱动程序。定时器内核在SOPC Builder

中现成的IP,而且很容易集成到任何SOPC Builder生成的系统。

图7-2显示了定时器内核结构,定时器内核对用户可见的特性:

提供对6个16位寄存器访问的Avalon存储器映射接口

可用作脉冲产生器的可选的脉冲输出

所有的寄存器都是16位的,使得定时器能够兼容16位和32位的处理器。某些寄存器只有

在特定的配置下才在硬件上存在。例如,如果定时器配置成具有一个固定的周期,硬件上就

没有周期寄存器(period registers)了

图7-2 定时器内核原理图

7.2.1 定时器寄存器描述

如果使用Nios II处理器HAL系统库提供的标准的特性,程序开发者可以不必通过寄存器

来直接访问定时器。通常,寄存器映射只是对开发驱动程序的人员有用处。对于定时器共有

6个用户可以访问的16位的寄存器。表7-2给出了定时器寄存器的映射。

表7-2 定时器寄存器映射

位描述

偏移量名称R/W

15 … 4 3 2 1 0

0 status R/W 未定义RUN TO

1 control R/W 未定义STOP START CONT ITO

2 periodl R/W 超时周期–1 (位15..0)

3 periodh R/W 超时周期–1 (位31..16)

4 snapl R/W 计数器快照(位15..0)

5 snaph R/W 计数器快照(位31..0)

1.状态寄存器

状态寄存器有两个定义位,如表7-3所示。

表7-3 状态寄存器位

位名称读/写/清除描述

0 TO 读/清除当内部的计数器减到0时,TO位被置为1。一旦被超时事件设置, TO 位保持该状态,直到被主外设清除。向状态寄存器写入0即可清除TO。

1 RUN 读当内部计数器运行时,RUN位为1;否则为0。向RUN位写操作无效。

2. 控制寄存器

控制寄存器有4个控制位,如表7-4所示。

表7-4 控制寄存器位

位名称读/写/清零描述

0 ITO 读写如果ITO位为1,当状态寄存器TO是1时,则定时器内核产生一个中断请

求。当ITO位为0,定时器不产生中断请求。

1 CONT 读写 CONT

(continuous)位决定内部计数器达到0时的行为。如果CONT位为

1,计数器继续运行,直到它被STOP位停止。如果CONT为0,计数器

在达到零之后,停止运行。不管CONT位为何值,当计数器到0时,计

数器重新装载periodl和periodh 寄存器中存储的32位的计数器的初值。

2 START 写写1到START位启动内部计数器的运行(减一计数)。START位是计数器

使能位。如果定时器被停止了,写1到START位,则重启定时器计数,

计数从计数器保存的当前值开始。如果定时器正在运行,写1到START

没有任何作用。写0到START位没有任何作用。

3 STOP 写写1到STOP位停止内部的计数器,STOP位是使计数器停止工作的位。

如果已经被停止了,写1到STOP位没有任何的作用。写0到STOP 位没

有任何作用。如果定时器硬件配置没有Start/Stop 控制位,写STOP位

没有任何作用。

7.2.2 软件编程

下面讨论定时器内核的编程模型,包括寄存器的映射和软件声明。定时器内核属于HAL 支持的通用设备类型中的种类。Altera为Nios II处理器的用户提供了硬件抽象层(HAL)系统库驱动程序,使用户可以使用HAL API(应用程序接口)来访问定时器内核。

7.2.2.1 HAL系统库支持

Altera提供的驱动程序集成到HAL系统库中。可能的话,HAL用户应该使用HAL API访问定时器,而不是访问定时器的寄存器。

Altera为两种HAL定时器设备模型:系统时钟定时器和timestamp定时器都提供驱动程序。

1.系统时钟驱动程序

当配置为系统时钟,定时器以周期方式连续运行,周期使用的是SOPC builder的设置值。系统时钟服务作为这个定时器中断服务的一部分。驱动程序是中断驱动的,因此在系统硬件上,定时器必须连接有中断信号。

Nios II IDE允许用户指定在系统库属性中指定哪个定时器设备被用作系统时钟定时器。参看第六章相关内容。

2. Timestamp驱动程序

如果定时器内核满足如下的条件,可用作timestamp设备:

定时器具有一个可写的周期(period)寄存器,这可在SOPC Builder中配置。

定时器没有被设置成系统时钟。

Nios II IDE 允许在系统库属性中用户指定哪个定时器设备用作timestamp定时器。如果

定时器硬件没有设置成具有可写的周期寄存器,则调用alt_timestamp_start() API函数不会复

位timestamp计数器。其它的HAL API调用则如预期的一样。Nios II (EDS) 提供了几个使用

定时器内核的设计实例。

7.2.2.2 软件文件

定时器内核提供了下面的软件文件。这些文件定义了访问底层硬件的接口,提供了HAL

驱动程序。应用程序开发者不应该修改这些文件。

altera_avalon_timer_regs.h——定义了内核寄存器的映射,提供了对底层硬件的符号化的

访问。

altera_avalon_timer.h、altera_avalon_timer_sc.c、altera_avalon_timer_ts.c和

altera_avalon_timer_vars.c——提供定时器设备的驱动程序的实现。

应用程序开发者使用HAL API来访问定时器设备。HAL API中的参数要用到定时器设

备的信息,这些信息在system.h中定义,下面的代码是电子钟设计中的system.h文件中有关

定时器的预定义。

#define SYS_CLK_TIMER_NAME "/dev/sys_clk_timer"

#define SYS_CLK_TIMER_TYPE "altera_avalon_timer"

#define SYS_CLK_TIMER_BASE 0x00000820

#define SYS_CLK_TIMER_SPAN 32

#define SYS_CLK_TIMER_IRQ 1

#define SYS_CLK_TIMER_ALWAYS_RUN 0

#define SYS_CLK_TIMER_FIXED_PERIOD 0

#define SYS_CLK_TIMER_SNAPSHOT 1

#define SYS_CLK_TIMER_PERIOD 10

#define SYS_CLK_TIMER_PERIOD_UNITS "ms"

#define SYS_CLK_TIMER_RESET_OUTPUT 0

#define SYS_CLK_TIMER_TIMEOUT_PULSE_OUTPUT 0

#define SYS_CLK_TIMER_MULT 0.001

#define SYS_CLK_TIMER_FREQ 85000000

#define ALT_MODULE_CLASS_sys_clk_timer altera_avalon_timer

7.3 异步串口UART

具有Avalon接口的通用异步收发器(universal asynchronous receiver/transmitter——UART)内核实现了Altera FPGA片上的嵌入式系统和片外设备之间的

串行的字符流传输的一种方法。UART内核实现了RS-232协议的定时,并且提供可调的波特率,奇偶校验位、停止和数据位,以及可选的RTS/CTS流控制信号。

特性集是可配置的,允许设计者只实现特定系统的必要的功能。UART内核提供了寄存

器映射的Avalon从接口,这样就允许Avalon主外设(如Nios II处理器)通过读/写数据和控制寄存器和UART内核通信。

UART内核在SOPC Builder中提供,并且可以很容易地集成到任意的SOPC Builder生成的系统中。

7.3.1 UART内核功能描述

图7-3一个典型系统中的UART内核构成框图

UART内核有两个部分对用户是可见的:

寄存器文件,通过Avalon从端口进行访问。

RS-232 信号,RXD、TXD、CTS和RTS。

1. Avalon从端口和寄存器

UART内核为寄存器提供一个Avalon从端口。UART内核的用户接口包含6个16位的寄存器: control、status、rxdata、txdata、divisor和endofpacket。主外设,如Nios II处理器,访问寄存器来控制内核,在串行的连接通道上传输数据。

UART内核提供一个高电平有效的中断请求输出,当接收到新数据时或UART内核准备发送一个新的字符时,请求一个中断。

Avalon从端口能进行具有流控制的传输。UART内核可以和具有Avalon流控制的DMA 外设联合使用,以实现自动的连续的数据传输,例如内核和存储器之间的传输。

2. RS-232 接口

UART内核实现RS-232异步发送和接收逻辑。UART内核通过TXD和RXD端口发送和接收串行的数据。大多数Altera FPGA系列的I/O缓存和RS-232 电平不相匹配,如果直接被来自RS-232连接器的信号驱动,可能会对UART内核造成损坏。为了和RS-232 电压信令规范匹配,在FPGA I/O管脚和外部的RS-232连接器之间加入一个外部的电压转换缓冲器,比如Maxim MAX3237。UART内核使用负逻辑,FPGA内的变极器可以用来翻转任何RS-232信号的极性。

3. 发送器逻辑

UART发生器包含一个7、8、或9位的txdata保持寄存器,和一个相应的7、8或9位的发送移位寄存器。Avalon主外设通过Avalon从端口写txdata保持寄存器。当没有串行的发送移

位操作在进行,发送移位寄存器自动装载txdata寄存器。发送移位寄存器直接提供TXD输出。数据最低有效位最先移出到TXD。

以上的两个寄存器提供双重的缓冲。当主外设之前写入的数据正在被从发送移位寄存器移出时,主外设可以写入txdata寄存器一个新的数据。通过读状态寄存器的发送器就绪位(trdy)、发送器移位寄存器为空位(tmt)和发送器溢出错误位(toe),发送器主外设可以监控发送器的状态。

发送器逻辑按照RS-232规范的要求,在串行的TXD数据流中自动插入正确的开始位、停止位和奇偶校验位。

4. 接收器逻辑

UART接收器包含一个7、8或9位的接收器移位寄存器和一个相应的7、8或9位的保持寄存器rxdata。Avalon主外设通过Avalon从端口读rxdata保持寄存器。每当一个新字符被完整接收, rxdata保持寄存器自动装载移位寄存器的内容。

以上的两个寄存器提供双重的缓冲。rxdata寄存器可以保存之前接收到的字符,当后续的字符正在移入接收器移位寄存器。

主外设通过读状态寄存器的读就绪位(rrdy)、接收器溢出错误位(roe)、间断检测位(brk)、奇偶校验错误位 (pe)和帧错误位(fe),来监控接收器状态。接收器逻辑按照RS-232的规范要求,在串行的RXD数据流中自动检测正确的开始、停止和奇偶校验位。接收器逻辑检查接收数据中的四种异常情况(帧错误、奇偶校验错误、接收器溢出错误和间断)。并且设置相应的状态寄存器位(fe, pe, roe, or brk)。

5. 波特率生成

UART内核内部波特率时钟来自Avalon时钟输入,内部波特率时钟通过时钟分频器产生。除数值来自下面两个值:

在系统生成时指定的一个常数值。

在divisor寄存器中存储的16位值。

divisor寄存器是一个可选的硬件特性,如果在系统生成时,没有使能divisor寄存器,除数值则是固定的,波特率就不能被改变了。

7.3.2 在SOPC Builder中实例化UART

实例化UART在硬件上产生至少两个I/O端口,RXD输入和TXD输出。可选地,硬件也可能包括流控制信号,CTS输入和RTS输出。

下面讲述UART的配置

1. 波特率选项

UART内核可以实现RS-232连接的任何标准的波特率。波特率可以通过下面的两种方法进行配置:

固定的波特率—波特率在系统生成时被固定,并且不能通过Avalon从端口进行改变。 可变的波特率—基于存储在divisor寄存器中的时钟分频值,波特率可以改变。主外设通过写入divisor寄存器新值来改变波特率。

波特率设置决定着复位之后默认的波特率。波特率选项提供标准的预置值(如 9600, 57600, 115200bps),用户也可以手动输入任何的波特率值。

波特率的值的用来计算适合的时钟除数值。波特率和除数值之间的关系如下:

除数= int( (时钟频率)/(波特率) + 0.5 )

波特率= (时钟频率)/(除数 + 1)

在SOPC Builder中实例化UART时,如果选中了波特率可以通过软件改变的选项,UART

内核硬件上包含了一个16的divisor(除数)寄存器,该寄存器的地址偏移量为4。Divisor寄存器是可写的,所以波特率可以通过写入该寄存器一个新值来进行改变。

如果不选择这个选项,UART硬件则不包含divisor寄存器。UART硬件实现一个不变的波特率除数,这个值在系统生成之后就不能被改变了。此时,对地址偏移量为4的地址写操作没有任何结果,对该地址读操作返回一个未定义的结果。

2. 数据位、停止位、奇偶校验位

UART内核的奇偶校验位、数据位和停止位是可配置的。这些设置在系统生成时被确定,不能通过寄存器文件进行修改。下面的设置是可用的,见表7-5。

表7-5 UART内核数据位设置

设置允许的值描述

数据位(Data Bits) 7、8、9 这项设置决定txdata、rxdata和endofpacket寄存器的宽

度。

停止位(Stop Bits) 1、2 这项设置决定UART内核每个字符是传输1个还是2个停止位,

UART内核总是在第一个停止位终止接收,并忽略所有后续的停

止位,不管停止位的设置。

奇偶校验位(Parity) None、Even、Odd 这项设置决定UART是否发送带有奇偶校验的字符,和是否期望

接收的字符具有奇偶校验

当奇偶校验(Parity)设置为None,发送逻辑发送没有奇偶校验位的数据,并且接收逻辑认为输入的数据也不含奇偶校验位。当奇偶校验设置为None,状态寄(status)存器pe(parity error)位没有实现,它总是读0。

当奇偶校验设置为Odd或Even时,发送逻辑计算和插入需要的奇偶校验位到输出的TXD 比特流中,接收逻辑检查输入的RXD比特流中的奇偶校验位。如果接收器发现数据具有错误的奇偶校验,状态寄存器的pe位设置为1。当奇偶校验设置为Even,如果字符具有偶数个1,奇偶校验位为0,否则奇偶校验位为1。类似地,奇偶校验设置为Odd,奇偶校验位为0,如果字符具有奇数个1。

3. 流控制

UART内核的设置有”Include CTS/RTS pins & control register bits”的选项。如果选中这个选项,UART硬件包括

CTS_N (l负逻辑 CTS)输入端口。

RTS_N (负逻辑 RTS) 输出端口。

status寄存器的CTS 位。

status寄存器的DCTS位。

Control寄存器的RTS位。

control寄存器的IDCTS位。

基于这些硬件,Avalon主外设能够检测CTS和发送RTS 流控制信号。CTS输入和RTS输出端口直接连接到状态寄存器和控制寄存器的相应位上,对UART内核的其它部分没有直接的影响。

当Include CTS/RTS pins and control register bits 选项没有选中,UART内核在硬件上就包括上面所列的。控制/状态位CTS、DCTS、IDCTS和RTS都不进行实现。它们读总是0。

4. Avalon流控制传输(DMA)

UART内核可选择实现具有流控制的Avalon传输。这样,只有当UART内核准备好接收新的字符时,Avalon主外设才写数据;只有当内核有可用的数据时,主外设才进行读数据。UART 内核也可以选择是否包含end-of-packet 寄存器。

当选中Include end-of-packet register选项,UART内核包括:

在偏移量为5的地址,一个7、8或9位的endofpacket寄存器。数据宽度由Data Bits 设置决定。

状态寄存器的eop位

控制寄存器的ieop位。

Avalon接口中的endofpacket信号,以支持来自和去往系统中的主外设的具有流控制的数据传输。

End-of-packet (EOP)检测允许UART内核终止同具有流控制的主外设之间的数据传输。EOP检测可用于同DMA控制器一起使用,例如,实现UART自动写接收到的字符到存储器,直到在RXD数据流中遇到一个指定的字符。终止(end of packet)字符值由endofpacket寄存器决定。当end-of-packet寄存器没有使能,UART内核不包括上面所列的资源。写endofpacket寄存器没有结果,读则返回一个未定义的值。

7.3.3 UART寄存器描述

应用程序访问UART内核使用HAL API,不通过直接访问UART内核寄存器的方式。通常,寄存器映射只是对编写内核的驱动程序才有用。

表8-6显示HAL内核的寄存器映射,设备驱动通过存储器映射寄存器控制内核和与内核通信。

表7-6 UART内核寄存器映射

描述/寄存器位

移量寄存器名R/W15~13

12 1110 9 8 7 6 5 4 3 2 1 0

0 Rxdata RO①②②接收数据

1 Txdata WO①②②发送数据

2 Status③R/W①eop cts dcts①e rrdy trdy tmt toe roe brk fe pe

3 Control④R/W①ieop rts idcts trbk ie irrdy itrdy itmt itoe iroe ibrk ife ipe

4 Divisor R/W波特率除数

5 Endofpacket R/W①②② End-of-Packet

注:①这些位保留。对其读返回未定义的值,写操作清零。

②这些位可能存在,也可能不存在,取决于Data Width硬件选项。如果不存在,读返回0,写没有任

何结果。

③写0到状态(status)寄存器,将清零dcts、e、toe、roe、brk、fe和pe位。

④该寄存器可能存在也可能不存在,取决于硬件配置选项。如果不存在,读返回一个未定义的值,写

则没有任何结果。

有些寄存器和寄存器位是可选的,这些寄存器和寄存器位只有当在系统生成时使能了,

才能在硬件中存在。

1. Rxdata寄存器

Rxdata寄存器保存由RXD输入接收到的数据。当一个新的字符由RXD输入完全接收到,

就被传输进入Rxdata寄存器,Status寄存器的rrdy(receive character ready)位置为1。当Rxdata

寄存器中的字符被读出后,Status寄存器的rrdy位置为0。在rrdy位为1时(即前面的数据还没

有读出),又有字符输入到rxdata寄存器,则发生接收溢出错误。Status寄存器的roe(receiver overrun error)位置为1。不管前一个字符是否已经被读出,新的字符总是被传输到Rxdata

寄存器。写Rxdata寄存器无效。

2.Ttxdata寄存器

Avalon主外设将要发送的字符写入Txdata寄存器。直到发送器准备好发送一个新的字符时,字符才被写入Txdata寄存器,这由Status寄存器的TRDY位指示。当字符写入Txdata寄存器时,TRDY位置为0。当字符由Txdata寄存器传输到发生器移位寄存器之后,TRDY位置为1。当TRDY为0时,写入字符到Txdata寄存器,结果是未定义的。读Txdata寄存器返回一个未定义的值。

3. Status寄存器

Status寄存器每个单独的位反映UART内核的特定状态。每个状态位是和control寄存器中相应的中断使能位相联系的。可以在任何时候读Status寄存器。读不会改变任何位的值。写0到Status寄存器,将对DCTS、E、TOE、ROE、BRK、FE和PE位清零。

表7-7 Status寄存器位

位位名称读/写/

清零

描述

0 PE* R/C

Parity Error。当接收的校验位有不期望的逻辑值发生时,奇偶校验错误发生。

当内核接收到的字符奇偶校验位不正确,置PE位为1。PE 位保持为1,直

到通过写状态寄存器将其清零。当PE位置为1时,从Rxdata寄存器读数据

返回一个未定义的值。如Parity硬件选项没被使能,则UART内核不执行奇

偶校验,其诶读PE位总是0、

1 FE R/C

Framing Error。当接收器没能检测到正确的停止位,发生帧错误。帧错误发

生时,FE位设为1。FE位为1时,需要通过写状态寄存器将其清零。当FE位

为1时,读Rxdata寄存器返回未定义的值。

2 BRK R/C

Break Detect。当RXD引脚保持低电平的时间大于一个完整的字符(data bits

加上start、stop和parity位)时间时,接收逻辑检测到间断。当检测到间断时,

BRK位设为1。BRK位为1,需要写状态寄存器将其清零。

3 ROE R/C

Receive Overrun Error。当新接收的字符传输到Rxdata寄存器,而前一个字符

还没有读取(RRDY为1),发生接收溢出错误。此时,ROE位置1,且接收数

据寄存器中前一个字符被改写。ROE为1,需要写状态寄存器清零。

4 TOE R/C

Transmit Overrun Error。当前一个字符从Txdata寄存器传输到移位寄存器前,

对Txdata写入新的字符,则发生发送溢出错误。此时,TOE位为1,TOE为1,

需要写状态寄存器将其清零。

5 TMT R Transmit Empty。TMT位指示发送移位寄存器的当前状态。当发送移位寄存

器正将字符从TXD引脚输出时,TMT设为0.当发送移位寄存器空闲时(没有

字符发送),TMT位为1。Avalon主控制器可以通过检查TMT位确定发送是否

完成(并在串行连接的另一端接收)。

6 TRDY R Transmit Ready。TRDY位指示发送数据寄存器的当前状态。当发送数据寄

存器空时,准备好接收新字符且TRDY为1。当发送数据寄存器满时,TRDY

为0。Avalon主外设必须等到TRDY变为1,才可以写入新数据到发送数据寄

存器。

7 RRDY R Receive Character Ready。RRDY位指示接收数据寄存器的当前状态。当接收

数据寄存器空时,没有准备好读的数据,RRDY为0。当新接收的值传输到

接收数据寄存器时,RRDY位为1。读接收数据寄存器将RRDY位清零。Avalon

主外设必须等到RRDY位为1,才可以读接收数据寄存器。

8 E R/C

Exception。E位指示异常情况的发生。E位是TOE、ROE、BRK、FE和PE位

的逻辑或。E位与控制寄存器中的对应的IE位一起提供了一种方便的允许/

禁止所有错误中断的方法。

写状态寄存器的操作将E为置零。

10* DCTS R/C Change in clear to send signal。只要在CTS_N输入端口上检测到逻辑电平的

跳变(采样与Avalon时钟同步),DTS位置为1。该位通过CTS_N的上升沿

和下降沿跳变设置。DCTS位为1时保持不变,直到写状态寄存器将其清零。

如果Flow Control硬件选项没有被使能,那么DCTS位总是为0。

11* CTS R Clear to send singnal。CTS位反映CTS_N输入的瞬时值(采样与Avalon时钟

同步)。CTS_N引脚为负逻辑,因此当CTS_N输入为0电平时,CTS位为1。

CTS_N输入对发送或接收逻辑没影响。CTS_N输入仅影响CTS和DCTS位状

态,且当控制寄存器的idcts位使能时,有可能产生中断。

如果Flow Control的硬件选项没有使能,那么CTS为总是0。

12* EOP R End of Packet。以下事件发生时,EOP位为1:

向发送数据寄存器写入EOP字符。

从接受数据寄存器接收EOP字符。

EOP字符由数据包结束符寄存器的内容确定。EOP位为1时保持不变,直到

写状态寄存器将其清零。

如果不使能Include End-of-Packet硬件选项。那么EOP位总是为0。

注:*该位可选,可能在硬件上不存在。

4. Control(控制)寄存器

Control寄存器包含控制UART内核操作的位,每一位控制UART内核的一个方面。Control 寄存器的值可以在任何时刻读取。Control寄存器的每一位使能状态寄存器中相应位的中断。当状态位和它的相应的中断使能位都是1时,内核产生一个中断请求。例如,状态寄存器的pe为0, 控制寄存器的ipe位为0。当pe和ipe都为1是产生中断。控制寄存器的位在表7-8中给出。

表7-8 控制寄存器位

位位名读/写描述

0 IPE RW

使能奇偶校验错误中断。

1 IFE RW

使能帧错误中断。

2 IBRK RW

使能间断检测中断。

3 IROE RW

使能j接收溢出错误中断。

4 ITOE RW

使能发送溢出错误中断。

5 ITMT RW

使能发送移位寄存器空中断。

6 ITRDY RW

使能发送准备就绪中断。

7 IRRDY RW

使能读准备就绪中断。

8 IE RW

使能异常中断。

9 TRBK RW

发送间断。TRBK位允许Avalon主外设在TXD输出引脚上发送间断

字符。当TRBK位置为1,TXD信号被强迫置0。TRBK位相对于发

送器其它逻辑对TXD有高的控制权。TRBK位干扰正在进行的传

输。当间断期过去之后,Avalon主外设必须重新将TRBK置回为0。

10 IDCTS RW

使能CTS信号改变中断。

11① RTS RW

请求发送(Request to send ——RTS)信号。RTS位直接提供给

RTS_N输出。Avalon主外设可以在任何时刻写RTS位。RTS位的值

只影响RTS_N端口输出。不会影响发生器和接收器的逻辑。因为

RTS_N输出是负逻辑,当RTS位是1时,低电平逻辑(0) 被驱动到

RTS_N输出端口。.

如果Flow Control硬件选项没有使能,读RTS位总是为0,写则没有

任何的结果。

12 IEOP RW

使能包结束符中断。

注:①该位是可选的,硬件上可能不存在。

5. 除数(divisor)寄存器(可选)

Divisor寄存器用来产生波特率时钟,采用的波特率由下面的公式决定:

Baud Rate = (Clock frequency) / (divisor + 1)

Divisor寄存器是一个可选的硬件特性,如果Baud Rate Can Be Changed By Software硬件选项没有使能,divisor寄存器就不存在。这种情况下,写divisor没有任何结果,读divisor 返回一个未定义的值。.

6. 包结束符(Endofpacket)寄存器(可选l)

Endofpacket寄存器的值决定可变长度的DMA传输的包结束字符。复位之后,缺省的值是0,即是ASCII的null字符(\0)。

Endofpacket寄存器是一个可选的硬件特性。如果Include end-of-packet register硬件选项没有使能,则endofpacket寄存器就不存在。这种情况下,写endofpacket没有任何结果,读则返回一个未定义的值。.

7.3.4 中断行为

UART内核输出一个单独的中断请求(IRQ)信号给Avalon接口,这样就可以连接到系统中的主外设,如Nios II处理器。主外设必须读status寄存器以确定中断的原因。每一个中断情况,都同status寄存器中的一位和control寄存器中的一个中断使能位相联系。当任何一种中断情况发生,与之相关的状态位被置为1,直到中断请求被确认。当状态位和其相应的中断使能位为1时,产生IRQ输出。主外设可以清除的状态寄存器来确认IRQ。

复位时,所有的中断使能位都设成0,所以,UART内核不能产生中断请求,直到主外设设置一个或多个中断使能位为1。

7.3.5 软件编程

对于Nios II处理器的使用者,Altera提供HAL系统库驱动程序,用户可以使用ANSI C标准库函数来访问UART内核,例如使用printf()和getchar()函数。

7.3.5.1 HAL系统库支持

Altera提供的驱动程序实现了HAL字符模式设备驱动程序,字符模式设备的驱动程序集成到了Nios II 系统的HAL系统库中。HAL用户应该使用熟悉的HAL API和ANSI C标准库函数来访问UART,而不是通过访问UART寄存器的方式。HAL用户可以使用ioctl() 函数来控制UART硬件的相关方面。

对于Nios II处理器的用户,HAL系统库API提供完整的UART内核特性访问。Nios II编程将UART内核当成一个字符模式设备处理,使用ANSI C标准库函数进行发送和接收数据。驱

动程序支持CTS/RTS控制信号。

下面的代码演示的是一个很简单的可能的使用,使用printf( )打印一条消息到标准输出设备。本例中,SOPC Builder系统包含一个UART内核,HAL系统库已经配置成使用UART 作为标准输出(stdout)设备。

例程:打印字符到作为标准输出设备的UART内核

#include

int main ()

{

printf("Hello world.\n");

return 0;

}

下面的代码演示了使用ANSI C 标准库函数从UART设备读字符和向UART设备发送消息。本例中,SOPC Builder系统包含一个UART内核uart1,该设备没有必要配置成stdout设备。这种情况下,程序处理该设备就像HAL文件系统中的其它节点一样。

例程:接收和发送字符

/* A simple program that recognizes the characters 't' and 'v' */

#include

#include

int main ()

{

char* msg = "Detected the character 't'.\n";

FILE* fp;

char prompt = 0;

fp = fopen ("/dev/uart1", "r+"); //Open file for reading and writing

if (fp)

{

while (prompt != 'v')

{ // Loop until we receive a 'v'.

prompt = getc(fp); // Get a character from the UART.

if (prompt == 't')

{ // Print a message if character is 't'.

fwrite (msg, strlen (msg), 1, fp);

}

}

fprintf(fp, "Closing the UART file.\n");

fclose (fp);

}

return 0;

}

7.3.5.2 驱动程序选项

为了满足不同类型系统的需求,UART驱动程序提供了两个版本:快速版本(fast version)和小型版本(small version.)。默认使用快速的版本。快速和小型版本驱动程序都完全支持

C标准库函数和HAL API。

快速驱动程序采用中断驱动的实现方法,这样当设备没有准备好发送或接收数据时,允许处理器执行其它的任务。因为UART数据速率比处理器要慢,采用快速驱动程序因此可以提高系统的性能。

小型版本驱动程序采用的是查询实现方法,在发送和接收每一个字符之前,要等待UART硬件。有两种方法来使能小型驱动程序:

在HAL系统库工程属性中使能小型版本。这个选项会影响系统中所有的设备驱动程序。指定预处理器选项如果用户要使用小型、查询版本的UART驱动程序,用户使用这个选项,这样不影响系统中-DALTERA_AVALON_UART_SMALL。其它设备的驱动程序。

如果在硬件上使能了CTS/RTS 流控制信号,快速的版本自动使用这些信号,而小型版

本忽略这些信号。

7.3.5.3 ioctl() 操作

UART驱动程序支持ioctl()函数,允许基于HAL程序请求设备相关的操作。表7-9定义了UART驱动程序支持的操作请求。

表7-9 UART ioctl( )操作

请求意义

TIOCEXCL 所定设备为独占的访问。接下来调用open()来打开该设备会失败,直到该文件描述符关闭或者通过使用TIOCNXCL ioctl请求释放了锁定。本请求成功,则设备的文件描

述符就不存在。Ioctl的"arg" 参数被忽略。

TIOCNXCL 释放先前独占访问锁定。ioctl "arg" 参数被忽略。

附加操作请求只对快速驱动程序是可选的,如表7-10所示。要在用户程序中使能这些操作,用户必须设置预处理器选项DALTERA_AVALON_UART_USE_IOCTL。

表7-10 快速驱动可选的UART的iotcl()操作

请求意义

TIOCMGET 通过填入输入termios①结构内容,返回当前的设备配置。该结构的指针提供给ioctl

作为 "opt" 参数。

TIOCMSET 根据输入termios结构①的值,设置设备的配置。该结构的指针提供给ioctl 作为

"arg"参数。

注:termios结构由Newlib C标准库定义,用户可以在文件/components/altera_hal/HAL/inc/sys/termios.h.找到其定义。

7.3.3.4 软件文件

系统库中提供了UART内核底层硬件接口和HAL驱动程序。应用程序开发人员不应该修改这些文件:

altera_avalon_uart_regs.h——定义了内核的寄存器映射,提供了符号常数来访问底层硬件。文件中的常数只能被设备驱动程序函数使用。

altera_avalon_uart.h, altera_avalon_uart.c——这些文件实现了HAL系统库的UART内核设备驱动程序。

7.4 Optrex 16207 LCD控制器内核

具有Avalon接口的Optrex 16207 LCD控制器内核为提供给Nios II处理器在Optrex 16207 (或相当的) 16x2-字符型LCD屏显示字符所需要的硬件接口和软件驱动程序。设备驱动程序在HAL 系统库中提供给Nios II处理器。Nios II程序使用ANSI C标准库函数访问LCD控制器(属于字符型设备),如printf()。LCD 控制器在SOPC Builder提供,很容易集成到SOPC Builder生成的系统中。Nios II EDS 包含Optrex LCD模块,并且提供了几个现成的设计例子,通过LCD控制器在Optrex 16207上显示文本。

7.4.1 功能描述

LCD控制器硬件包含两个用户可见的部分,如图7-4所示:

连接到Optrex 16207 LCD屏引脚的11个信号,这些信号在Optrex 16207 data sheet中定义。

z E– 输出使能

z RS– 寄存器选择(输出)

z R/W – 读或写(输出)

z DB0~DB7 – 数据总线(双向)

Avalon从接口,提供对4个寄存器的访问— HAL设备驱动程序使用户不必直接访问寄存器,因此,Altera不提供寄存器使用的细节。

图7-4 LCD 控制器的结构图

LCD控制器硬件支持所有的Altera FPGA系列。LCD控制器驱动程序支持Nios II处理器。驱动程序不支持第一代的Nios处理器。

7.4.2 软件编程

1. HAL系统库支持

Altera为Nios II处理器提供HAL系统库驱动程序,使用户可以使用ANSI C标准库函数访问LCD 控制器。Altera提供的驱动程序集成到HAL系统库。LCD 驱动程序是标准的字符型设备,因此使用printf()是最简单的显示字符的方法。

LCD驱动程序要求HAL系统库包含系统时钟驱动程序。

2.软件文件

随LCD控制器提供了下面的软件文件。这些文件定义了硬件的底层接口,并且提供了HAL驱动程序。应用程序开发人员不应该修改这些文件。

altera_avalon_lcd_16207_regs.h——该文件定义了控制器内核的寄存器映射,提供了符号化的常数来访问底层硬件。

altera_avalon_lcd_16207.h和altera_avalon_lcd_16207.c——这些文件为HAL系统库实现了LCD控制器设备驱动程序。

LCD控制器和UART一样都属于字符型设备,所以访问LCD控制器同UART一样可以使用ANSI C标准库函数和HALAPI来进行访问,读者可以参考UART部分。

7.5 通用Flash接口(CFI)控制器内核

具有Avalon接口的通用flash接口(Common Flash Interface)控制器内核允许用户很容易地将SOPC Builder系统同外部的遵循CFI规范的flash存储器连接起来。CFI 控制器在SOPC Builder中提供,很容易集成到SOPC Builder生成的系统中去。

对于Nios II处理器,Altera为CFI控制器提供硬件抽象层(HAL) 驱动函数。驱动程序提供通用的访问遵循CFI规范的flash存储器函数。因此,用户不需要写任何的额外的代码。HAL 驱动程序利用了HAL通用设备模型,允许用户使用熟悉的HAL API或ANSI C标准库I/O函数来访问flash存储器。

7.5.1 功能描述

Nios II EDS提供基于Nios II 处理器和CFI控制器的flash programmer工具,flash programmer 工具可以用于编程任何遵循CFI规范的连接到Altera的FPGA的flash存储器。

图7-5为典型系统配置中CFI控制器的原理图。Flash设备的Avalon接口是通过Avalon三态桥进行连接的。三态桥生成一个片外存储器总线,允许flash芯片同其它的存储器芯片共享地址和数据管脚。

它为每个连接到存储器总线的芯片提供了独立的chipselect、read和write管脚。CFI控制器的硬件最小化的,只是配置有适合flash芯片的等待周期、建立时间和保持时间的Avalon 三态从端口。从端口能够进行Avalon三态读传输和写传输。Avalon主端口能够直接对CFI控制器的Avalon端口执行读传输。

图7-5 集成CFI内核的系统

7.5.2 在SOPC Builder中实例化CFI控制器内核

硬件设计者使用SOPC Builder中的CFI的MegaWizard来设定CFI控制器内核的特性。MegaWizard包含有以下的设置页面。

1.属性(Attributes)页面

该页中的选项控制CFI控制器的基本的硬件配置。.

a.Presets设置

Presets设置下拉菜单提供已经预先配置好使用CFI控制器的flash芯片。用户选择Preset

下拉菜单中一个芯片,MegaWizard会更新两个页面的所有的设置为指定的flash芯片的设置。如果用户目标板上的flash芯片在Presets列表中不存在,用户必须配置手动配置其它的设置。

b.Size设置

size 设置设定flash设备的容量,这里有两种配置:

Address Width—flash芯片地址总线的宽度。

Data Width—flash芯片的数据总线的宽度。

size设置会使得SOPC Builder分配正确数量的地址空间给flash设备。SOPC Builder会自动生成动态总线对齐逻辑,以使得flash 芯片能够正确地与具有不同数据宽度的Avalon主端口进行连接。

2. 定时(Timing)页

该页的选项指定flash设备的读传输和写传输的时序要求。可用设置包括:

Setup—在置chipselect有效之后,在发出read或write信号之前所需的时间。

Wait—每次传输read或write信号保持有效的时间。

Hold—当write信号无效之后,置chipselect信号无效之前所需的时间。.

Units—Setup、Wait和Hold值的单位。可以是ns、us、ms和时钟周期。.

7.5.3 软件编程

1. HAL系统库支持

通常,系统中的任何的Avalon主外设都可以读flash芯片。对于Nios II 处理器的用户,

Altera通过HAL系统库驱动程序,使用户可以使用HAL API 函数来擦除和写flash存储器。

Altera通过的驱动程序实现HAL flash设备的驱动程序,并且集成到Nios II系统的HAL系统库中去了。应用程序调用熟悉的HAL API 函数来对遵循CFI规范的flash存储器进行编程。用户不必知道底层驱动的细节。

Nios II EDS提供了参考设计——Flash Tests,演示了擦除、写和读flash存储器。目前,Altera提供的CFI控制器的驱动只支持AMD和Intel的flash芯片。

2. 软件文件

CFI控制器提供如下的软件文件,这些文件定义了对硬件的底层访问,并且提供HAL flash设备的驱动程序。应用程序开发人员不应修改这些文件。

altera_avalon_cfi_flash.h, altera_avalon_cfi_flash.c——将驱动程序集成到HAL系统库中

所需要的函数和变量的头文件和源代码。

altera_avalon_cfi_flash_funcs.h, altera_avalon_cfi_flash_table.c——和访问CFI表有关的函数的头文件和源代码。

altera_avalon_cfi_flash_amd_funcs.h、altera_avalon_cfi_flash_amd.c——对AMD flash芯片编程的头文件和源代码。

altera_avalon_cfi_flash_intel_funcs.h、altera_avalon_cfi_flash_intel.c——对Intel flash

芯片编程的头文件和源代码。

7.6 DMA内核

具有Avalon接口的直接存储器访问(DMA)控制器内核执行大块的数据传输,从一个源地址范围读数据,写数据到不同的地址范围。Avalon主外设,如CPU,能够将存储器传输任务下放给DMA控制器。而DMA控制器执行存储器传输,主外设能够并行地执行其它的任务。

DMA控制器尽可能高效地传输数据,以源存储器和目的存储器所能允许的最大的速率读和写数据。DMA控制器能够执行具有流控制的Avalon传输,使得它能自动地以外设允许的最大速率,向/从一个具有流控制的低速外设传输数据。

DMA控制器在SOPC Builder提供,并且很容易集成到系统中去。

7.6.1 功能描述

DMA控制器用于执行从源地址空间到目的地址空间的直接存储器访问数据传输。源和目的可以是Avalon从外设(即,固定的地址)或是存储器内的一段地址范围。DMA控制器可以同具有流控制的外设联合使用,可以进行有固定和可变长度的数据处理。当DMA传输结束,DMA控制器可以发一个中断请求信号。DMA数据传输定义为一个或多个由DMA控制器内核发起的Avalon传输的序列。DMA控制器具有两个Avalon主端口:一个主读端口和一个主写端口,和一个Avalon从端口用于控制DMA,如图7-6所示。

离机闪灯使用基本技巧

离机闪灯使用基本技巧 离机闪灯使用基本技巧:基本离机闪灯的器材 要用离机闪灯来相片,你当然要一些光源,对于一般用家来说,一支普通的外置闪灯已经可以胜任,在选择闪灯时,最好选一些灯 头可以调较的,方便改变闪光的方向;而且可以的话,选择一些可以 连接外置电池箱和用相机同步线的,外置电池箱虽然可以增加回电 速度和持久性,不过并不是必须的。 下一步便是要让外置闪光灯连接到相机了!最便宜和传统的方法 便是利用闪光灯同步线来连接,留意每部相机的闪光灯同步线的插 头可能会有所不同,购买时请按型号来选择。不过现在有些更方便 的选择,便是利用无线同步器了,市面上有很多这种的同步器,好 像PhottixODIN引闪,或是国内牌子永诺YongnuoRF-603II等,前 者比较专业,有更多选项,但也比较贵,对于新手不妨考虑后者。 最后的器材便是放外置闪灯的支架了,闪灯架不贵,在相机器材店一般也有,例如Manfrotto的5001B,或是大陆牌子的也可以, 或是直接把闪光灯放在椅子或桌面也可。 离机闪灯使用基本技巧:离机闪灯示范教学 一开始不用任何闪灯,直接拍摄: 光圈:f/2.8 快门:1/160s ISO:250 只利用自然光拍摄的效果不太差,但左边因为受光不足而比较暗: 现在是时候让闪光灯出场了!外置闪光灯一般会有数个按钮,但 第一个你要知道的便是「Mode」模式,按下Mode按钮后可以让你从「ETTL」(自动)转到「M」手动模式。当你把闪灯插在相机上的时候,

ETTL可以发挥很大的作用,但当使用离机引闪时,最好也是使用全手动模式,这样可以更有效地控制闪灯的输出和想用的效果。 选择了「M」手动模式后,你可以控制闪光灯的输出,1/1是全力输出而1/128是最小的光度(其实只是输出的持续时间而不是实际的力度,另文再谈)。以下的相片是利用了刚才一样的设定,但闪光灯输出调较至1/16,看看效果: 闪光灯输出设定为:1/16 相片看起来太光了,我们再试试把输出降至1/64,这时光线便平均很多: 闪光灯输出设定为:1/64 若果再把闪灯输出降至1/128,可以看到主体的边缘更突出,能在背景中显露出来: 闪光灯输出:1/128 以上便是离机闪灯最基本的玩法了,是不是很简单呢?下一步你可以试试多加数支闪灯,调较输出,并照亮不同的地方,这样可能会有意想不到的效果啊!快点玩玩吧!

NIOSII里的uart操作

NIOSII里的uart操作 第一步,在sopc里增加一个串口 第二步:操作UART的三种方法 (1)直接寄存器操作。 NIOS II 的串口编程有多种方式,很多地方给的程序大多数更像纯C语言写法,占用程序空间比较大,这里以一个更像单片机串口的程序,占用空间当对而言要小,且对像工业控制的数据传输更实用简单些(个人觉得)。 extern unsigned char leddata[8]; //UART发送一个字节子程序 void Uart_send(unsigned char data) { alt_u16 status; status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);

while(!(status&0x0040))//等待发送完成 status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE); IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE,data); } //UART发送多个字节子程序 void Uart_send_n(unsigned char *ptr,unsigned char n) { for(;n>0;n--) { Uart_send(*ptr); ptr++; } } //UART接收子程序 int Uart_receive(void) { alt_u16 status; int temp; status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE); while(!(status&0x0080))//等待发送完成 status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE); temp=IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE); return temp; } //串口接收中断服务程序 void Uart_ISR(void * context,alt_u32 id) { unsigned char temp; temp=IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE); leddata[5]=temp; } //串口中断初始化 void Uart_init() { IOWR_ALTERA_AVALON_UART_CONTROL(UART_BASE, 0x80);//接收中断使能 IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0x0);//清状态标志 // IOWR_ALTERA_AVALON_UART_RXDATA(UART_BASE, 0x0);//清接收寄存器 alt_irq_register(UART_IRQ,0,Uart_ISR);//中断注册,此处编译总出现警告,还请高手能指点。warning: implicit declaration of function `alt_irq_register' test3 uart_zx.h

Proe中的常用函数关系

Proe中的部分函数关系 一、函数关系 sin 正弦Cos 余弦tan 正切asin 反正弦acos 反余弦atan 反正切sinh 双曲线余弦cosh 双曲线正弦tanh 双曲线正切spar 平方根exp e的幂方根abs 绝对值log 以10为底的对数ln 自然对数 ceil 不小于其值的最小整数floor 不超过其值的最大整数 二、齿轮公式 alpha=20 m=2 z=30 c=0.25 ha=1 db=m*z*cos(alpha) r=(db/2)/cos(t*50) theta=(180/pi)*tan(t*50)-t*50 z=0 三、蜗杆的公式da=8为蜗杆外径m=0.8 为模数angle=20压力角 L=30长度q直径系数d分度圆直径f齿根圆直径n实数

其中之间的关系 q=da/m-2 d=q*m df=(q-2.4)*m n=ceil(2*l/(pi*m)) 在可变剖面扫描的时候运用公式sd4=trajpar*360*n 在扫描切口的时候绘制此图形,其中红色的高的计算公式是sd5=pi*m/2 五、方向盘的公式sd4=sd6*(1-(sin(trajpar*360*36)+1)/8) 其中sd4是sd6的(3/4或者7/8),sin(trajpar*360*36的意思是转过360度且有36个振幅似的 六、凸轮的公式sd5=evalgraph("cam2",trajpar*360) r=150 theta=t*360 z=9*sin(10*t*360) 在方向按sin(10*t*360)的函数关系,9为高的9倍10为10个振幅似的 七、锥齿轮公式 m=4模数z =50齿轮齿数z-am=40与之啮合的齿轮齿数angle=20压力角b=30齿厚long分度圆锥角 d分度圆直径da齿顶圆直径df齿根圆直径db基圆直径关系:long=atan(z/z-am) d=m*z da=d+2*m*cos(long)

闪光灯使用技巧详细说明

闪光灯使用技巧详细说明 喜欢摄影的人没有几个不知道Strobist(闪卓博识)的,在全球每天都有成千上万的人来网站流连。在这里你将会浏览到不断更新的免费教程,跟从专家学习闪光灯的使用技巧。闪卓博识越办越专业,所带来的人群也越来越高端。美国摄影业同侪——那些同样痴迷于小型闪光灯运用的大名鼎鼎的摄影大师受到大卫的感召来到闪卓博识,他们一同探讨摄影技术,成为朋友、知己,进而构成“闪卓士”的最中坚分子和技术核心,他们的名字熠熠生辉,闪耀在当代国际高端摄影舞台,他们有: 乔·麦克那利(Joe McNally) 切斯·贾维斯(Chase Jarvis)戴夫·布莱克(Dave Black) 提姆·泰德(Tim Tadder) 尤里·艾库斯(Y uri Arcurs) 大卫·泰加塔(David Tejada) 柯克·塔克(Kirk Tuck) 闪卓博识从建站伊始即打出最醒目的口号:精简装备,依靠你的布光智慧,拍下惊世骇俗的照片 大卫豪比在闪卓博识(Strobist)中设立了一系列免费的主题如:《闪光灯初级课》、《场记》、《新兵营》等,这些主题深入浅出地阐明了自己的摄影理念和用光细节,同时采用图文并茂的手法,让每次有意义的外拍场记都呈现在读者面前。 其中《闪光灯初级课》是向读者传授如何掌握光线平衡和外置闪光灯的基础摄影技巧的栏目,它解答的是:拍摄高质量照片的初学者应该从何处下手,练习拍什么题材的照片。课程涉及许多就连大师级摄影师也懵懂的一些技术内容,因此作为互联网上对摄影知识进行讲解的最全的问题数据库,《闪光灯初级课》适合所有摄影师来阅读——无论是业余爱好者还是专业摄影师。 《场记》是对基础技能知识的有效补充,并以真实的拍摄实例,以图文并茂的方式介绍那些善用闪光灯的专业摄影师获得该图片效果的详细过程。通过《场记》,摄影界的新手可以了解到一个职业摄影师面对任务的思路和解决问题的步骤,老手则可以在阅读的同时,用同样问题考问自己,找到和同业者的思路差异,从而取长补短,去提升自己的专业水平。

nios2+c语言编程方法Nios2系列教程

最小的Nios2系统 前言 2003年Altera推出了第一代32位Nios系统,开创了FPGA内构建高性能单片机的先河。随之2004年,Nios系统升级为Nios2系统,解决了软硬件开发中一些不方便的问题,软件开发环境从命令行编译转移到Eclips的IDE集成开放环境。Nios2开发环境从1.0、1.1到1.2逐步升级。后来为了和QuartusII软件升级同步,从QuartusII5.0版本开始Nios2的版本号正式和QuartusII统一。 作者我亲身经历过整个Nios2发展历程,深知Nios2的不同版本发生的巨大变化。目前网上流行的Nios2教程针对的版本相对较老,已经对初学者学习Nios2起不到指导作用,并且应广大爱好者的强烈要求,我在此使用QuartusII和Nios2的8.0版本详细叙述Nios2的开发流程。构建一个Nios2最小系统需要什么 构建一个Nios2最小系统需要具备以下资源: ★Nios2软核处理器 ★内存 ★Jtag_uart调试接口 1. Nios2软核处理器:这就是Nios2处理器的核心CPU,所有的外设都是和这个CPU通过Avalon总线连接到一起的。

2. 内存:编译后的程序代码需要通过下载线下载到该内存中,然后CPU的程序指针跳转到内存的首地址开始执行程序。 3. Jtag_uart调试接口:想要用单步调试等调试功能控制程序执行和查看程序变量,那么就需要这个调试接口。 开始构建一个再简单不过的Nios2工程 整个步骤由2部分组成,第一部分建立Nios2硬件SOPC工程,第二部分建立Nios2软件工程。 1.建立Nios2硬件SOPC工程 建立Nios2硬件SOPC工程就是设计一个软核CPU和它的外设,编译成硬件电路放到FPGA芯片里面。这时候可以认为FPGA就是一个32位的单片机了,下面的软件开发都是针对这个单片机的。 打开QuartusII软件,新建一个工程选择EP2C8Q208C8芯片。 打开Tools->SOPC Builder菜单,进入SOPC Builder界面,新建一个名为nios32的SOPC文件,语言可以选择VHDL或者VerilogHDL。我们一共要添加3个IP模块:Nios2处理器、片上内存和Jtag_uart 调试接口。 1.1在左边的IP导航栏里面双击选择NiosII Processor,然后选择Nios II/e型的处理器。这个处理器占用FPGA逻辑资源最小。此时CPU的Reset Vector和Exception Vector都是不可选的,因为还没有设置内存。在

闪光灯使用技巧详细说明

闪光灯使用技巧详细说明 闪光设备的种类 /B 热靴式闪光灯能够滑入位于相机顶部的热靴插座。热靴具有一个电子连接口当闪光灯接入这一连接口后快门释放时闪光就会同时爆发。手握固定式闪光灯能够比标准的热靴闪光灯产生更多的闪光。影室闪光灯组是非常强大的闪光设备它们能够触发一个或多个通过电线与电池组相连的闪光灯。自给式闪光灯灯头具有内置的电池组。闪光设备配件/B 当闪光灯同步感应器探测到由相机控制的主闪光灯发出的光波脉冲后它能够激发附属闪光灯。造型灯是一个内置于闪光灯灯头内的小型疝气灯它能够确定闪光灯的位置。/ALIGN 描述闪光灯功率基本闪光技巧/B 闪光灯最简单的使用方法就是利用相机上的闪光灯直接为拍摄场景提供光线。在使用闪光灯时要仔细确定闪光灯的照射方向避免产生奇怪的阴影或任何混乱的反射。 /B 手动闪光曝光手动控制闪光灯可以使光线具有固定的强度。在使用手动闪光灯进行重要的拍摄之前先采用一个好的闪光灯测光表测试一下或拍摄一卷试验胶片。使用闪光灯上的刻度盘闪光灯可以帮助你计算出手动闪光灯的曝光数值。/ALIGN 1. 将闪光灯设为手动。 2. 将相机的快门速度与闪光灯设定为同步。 3. 将闪光灯刻度盘上的感光度设置为所用胶片的感光度。 4. 选择被摄物与闪光灯之间的距离在刻度盘上选择它们的距离之前你可以先自己估算一下距离或先进行对焦然后再读取镜头上距离标尺的数值。 5. 设定镜头所需的光圈大小。闪光灯光线反射的手动曝光设定反射的闪光灯光线会游走段额外的距离。/ALIGN 1. 将闪光灯设为手动。 2. 将相机的快门速度与闪光灯设定为同步。 3. 将闪光灯刻度盘上的感光度设置为所用胶片的感光度。 4.估测从闪光灯到反射面以及反射面到被摄物的距离。 5.在刻度盘上找到与距离刻度对应的光圈数值。 6.把光圈调整得稍大一些来弥补被反射面吸收的部分光线。使用闪光灯测光表:闪光灯测光表是使用手动闪光灯或闪光灯反射光进行拍摄时最精确的测光工具。/ALIGN 1. 根据胶

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

第1节并行输入/输出内核 并行输入/输出(PIO)内核提供了Avalon存储器映射从端口和通用IO端口直接的接口。 I/O端口连接到片内的用户逻辑或是连到与FPGA片外设备相连的引脚上。 PIO内核提供对用户逻辑或外部设备简单的I/O访问,应用实例如下: ?控制LED ?获取开关数据 ?控制显示设备 ?配置并与片外设备通信,例如专用标准产品(ASSP)的设备。 PIO内核可以基于输入信号而发出中断请求 (IRQ) 输出。SOPC Builder 中提供了现成的 PIO内核,可以很容易地将PIO内核集成到SOPC Builder生成的系统中。 7.1.1 PIO 寄存器描述 每个PIO内核可提供多达32I/O端口,用户可以添加一个或多个PIO 内核。CPU通过读/ 写PIO接口的映射寄存器来控制PIO端口。在CPU的控制下,PIO内核在输入端口捕获数据,驱动数据到输出端口。当PIO端口直接连到了I/O管脚,通过写控制寄存器,CPU能够将管脚置成三态。图7-1是一个PIO应用的例子,本例使用了多个 PIO内核。 图7-1 使用PIO内核的系统实例

当集成到SOPC Builder生成的系统中,PIO内核有两个特性对用户是可见的。 ?具有四个寄存器的存储器映射的寄存器空间,4个寄存器是data、direction、 interruptmask和edgecapture。 ?1到32个的I/O端口。 有些寄存器在某些硬件配置下不是必需的,这时相应的寄存器就不存在了。对一个不存在的寄存器进行读操作,则返回一个未定义的值;一个不存在寄存器进行写操作则没有任何结果。表7-1给出了PIO寄存器的描述。 1. 数据寄存器(Data Input & 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 内核的硬件的配置。.中断掩码寄存器只有当硬件配置产生中

580EX闪光灯使用技巧说明

“佳能EOS相机闪光摄影”学习笔记与心得秋色怡人视觉摄 摄影艺术是造型艺术的一种,在摄影艺术中对摄影作品的欣赏是体会摄影艺术妙处的重要方式。下文便是对摄影作品欣赏的简单介绍: 2010年05月04日 “佳能EOS相机闪光(shanguang)摄影”学习笔记与心得 第一部分用佳能EOS相机进行闪光(shanguang)摄影 佳能580EX II闪光灯乃一神灯,功能强大又易于控制,让人细细把玩,爱不释手。鄙人学习了“佳能EOS相机闪光摄影(地址:https://www.doczj.com/doc/b814134248.html,/articles/eos-flash/)”,也参考了色影无忌上的译文(地址:https://www.doczj.com/doc/b814134248.html,/showarchives.php?threadid=1 39858),做了些笔记,有些小小的心得,愿和大家交流,写的不对的地方,望多多指教。 鄙人也曾在430和580之间犹豫,最后还是选择了指数更高、回电更快的580。在室内抓拍场合(比如婚礼),从一定程度上避免了反射闪光时因屋顶太高而反射光线不足的情况,也保证了在连拍情况下的迅速回电。若只是户外人像的补光,430真的就可以了。 根据“佳能EOS相机闪光摄影”的章节,本文分为三个部分。 如需转载,请保留以下信息。 作者:李岩 十个常见的EOS闪光灯问题

(1) 我的相机已经有内置的闪光灯,我还需要一个外置的吗?如果需要的话,我该选择哪一种? 『笔记』:内置闪光灯发出的光线十分生硬,而外置闪光灯允许你利用墙壁、天花板或所附的柔光散光板使光线柔化。最重要的是,你可以利用延长连线或无线技术使外置闪光灯与相机分离,因为机顶闪光灯会产生不自然的正面光线。 〖心得〗:直射的光线生硬,反射闪光的光线柔和自然,根据需要选用不同的照射方式。 (2) 我对自己的闪光摄影照片不满意,光线总显得生硬和不讨人喜欢。 『笔记』:你什么时候会看到现实世界是被发自你头部的光线所照亮的?除非你戴着采矿的头盔,否则难得一见。光线通常来自高处的光源,如太阳、天花板灯光等。 〖心得〗:所以需要使用“反射闪光”,以获得更自然的光线。 (3) 我的朋友是否中了魔法?他们的眼睛发出恐怖的红光! 『笔记』:因为闪光灯发出的光被眼睛视网膜上的红色血管直接反射回照相机。减少红眼现象的最简单办法就是用外置闪光灯代替内置的闪光灯。 〖心得〗:使闪光灯远离镜头光轴并使用“防红眼”功能,可减轻或消除红眼。在大多数相机上,“防红眼”功能以一个小眼睛形状的图标指示,拍照时,它会使闪光灯预闪几次,使人眼适应强光后,再发出有效的闪光。

高中常用函数性质及图像汇总

高中常用函数性质及图像 一次函数 (一)函数 1、确定函数定义域的方法: (1)关系式为整式时,函数定义域为全体实数; (2)关系式含有分式时,分式的分母不等于零; (3)关系式含有二次根式时,被开放方数大于等于零; (4)关系式中含有指数为零的式子时,底数不等于零; (5)实际问题中,函数定义域还要和实际情况相符合,使之有意义。 (二)一次函数 1、一次函数的定义 一般地,形如y kx b =+(k ,b 是常数,且0k ≠)的函数,叫做一次函数,其中x 是自变量。当0b =时,一次函数y kx =,又叫做正比例函数。 ⑴一次函数的解析式的形式是y kx b =+,要判断一个函数是否是一次函数,就是判断是否能化成以上形式. ⑵当0b =,0k ≠时,y kx =仍是一次函数. ⑶当0b =,0k =时,它不是一次函数. ⑷正比例函数是一次函数的特例,一次函数包括正比例函数. 2、正比例函数及性质 一般地,形如y=kx(k 是常数,k≠0)的函数叫做正比例函数,其中k 叫做比例系数. 注:正比例函数一般形式 y=kx (k 不为零) ① k 不为零 ② x 指数为1 ③ b 取零 当k>0时,直线y=kx 经过三、一象限,从左向右上升,即随x 的增大y 也增大;当k<0时,?直线y=kx 经过二、四象限,从左向右下降,即随x 增大y 反而减小. (1) 解析式:y=kx (k 是常数,k ≠0) (2) 必过点:(0,0)、(1,k ) (3) 走向:k>0时,图像经过一、三象限;k<0时,?图像经过二、四象限 (4) 增减性:k>0,y 随x 的增大而增大;k<0,y 随x 增大而减小 (5) 倾斜度:|k|越大,越接近y 轴;|k|越小,越接近x 轴 3、一次函数及性质 一般地,形如y=kx +b(k,b 是常数,k≠0),那么y 叫做x 的一次函数.当b=0时,y=kx +b 即y=kx ,所以说正比例函数是一种特殊的一次函数. 注:一次函数一般形式 y=kx+b (k 不为零) ① k 不为零 ②x 指数为1 ③ b 取任意实数 一次函数y=kx+b 的图象是经过(0,b )和(- k b ,0)两点的一条直线,我们称它为直线y=kx+b,它可以看作由直线y=kx 平移|b|个单位长度得到.(当b>0时,向上平移;当b<0时,向下平移)

闪光灯人像入门教程详解

闪光灯人像入门教程详解 下面是为大家精心推荐闪光灯设置与使用方法,希望能够对您有所帮助。 闪光灯设置与使用1、连接闪光灯与相机各品牌的机顶闪光灯外观大同小异。 之所以叫「机顶」,是因为它可以通过底部的「热靴」接口,直接安装在相机顶部的热靴插槽上使用。 虽然机顶闪光可以直接安装在相机上,但在拍人像时很少会这样用。 首先,闪光灯的朝向角度受到了限制,发挥余地变小;其次,如果是较硬的光线直射人物面部,反光后的效果会让面部看上去油油的。 还好,聪明的人类发明了「闪光灯无线引闪器」。 无线引闪器通常是成对出现,分别安装在相机顶部热靴,和闪光灯热靴接口处,这样就把闪光灯的摆放位置解放了。 2、为什么要使用手动模式当决定使用闪光灯作为人造光源的同时,也就决定了摄影师对于器材的绝对控制权。 当今的相机虽然已经非常自动化,但在面对复杂的拍摄环境时,难免会弄巧成拙。 这时候就需要用手动参数设置才能解决问题。 我们从最简单的闪光灯使用情景开始,将闪光灯作为唯一的光源。 同时,将闪光灯与相机的各个参数先固定下来。

3、闪光灯初始参数设置我们的器材操作逻辑是:固定大部分参数,调整最需要调整的参数,避免手忙脚乱。 固定参数部分:模式设置为「手动模式」;关闭「TTL功能」;「闪光灯焦距」固定为最广焦段,如24mm。 4、拍摄时需要调整的参数:亮度,预先设置为1/2 亮度。 并非所有闪光灯与相机都支持该功能,事实上,如果实现了精确的布光,是不需要相机为闪光灯自动测光的。 2. 「闪光灯焦距」的改变,最直接的影响是其闪光范围的宽窄变化。 闪光灯焦距越广(数值越小),闪光范围也会越广阔,反之,闪光灯焦距越长(数值越大),闪光范围则越集中。 在本文中,由于是在空间有限的室内拍摄人像,我们这里可以调整到闪光范围最大,即闪光灯焦距最广,并保持不变。 相机初始参数设置固定参数部分:相机操作模式设置为「手动档」,即M 档;「快门速度」固定为1/200 s;「感光度ISO」固定为200;「图片格式」设置为RAW 格式。 拍摄时需要调整的参数:「光圈」,预先设置为f/11,调整范围一般会在f/8至f/16之间。 相机参数 1. 关于「手动档」:如果是相机「自动档」的话,相机将会在闪光灯未启动时,自动调整参数去适应没有闪光灯的环境。 我们假定是在夜间室内拍照,所以此时应该是较暗的自动测光环

基于Nios II 的自定制PWM模块设计与实现

收稿日期:2009-03-05 基金项目:河南省教育厅科技攻关项目(2007480001) 作者简介:石新峰(1973-),男,河南巩义人,讲师,硕士,主要从事基于FPGA 的嵌入式系统开发研究. 基于Nios II 的自定制PWM 模块设计与实现 石新峰,牟光臣 (河南机电高等专科学校电子通信工程系,河南新乡453002) 摘要:详细论述了基于NiosII 软核处理器的PWM 外设模块的整个设计过程,最后构建SOPC 系统,并在开发 装置上进行了功能验证。文中所述的方法对于开发其它的用户自定义外设具有一定借鉴意义,按照Avalon 总线规范将各种自定义外设的驱动程序集成到SOPC Builder 的硬件抽象层中,进行设计复用,可以大大提高设计效率和提升数字系统的性能。 关键词:NiosII ;PWM ;Avalon 总线;SOPC Builder 中图分类号:TP332 文献标识码:A 文章编号:1673-6060(2009)03-0060-03 NiosII customized based on the PWM module of the design and implementation Shi Xinfeng ,M ou Guangchen (Henan Electrical and Electronics Communication Engineering College,Xinxiang 453002,China )Abstract:The designing process of PWM ’peripheral module had been detailed based on NiosII,build the SOPC system and undertakes a functional verification on it.The design gives some referential help for developing other user -defined peripherals and it could improve the design efficiency and promote the performance function of the digital system by the means of integrating various user-defined peripheral driver in the rule of Avalon bus into the hardware abstract layer of SOPC Builder for design multiplxing. Key words:Nios II ;PWM ;Avalon bus ;SOPC Builder 近年来,随着大规模FPGA 芯片的出现及相关开发平台的完善,为实现各种全数字化的PWM 系统提供了充分的技术基础.在开发各种信息家电或者其他工业控制系统时,将Nios II 软核处理器和PWM 等外设集成到系统主控FPGA 芯中,可以使得系统体积更小,成本更低,可靠性更高,更适合嵌入式系统的要求,而且具有现场可编程性,能够进行升级换代,具有广阔应用前景. 1Nios II 嵌入式系统外设的基本结构 Nios Ⅱ嵌入式处理器的外设除了SOPC Builder 编辑器中提供的常用模块外,还可以由设计者根据 自己的需要,按照Nios Ⅱ硬件抽象层(HAL )的元件定义规范编写自己的设备文件,并予以封装,从而在以后的开发中像其它常用外设一样进行复用. 自定义设备的文件系统如图1所示,通常由如下几部分组成,①硬件文件(.v 或.vhd ):用HDL 语言编写的自定义设备文件;②软件文件(.h ):用C 语言编写的设备寄存器定义文件以及设备的驱动程序文件;③设备描述文件(.Ptf ):本文件描述设备的结构,以及将其集成到系统中时所需要的信息.由SOPC Builder 根据其硬件及软件文件自动生成. 硬件抽象层(HAL )为用户程序控制一般类型的外围硬件设备提供了标准的C 语言函数库,接口函 第37卷第3期373 Vol.No.河南科技学院学报 Journal of Henan Institute of Science and Technology 2009年9月2009 Sep.60

Excel常用函数详解

计算机二级考试MS_Office应用Excel函数 =公式名称(参数1,参数2,。。。。。) =sum(计算范围) =average(计算范围) =sumifs(求和范围,条件范围1,符合条件1,条件范围2,符合条件2,。。。。。。) =vlookup(翻译对象,到哪里翻译,显示哪一种,精确匹配) =rank(对谁排名,在哪个范围里排名) =max(范围) =min(范围) =index(列范围,数字) =match(查询对象,范围,0) =mid(要截取的对象,从第几个开始,截取几个) =int(数字) =weekda y(日期,2) =if(谁符合什么条件,符合条件显示的内容,不符合条件显示的内容) =if(谁符合什么条件,符合条件显示的内容,if(谁符合什么条件,符合条件显示的内容,不符合条件显示的内容)) SUM函数 简单求和。 函数用法 SUM(number1,[number2],…) =SUM(A1:A5)是将单元格 A1 至 A5 中的所有数值相加; =SUM(A1,A3,A5)是将单元格 A1,A3,A5 中的数字相加。 SUMIFS函数 根据多个指定条件对若干单元格求和。 函数用法 SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...) 1) sum_range 是需要求和的实际单元格。包括数字或包含数字的名称、区域或单元格引用。忽略空白值和文本值。 2) criteria_range1为计算关联条件的第一个区域。 3) criteria1为条件1,条件的形式为数字、表达式、单元格引用或者文本,可用来定义将对criteria_range1参数中的哪些单元格求和。例如,条件可以表示为32、“>32”、B4、"苹果"、或"32"。 4)criteria_range2为用于条件2判断的单元格区域。 5) criteria2为条件2,条件的形式为数字、表达式、单元格引用或者文本,可用来定义将对criteria_range2参数中的哪些单元格求和。 4)和5)最多允许127个区域/条件对,即参数总数不超255个。 VLOOKUP函数 是Excel中的一个纵向查找函数,按列查找,最终返回该列所需查询列序所对应的值。

佳能闪光灯混合配图使用技巧加强版说明书

佳能闪光灯混合配图使用技巧加强版说明书 前言 拥有一个闪光灯,你将开辟一个全新的摄影世界。 很多佳能器材新手烧完机身、镜头之后都在思量:要不要上一个闪光灯呢?作为完全没有使用过的外闪的你,对各佳能旗下的闪光灯的各项参数、功能感到一头雾水。买了以后什么后帘同步啊、频闪啊的一大堆概念弄不明白,加上现在的佳能闪光灯说明书简单得令人发指。书看着挺厚的,可是除以三就剩下那么几页。这和尼康说明书事无巨细不厌其烦的进行各种情况说明真是差远了。有感于此,我根据所接触过的佳能品牌EX系列闪光灯和阅读过的说明书,回答一些完全没有闪灯使用经验的朋友常遇到的问题。 其实下面文章中有些问题和摄影效果毫无关系,但是我十分乐于研究这些边边角角,这才是一个器材党应有的精神嘛! 声明及注意事项: 1、由于本人不是专业人士,所以在术语的解释有些地方难免会有误差,请各位自行辨别是否正确,本文说法只做参考。 2、本文想通过通俗易懂的说明及实例图来说明闪光灯的最基本功能及常见疑问,不涉及闪光灯的原理讨论。想完全了解闪光专业术语及效果产生物理过程,请买正规的书籍了解。 本人用闪光灯拍的都是到此一游的照片,所以本文不会(也不懂)讨论如何拍出精美照片。 3、本人没有测光表,里面一些闪光指数的计算公式计算出的结果与手持测光表实际测量值相比可能并不完全一致。 4、以下内容主要针对佳能420EX、430EX、430EXII、550EX、580EX、580EXII及永诺ST-E2引闪器。其他的EZ和EX灯并不在本文讨论范围之内。若你使用佳能其他的闪光灯,下文所述和你得出的结果可能并不一致 5、下文所得出的结论都是基于测试器材:40D+18-55IS+24-105L,相机拍摄模式使用AV、TV和M档,并不涉及P档和全自动档。若你使用佳能其他的机身镜头或其他拍摄模式,那么下文所述和你得出的结果可能并不一致。 6、由于用老灯的新手毕竟较少,本文着重论述430EXII和580EXII,举例子尽量以430EXII和580EXII为主。 7、本文一些推荐及使用感受为一家之言,各位同志看本文后买闪光灯受骗的,不要找我。(摄友:linzhijin2003) 文章导读: 第一部分佳能原厂闪光灯购买问题 第二部分佳能闪光灯实物说明及基本术语解释 第三部分 4、5系闪光灯普通闪光若干问题及配图解释 第四部分 4、5系闪光灯无线闪光若干问题及配图解释 第五部分一些便宜的闪灯小附件 第一部分佳能原厂闪光灯购买问题 一、没有必要买闪光灯?闪光灯在哪些场合有用? 答:前半个问题,我的回答是:580EXII,摄影路上必须有一只!

Creo常用函数

Creo(PROE)中关系式的理解 一)关系式中可以用下列数学函数式表达: 1)、正弦 sin( ) 2)、余弦 cos( ) 3)、正切 tan( ) 4)、反正弦 asin( ) 5)、反余弦 acos( ) 6)、反正切 atan( ) 7)、双曲线正弦 sinh( ) 8)、双曲线余弦 cosh( ) 9)、双曲线正切 tanh( ) 以上九种三角函数式所使用的单位均为“度”。 10)、平方根 sqrt( ) 11)、以10为底的对数 log( ) 12)、自然对数 ln( ) 13)、e的幂 exp( ) 14)、绝对值 abs( ) 15)、不小于其值的最小整数(上限值) ceil( ) 16)、不超过其值的最大整数(下限值) floor( ) 可以给函数ceil和floor加一个可选的自变量,用它指定要圆整的小数位数。 带有圆整参数的这些函数的语法是: ceil(parameter_name或number, number_of_dec_places) floor (parameter_name 或 number, number_of_dec_places) 其中的parameter_name或number意为参数名称或者一个带小数位的精确数值 后面跟随着的number_of_dec_places意为十进位的小数位数,是可选值: A)可以被表示为一个数或一个使用者自定义参数。如果该参数值是一个实数,则被截尾成为一个整数。 B)它的最大值是8。如果超过8,则不会舍入要舍入的数(第一个自变量),并使用其初值。C)如果不指定它,则功能同前期版本一样。 使用不指定小数部分位数的ceil和floor函数,其举例如下: ceil (10.2) 值为11 floor (10.2) 值为 10

外置机顶闪光灯的使用技巧

外置机顶闪光灯的使用技巧 使用机顶闪光灯,你可以得到非常棒的人像用光。你无需花费巨大去购买昂贵的附件来控制光线,因为所有需要的东西都是准备好的。你需要明白,闪光灯只是一个光源,它服从你的安排。幸运的是,你可以学习如何控制闪光灯产生的光线,把它塑造成任何你需要的形状。另外,这样做还会有一些额外的好处。 闪光灯直接产生的光线比较粗糙,你必须做下列这些事来改善光线: 为被摄体创造一个大光源 从直接照射之外的角度给被摄体打光 下面的这些小技巧可以帮助你实现上述目标。 1. 跳闪 这是机顶闪光灯技术中的一号武器。在室内拍摄时,一间具有浅色墙壁和天花板的屋子,处处都可以做为反射面供你使用,以拍出漂亮的照片。你可以创造出柔光箱一样的照明效果,甚至可以用闪光灯创造出大面积光线。 利用墙壁或天花板跳闪 虽然闪光灯本身只是一个很小的光源,但是可以覆盖墙壁和天花板的大部分面积。这些被光线覆盖的地方相对被摄体来说就变成了大面积光源。

利用跳闪技术拍摄人像,我一般用闪光灯向天花板和墙壁打光,并想象那里有一个柔光箱,以传统的人像布光角度给我的被摄体打光。在拍摄中,被摄体的角度,以及结合使用跳闪是获得你想要的结果的关键。 你还可以使闪光灯角度向上或向你身后,将闪光灯旋转45度朝向墙壁和天花板打光,让美丽的光线充满整间房子。 2. 遮挡 很多人都没有意识到的一件事是,闪光灯发出的光线是向四周扩散的,而不是简单的一道光束。虽然大部分光线是向前发射的,但仍然有一些光线会以与闪光灯垂直的角度扩散开来。 用机顶闪光灯向相机左侧打光,利用墙壁和天花板跳闪 即使将闪光灯变焦到长焦端,仍然有大量光线向周围扩散开来。一片小小的遮光片就可以限制这种情况

2019年NiosII的USB接口模块设计

Nios II的USB接口模块设计 1. 引言 随着电路规模越来越大,片上系统(SoC)已经成为IC设计的发展趋势,相应地也有了更加灵活的片上可编程系统(SOPC)。Nios II CPU是一个基于流水线设计的通用RISC微处理器,拥有五级流水线和指令与数据内存分开的哈佛结构,具有可配置功能。用户可以根据需求在SOPC Builder中增减IP核,从而实现资源优化。为了构建一个更简洁高效的片上系统,用户可以自行开发IP组件,作为用户自定义逻辑添加到AVALON总线[1]。AVALON 总线是一种结构相对简单的总线,用于连接Nios II和其他外设。它规定了主从部件间的端口连接关系,以及部件间通信的时序关系。 AVALON总线拥有多种传输模式,以适应不同外设要求。基本传输模式是在主从外设之间进行单字节,半字或字的传输。AVALON总线还支持一些高级传输模式,例如支持流操作,支持延时操作,支持多个主设备同时访问。 2.用户自定义逻辑模块设计流程 通常来说,EDA厂商及第三方提供的IP核都是通用的,但进行SOPC设计时,用户可能有特殊需求,这时必须使用用户自定义逻辑来实现所要的功能。SOPC Builder集成在Altera 公司的EDA工具Quartus II中。用户可以通过SOPC Builder提供的图形用户界面从Altera 公司提供的IP库中选取一些组件,如Nios II,DMA,SRAM,FLASH等等,根据实际需要设置这些IP的配置参数。用户还可以自己编写HDL代码模块作为用户自定义逻辑方便地添加到SOPC Builder中,设计流程如图1所示。

接口模块的添加 这里以常用的USB控制芯片SL811HS为例详细介绍如何在Nios II中添加用户自定义模块。图2是系统结构图。

关系中常用函数详解

在ProE中,我们的关系可以直接很多系统已经预定义好的函数,通过这些函数我们可以来进行一些特定的运算得到所期望的值,下面我们就对一些常用函数进行一个概括和总结,方便大家在使用的时候查阅。 1.数学函数 在proe中,我们可以使用丰富的数学函数,常用的函数列表如下: sin()、cos()、tan()函数 这三个都是数学上的三角函数,分别使用角度的度数值来求得角度对应的正弦、余弦和正切值,比如: A=sin(30) A=0.5? B=0.866?B=cos(30) ?C=tan(30) C=0.577 asin()、acos()、atan()函数 这三个是上面三个三角函数的反函数,通过给定的实数值求得对应的角度值,如:A=asin(0.5) A=30? B=60?B=acos(0.5) C=26.6?C=atan(0.5)

sinh()、cosh()、tanh()函数 在数学中,双曲函数类似于常见的(也叫圆函数的)三角函数。基本双曲函数是双曲正弦“sinh”,双曲余弦“cosh”,从它们导出双曲正切“tanh”等。 sinh / 双曲正弦:sinh(x) = [e^x - e^(-x)] / 2 cosh / 双曲余弦:cosh(x) = [e^x + e^(-x)] / 2 tanh / 双曲正切:tanh(x) = sinh(x) / cosh(x)=[e^x - e^(-x)] / [e^x + e^(-x)] 函数使用实数作为输入值 log()函数 求得10为底的对数值,如: A=log(1) A=0;? A=1;?A=log(10) ?A=log(5) A=0.6989...; ln()函数 求得以自然数e为底的对数值,e是自然数,值是2.718...;如: A=ln(1) A=0;? ?A=ln(5) A=1.609...;

YN560II闪光灯使用说明书

永诺YN560-II闪光灯使用说明 一、警告: 请勿让本产品淋雨或受潮,以免发生火灾或触电。 处理电池时,请将电池的触点包裹好以避免短路,并请遵守好当地有关处理电池的规定。请将电池或容易误吞的东西远离儿童存放,如果误吞了物体,请立即与医生联系。 不要近距离对人体的眼睛使用闪光元件,否则有可能对人体视网膜造成伤害。 不要对需要高度注意力的人使用闪光灯,否则行可能引发安全事故。 如果发生以下情况,请立即取出电池并停止使用: ●本产品跌落或受到强烈冲击,使产品的部裸露。 ●电池部腐蚀性液体泄漏,此时应带手套取出电池。 ●产品发出奇怪的气味,发热或冒烟。 请勿自行拆卸或维修本产品,如果接触产品部的高压电路,可能会触电。 长期不使用本产品时,请取出所有电池。 二、产品特点 ●大尺寸LCD液晶显示 YN560—II配备大尺寸LCD液晶屏,方便您清晰、直观的查看或设置闪光灯各项功能,使用便捷。 ●电动变焦功能 通过ZOOM按钮,可以使灯头覆盖焦距在24-105mm之间循环变动。 ●GN58ISO100,105mm 永诺新一代高指数手动闪光灯,支持M/Multi模式。 高灵敏度无线触发感应 YN560-II的无线触发功能沿用了YN560的优良设计,S1、S2模式室使用无线感应距离达25米,即使工作于室外环境,无线触发感应距离也可达15米。 ●声音提示 开启声音提示功能,闪光灯发出的声音提示其工作状态,让您得以专注于创作过程(注:声音可以关闭)。 ●配备外置电源插座 YN560-II配备了外置电源插座,满足您更高的回电速度需求。 ●配备PC同步口 YN560-II配备了标准的PC同步口,使用PC同步线可让闪光灯同步闪光。 ●超速回电 全光输出回电时间仅需3秒,即使不使用全新电池,也能获得极速的回电体验,只需4-5秒:您还可以使用外置充电盒对回电再次加速。 ●支持高速连拍 在1/8及以下的亮度,YN560-II能支持8FPS的高速连拍。 ●节电模式 在节电模式下,闪光灯会进行休眠及更快地自动关机:在非节电模式下则不休眠,闪光灯闲置更长时间才自动关机。 ●自动保存设置 YN560—Ⅱ能自动保存您当前的操作设置。 ●改进面板按钮设计,操作灵敏,手感更佳。

相关主题
文本预览
相关文档 最新文档