当前位置:网站首页>【SOC FPGA】外设KEY点LED
【SOC FPGA】外设KEY点LED
2022-07-30 15:39:00 【菜虚鲲001】
文章目录
一、添加LED和KEY的pio外设
1、黄金参考工程

2、配置pio外设
打开Plaform Designer,右侧搜索pio并双击。
(1)添加pio_KEY
我们使用key1和key2,所以选择2位。
连线:
(2)添加pio_LED
cyclone Ⅴ的板子有四个LED,所以选择4位。
连线:
默认给led和key分配的地址都是0,所以点击分配地址可解决报错。
3、修改Verilog代码
连线完成后点击Genrate HDL,自动实例化。
在top模块中定义接口并实例化

4、全编译
没有错误就很完美
二、生成相应的文件,转移至sd卡内
1、更新dtb文件
打开SOC…Shell
进入黄金工程目录:
make dtb
更新dtb文件
看文件时间是否更新成功
2、更新rbf文件
运行命令:
cd output_files/
./sof_to_rbf.bat

看文件时间是否更新成功

3、更新hps_0.h文件
运行:
./generate_hps_qsys_header.sh

看文件时间是否更新成功
4、替换sd卡中的内容

三、编写C代码实现功能
打开eclipse
1、C工程准备
新建一个Cproject
导入库文件:
将黄金工程的hps_0.h放入工程中
2、C语言实现按键点灯
代码实现:
/* * pio_led.c * * Created on: 2022年7月19日 * Author: 哈哈 */
//标准头文件
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
//HPS厂家提供的底层定义头文件
#define soc_cv_av //开发平台Cyclone V 系列
#include "hwlib.h"
#include "socal/socal.h"
#include "socal/hps.h"
//与用户具体的HPS 应用系统相关的硬件描述头文件
#include "hps_0.h"
#define HW_REGS_BASE (ALT_STM_OFST) //HPS外设地址段基地址
#define HW_REGS_SPAN (0x04000000) //HPS外设地址段地址空间 64MB大小
#define HW_REGS_MASK (HW_REGS_SPAN - 1) //HPS外设地址段地址掩码
static unsigned long *led_pio_virtual_base =NULL ;
static unsigned long *key_pio_virtual_base = NULL;
int led_init(int *virtual_base)
{
int fd;
void *perph_virtual_base;
//1.open打开
fd = open("/dev/mem",(O_RDWR | O_SYNC));
if(fd == -1)
{
printf("open failed..\n");
return 1;
}
//mmap 映射虚拟地址
perph_virtual_base = mmap(NULL,HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ),MAP_SHARED,fd,HW_REGS_BASE);
led_pio_virtual_base = perph_virtual_base +
(((unsigned)(ALT_LWFPGASLVS_OFST + PIO_LED_BASE))&(unsigned)(HW_REGS_MASK));
key_pio_virtual_base = perph_virtual_base +
(((unsigned)(ALT_LWFPGASLVS_OFST + PIO_KEY_BASE))&(unsigned)(HW_REGS_MASK));
*virtual_base = perph_virtual_base;
return fd;
}
int main()
{
int fd;
int i=0;
int virtual_base;
fd = led_init(&virtual_base);
while(1)
{
if(*(key_pio_virtual_base + 0) == 0x01)
{
*(led_pio_virtual_base + 0) = 0x01;
}
else if(*(key_pio_virtual_base + 0) == 0x02)
{
*(led_pio_virtual_base + 0) = 0x02;
}
/**(led_pio_virtual_base +0) = 1<<i; i=(i+1)%4; sleep(1); printf("LIGHT:%d ON\n",i);*/
}
//取消映射
if(munmap(virtual_base,HW_REGS_SPAN) == -1)
{
printf("fail\n");
}
close(fd);
return 0;
}
3、效果演示
FPGA之SOC按键点灯
边栏推荐
猜你喜欢

rhce笔记2

新技术要去做新价值

Promise Notes (1)

FME realizes the method of converting CAD with attribute to SHP data

【HMS core】【Media】【视频编辑服务】 在线素材无法展示,一直Loading状态或是网络异常

PMP每日一练 | 考试不迷路-7.30(包含敏捷+多选)

武汉星起航跨境电商有前景吗?亚马逊的未来趋势如何发展?

三维重建方法汇总

How to remove last character from string in php

FME's scheme and operation process for reading and writing cass data
随机推荐
rscsa笔记八
Applicable scenarios of TiDB tools
武汉星起航跨境电商有前景吗?亚马逊的未来趋势如何发展?
php字符串如何去除第一个字符
tiup clean
PCIE下载的驱动安装
go 学习03 基础知识变量类型
Classes and Objects (Part 2)
FME realizes the method of converting CAD with attribute to SHP data
How to remove first character from php string
FME实现CAD带属性转SHP数据方法
【AGC】开放式测试示例
php如何查询字符串出现位置
后浪来袭!阿里产出“第二代”容器技术手册及脑图,这也太香了吧
SMI 与 Gateway API 的 GAMMA 倡议意味着什么?
Overview of TiUP commands
70行代码撸一个桌面自动翻译神器
Placement Rules usage documentation
数据库-SQL
How to intercept the first few digits of a string in php