当前位置: 首页 > news >正文

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 regionAPP_CODE +0{*(+RO,+RW,+ZI)};Application heap and stackARM_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 declarationint main()
{int i = 0x01000000;int j = 0x00000001;alt_wdog_start (ALT_WDOG0);                              //start the watchdogalt_write_word(ALT_RSTMGR_BRGMODRST_ADDR, 0x00000000);   //remove bridge reset modealt_write_word(ALT_GPIO1_SWPORTA_DDR_ADDR,0x0F000000);   //set GPIO1 direction as outputwhile( 1 ){alt_write_word(ALT_GPIO1_SWPORTA_DR_ADDR,        i);   //update led state controled by GPIO1 valuealt_write_word(ALT_LWFPGASLVS_OFST + LED_PIO_BASE, j); //update led state controled by FPGA peripheralif ( (i & 0x0F000000) == 0x08000000 )i = 0x01000000;elsei = i << 1;if ( (j & 0x0000000F) == 0x00000008 )j = 0x00000001;elsej = j << 1;delay(100000000);  //delayalt_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中即可。

相关文章:

SOC FPGA之流水灯设计

一、DS-5简介 Altera Soc EDS开发套件的核心是Altera版ARM Development Studio 5(DS-5)工具包&#xff0c;为SoC器件提供了完整的嵌入式开发环境、FPGA自适应调试和对Altera工具的兼容。 1.1 DS-5 eclipse破解 首先下载破解器 然后进入cmd运行&#xff0c;进入到破解器所在文…...

无涯教程-Lua - Iterators(迭代器)

迭代器是一种构造&#xff0c;使您可以遍历所谓的集合或集合的元素。在Lua中&#xff0c;这些集合通常引用表&#xff0c;这些表用于创建各种数据结构(如数组)。 通用迭代器 通用的 for 迭代器提供集合中每个元素的键值对。下面给出一个简单的示例。 array{"Lua",…...

HTML+CSS+JavaScript:实现B站评论发布效果

一、需求 1、用户输入内容&#xff0c;输入框左下角实时显示输入字数 2、为避免用户输入时在内容左右两端误按多余的空格&#xff0c;在发送评论时&#xff0c;检测用户输入的内容左右两端是否带有空格&#xff0c;若有空格&#xff0c;发布时自动取消左右两端的空格 3、若用…...

实战 - 利用 ThreadLocal 线程局部变量实现数据缓存

文章目录 1. 利用 ThreadLocal 缓存 AssetBranchCache 数据1. 定义 AssetBranchCache 类2. 定义 BranchContext 类操作 AssetBranchCache 对象3. 配置拦截器实时更新和清除缓存数据4. 定义 SaasThreadContextDataHolderBranch 类持有 AssetBranchCache 对象5. 定义 SaasThreadC…...

wxwidgets Ribbon使用简单实例

// RibbonSample.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <wx/wx.h> #include "wx/wxprec.h" #include "wx/app.h" #include "wx/frame.h" #include "wx/textctrl.h" #include "…...

2023年第四届“华数杯”数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; 最短时间生产计划模型 该模型出现在好几个竞赛赛题上&#x…...

LeetCode404. 左叶子之和

404. 左叶子之和 文章目录 [404. 左叶子之和](https://leetcode.cn/problems/sum-of-left-leaves/)一、题目二、题解方法一&#xff1a;递归方法二&#xff1a;迭代 一、题目 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9…...

Nginx 高性能内存池 ----【学习笔记】

跟着这篇文章学习&#xff1a; c代码实现一个高性能内存池&#xff08;超详细版本&#xff09;_c 内存池库_linux大本营的博客-CSDN博客https://blog.csdn.net/qq_40989769/article/details/130874660以及这个视频学习&#xff1a; nginx的内存池_哔哩哔哩_bilibilihttps://w…...

iOS--frame和bounds

坐标系 首先&#xff0c;我们来看一下iOS特有的坐标系&#xff0c;在iOS坐标系中以左上角为坐标原点&#xff0c;往右为X正方向&#xff0c;往下是Y正方向如下图&#xff1a; bounds和frame都是属于CGRect类型的结构体&#xff0c;系统的定义如下&#xff0c;包含一个CGPoint…...

docker logs 使用说明

docker logs 可以查看某个容器内的日志情况。 前置参数说明 c_name容器名称 / 容器ID logs 获取容器的日志 , 命令如下&#xff1a; docker logs [options] c_name option参数&#xff1a; -n 查看最近多少条记录&#xff1a;docker logs -n 5 c_name--tail与-n 一样 &#…...

Ceph入门到精通-Ceph PG状态详细介绍(全)

本文主要介绍PG的各个状态&#xff0c;以及ceph故障过程中PG状态的转变。 Placement Group States&#xff08;PG状态&#xff09; creating Ceph is still creating the placement group. Ceph 仍在创建PG。activating The placement group is peered but not yet active.…...

【数据结构】二叉树、二叉搜索树、平衡二叉树、红黑树、B树、B+树

概述 二叉树&#xff08;Binary Tree&#xff09;&#xff1a;每个节点最多有两个子节点&#xff08;左子节点和右子节点&#xff09;&#xff0c;没有限制节点的顺序。特点是简单直观&#xff0c;易于实现&#xff0c;但查找效率较低。 二叉搜索树&#xff08;Binary Search…...

【JVM】(二)深入理解Java类加载机制与双亲委派模型

文章目录 前言一、类加载过程1.1 加载&#xff08;Loading&#xff09;1.2 验证&#xff08;Verification&#xff09;1.3 准备&#xff08;Preparation&#xff09;1.4 解析&#xff08;Resolution&#xff09;1.5 初始化&#xff08;Initialization&#xff09; 二、双亲委派…...

npm i 报错项目启动不了解决方法

1.场景 在另一台电脑低版本node环境跑的react项目&#xff0c;换到另一台电脑node18环境执行npm i时候报错 2.解决方法 脚本前加上set NODE_OPTIONS--openssl-legacy-provider...

【从零开始学习JAVA | 第三十七篇】初识多线程

目录 前言&#xff1a; ​编辑 引入&#xff1a; 多线程&#xff1a; 什么是多线程&#xff1a; 多线程的意义&#xff1a; 多线程的应用场景&#xff1a; 总结&#xff1a; 前言&#xff1a; 本章节我们将开始学习多线程&#xff0c;多线程是一个很重要的知识点&#xff…...

微信新功能,你都知道吗?

近日iOS 微信8.0.40正式版来了&#xff0c;一起来看看有哪些变化&#xff1f; 1、朋友圈置顶 几个月前微信开始内测「朋友圈置顶」功能&#xff0c;从网友们的反馈来看&#xff0c;iOS 微信 8.0.40 似乎扩大了内测范围&#xff0c;更多用户可以体验到该功能了。 大家可以去自己…...

Android 中 app freezer 原理详解(二):S 版本

基于版本&#xff1a;Android S 0. 前言 在之前的两篇博文《Android 中app内存回收优化(一)》和 《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理&#xff0c;为什么叫这个名字&#xff0c;而不…...

Vue3_04_ref 函数和 reactive 函数

ref 函数 声明变量时&#xff0c;赋值的值要写在 ref() 函数中修改变量时&#xff0c;变量名.value xxx在模板中使用时可以省略掉 .value&#xff0c;直接使用变量名即可 <template><h1>一个人的信息</h1><h2>姓名&#xff1a;{{name}}</h2><…...

05 Ubuntu下安装.deb安装包方式安装vscode,snap安装Jetbrains产品等常用软件

使用deb包安装类型 deb包指的其实就是debian系统&#xff0c;ubuntu系统是基于debian系统的发行版。 一般我们会到需要的软件官网下载deb安装包&#xff0c;然后你既可以采用使用“软件安装”打开的方法来进行安装&#xff0c;也可以使用命令行进行安装。我推荐后者&#xff…...

性能测试jmeter连接数据库jdbc(sql server举例)

一、下载第三方工具包驱动数据库 1. 因为JMeter本身没有提供链接数据库的功能&#xff0c;所以我们需要借助第三方的工具包来实现。 &#xff08;有这个jar包之后&#xff0c;jmeter可以发起jdbc请求&#xff0c;没有这个jar包&#xff0c;也有jdbc取样器&#xff0c;但不能发起…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...