(一)手把手教你如何通过ARM DesignStart计划在FPGA上搭建一个Cortex-M3软核

(一)手把手教你如何通过ARM DesignStart计划在FPGA上搭建一个Cortex-M3软核

一、ARM DesignStart计划

1.1 如何下载ARM DesignStart Cortex-M3相关文件

​ 关于ARM DesignStart计划的介绍:ARM DesignStart计划——私人定制一颗ARM处理器 - 知乎 (zhihu.com)。

​ 在arm Developer官网[Arm Developer](https://developer.arm.com/downloads)右上方的Downloads中搜索ARM DesignStart Cortex-M3第一个即是FPGA上定制的Cortex-M3软核IP。

在这里插入图片描述

图1.1 官网主页界面

在这里插入图片描述

图1.2 官网的Downloads界面

在这里插入图片描述

图1.3 搜索界面

​ 以下是我从官网下载的Cortex-M3的百度网盘链接,M0也是同样的方法:https://pan.baidu.com/s/1jO1cTTL89xig5wEomUTrlQ?pwd=1234。

​ 上面我废话了两句是因为我一开始在官网主页中直接搜索ARM DesignStart Cortex-M3一直找不到软核工具包,只能找到相关的用户说明书,Cortex-M3软核IP要到Downloads才能找到。总之是我搜索方式不对的原因,给大家避个坑。

1.2 Cortex-M3 DesignStart Eval工具使用介绍

​ 在arm Developer官网主页面中直接搜索Arm Cortex-M3 DesignStart Eval User Guide可以找到Cortex-M3软核IP的相关用户使用手册。

在这里插入图片描述

图1.4 在官网主页面搜素相关用户手册

在这里插入图片描述

图1.5 搜索结果

​ 在该用户使用手册文件的1-17页有具体的文件结构说明。其中我们用到的我觉得比较重要的是Cortex-M3内核文件夹,在下图1.5路径中:

在这里插入图片描述

图1.6 Cortex-M3内核文件夹及路径

在cmsdk(Cortex-M System Design Kit,Cortex-M系统设计工具包)文件夹中,有着大量官方提供的现成的MCU实现组件,像串口、定时器等外设,ahb、apb总线接口,经过封装的FPGA内部sram存储器等,这些组件都是由verilog代码实现的。如下图1.7所示:

在这里插入图片描述

图1.7 cmsdk组件

​ 另外一个很常用的用户使用手册是Arm Cortex-M System Design Kit Technical Reference Manual,可以直接在官网主页搜索得到。这个用户手册中有很大一部分是对cmsdk工具包文件夹中的系统组件的说明,例如对上图1.7中cmsdk_apb_uartcmsdk_apb_time这两个由verilog代码实现的外设IP的寄存器构成、时序逻辑等都在该文档中有详细说明。在我们的系统实现中,我就是对着这个文档对gpio、uart和timer这三个外设编写的软件驱动。该文档的具体内容如下图1.8所示:

在这里插入图片描述

图1.8 Arm Cortex-M System Design Kit Technical Reference Manual说明手册中定时器外设具体说明

如上图可以看到定时器外设的寄存器地址偏移、位宽、描述等,除此之外还有模块端口信号,特征描述等。

二、如何搭建软核

​ 在搭建SoC系统的过程中碰到过许多问题查阅了许多资料,这里就不一一详细说明了,我把查阅过的视频和资料都列出来:

  1. 使用Keil设计基于ARM DesignStart M3软核的软件程序_哔哩哔哩_bilibili

    该视频前半段是在VIVADO上搭建硬件资源,后半段在配置KEIL,因为我们是在安路的平台上搭建,因此跳过了前面的部分,看的是后半段的KEIL配置以及代码编写,主要是实践操作性。

  2. 使用CMSDK搭建CortexM3SoC - 极术社区 - 连接开发者与智能计算生态 (aijishu.com)

    这篇文章可以结合着下面的极术社区的视频一起看,主要写了:

    • 使用CMSDK生成总线矩阵,这部分比较复杂,主要就是给主从设备分配端口和地址,具体怎么操作我不太懂是我队友做的。
    • 硬件上添加CMSDK APB外设,文中以uart为例如何将外设模块端口信号和APB总线相连,连接至AHB总线上也大同小异。
    • 自定义外设,简要地讲解了如何编写外设硬件代码和完成外设软件驱动。
    • 最后给出了一份硬件和软件上的参考范例。
  3. 极术公开课|【集创赛培训】基于Arm Cortex M3的SoC设计与FPGA实现_哔哩哔哩_bilibili

    这是往年集创赛ARM杯的培训视频,很有必要看一遍,看完之后可以对整个软核的搭建有一个清晰的概念,主要偏向理论性并给出整体框架概念。

  4. GitHub - ian-lab/my_CortexM3

    一个开源GitHub项目,是一个完整的Cortex-M3的SoC系统范例。

  5. 目录 - Arm Cortex-M0的SoC实现 (yuque.com)

    硬木课堂知识库,其中一个章节就是Arm Cortex-M0的SoC实现,基于安路EG4S20。这几篇文章兼有理论和实践,理论上如总线的知识、SoC的组成等,对在大脑中构建一个整体SoC概念很有帮助。实践上这篇文章手把手教你硬件代码如何编写,KEIL上如何配置等等。但是因为这篇文章是用汇编语言进行软件编写的,因此在我比赛过程中就没有参考。另外这些文章中提到的下载的文件都没有,不用找和问了。

三、总体架构

3.1 整体架构展示

​ 本系统的系统框图如图3.1。在基于ARM DesignStart计划开放的Eval版ARM Cortex-M3软核搭建片上系统,硬件主要模块包括(图中的ACC硬件加速器实际上还没有):

  1. ARM Cortex-M3处理器内核;
  2. 一、二级AHB系统总线和二级APB系统总线;
  3. 总线间接口和总线与外设间接口;
  4. 挂载在AHB和APB总线上的外设:
    1. 由FPGA片上BRAM实现的程序和数据存储器ITCM和DTCM;
    2. 片上功能外设,包括串口UART,GPIO,定时器TIMER,外部SDRAM,FLASH;
  5. SWD调试接口;
  6. 外部SDRAM与总线之间的高速缓存Cache。

在这里插入图片描述

图3.1 系统框图

​ 以上系统框图以及顶层代码的排布都是按照系统地址递增的顺序排列的,为的是能有更清晰的逻辑,下面是整个系统的地址层次。

​ Cortex-M3的总线位宽为32位,因此提供了4GB的存储器寻址空间。在我们设计的片上SOC中,具有片内RAM,片外SDRAM和外设驱动层电路,因此具有灵活的地址映射和寻址方式。具体的地址空间映射如下图3.2所示:

在这里插入图片描述

图3.2 地址映射图

3.2 顶层文件代码分析

​ 我们的所有工程都会上传到我的github仓库,后期也会不断做修改:JimmyForest · GitHub。以下是我对着顶层文件进行的代码分析,简单讲述了搭建软核的思路以及软核的框架结构:

  1. 最开始的一个GLOBAL BUF(这个在我们的代码的注释中,以下的都是)是对全局时钟走线的处理,走全局时钟网络的信号具有低偏斜、低抖动以及高扇出的特点。
  2. 接下来是DEBUG IOBUF对调试接口的三态处理,因为安路中找不到相应的三态原语,因此就用了1'bz代替。
  3. 后面两个是全局复位的处理。
  4. 接下来的cortexm3ds_logic模块是官方提供的Cortex-M3内核,即图3.1中的Cortex-M3 Core,为整个系统的中央CPU。该模块的底层代码由大量的assign语句构成,且所有信号均由无规律的字母和数字组成无实际含义,因此具有很差的可读性。另外该内核主要有三大主机接口与一级AHB总线相连接,分别是I_bus(Instructions)指令总线,D_bus(Data)数据总线和SYSTEM_bus系统总线。前两个分别是内核与ITCM和DTCM交互分别取指和数据读写,系统总线还不是很懂,CSDN上有说法是这条总线用来加载外设。
  5. 在内核模块的后面是一级AHB稀疏总线矩阵L1AhbMtx,这是AHB总线的核心部分。该模块包含多个子模块,其中包括多个仲裁器、地址译码器、从机的输入级和主机的输出级模块(后面两个什么意思和功能我不懂,是根据注释翻译的)。相比于后面的二级AHB总线模块这是一个完整的总线模块,拥有总线的完整功能,可以通过在第二点中2、3两小点中提供文章和视频提供的方法进行生成。
  6. 在一级AHB总线矩阵模块下面的是ahb_eram,此处的eram也即可理解为BRAM即为块状(BLOCK)RAM,利用大块的RAM作为ITCM指令存储空间。之前采用分布式SRAM作为ITCM的存储空间导致存储资源不够是因为SRAM的本质是LUT查找表,LUT较适合用于小容量的存储和逻辑电路的综合,对于大容量的存储使用SRAM效率十分低下。
  7. 在ITCM下面的是cmsdk_ahb_to_sram,这个并不是DTCM存储器SRAM,而是AHB总线和DTCM的接口层。下面的cmsdk_fpga_sram才是DTCM的SRAM实例化模块。这里采用分布式SRAM是因为在KEIL中配置ITCM和DTCM时。ITCM大小为64kb bit,DTCM大小为16kb bit。因此DTCM大小较小采用了分布式RAM实现。
  8. 接下来的是APB总线部分,首先是APB与AHB的接口模块cmsdk_ahb_to_apb。后面是APB总线的核心部分cmsdk_apb_slave_mux,根据名字看mux是多路选择器,但模块内部不仅包含了从机多路选择器还包含了地址译码器。因为APB总线是单主机结构因此不存在仲裁器。具体的总线内容放到下一篇文章。
  9. 再下面是两个挂载在APB总线上的外设,串口和定时器。前面APB总线的地址译码器决定了两个外设的基地址。
  10. 在APB后面的是二级AHB总线,和APB总线一样,AHB与AHB总线之间有一个同步桥模块cmsdk_ahb_to_ahb_sync,是一级AHB总线和二级AHB总线之间的数据指令同步接口模块。
  11. 在同步桥下面是AHBlite_Interconnect,AHBlite是只AHB总线的简化版本,AHB支持多主机而AHBlite仅支持单主机,因此AHBlite在AHB总线的基础上可以简化仲裁器等大量的控制信号。例如在该系统中一级AHB总线是二级AHB总线的主机,在二级AHB总线下可以挂载多个外设。AHB的AHBlite_Interconnect模块和APB的cmsdk_apb_slave_mux一样也是由地址译码器和多路选择器组成。
  12. 在二级AHB总线下面是三个挂载在总线上的外设GPIO、LCD和FLASH。最后在一级AHB总线上单独挂载了一个外设外部SDRAM,不挂载在二级AHB总线上是为了提高外部SDRAM的数据读写效率。数据经过总线的读写会造成时钟延迟降低数据的传输效率。
  13. 在顶层文件的代码最后一行一个assign语句是系统中断,IRQ信号的位宽大小为240表示该系统最大可以支持240个自定义的外部中断。如在该系统中就有定时器中断,GPIO1的中断等等。

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

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

相关文章

Android ViewPager不支持wrap_content的原因

文章目录 Android ViewPager不支持wrap_content的原因问题源码分析解决 Android ViewPager不支持wrap_content的原因 问题 <androidx.viewpager.widget.ViewPagerandroid:id"id/wrap_view_pager"android:layout_width"match_parent"android:layout_he…

快速画流程图

使用在线工具&#xff1a;PlantUML PlantUML 官网:https://plantuml.com/ 中文官网:https://plantuml.com/zh/ 使用步骤如下&#xff1a; 1、拷贝一个完成函数&#xff1a; int func_init(const char *tag) {if (tag ! NULL) {printf("set TAG :%s", tag);}print…

登录校验:JWT令牌、Filter、Interceptor

JWT&#xff1a; 全称&#xff1a;JSON Web Token 定义了一种简洁的、自包含的格式&#xff0c;用于在通信双方以json数据格式安全的传输信息&#xff0c;由于数字签名的存在&#xff0c;这些信息是可靠的。 组成&#xff1a; Header(头部)&#xff1a;&#xff08;“alg&q…

每日学习笔记:C++ STL 的set、multiset

定义 (自动排序&#xff0c;可指定自定义排序准则) 排序准则 特点 &#xff08;不同通过迭代器直接修改元素值&#xff0c;只能先删除后添加&#xff09; 操作函数 运行期指定排序准则

【项目实践】VS配置Qt

文章目录 前言版本使用具体步骤1&#xff09;安装Qt或者添加删除组件2&#xff09;VS安装Qt Visual Studio Tools 如何使用遇到的问题双击ui文件编辑报错 前言 最近因为一个项目&#xff0c;需要使用Qt&#xff0c;本来想使用Python的&#xff0c;但是由于另外一个第三方的库是…

Linux:vim编辑器的使用

1.Vim的安装 Linux默认是安装了的vim&#xff0c;未安装则可以使用以下指令安装。 yum install vim -y 2.Vim的四种模式 &#xff08;1&#xff09;命令模式 使用VIM编辑器时&#xff0c;默认处于命令模式。在该模式下可以移动光标位置&#xff0c;可以通过快捷键对文件内容…

路灯单灯控制器 智慧路灯杆智能照明新宠

路灯单灯控制器是现代城市管理中非常重要的设备之一。它们不仅可以提供照明功能&#xff0c;还可以通过智能控制系统实现远程监控和调节。   路灯单灯控制器通过感知环境亮度和运行状态&#xff0c;实现对路灯的智能控制。它使用先进的传感器技术&#xff0c;能够实时感知路灯…

von Mises-Fisher Distribution

1. 概率密度函数 关于 Bessel Function 请参阅《贝塞尔函数》《Modified Bessel Function of the First Kind》。 2. Relation to Normal Distribution 进一步的推导&#xff1a; G p ( x ; μ , κ ) ( κ 2 π ) p e x p ( − κ ( x − μ ) ⊺ ( x − μ ) 2 ) ( κ 2 π…

109 项目整合 spring-quartz 启动自动执行定时任务

前言 项目中使用了 quartz 来支持定时任务的相关基础支撑, 但是 最近添加了一个 资源消耗比较高的定时任务, 发布到测试环境之后, 发现服务突然 起不起来了[资源比较有限] 然后 查看了一下日志, 这个定时任务怎么在执行?, 不是 配置的是 凌晨两点么, 然后 仔细一看 几乎配置…

跳槽多次未成功,问题源自何处?

众所周知&#xff0c;2023年市场很难&#xff01;看着企业们纷纷裁员&#xff0c;甚至连内推这个后门都走不通&#xff01;哪怕有面试&#xff0c;都是屡屡碰壁&#xff0c;你想清楚问题出在哪了吗&#xff1f;&#x1f62d;“求职不得&#xff0c;夜不能寐&#xff1b;三更半夜…

免费升级https的方式(含教学)

背景&#xff1a;随着现在全民网络安全意识的日益提升&#xff0c;各个网站实现的https数量也随之提升&#xff0c;那么如何将原本网站的http访问方式升级为https呢&#xff1f;下面均为干货内容。 目录 http访问和https访问的区别&#xff1a; 实现https后有哪些好处&#x…

两个现货白银理财产品投资技术分析方法

现货白银是投资市场中比较受欢迎的理财产品。要投资现货白银&#xff0c;我们需要具备一定的金融投资经验。下面我们就来讨论一下&#xff0c;在现货白银这个理财产品的投资过程中&#xff0c;常常用到的一些技术分析方法。 宏观的趋势分析法。在现货白银理财产品投资中&#x…

助农抢农时,千耘导航保春耕

助农抢农时&#xff0c;千耘导航保春耕 在农业生产中&#xff0c;农机的作用不可忽视。随着人们生活水平的提高和科技的进步&#xff0c;对于农机的需求也越来越大。而千耘农机导航作为农机自动驾驶领域独具优势的一款设备&#xff0c;正以火爆的势头成为众多农户的首选。 在春…

C 结构体链表的一点想法

去年写的 白天和同事在聊一个东西&#xff0c;关于 c 里面链表的使用&#xff0c;通常是用一个 list 作为结构体的成员&#xff0c;然后通过 list 把结构体串起来&#xff0c;就像串糖葫芦一样。 而我发现项目中有一个结构体有三个类似 list 这样的成员&#xff0c;一个成员是…

20240318uniapp怎么引用组件

在script中增加 import index from "/pages/index/index.vue" 把index直接整个作为一个组件引入 然后注册组件 在export default中增加 components: {index:index }, 注册了index组件&#xff0c;内容为import的index 然后就可以在template里使用 <index&…

3/20作业

1> 创建一个工人信息库&#xff0c;包含工号&#xff08;主键&#xff09;、姓名、年龄、薪资。 2> 添加三条工人信息&#xff08;可以完整信息&#xff0c;也可以非完整信息&#xff09; 3> 修改某一个工人的薪资&#xff08;确定的一个&#xff09; 4> 展示出工资…

AL379芯片和AL383芯片是一款DC-DC升压芯片IC

首先&#xff0c;我们来了解HU6283芯片5V升压12V芯片的工作原理。这种芯片通常采用开关电源技术&#xff0c;通过高频开关控制&#xff0c;将5V的输入电压转换为12V的输出电压。开关电源技术具有高效、稳定、体积小等优点&#xff0c;因此在电子设备中得到了广泛应用。5V升压12…

C语言基础知识点(十八)联合、

【C语言】联合体-共用体 &#xff08;union&#xff09; 详解-阿里云开发者社区 (aliyun.com) 联合 在C语言中是一种数据类型&#xff0c;能在同一个内存空间中存储不同的数据类型&#xff08;不是同时储存&#xff09;。 典型用法&#xff1a;设计一种表以存储及无规律、实…

(C语言) print输出函数系列介绍

(C语言) print输出函数系列介绍 文章目录 (C语言) print输出函数系列介绍前言输出系列函数&#x1f5a8;️printf&#x1f5a8;️sprintf & snprintf&#x1f5a8;️fprintf&#x1f5a8;️vprintf&#x1f5a8;️dprintf&#x1f5a8;️puts&#x1f5a8;️fputs&#x1f…

Java开发---上海得帆(一面)

面试感受 这是我的第一次面试&#xff0c;我感觉我这次面试的很差&#xff0c;很糟糕&#xff0c;十分的糟糕&#xff0c;万分的糟糕。第一次面试&#xff0c;面试了半个小时。我去真的好紧张&#xff0c;脑子里一篇空白。脑子空白还不是最惨的&#xff0c;最惨的是那个八股文…