MCU软核 3. Xilinx Artix7上运行cortex-m3软核
0. 环境
- win10 + vivado 2018.3 + keil mdk
 - jlink
 - XC7A35TV12
1. 下载资料
https://keilpack.azureedge.net/pack/Keil.V2M-MPS2_DSx_BSP.1.1.0.pack
 https://gitee.com/whik/cortex_m3_on_xc7a100t
2. vivado 2018
Create Project -> Next -> 
 -> Project name: cortex_m3
 -> Project location: E:/Workspaces/vivado2018/XC7A35TV12/
 -> 取消勾选 Create project subdirectory
 -> RTL Project
 -> Next -> Next
 -> xc7a35tftg256-1
 -> finish
创建Block Design
 点击IP INTEGRATOR下的 Create Block Design -> Design name: cm3_core -> OK
2.1 添加m3 ip核
 把
 mcu designstart cortex-m3\cortex_m3_on_xc7a100t-main\cm3_core
 拷贝到
 E:\Workspaces\vivado2018\XC7A35TV12\cortex_m3\cm3_core

 -> 点击PROJECT MANAGER下的Settings -> IP -> Repository -> Add -> E:\Workspaces\vivado2018\XC7A35TV12\cortex_m3\cm3_core
 -> Apply -> OK
添加Cortex-M3
 点击Diagram下的+ -> 筛选并双击Cortex-M3 -> 双击新建的实例CORTEXM3_AXI_0 -> 
 -> Debug -> Trace Level: 0 = No trace -> 取消勾选 JTAG Port Present
 -> Instruction Memory -> ITCM Size: 64kB -> 取消勾选 Initialise ITCM
2.2 Clocking Wizard
点击Diagram下的+ -> 筛选并双击Clocking Wizard -> 双击新建的实例 clk_wiz_0 -> 
 -> Clocking Options -> Primary 50MHz -> 
 -> Output Clocks -> clk_out1: 50MHz -> 
 -> Reset Type: Active Low
 -> OK

2.3 复位
 点击Diagram下的+ -> 筛选并双击Processor System Reset -> OK
点击Diagram下的+ -> 筛选并双击 Utility Vector Logic -> 双击新建的实例 util_vector_logic_0 -> 
 -> C_SIZE: 1 -> not -> OK

2.4 AXI
 点击Diagram下的+ -> 筛选并双击 AXI Interconnect -> OK
File -> Add Sources -> Add or create design sources -> Next
 -> Create File -> swdiobuf -> OK
 -> Finish

2.5 SWD调试口
 修改swdiobuf.v
 添加以下内容:
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 
Sources -> Design Sources -> -> 右键选择swdiobuf -> Add Module to Block Design
连线
 CORTEXM3_AXI_0        swdiobuf_0
 SWDO                swd_o
 SWDOEN                swd_oe
 SWDITMS                swd_i
 右键swd_io -> Make External -> 改名为 cm3_swdio
2.6 cortex-m3的接口配置
 点击Diagram下的+ -> 筛选并双击 Constant -> 双击新建的实例 xlconstant_0 -> Const Width: 1 -> ConstVal: 0 -> OK -> 输出连线 NMI
 点击Diagram下的+ -> 筛选并双击 Constant -> 双击新建的实例 xlconstant_1 -> Const Width: 2 -> ConstVal: 1 -> OK -> 改名为 cfg_itc ->  输出连线 CFGITCMEN
 点击Diagram下的+ -> 筛选并双击 Constant -> 双击新建的实例 xlconstant_2 -> Const Width: 1 -> ConstVal: 1 -> OK -> 改名为 cfg_itc ->  输出连线 IRQ
 
2.7 外设
 点击Diagram下的+ -> 筛选并双击 AXI GPIO -> 双击新建的实例 axi_gpio_0 -> 
 -> GPIO -> 勾选All Outputs -> GPIO Width: 4
 -> 勾选 Enable Dual Channel 
 -> GPIO 2 -> 勾选All Inputs -> GPIO Width: 4
 -> OK
点击Diagram下的+ -> 筛选并双击 AXI Uartlite -> 双击新建的实例 axi_uartlite_0 -> 
 -> Baud Rate: 115200
 -> OK
2.8 分配外设基地址
 Address Editor -> Auto Assign Address
 
2.9 验证
 右键空白处  -> Validate Design
2.10 封装
 点击 IP INTEGRATOR下的 Generate Block Design -> global -> Generate
 Sources -> 右键 microblaze_core -> Create HDL wrapper -> Copy generated wrapper to allow user edits -> OK
2.11 封装 top
 Sources -> Add Sources -> -> 右键选择 s wdiobuf -> Add Module to Block Design
File -> Add Sources -> Add or create design sources -> Next
 -> Create File -> top_hdl -> OK
 -> Finish
