MCU软核 3. Xilinx Artix7上运行cortex-m3软核

news2024/12/26 11:00:41

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(
    //Inputs
    input clk,
    input rst_n,
    input swclk,
    input uart_rxd,
    input [3:0] sw,
    
    //Outputs
    output [3:0] led,
    output uart_txd,

    //Inouts
    inout 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 Type
   0x00000000,                 // Device Start Address
   0x00040000,                 // Device Size in Bytes (256kB)
   1024,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0xFF,                       // Initial Content of Erased Memory
   100,                        // Program Page Timeout 100 mSec
   3000,                       // Erase Sector Timeout 3000 mSec

// Specify Size and Address of Sectors
   0x002000, 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 Type
   0x00000000,                 // Device Start Address
   0x00010000,                 // 修改为64KB
   1024,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0xFF,                       // Initial Content of Erased Memory
   100,                        // Program Page Timeout 100 mSec
   3000,                       // Erase Sector Timeout 3000 mSec

// Specify Size and Address of Sectors
   0x010000, 0x000000,         // 只有一个扇区,起始地址为0
   SECTOR_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


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web安全漏洞-SQL注入攻击实验

实验目的 学习sql显注的漏洞判断原理掌握sqlmap工具的使用分析SQL注入漏洞的成因 实验工具 sqlmap是用python写的开源的测试框架,支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,I…

2023微信头像生成小程序源码/基于skyline+vue3+t

微信头像生成小程序,基于skylinevue3t该项目已适配微信小程序隐私政策,截图、获取头像等诸多新的接口 如何使用: 将代码导入到HBuilderX开发工具,可无需修改任何代码,运行并编译到微信开发者工具 skyline需要使用微…

C++ 的继任者:Carbon Language | 开源日报 0911

carbon-language/carbon-lang Stars: 31.1k License: NOASSERTION Carbon Language 是一个实验性的 C 继任者项目。它旨在提供与 C 相当的性能,并具有低级访问位和地址的功能,以及与现有 C 代码进行互操作、快速可扩展构建等特点。该项目还强调了以下核…

io概述及其分类

一、IO概念 • I/O 即输入Input/ 输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和外部存储)的数据写入写出的过程; I : Input O : Output 通过IO可以完成硬盘文件的读和写。 • java中用“流(stream&am…

太牛啦!Python入门到精通 只用了3个多月

最近 GitHub 热榜上持续有一个这样的 Python 项目,自称「100天从新手到大师」。目前 Star 数量已有 19000 多。 作者在开头列出了 Python 的一些应用领域 作者的计划目录 Day01~15 - Python语言基础 Day16~20 - Python语言进阶 Day21~30 - Web前端入门 Day31~3…

基于RuoYi-Flowable-Plus的ruoyi-nbcio项目的formdesigner文件上传与回显处理

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 本节说明ruoyi-nbcio项目的formdesigner文件上传与回显处理,不过目前还只实现oss的formdesigner的文件上传与回显功能。 1、前端方面 formdesigne…

IDEA中Debug测试的基本使用

Debug简介 Debug是用来追踪代码,通常在程序运行中出现异常的时候启动debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化,通常我们也可以启动Debug模式来跟踪代码的运行流程去学习三方框架的源码 Debug与Junit的区别 Debug与JU…

力扣236 补9.14

做不来,我做中等题基本上都是没有思路,这里需要先遍历祖先节点,那必然用先序遍历,这题还是官方题解容易理解,第二火的题解反而把我弄得脑袋昏昏的。 class Solution { TreeNode ans; public TreeNode lowestCommonAnce…

私域流量的优势

私域流量是指由自身品牌或个人拥有并具备完全掌控权的流量资源。它相比于传统的广告推广,拥有独特的优势。 首先,私域流量能够更加精准地定位目标用户,实现精准传播。不再盲目投放广告,而是通过建立自身社群、粉丝群,获…

Postman应用——下载注册和登录

文章目录 下载安装注册登录注册账号登录账号 下载安装 Postman下载:https://www.postman.com/ 访问链接后,进入首页,根据自己的操作系统下载对应的版本。 找到下载到的目录直接双击.exe文件,会默认安装在C盘,安装完会…

使用VMware 16 安装银河麒麟V10 --九五小庞

1.下载 银河麒麟系统V10 服务版镜像包: Kylin-Server-10-SP1-Release-Build04-20200711-x86_64.iso 百度云盘链接:https://pan.baidu.com/s/1z0GCEadvefUA8R988qDP5Q 提取码:1l0g 2.运行VMware Workstation,创建新的虚拟机&…

【动态规划刷题 15】最长定差子序列 最长的斐波那契子序列的长度

1218. 最长定差子序列 链接: 1218. 最长定差子序列 给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。 子序列 是指在不改变其余元素顺序的情况下,通…

python程序商业化,代码安全最终方案,pyinstaller与cython打包python执行程序

其实一般的程序安全上只需要两步就行,没必要再加密改解释器等,已经不可能反编译到原有python了,因为动态链接库就是汇编了,中间经历了python转c,c在转动态库,代码已经没有可读性了。但是一些密码等重要字符还是要处理好…

构建无限画布,协作数字绘图 | 开源日报 0915

tldraw/tldraw Stars: 16.4k License: Apache-2.0 tldraw 是一个协作数字白板项目,可在 tldraw.com 上使用。它的编辑器、用户界面和其他底层库都是开源的,并且可以通过 npm 进行分发。您可以使用 tldraw 为产品创建一个即插即用的白板,或者…

Smart Community(1)之设计规范

通过前面大数据开发相关知识的学习,准备做一个项目进行练习---我给他起了一个响亮的名字:基于HadoopHA的智慧社区服务平台 设计规范: 做一个项目之前肯定要先规定一些开发过程中的设计规范 (一)数据埋点规范&#xf…

Python中异常处理4-4

在Python中的异常处理4-1_棉猴的博客-CSDN博客中提到,在try块中的代码运行时如果出现异常,会自动抛出这个异常。可以通过raise语句手动抛出异常。 1 raise语句手动抛出异常 raise后面跟要抛出的异常类或者异常类的实例,表示手动抛出该异常&…

位图+布隆过滤器+海量数据并查集(它们都是哈希的应用)

一)位图: 首先计算一下存储一下10亿个整形数据,需要多大内存呢,多少个G呢? 2^3010亿,10亿个字节 byte kb mb gb 100000000个字节/1024/1024/10241G 所以10亿个字节就是1G,所以40亿个字节就是4G,也就是10个整…

电脑重装系统之后设置

edge一直处于正在同步设置关闭系统自动更新更改默认安装路径 edge一直处于正在同步设置 解决办法:卸载重新安装 用电脑管家16可以卸载 电脑管家16 链接:https://pan.baidu.com/s/1f5T4uXrumL8Fne9hyvTHcg?pwd0122 提取码:0122 edge 链接&am…

Go Moonbeam:Ai智能写作助手

【产品介绍】 • 名称 Go Moonbeam • 具体描述 Moonbeam是一个人工智能驱动的长篇写作助手。你可以用它创建散文,故事,文章,博客,和其他长形式的内容,可以轻松的将混乱的笔记转换为大纲。同时它…

对象创建和内存分配

对象创建和内存分配 Java中类创建是在平常不过的操作了,但是一个类的创建到底经历 了哪些过程呢? 对象创建 创建方法 使用关键字new一个对象 使用反射机制 User user (User)Class.forName("xxx.xxx.User").newInstance(); User user Us…