SOC FPGA之流水灯设计

一、DS-5简介

        Altera Soc EDS开发套件的核心是Altera版ARM Development Studio 5(DS-5)工具包,为SoC器件提供了完整的嵌入式开发环境、FPGA自适应调试和对Altera工具的兼容。

1.1 DS-5 eclipse破解

首先下载破解器

然后进入cmd运行,进入到破解器所在文件夹

 然后输入patcher.exe --license ?:licensepath

最后显示.dat文件即可,将license添加到eclipse中就好了

1.2 ARM编译器

        ARM编译器用于生成面向ARM、Thumb、Thumb22、VFP和NEON指令集的应用程序。
        ARM编译器工具链可用于编译由C、C++或ARM汇编语言源代码编写的程序,可以为32位ARM、16位Thumb和Thumb-2指令集生成优化代码,并支持完整的符号ISO标准的C和C++代码,通过向量化NEON编译器支持NEON SIMD指令集。

1.3 GNU编译器

        Altera Soc EDS自带的裸机GNU编译工具是基于ARM架构的处理器,用于编译Linux应用程序,可以直接从命令行直接启动,也可以在Eclipse中创建Linux可执行程序项目从而调用此套编译器。

二、基于ARM编译器的流水灯实例

2.1 创建项目

新建C Project

用SOC EDS提供的HALIB中给的API访问板上硬件,所以需要在项目编译选项中添加HWLIB路径
选择主菜单Project->Properties,在弹出的Properties for LedWater对话框中点击Includes

本实例要添加的是项目编译时需要包含的HALIB路径,点击Include path(-I),通过File system选择<SocEDS安装路径>\ip\altera\hps\altera_hps\hwlib\include

在C项目中添加主程序main.c,File->New->Source File

创建硬件设备描述头文件hps_0.h
SOC EDS提供了由Qsys硬件系统信息转换为软件开发所需设备描述头文件的工具swinfo2header,通过Shell进入Qsys工程所在目录并输入

sopc-create-header-files soc_system.sopcinfo -single hps_0.h -module hps_0

根据.sopcinfo文件生成hps_0.h文件,并将其拷贝至Eclipse当前项目目录中

另一种生成hps_0.h文件是编写Shell脚本generate_hps_qsys_header.sh

#!/bin/sh
sopc-create-header-files\
"/cygdrive/d/chapter7/Hardware/soc_system.sopcinfo"
--single hps_0.h
--module hps_0

脚本文件编译完成后将其保存在当前项目目录中,在命令行中切换到当前项目目录,然后执行哎脚本,即可在当前项目目录下生成 hps_0.h

在Eclipse中右键点击项目名称选择Refresh就可以看到hps_0.h文件已经被添加至当前项目

将<SocEDS安装路径>\embedded/\ip\altera\hps\altera_hps\hwlib\src\hwmgr中的看门狗驱动程序alt_watchdg.c拷贝至项目目录并对其进行裁剪

#include <stdint.h>
#include <stdbool.h>
#include "socal/hps.h"
#include "socal/socal.h"
#include "socal/alt_rstmgr.h"
#include "socal/alt_l4wd.h"
#include "hwlib.h"
#include "alt_mpu_registers.h"
#include "alt_watchdog.h"
#include "alt_clock_manager.h"

#define WDOG_RESET_KEY           0x00000076
#define ALT_WDOG_RST_WIDTH       8             //8个或更多MPU时钟周期


bool cpu_wdog_in_gpt_mode(void)
{
    return !(alt_read_word(CPU_WDTGPT_TMR_BASE + WDOG_CTRL_REG_OFFSET) & WDOG_WDT_MODE);
}

