系统:win10
软件编辑和程序下载平台:Quartus II
仿真平台:modelsim
FPGA:EP4CE6

PIO (parallel input/output)

通用IO端口,控制LED灯,获取按键高低电平变化,控制显示设备等

FPGA学习-12-PIO_寄存器


当使用IO时,就是在配置IO相关的寄存器

IO io寄存器描述

FPGA学习-12-PIO_自启动_02

实验任务:

在Qsys系统中加入PIO IP核,完成4个按键控制LED亮灭实验,并实现上电自启动的功能

实验硬件

4个LED 四个key
一个epcs(flash)

头文件

altera_avalon_pio_regs.h
该文件定义了核心寄存器,以及宏定义硬件驱动,总之就是最底层文件

打开之前配置好的最基本的qsys,添加PIO IP核 ;

配置按键IO

FPGA学习-12-PIO_自启动_03


FPGA学习-12-PIO_寄存器_04

配置LED_IO

FPGA学习-12-PIO_寄存器_05

配置上电自启动的epcs

这是一个flash,能够掉电保存程序,不需要进行配置

FPGA学习-12-PIO_#include_06


FPGA学习-12-PIO_寄存器_07

生成qsys并拷贝程序

system_qsys u0 (
.clk_clk (<connected-to-clk_clk>), // clk.clk
.reset_reset_n (<connected-to-reset_reset_n>), // reset.reset_n
.key_export (<connected-to-key_export>), // key.export
.led_export (<connected-to-led_export>), // led.export
.epcs_dclk (<connected-to-epcs_dclk>), // epcs.dclk
.epcs_sce (<connected-to-epcs_sce>), // .sce
.epcs_sdo (<connected-to-epcs_sdo>), // .sdo
.epcs_data0 (<connected-to-epcs_data0>) // .data0
);

配置引脚

实验软件开发:

1 工作路径保存到\key_led\qsys\software

2 新建application and BSP
3 工程名:key_led
4 工程保存路径:\1_key_led\qsys\software\key_led (这里注意:路径不会自己生成,需要手动选择,并且将后面的key_led要自己手写,不然出错)
5 bsp文件右击,BSP editor 选择common中reduced和small_c, 以及setting中 去掉plus和clean,最后点击Generate

6 重新编译一下BSP底层驱动 Nios II->generate BSP

#include <stdio.h>
#include <system.h>
#include "altera_avalon_pio_regs.h"


//altera_avalon_pio_regs.h
int main()
{
int led=0, key=0;
printf("hello world!\n");

while(1){

//读KEY
key = IORD_ALTERA_AVALON_PIO_DATA(PIO_KEY_BASE);


led = ~key; //安位取反

//写led
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);
}
return 0;
}

下载运行成功

接下来解决固化问题

FPGA学习-12-PIO_寄存器_08


FPGA学习-12-PIO_#include_09


添加sof文件(底层硬件),

添加elf文件(应用层软件)

然后下载到FPGA中

FPGA学习-12-PIO_寄存器_10

成功