在FPGA上搭建Cortex-m3软核

2023-11-07 19:31
文章标签 搭建 fpga cortex m3 软核

本文主要是介绍在FPGA上搭建Cortex-m3软核,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在FPGA上搭建Cortex-m3软核

前言

​ 说是在fpga上搭建,其实还是比较偷懒了,在Vivado上进行搭建,比较方便。先来讲讲Cortex-m3这个东西,玩过单片机的人应该都用过Stm32f103c8t6这块板子,里面的核心架构就是Cortex-m3,c8t6这个器件是基于m3内核组成一块芯片。由于自己需要做一个加密解密的soc,所以需要先搭建一个m3的软核,后续在软核基础上把做好的模块挂到AXI总线上。花了一天做这个,今天就顺带着博客写了,就当作笔记了。

Cortex-m3 Design_Star计划

​ 其实多亏了Risc-V的兴起,ARM公司在前几年把m3和m0的内核通过Design_Star的活动给开源了,开发者只需要在ARM网站上注册就可以下载源码或者是IP核来直接调用,目前来看比较完善的有Xilinx和Gowin这两家体验挺好。手头没有高云的器件,只有一块4k(但是带了硬核),所以就拿手头的zynq来做这次项目。

img

前期准备

硬件资源

​ 1、你需要一块Xilinx的板子,lut容量大概10k左右应该就差不多。

​ 2、jlink调试器

软件资源

​ 1、Cortex-m3的ip核

​ 2、Keil的cortex-m3的bsp

Cortex-m3软核搭建

1、创立工程文件夹

​ 为了我们方便开发,我们先建立一个名为“Cortex-m3_7010"的文件夹,文件夹下方有下图这些文件夹
在这里插入图片描述

​ 其中”cm3_core“中存储的是我们下载得到的资源包中的”Arm_ipi_repository“这个文件夹。

2、建立Vivado工程

​ 本篇博客面向的是有FPGA开发经验的同学,怎么建立Vivado工程就不具体讲了,建立完工程后在Tools-Settings中找到ip相关的设置栏

在这里插入图片描述

​ 在”Repository“中添加Cortex-m3的ip核的路径。

3、在Block Design中搭建Cortex-m3

​ 相信用过Vivado的同学们应该都知道Xilinx的Block Design的功能十分高效。使用方法建议百度。

​ 创建Block Design后,我们添加Cortex-m3的IP核进我们的画布中。

在这里插入图片描述

​ 添加IP核处搜索Arm即可出现两个IP核,第一个就是我们想要的m3的IP核,第二个则是DAP的调试的IP核,我们使用Jlink进行调试,所以我们只需要将第一个IP核添加进来即可。

4、Cortex-m3 IP核

​ 我们双击m3的IP核就可以对其进行配置。

在这里插入图片描述

​ 第一栏里的中断的数量是不需要我们去设置了,对应的IRQ的接口会根据你接入的位宽自动展开。其他的按照默认即可。

在这里插入图片描述

​ 然后来调整Debug部分的设置。我使用的Jlink进行调试,同时也不需要Trace功能,所以选择”no trace“,并且将JTAG的那个勾选取消。

​ 接下来设置ITCM和DTCM的大小

在这里插入图片描述

​ 上图中Initialize的勾选取消,这个功能是将ITCM/DTCM按设置进行初始化,我们不需要,取消勾选。DTCM同ITCM设置相同

​ 按照上方设置即可完成。选择OK即可。

5、时钟网络构建

​ Cortex-m3基本上最高就是跑到50M的频率,所以我们先确定时钟频率就是50M。通过”Clk_Wizard“(时钟生成向导“)这个IP核,生成对应的时钟频率,并且激活LOCKED端口即可。

在这里插入图片描述

​ 输出的Clk_out1就是我们需要的时钟,将内核的时钟连到这里就行,同时我们后续外设的时钟也是使用这个。

6、复位信号网络搭建