module top_hdl(//Inputsinput clk,input rst_n,input swclk,input uart_rxd,input [3:0] sw,//Outputsoutput [3:0] led,output uart_txd,//Inoutsinout swdio
);cm3_core_wrapper cm3_core_wrapper_ut0(//Inputs.cm3_clk(clk),.cm3_resetn(rst_n),.cm3_gpio_in_tri_i(sw[3:0]),.cm3_swclk(swclk),.cm3_uart0_rxd(uart_rxd),//Outputs.cm3_gpio_out_tri_o(led[3:0]),.cm3_uart0_txd(uart_txd),//Inouts.cm3_swdio(swdio)
);endmodule   //top_hdl end 

 2.12 编译
 
 RTL ANALYSIS -> Schematic
 -> I/O Ports
 -> save... -> cortex_m3.xdc
2.13 修改约束文件 cortex_m3.xdc
set_property PACKAGE_PIN D4 [get_ports clk_50m]
set_property IOSTANDARD LVCMOS33 [get_ports clk_50m]set_property PACKAGE_PIN C4 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]set_property PACKAGE_PIN K12 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]set_property PACKAGE_PIN L14 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]set_property PACKAGE_PIN L13 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]set_property PACKAGE_PIN M14 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]set_property PACKAGE_PIN D11 [get_ports {key[0]}]
set_property IOSTANDARD SSTL15 [get_ports {key[0]}]set_property PACKAGE_PIN G11 [get_ports {key[1]}]
set_property IOSTANDARD SSTL15 [get_ports {key[1]}]set_property PACKAGE_PIN H11 [get_ports {key[2]}]
set_property IOSTANDARD SSTL15 [get_ports {key[2]}]set_property PACKAGE_PIN K13 [get_ports {key[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {key[3]}]set_property PACKAGE_PIN E6 [get_ports uart_txd]
set_property IOSTANDARD LVCMOS33 [get_ports uart_txd]set_property PACKAGE_PIN C7 [get_ports uart_rxd]
set_property IOSTANDARD LVCMOS33 [get_ports uart_rxd]set_property PACKAGE_PIN M15 [get_ports swclk]
set_property IOSTANDARD LVCMOS33 [get_ports swclk]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets swclk_IBUF]set_property PACKAGE_PIN R16 [get_ports swdio]
set_property IOSTANDARD LVCMOS33 [get_ports swdio]#set_property BITSTREAM.CONFIG.UNUSEDPIN Pulldown [current_design]
#set_property BITSTREAM.CONFIG.UNUSEDPIN Pullup [current_design]
set_property BITSTREAM.CONFIG.UNUSEDPIN Pullnone [current_design]set_property BITSTREAM.CONFIG.SPI_32BIT_ADDR NO [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property BITSTREAM.CONFIG.SPI_FALL_EDGE YES [current_design] 
 编译
 -> Run Systhesis
 -> Run Implementation
 -> Generate Bitstream
下载
 Open Hardware Manager -> Open Target -> Auto Connect -> 右键Hardware栏内的xc7a35t_0 -> 点击Program device
 -> Bitstream file: E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1/top_hdl.bit
固化
 Tools -> Generate Memory Configuration File -> 
 -> MCS
 -> 128MB
 -> File name: E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1/cortex_m3.mcs
 -> Interface: SPIx4
 -> 勾选 Load bitstream files 
 -> Bitfile: E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1/top_hdl.bit
请先手动删除
 E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1
 下的
 led_test.mcs
 led_test.prm
-> OK
 -> Add Configuration Memory Device -> 输入n25q128-3.3v -> OK
烧写
 -> Configuration file:     E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1/cortex_m3.mcs
 -> PRM file:             E:/Workspaces/vivado2018/XC7A35TV12/cortex_m3/vivado/cortex_m3.runs/impl_1/cortex_m3.prm
 -> OK
3. keil
 3.1 安装器件库
 
 直接双击Keil.V2M-MPS2_DSx_BSP.1.1.0.pack安装
3.2 新建工程
 Project -> New uVision Project -> E:\Workspaces\vivado2018\XC7A35TV12\cortex_m3\mdk\ds_cm3
 -> Select Device for Target -> ARM -> ARM Cortex M3 -> DS_CM3 -> OK
 -> 勾选 CMSIS 下的 CORE
 -> 勾选 Device 下的 Startup
 -> OKFile -> New 
 添加以下内容
#include "DS_CM3.h"
#include "system_DS_CM3.h"int main(void)
{while(1){}
} 
 保存到
 E:\Workspaces\vivado2018\XC7A35TV12\cortex_m3\mdk\src\main.c
设置RAM和ROM地址
 在工程选项中设置片上ITCM的起始地址0x0、大小64K,片上DTCM起始地址0x20000000、大小64K:
 Options for Target -> Target -> 
 -> IROM1: Start: 0x0, Size: 0x10000,
 -> IRAM1: Start: 0x20000000, Size: 0x10000,
 
3.3 修改main.c
 main.c直接使用mcu designstart cortex-m3\cortex_m3_on_xc7a100t-main\mdk_prj\application\main.c
3.4 Flash编程算法生成
 文件浏览器 打开D:\Keil\mdk5\ARM\Flash
 把 
 D:\Keil\mdk5\ARM\Flash\_Template
 拷贝到
 D:\Keil\mdk5\ARM\Flash\DS_CM3
双击 D:\Keil\mdk5\ARM\Flash\DS_CM3\NewDevice.uvprojx打开FlashDev.c
 把里面的
struct FlashDevice const FlashDevice  =  {FLASH_DRV_VERS,             // Driver Version, do not modify!"New Device 256kB Flash",   // Device Name ONCHIP,                     // Device Type0x00000000,                 // Device Start Address0x00040000,                 // Device Size in Bytes (256kB)1024,                       // Programming Page Size0,                          // Reserved, must be 00xFF,                       // Initial Content of Erased Memory100,                        // Program Page Timeout 100 mSec3000,                       // Erase Sector Timeout 3000 mSec// Specify Size and Address of Sectors0x002000, 0x000000,         // Sector Size  8kB (8 Sectors)0x010000, 0x010000,         // Sector Size 64kB (2 Sectors) 0x002000, 0x030000,         // Sector Size  8kB (8 Sectors)SECTOR_END
}; 
 修改为:
struct FlashDevice const FlashDevice  =  {FLASH_DRV_VERS,             // Driver Version, do not modify!"MyCM3onFPGA",              // Device Name ONCHIP,                     // Device Type0x00000000,                 // Device Start Address0x00010000,                 // 修改为64KB1024,                       // Programming Page Size0,                          // Reserved, must be 00xFF,                       // Initial Content of Erased Memory100,                        // Program Page Timeout 100 mSec3000,                       // Erase Sector Timeout 3000 mSec// Specify Size and Address of Sectors0x010000, 0x000000,         // 只有一个扇区,起始地址为0SECTOR_END
}; 
编译,生成D:\Keil\mdk5\ARM\Flash\DS_CM3\NewDevice.FLM
 把这个文件拷贝到
 D:\Keil\mdk5\ARM\Flash\DS_CM3.FLM
回到ds_cm3.uvprojx工程
 -> 右键 Target 1 -> Options for target -> Debug -> Use J-LINK -> Settings -> 
 -> Flash Download -> Add -> MyCM3onFPGA -> Add
3.5 下载测试

下载时使用jlink的swdio、swclk、gnd连接fpga板卡上的对应三根线即可。
下载时通过keil的 Flash -> Download开始下载。
  有时候下载完需要按下复位才可以执行。
  
  参考
 
[1]在FPGA上搭建Cortex-m3软核,https://blog.csdn.net/m0_50735735/article/details/124253664
[2]手把手教你在FPGA上运行一个ARM Cortex-M3软核,https://zhuanlan.zhihu.com/p/489213515
[3]ARM Cortex M3 verilog源代码 Cortex-M3 DesignStart评估,https://www.amobbs.com/thread-5756149-1-1.html
[4]如何用FPGA实现一个ARM Cortex-M3软核,https://blog.csdn.net/whik1194/article/details/123784346 
  
相关文章:
MCU软核 3. Xilinx Artix7上运行cortex-m3软核
0. 环境 - win10 vivado 2018.3 keil mdk - jlink - XC7A35TV12 1. 下载资料 https://keilpack.azureedge.net/pack/Keil.V2M-MPS2_DSx_BSP.1.1.0.pack https://gitee.com/whik/cortex_m3_on_xc7a100t 2. vivado 2018 Create Project -> Next -> -> Project n…...
基于SpringbootShiro实现的CAS单点登录
概述 单点登录(Single Sign On,SSO)是一种登录管理机制,主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录。常见的例子就是,…...
SocketTool V4.0 使用说明
TCP/UDP Socket 调 试 工 具 提 供 了 TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种 Socket 调试方案。 下面是一份简要的使用流程: TCP 通信测试: 1) 创建 TCP Server 选中左方的 TCP Server, 然后点击 ”创建 ”按钮,软件弹…...
Jenkins结合allure生成测试报告
前言: 我们在做自动化测试的过程中最重要的肯定是报告的输出啦,最近几年allure可以说是最最主流报告展示工具啦。 一、服务端安装allure 在安装Jenkins的机器 安装allure,我们在Jenkins上能跑动前提是在对应服务器上代码能正常运行…...
【Linux】缓冲区/回车换行
1、缓冲区 C程序默认有输出缓冲区。数据输出时,被及时看到,是立马刷新了;如果没被看到,是被暂存在数据缓冲区中。fflush(stdout); 【强制刷新】\n【行刷新,也是一种刷新方式】 2、回车换行 \n【回车换行】输入完一行内…...
Java手写插入排序和算法案例拓展
1. Java手写插入排序和算法案例拓展 1.1 算法思维导图 #mermaid-svg-jIZ3LAdg1NLcOvaM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jIZ3LAdg1NLcOvaM .error-icon{fill:#552222;}#mermaid-svg-jIZ3LAdg1NLcOvaM…...
Python Opencv实践 - 视频文件操作
参考资料: 视频处理VideoCapture类---OpenCV-Python开发指南(38)_python opencv videocapture_李元静的博客-CSDN博客 OpenCV VideoCapture.get()参数详解 - 简书FOURCC四字符码对照表_4fvcc_Kellybook的博客-CSDN博客 import cv2 as cv im…...
HCS 中的一些概念(二)
一、Service OM 1、首页(资源状态) 2、服务列表 计算资源:计算资源又分为可用分区(AZ)、规格和虚拟机组,可在此处创建虚拟机、虚拟机组、主机组和规格 网络资源:网络资源又分为物理网络…...
Scanner类用法(学习笔记)
Scanner类用法(学习笔记,后续会补充) 1.next()用法 package com.yushifu.scanner; import java.util.Scanner;//util java工具包 //Scanner类(获取用户的输入) Scanner s new Scanner&#…...
idea2021.1.3版本双击启动,没反应
今天打开电脑,点开idea,界面悬在这里,几秒然后就是没了。然后就一直打不开idea了。 然后又是卸载重装,又是删除缓存文件。我把电脑关于idea的文件全都删除了 。重新安装后(首次运行倒是可以打开,但是关掉id…...
MC-4/11/01/400 ELAU 软件允许用户完全访问相机设置
MC-4/11/01/400 ELAU 软件允许用户完全访问相机设置 一个完整的Sentinel模具保护解决方案包括一到四台冲击式摄像机、专用红外LED照明和镜头、Sentinel软件以及所有与模压机连接的必要互连组件。摄像机支架基于磁性,可快速、安全、灵活地部署。此外,一个…...
Error contacting service. It is probably not running.问题解决
一 问题描述 Error contacting service. It is probably not running. 查看zookeeper 目录下数据目录下的zookeeper.out 如果你没找到这个目录那么 OK 你的问题就是 zoo.cfg 文件中数据目录设置错误 zookeeper.out下报错 ERROR [main:QuorumPeerMain86] - Invalid config,…...
01_网络编程_传统IO
网络编程 1.什么是网络编程 在网络通信协议下,不同计算机上运行的程序,进行的数据传输。 如果想把一个计算的结果,或者是电脑上的文件通过网络传递给你的朋友,就需要用到网络编程。 在实际生活中,网络通信无处不在…...
vue 检查指定路由是否存在
今天路由跳转报错了 RangeError: Maximum call stack size exceeded 但显然 我的代码只有一个简单的路由跳转 并没有很大的的堆栈数据操作 所以 我就联想到了 会不会是因为路由不存在 我们可以通过 console.log(this.$router.options.routes)输出整个路由对象类看一下 或者…...
自动化办公更简单了:新版python-office,有哪些更新?
#职场经验谈# 大家好,这里是程序员晚枫,小破站/小红薯都叫这个名。 去年4月开源了一个Python自动化办公项目:python-office,GitHub和Gitee都能看到。1行代码实现复杂的自动化办公任务,帮助不懂代码的小白,…...
windows flask服务卡死的问题
windows flask服务卡死的问题 最近的工作中,需要用python写一个flask服务,供C端调用,但是偶尔服务会卡住,只接收数据但不进行处理,不过CtrlC后又可以继续运行。 查看了网上的一些解决方法,但似乎都没有什…...
项目上线部署--》服务器部署流程(一)
目录 🌟准备工作 服务器购买 域名购买 域名解析(配置 DNS) 🌟服务器环境搭建 配置服务器 安装 CentOS 开发人员相关包 编辑 配置免密登陆 🌟写在最后 🌟准备工作 服务器购买 国内服务器&#x…...
Python:函数调用的实参
相关阅读 Python专栏https://blog.csdn.net/weixin_45791458/category_12403403.html 调用就是附带可能为空的一系列参数来执行一个可调用对象 (例如函数),它的语法的BNF范式如下所示,有关BNF范式的规则,可以参考之前…...
174. 地下城游戏 -- 动规
174. 地下城游戏 class CalculateMinimumHP:"""174. 地下城游戏https://leetcode.cn/problems/dungeon-game/"""def solution(self, dungeon: List[List[int]]) -> int:# 我们想计算左上⻆到右下⻆所需的最⼩⽣命值m, n len(dungeon), len(d…...
js实现websocket服务端和客户端
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