/****************************************************************************************/
/* 启动指定看门狗定时器                                                                 */
/****************************************************************************************/
ALT_STATUS_CODE alt_wdog_start(ALT_WDOG_TIMER_t tmr_id)
{
    ALT_STATUS_CODE     ret = ALT_E_BAD_ARG;    //返回值
    uint32_t            regdata;                //定义数据变量


    if (tmr_id == ALT_WDOG_CPU)
    {
        regdata = alt_read_word(CPU_WDTGPT_TMR_BASE + WDOG_CTRL_REG_OFFSET);
        alt_write_word(CPU_WDTGPT_TMR_BASE + WDOG_CTRL_REG_OFFSET, regdata | WDOG_TMR_ENABLE);
        ret = ALT_E_SUCCESS;
    }
    else if ((tmr_id == ALT_WDOG0) || (tmr_id == ALT_WDOG0_INIT))
    {
        regdata = alt_read_word(ALT_L4WD0_WDT_CR_ADDR);
        alt_write_word(ALT_L4WD0_WDT_CR_ADDR, regdata | ALT_L4WD_CR_WDT_EN_SET_MSK);
        ret = ALT_E_SUCCESS;
    }
    else if ((tmr_id == ALT_WDOG1) || (tmr_id == ALT_WDOG1_INIT))
    {
        regdata = alt_read_word(ALT_L4WD1_WDT_CR_ADDR);
        alt_write_word(ALT_L4WD1_WDT_CR_ADDR, regdata | ALT_L4WD_CR_WDT_EN_SET_MSK);
        ret = ALT_E_SUCCESS;
    }
    return  ret;
}

/****************************************************************************************/
/* 重新加载计数器的倒数计时器,并重启看门狗定时器                                       */
/* 可以在看门狗定时器计数结束前任意时刻重启定时器                                       */
/* 本质上是清除中断                                                                     */
/****************************************************************************************/
ALT_STATUS_CODE alt_wdog_reset(ALT_WDOG_TIMER_t tmr_id)
{
    uint32_t                regdata;        //定义读数据


    if (tmr_id == ALT_WDOG_CPU)
    {
        regdata = alt_read_word(CPU_WDTGPT_TMR_BASE + WDOG_LOAD_REG_OFFSET);
        alt_write_word(CPU_WDTGPT_TMR_BASE + WDOG_LOAD_REG_OFFSET, regdata);     //验证硬件操作

        if (cpu_wdog_in_wdt_mode())
        {
            alt_write_word((CPU_WDTGPT_TMR_BASE + WDOG_RSTSTAT_REG_OFFSET), WDOG_RST_STAT_BIT);   //根据当前模式,清除复位位
        }
        else
        {
            alt_write_word((CPU_WDTGPT_TMR_BASE + WDOG_INTSTAT_REG_OFFSET), WDOG_INT_STAT_BIT);   //清除中断状态位
        }
    }
    else if ((tmr_id == ALT_WDOG0) || (tmr_id == ALT_WDOG0_INIT))
    {
        alt_write_word(ALT_L4WD0_WDT_CRR_ADDR, WDOG_RESET_KEY);               //重启计数器,清除看门狗0定时器中断
    }
    else if ((tmr_id == ALT_WDOG1) || (tmr_id == ALT_WDOG1_INIT))             //重启计数器,清除看门狗1定时器中断
    {
        alt_write_word(ALT_L4WD1_WDT_CRR_ADDR, WDOG_RESET_KEY);
    }
    else { return  ALT_E_BAD_ARG; }
    return ALT_E_SUCCESS;
}

ARM链接器支持分散加载机制,可通过一个描述性分散文件(*.scat)指定链接生成可执行影响存储器映射情况,使开发人员完全控制映像各部分的组织、布局情况。分散文件通常用于控制需要复杂存储器映射的映像。

创建分散文件OnchiioRAM.scat,选择File->New->Other ,在Scatter File Editor中选择Scatter File

流水灯仅需对映像存储器映射进行控制,控制映像在片内65KB的OnchipRAM连续的存储区域加载执行,地址映射为0xFFFF0000~0xFFFFFFFF,编辑该分散文件内容如下:

PCRAM 0xFFFF0000 0x10000
{
    ;APP code region
    APP_CODE +0
    {
        *(+RO,+RW,+ZI)
    }
    ;Application heap and stack
    ARM_LIB_STACKHEAP 0xFFFF8000 EMPTY 0x8000
    {}
}

保存编辑好的Scatter文件并保存该文件,再次打开该文件即可看到映像加载区和执行区两种存储器映像视图

编辑主程序文件main.c,使板上LED呈现流水灯实验现象

/************/
/*LedWater example*/
/************/

#include <stdio.h>
#include "hwlib.h"
#include "alt_watchdog.h"
#include "socal\socal.h"
#include "socal\hps.h"
#include "socal\alt_gpio.h"
#include "socal\alt_rstmgr.h"
#include "socal\alt_l4wd.h"
#include "hps_0.h"

void delay(int time);    //delay function declaration