​ 复位是很重要的一环,如果复位部分没做好的话软核很可能会跑不通。笔者到现在还是有时候会因为复位网络导致系统出错误。但是在Vivado里,有一个很好用的IP核可以帮助我们解决困难。(属实被Vivado宠坏了

在这里插入图片描述

​ 就是这个,PS端复位信号的生成IP核,真挺好用的。配置的话按照默认的即可。将时钟信号接入对应的Sync_clk。外部复位信号源接入到”ext_reset_in"中。时钟的locked信号接入dcm_locked中。输出端口:

在这里插入图片描述

​ “mb_reset"是输出的复位,我们将这个作为arm的ip核的系统复位信号以及debug的系统复位信号。不过需要注意的是,他这里是高电平有效的信号,我们需要生成not门来之后再接入到arm ip核中去。

​ ”Interconnect_restn"用来当作总线的复位源,”periphera“用来当作外设的复位源。这样基本的复位信号网络就搭建好了。

7、AXI总线

​ Vivado给了一个叫“AXI Interconnection"的ip核,通过这个ip核,我们可以将我们想要的总线与外设搭建起来。我们这次先将GPIO与Uart挂上AXI总线,设置好相关参数,将时钟和复位信号连接起来。

在这里插入图片描述

​ 如上图,连线都是比较基本的。

8、SWD调试接口

​ 我们这次使用的是Jlink的SWD模式,在Cortex-m3上相关的接口是:

SWTCLK、SWDI/TMS、SWDO、SWDOEN这几个引脚。其中SWTCLK是调试器给的外部时钟,直接引出引脚即可,SWDI与SWDO是输入输出,但是我们在调试器上属于是双向IO,因此我们需要例化IOBUF的原语来实现双向IO的功能。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/04/16 21:28:24
// Design Name: 
// Module Name: swdiobuf
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module swdiobuf(input swd_o,output swd_i,input swd_oe,inout swd_io);IOBUF swd_iobuf_inst1(.O(swd_i),.I(swd_o),.IO(swd_io),.T(~swd_oe)    //);endmodule

​ 然后把这个rtl导入到Block Design中按找接口进行连线即可。

9、Cortex-m3相关接口配置

​ 有两个引脚NMI、CFGITCM需要我们手动配置一下,这两个引脚的作用可以去查看说明文档(记得是4-128页)。配置的方法可以通过常量IP核来实现。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

​ 上图是常量IP设置的信息。

10、地址分配

在这里插入图片描述

​ 我们需要为外设进行分配存储空间。DTCM和ITCM不需要我们手动配置。右键Auto set即可。

11、创建引用文件、导出IP核

​ 这一步用过的Vivado的应该都会。就不多讲了。

12、设置引脚、综合实现

​ 设置引脚需要注意一点,SWDCLK这个引脚需要设置为FPGA上的时钟引脚,否则综合的时候会报错,显示该引脚输入的时钟无法作为时钟源来使用。(具体的报错信息忘记了)排除了以上问题之后综合实现翻译成bit流文件,通过JTAG或者其他方式下载到FPGA的板子上即可。

Keil端软件程序编写

1、Keil设置

​ Keil软件配置需要设置BSP的支持包,具体的可以去资源网站下载,安装完即可。然后需要根据我们搭建M3的软核来设置内存大小和频率。

在这里插入图片描述
在这里插入图片描述

​ 按上图选中信号以及配置ram地址即可。

2、Jlink配置

​ 插入Jlink连接到板子上如果出现了相关的型号,就可以说明FPGA软核搭建成功,如果有错误的话从头看看布线是否有错误。

在这里插入图片描述

3、典中典之点灯

​ 每一个EE工程师的起始之路,就是点灯。今天我们在搭建好的Cortex-m3软核上通过挂载到AXI总线上的GPIO进行点灯操作。

​ 先利用官方给的DS_CM3.h的库来做一个定时器。

	SysTick_Config(SystemCoreClock/1000);

​ 这个函数可以配置一个滴答计时器,然后设置句柄来生成一个计数器。

volatile uint32_t SystemTicks =0;
void SysTick_Handler(void)
{SystemTicks++;
}void Delay(uint32_t ms)
{uint32_t this_time=SystemTicks;while((SystemTicks-this_time) < ms);
}

​ 生成了这个计时器之后,就可以来点灯了。查看Vivado的内存地址分配可以看到GPIO的地址是 0x40000000;查看GPIO的库可以知道地址的一些分配之后就可以进行点灯了。

#define LED_BASEADDR 0x40000000
#define LED_DATA		 0x0000
int main()
{SysTick_Config(SystemCoreClock/1000);while(1){*(uint32_t *)(LED_BASEADDR+LED_DATA)=0x01;Delay(1000); *(uint32_t *)(LED_BASEADDR+LED_DATA)=0x02;Delay(1000 ); }
}

​ 编译通过即可。

4、Jlink flash下载设置

在这里插入图片描述

​ 正常来讲,这里是没有适配的,我们需要自己写一个下载的方法(需要手动改成ohchip下载,要用flash下载的话需要在搭建软核的时候重新设置code_ram);

​ 找到Arm下的Flash的文件夹。如下图:

在这里插入图片描述

​ 途中的template文件夹是预留给我们用来进行自定义下载方法的模板,我们复制一份之后重命名为“DTCM_onchip"后打开工程文件进行修改。

​ 如下图修改:

在这里插入图片描述
在这里插入图片描述

​ 保存编译后回到Jlink的Flash页面把我们做好的添加进来,然后就可以下载了。

现象

如下图:

在这里插入图片描述

如有错误欢迎指出

在这里插入图片描述

这篇关于在FPGA上搭建Cortex-m3软核的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365802

相关文章

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

JavaFX环境的搭建和一个简单的例子

之前在网上搜了很多与javaFX相关的资料,都说要在Eclepse上要安装sdk插件什么的,反正就是乱七八糟的一大片,最后还是没搞成功,所以我在这里写下我搭建javaFX成功的环境给大家做一个参考吧。希望能帮助到你们! 1.首先要保证你的jdk版本能够支持JavaFX的开发,jdk-7u25版本以上的都能支持,最好安装jdk8吧,因为jdk8对支持JavaFX有新的特性了,比如:3D等;

springboot+maven搭建的项目,集成单元测试

springboot+maven搭建的项目,集成单元测试 1.在pom.xml文件中引入单元测试的依赖包 <!--单元测试依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></depen

CentOS 7 SVN的搭建和使用

https://subversion.apache.org/packages.html#centos 阿里云的ECS貌似已经自带了SVN [root@xxx ~]# svn --versionsvn, version 1.7.14 (r1542130)compiled Aug 23 2017, 20:43:38Copyright (C) 2013 The Apache Software Fo

2021-08-14 react笔记-1 安装、环境搭建、创建项目

1、环境 1、安装nodejs 2.安装react脚手架工具 //  cnpm install -g create-react-app 全局安装 2、创建项目 create-react-app [项目名称] 3、运行项目 npm strat  //cd到项目文件夹    进入这个页面  代表运行成功  4、打包 npm run build

搭建H1veCTF平台

An Easy / Quick / Cheap Integrated Platform H1ve是一款自研CTF平台,同时具备解题、攻防对抗模式。其中,解题赛部分对Web和Pwn题型,支持独立题目容器及动态Flag防作弊。攻防对抗赛部分支持AWD一键部署,并配备炫酷地可视化战况界面。 项目地址:https://github.com/D0g3-Lab/H1ve 更多请打开。。。

day45-测试平台搭建之前端vue学习-基础4

目录 一、生命周期         1.1.概念         1.2.常用的生命周期钩子         1.3.关于销毁Vue实例         1.4.原理​编辑         1.5.代码 二、非单文件组件         2.1.组件         2.2.使用组件的三大步骤         2.3.注意点         2.4.关于VueComponen

FPGA编译与部署方法全方位介绍

FPGA编译与部署是FPGA开发中的核心环节,涉及从代码编写、调试到将设计部署到FPGA硬件的全过程。这个流程需要经过创建项目、编写FPGA VI、模拟调试、编译生成比特流文件,最后将设计部署到硬件上运行。编译的特点在于并行执行能力、定制化硬件实现以及复杂的时钟管理。通过LabVIEW的FPGA模块和NI硬件,可以快速完成开发和部署,尤其适用于复杂控制与高性能数据处理系统。 1. FPG