现在的位置: 首页 > FPGA开发 > 正文

关于NIOS II PIO的几个问题(转)

2017年08月11日 FPGA开发 ⁄ 共 2261字 ⁄ 字号 关于NIOS II PIO的几个问题(转)已关闭评论 ⁄ 阅读 1,714 次

1.几个示例
(1)控制LEDS。
(2)获得来自外部的开关信息。
(3)控制显示设备。
(4)与外部设备通讯。
注意PIO可以连接至片外与外部设备交互,亦可直接与FPGA内部逻辑相连接。
2.PIO所具有的功能
(1)输入
此种只能设置PIO为输入,此时对direction、interruptmask或者edgecapture三个寄存器的读写均无效。
(2)输出
此种只能设置PIO为输入,此时对direction、interruptmask或者edgecapture三个寄存器的读写均无效。
(3)双向
可三态控制。通过设置direction寄存器控制PIO的方向。当为高时,PIO为输出状态;为低时,PIO为输入状态。这种状态可以单独对每一位设置方向。
(4)输入输出
该方式与双向的区别在于:在该方式下,能对每一位设置输入或者输出,但是一旦确定之后,不能软件更改。该方式其实就是n位宽的单向总线。
(5)边沿出发外部中断
必须是输入引脚才能设置该方式,在SOPC builder里面双击PIO实例可以设置为上跳沿触发或者下跳沿触发,或者双沿触发
(6)电平触发
  必须是输入引脚才能设置该方式,默认情况下,是高电平触发。若开发者需要低电平触发,可以在QUARTUS里面加个非门。
3.控制PIO所需要的几条指令
在编写程序的时候,必须单独加入#include "altera_avalon_pio_regs.h"头文件,否则不能对PIO的寄存器进行操作。
打开头文件,程序如下:(注释是笔者对该宏的功能描述)
#ifndef __ALTERA_AVALON_PIO_REGS_H__
#define __ALTERA_AVALON_PIO_REGS_H__
#include <io.h>
#define IOADDR_ALTERA_AVALON_PIO_DATA(base)           __IO_CALC_ADDRESS_NATIVE(base, 0)
#define IORD_ALTERA_AVALON_PIO_DATA(base)             IORD(base, 0)                                                 //读数据寄存器DATA
#define IOWR_ALTERA_AVALON_PIO_DATA(base, data)       IOWR(base, 0, data)                                    // 写数据寄存器DATA
#define IOADDR_ALTERA_AVALON_PIO_DIRECTION(base)      __IO_CALC_ADDRESS_NATIVE(base, 1)
#define IORD_ALTERA_AVALON_PIO_DIRECTION(base)        IORD(base, 1)                                                //读方向寄存器DIRECTION
#define IOWR_ALTERA_AVALON_PIO_DIRECTION(base, data)  IOWR(base, 1, data)                                    //写方向寄存器DIRECTION
#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)                                                 //读中断标志寄存器interruptmask
#define IOWR_ALTERA_AVALON_PIO_IRQ_MASK(base, data)   IOWR(base, 2, data)                                    //写中断标志寄存器interruptmask
#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)                                                  //读边沿触发寄存器edgecapture
#define IOWR_ALTERA_AVALON_PIO_EDGE_CAP(base, data)   IOWR(base, 3, data)                                     //写中断标志寄存器edgecapture

/* Defintions for direction-register operation with bi-directional PIOs */
#define ALTERA_AVALON_PIO_DIRECTION_INPUT  0
#define ALTERA_AVALON_PIO_DIRECTION_OUTPUT 1

#endif /* __ALTERA_AVALON_PIO_REGS_H__ */

×