int main()
{
	int i = 0x01000000;
	int j = 0x00000001;
    alt_wdog_start (ALT_WDOG0);                              //start the watchdog
	alt_write_word(ALT_RSTMGR_BRGMODRST_ADDR, 0x00000000);   //remove bridge reset mode
	alt_write_word(ALT_GPIO1_SWPORTA_DDR_ADDR,0x0F000000);   //set GPIO1 direction as output

	while( 1 )
	{
		alt_write_word(ALT_GPIO1_SWPORTA_DR_ADDR,        i);   //update led state controled by GPIO1 value
	    alt_write_word(ALT_LWFPGASLVS_OFST + LED_PIO_BASE, j); //update led state controled by FPGA peripheral

		if ( (i & 0x0F000000) == 0x08000000 )i = 0x01000000;
		else
			i = i << 1;
		if ( (j & 0x0000000F) == 0x00000008 )j = 0x00000001;
		else
			j = j << 1;
        delay(100000000);  //delay
		alt_wdog_reset(ALT_WDOG0);    //kick the watchdog
    }
	return 1;
}
void delay(int time)
{
	int k;
	for( k=0; k<time; k++ );
}

2.2 项目编译

在编译之前需要为ARM Linker指定生成可执行程序所需的分散文件OnchiioRAM.scat

在Properties中选择ARM Linker->Image Layout,选择文件

在注册单选择Project->Build Project或者工程名右键Build Project
编译过程中可在Console窗口查看相关信息,整个编译过程为先启动ARM C Compiler进行编译生成目标文件,再启动ARM C Linker链接为可执行程序,最后生成LedWater.axf可执行程序映象

将之前生成的software\spb_bsp\uboot-socfpga\spl\u-boot-spl拷贝至当前目录,将.sof文件下载之FPGA中即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/57842.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【八】mybatis 日志模块设计

mybatis 日志模块设计 简介&#xff1a;闲来无事阅读一下mybatis的日志模块设计&#xff0c;学习一下优秀开源框架的设计思路&#xff0c;提升自己的编码能力 模块设计 在Mybatis内部定义了4个级别&#xff1a;Error:错误 、warn:警告、debug:调试、trance&#xff0c;日志优…

【计算机网络】应用层协议 -- DNS协议

文章目录 1. DNS背景2. 域名简介3. 域名解析过程4. 使用dig查看DNS过程 1. DNS背景 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&#xff0c;是一个用来将域名转化为IP地址的应用层协议。 TCP/IP当中通过IP地址和端口号的方式&#xff0c;来确定…

C语言之结构体篇(简)

结构体 结构体的认知结构体的声明一般声明特殊声明匿名结构体类型 结构体自引用结构体变量的定义与初始化结构体变量的定义结构体变量的初始化 结构体传参结构体内存对齐位段位段声明位段的内存分配位段跨平台问题: 结构体是由我们自己创造的一种类型&#xff0c;使得C语言有能…

js-匈牙利算法

匈牙利算法 素数伴侣新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的K…

H5打包封装小程序系统开发

H5打包封装小程序系统开发 H5打包封装小程序系统开发是指将H5页面打包封装成小程序的开发过程。下面是一个简单的步骤&#xff1a; 准备工作&#xff1a;首先&#xff0c;需要准备好H5页面的代码和资源文件。确保H5页面在浏览器中正常运行&#xff0c;并且没有依赖于浏览器特…

『赠书活动 | 第十六期』《深入浅出Java虚拟机:JVM原理与实战》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十六期』 本期书籍&#xff1a;《深入浅出Java虚拟机&#xff1a;JVM原理与实战》 赠书规则&#xff1a;评论区&#xff1a;点赞&#xff…

将Visio和Excel导出成没有白边的PDF文件

1、VISIO如何无白边导出pdf格式 在使用Latex时&#xff0c;要导入矢量图eps格式。但是VISIO无法输出eps格式&#xff0c;这就需要将其导出为pdf。但是导出pdf时&#xff0c;往往会有大量的白边。VISIO无白边导出pdf格式的方法如下&#xff1a; 1.文件——开发工具——显示sha…

并发 如何创建线程 多线程

进程&#xff1a;一个程序的执行过程 线程&#xff1a;一个方法就是一个线程 并发&#xff1a;多个线程抢夺一个资源 操作同一个对象 创建线程方法1 //创建线程方法1 继承Thread类 重写润方法 调用start开启线程 public class TestThead extends Thread{Overridepublic voi…

