当前位置:网站首页>【SOC FPGA】Peripheral KEY LED

【SOC FPGA】Peripheral KEY LED

2022-07-30 16:10:00 Caixukun 001

一、添加LED和KEY的pio外设

1、黄金参考工程

在这里插入图片描述

2、配置pio外设

打开Plaform Designer,右侧搜索pio并双击.
在这里插入图片描述

(1)添加pio_KEY

我们使用key1和key2,所以选择2位.
在这里插入图片描述
连线:
在这里插入图片描述

(2)添加pio_LED

cyclone ⅤThe board has fourLED,所以选择4位.
在这里插入图片描述
连线:
在这里插入图片描述

默认给led和key分配的地址都是0,So click assign address to solve the error.
在这里插入图片描述

3、修改Verilog代码

Click when the connection is completeGenrate HDL,自动实例化.
在这里插入图片描述
在topInterfaces are defined in modules and instantiated
在这里插入图片描述
在这里插入图片描述

4、全编译

Perfect without mistakes
在这里插入图片描述

二、生成相应的文件,转移至sd卡内

1、更新dtb文件

打开SOC…Shell
在这里插入图片描述
进入黄金工程目录:
在这里插入图片描述

make dtb

更新dtb文件
在这里插入图片描述
See if the file time is updated successfully
在这里插入图片描述

2、更新rbf文件

运行命令:

cd output_files/
./sof_to_rbf.bat

在这里插入图片描述
See if the file time is updated successfully

在这里插入图片描述
3、更新hps_0.h文件
运行:

./generate_hps_qsys_header.sh

在这里插入图片描述
See if the file time is updated successfully
在这里插入图片描述

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按键点灯

原网站

版权声明
本文为[Caixukun 001]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/211/202207301539064340.html