redis 高级篇 redis 源码的读取分析

一 redis源码分析 1.1 源码分析 1每一个kv键值对应有一个dictEntry。 2.底层数据结构

景联文科技高质量成品数据集上新啦!

景联文科技近期上新多个成品数据集&#xff0c;包含图像、视频等多种类型的数据&#xff0c;涵盖丰富的场景&#xff0c;可满足不同模型的多元化需求。 高质量成品数据集可用于训练和优化模型&#xff0c;使得模型能够更加全面和精准地理解和处理任务&#xff0c;更好地应对复…

eclipse was unable to locate its companion shared library

当转移或者Copy工程时&#xff0c; eclipse was unable to locate its companion shared library eclipse.ini 里面的路径配置错误导致 --launcher.library C:/Users/**/.p2/pool/plugins/org.eclipse.equinox. launcher.win32.win32.x86_64_1.2.700.v20221108-1024 -product …

17. Spring 事务

目录 1. 事务定义 2. MySQL 中的事务使用 3. 没有事务时的插入 4. Spring 编程式事务 5. Spring 声明式事务 5.1 Transactional 作用范围 5.2 Transactional 参数说明 5.3 Transactional 工作原理 1. 事务定义 将⼀组操作封装成一个执行单元&#xff08;封装到一起…

人工智能安全-2-非平衡数据处理

0 提纲 现象与原因非平衡数据处理方法概览数据预处理层面特征层算法层面1 现象与原因 非平衡数据分类问题:在网络信息安全问题中,诸如恶意软件检测、SQL注入、不良信息检测等许多问题都可以归结为机器学习分类问题。这类机器学习应用问题中,普遍存在非平衡数据的现象。 产…

java系列之list集合分组

文章目录 前言一、list是什么&#xff1f;二、list集合分组总结 前言 在Java编程中&#xff0c;List集合是一种常用的数据结构&#xff0c;用于存储一组元素。有时候&#xff0c;我们需要对List集合中的元素进行分组操作&#xff0c;即将相同属性或特征的元素归类到一组。这种…

向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录

1、注册https://issues.sonatype.org/账号 下面就代表注册好了&#xff0c;同时提交的工单也通过了 2、这里主要是goupId 需要进行认证&#xff0c;需要到域名注册商近一个txt的解析&#xff0c;以便确保这个是你的 通过下面来验证你的域名信息&#xff0c;这里主要是上面的工…

前端文件上传实践与后端处理——文件分块上传

文件上传是现代Web应用程序中常见的功能之一。在这篇博客中&#xff0c;我们将探讨一个简单但完整的前端文件上传实践&#xff0c;同时提供一个后端示例&#xff0c;演示如何处理上传的文件。我们将使用JavaScript作为前端语言&#xff0c;并结合Node.js作为后端环境。让我们开…

Postgresql源码(109)并行框架实例与分析

1 PostgreSQL并行参数 系统参数 系统总worker限制&#xff1a;max_worker_processes 默认8 系统总并发限制&#xff1a;max_parallel_workers 默认8 单Query限制&#xff1a;max_parallel_workers_per_gather 默认2 表参数限制&#xff1a;parallel_workers alter table tbl …

针对高可靠性和高性能优化的1200V硅碳化物沟道MOSFET

目录 标题&#xff1a;1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance摘要信息解释研究了什么文章创新点文章的研究方法文章的结论 标题&#xff1a;1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance 摘要 本文详…

Flask学习笔记_异步论坛(四)

Flask学习笔记_异步论坛&#xff08;四&#xff09; 1.配置和数据库链接1.exts.py里面实例化sqlalchemy数据库2.config.py配置app和数据库信息3.app.py导入exts和config并初始化到app上 2.创建用户模型并映射到数据库1.models/auth.py创建用户模型2.app.py导入模型并用flask-mi…

ORB算法在opencv中实现方法

在OPenCV中实现ORB算法&#xff0c;使用的是&#xff1a; 1.实例化ORB orb cv.xfeatures2d.orb_create(nfeatures)参数&#xff1a; nfeatures: 特征点的最大数量 2.利用orb.detectAndCompute()检测关键点并计算 kp,des orb.detectAndCompute(gray,None)参数&#xff1a…