基于安路FPGA的Cortex M0移植

这其实是今年上半年参加集创赛安路科技杯时候做的内容,当时忙着考研复习大概做了个框架参赛,没想到还混到一个分赛区二等奖加一次公费旅游,现在保研后闲着写点博客记录下当时碰上的问题。

软硬件介绍


硬件平台是硬木课堂的安路EG4S20BG256核心板,资源一般够用,在这次赛题里面移植M0加上其他外设绰绰有余;
软件平台使用安路公司的TD软件开发FPGA部分,Keil软件对M0进行编程;

具体移植过程

具体移植过程强烈建议直接看官方教程,十分详细。配合ARM Cortex-M0 权威指南这本书,能更深入理解M0内核架构和各个部分工作原理,后面自己要添加其他外设也不至于不知道怎么去写代码。
Arm Cortex-M0的SoC实现

移植过程中碰上的问题

RAM和ROM资源不足

在 Anlogic 的 EG4S20 系列 FPGA 中,总共有两类 Memory 资源,分别是 Block Memory 与 Distributed Memory。EG4S20BG256芯
片的存储部分包含了:

  1. 156 Kbits 分布存储器(Distribute RAM)
  2. 1 Mbits 嵌入块存储器(Block RAM 简称 BRAM)包括:
    • 64 个 9 Kbits BRAM,可配置为真双口,8Kx1 到 512x18 模式
    • 16 个 32 Kbits BRAM,可配置为真双口,可设置为 2Kx16 或 4Kx8

按照官方教程进行移植的时候,分配的RAM、ROM空间都较小(4096*32bit)。但是如果直接在Block_RAM.v代码中对空间大小进行修改, TD软件可能会在综合编译时会报错。这是因为由于此次使用的 FPGA 内部存储器的单个空间较小,TD软件无法自动生成这么大的BRAM资源块。
解决方法大致有:

  1. 在TD软件中使用IP核生成大小合适的整块BRAM资源;
  2. 先生成小块BRAM块,再使用数据线扩展或者地址线扩展的方法进行扩展。

FPGA 内部 BRAM 资源分为 9Kbits、32Kbits 两种,其中 32Kbits 可具体设置为 2K * 16 或 4K * 8 两种模式。由于 M0 内核使用的数据位宽最长为 32bits,且需要支持 8bits、16bits、24bits、32bits 四种变长数据宽度传输(可以看上面那本书),所以设定的具体 ROM、RAM 扩展方案如下:

  1. 使用 32Kbits BRAM 资源块分别生成 4 个 8K*8 配置模式的内存资源模块,每个模块将使用两个 32Kbits BRAM 资源块;
  2. 以上 4 个模块进行数据位扩展,组成一个 8K*32 的内存资源模块,即 32KB 的内存空间;
  3. 该内存空间深度为 8192,数据位宽为 8K,因为是由 4 个分别的小模块组合而来,还可以支持变长数据宽度传输;

使用以上方案分别构建 ROM、RAM 模块,共使用了 16 个 32Kbits BRAM 资源块,得到的 ROM、RAM 空间大小都为 32KB。

启动文件编写

启动文件这一部分,一开始我是直接抄的教程的代码,能用,但是不是很理解。等到后面引入了中断后,就更加不理解了,感觉写起来很乱。于是突发奇想,去找到STM32某个同样也是M0内核的型号单片机,抄了一份启动文件,按照自己的硬件进行修改后,验证同样能用。
代码如下:

;/**************************************************************************//**
; * @file     startup_CMSDK_CM0.s
; * @brief    CMSIS Cortex-M0 Core Device Startup File for
; *           Device CMSDK_CM0
; * @version  V3.01
; * @date     06. March 2012
; *
; * @note
; * Copyright (C) 2012 ARM Limited. All rights reserved.
; *
; * @par
; * ARM Limited (ARM) is supplying this software for use with Cortex-M
; * processor based microcontrollers.  This file can be freely distributed
; * within development tools that are supporting such ARM based processors.
; *
; * @par
; * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
; *
; ******************************************************************************/
;/*
;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
;*/; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>Stack_Size      EQU     0x00000400AREA    STACK, NOINIT, READWRITE, ALIGN=4
Stack_Mem       SPACE   Stack_Size
__initial_sp; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>Heap_Size       EQU     0x00000400AREA    HEAP, NOINIT, READWRITE, ALIGN=4
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limitPRESERVE8THUMB; Vector Table Mapped to Address 0 at ResetAREA    RESET, DATA, READONLYEXPORT  __VectorsEXPORT  __Vectors_EndEXPORT  __Vectors_Size__Vectors       DCD     __initial_sp              ; Top of StackDCD     Reset_Handler             ; Reset HandlerDCD     NMI_Handler                ; NMI HandlerDCD     HardFault_Handler         ; Hard Fault HandlerDCD     0                         ; ReservedDCD     0                         ; ReservedDCD     0                         ; ReservedDCD     0                         ; ReservedDCD     0                         ; ReservedDCD     0                         ; ReservedDCD     0                         ; ReservedDCD     SVC_Handler                  ; SVCall HandlerDCD     0                         ; ReservedDCD     0                         ; ReservedDCD     PendSV_Handler          ; PendSV HandlerDCD     SysTick_Handler             ; SysTick HandlerDCD     UART0_Handler             ; UART_HandlerDCD     SW_Handler                ; SW_HandlerDCD     KEY_Handler               ; KEY_HandlerDCD     ESP_Handler               ; ESP_Handler
__Vectors_End__Vectors_Size  EQU     __Vectors_End - __VectorsAREA    |.text|, CODE, READONLY; Reset HandlerReset_Handler   PROCGLOBAL  Reset_HandlerENTRYIMPORT  __mainLDR     R0, =__mainMOV     R8, R0MOV     R9, R8BX      R0ENDP; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler     PROCEXPORT  NMI_Handler               [WEAK]B       .ENDP
HardFault_Handler\PROCEXPORT  HardFault_Handler         [WEAK]B       .ENDP
SVC_Handler     PROCEXPORT  SVC_Handler               [WEAK]B       .ENDP
PendSV_Handler  PROCEXPORT  PendSV_Handler            [WEAK]B       .ENDP
SysTick_Handler PROCEXPORT  SysTick_Handler           [WEAK]B       .ENDPDefault_Handler PROCEXPORT  UART0_Handler             [WEAK]EXPORT  SW_Handler                [WEAK]EXPORT  KEY_Handler               [WEAK]EXPORT  ESP_Handler               [WEAK]
UART0_Handler
SW_Handler
KEY_Handler
ESP_HandlerB       .ENDPALIGN; User Initial Stack & HeapIF      :DEF:__MICROLIBEXPORT  __initial_spEXPORT  __heap_baseEXPORT  __heap_limitELSEIMPORT  __use_two_region_memoryEXPORT  __user_initial_stackheap__user_initial_stackheap LDR     R0, =  Heap_MemLDR     R1, =(Stack_Mem + Stack_Size)LDR     R2, = (Heap_Mem +  Heap_Size)LDR     R3, = Stack_MemBX      LRALIGN ENDIFEND

如果需要新增中断,只需要更改完FPGA硬件后,在下图的地方依葫芦画瓢添加自己的中断名称即可:


KEIL下载算法编写

软硬件都经过仿真验证没问题后,先通过TD软件将FPGA比特流下载到FPGA芯片内,再使用KEIL软件将软核代码下载到M0内核内,整个系统才能正常运作。这个过程中需要一个KEIL下载算法,路径:\KEIL\ARM\Flash\。
1、首先将该文件夹下的例程文件夹复制一份,改成需要的名称;

2、根据自己的硬件flash大小,更改FlashDev.c文件;

struct FlashDevice const FlashDevice  =  {FLASH_DRV_VERS,             // Driver Version, do not modify!"CM0_SoC",                  // Device Name ONCHIP,                     // Device Type0x00000000,                 // Device Start Address0x00008000,                 // Device Size in Bytes (32kB)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 Sectors0x008000, 0x000000,         // Sector Size  32kB (1 Sectors)SECTOR_END
};

3、编写FlashPrg.c文件中的几个函数;

/**************************************************************************//*** @file     FlashPrg.c* @brief    Flash Programming Functions adapted for New Device Flash* @version  V1.0.0* @date     10. January 2018******************************************************************************/
/** Copyright (c) 2010-2018 Arm Limited. All rights reserved.** SPDX-License-Identifier: Apache-2.0** Licensed under the Apache License, Version 2.0 (the License); you may* not use this file except in compliance with the License.* You may obtain a copy of the License at** www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an AS IS BASIS, WITHOUT* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#include "..\FlashOS.H"        // FlashOS Structures
#include "string.h"/* Mandatory Flash Programming Functions (Called by FlashOS):int Init        (unsigned long adr,   // Initialize Flashunsigned long clk,unsigned long fnc);int UnInit      (unsigned long fnc);  // De-initialize Flashint EraseSector (unsigned long adr);  // Erase Sector Functionint ProgramPage (unsigned long adr,   // Program Page Functionunsigned long sz,unsigned char *buf);Optional  Flash Programming Functions (Called by FlashOS):int BlankCheck  (unsigned long adr,   // Blank Checkunsigned long sz,unsigned char pat);int EraseChip   (void);               // Erase complete Deviceunsigned long Verify      (unsigned long adr,   // Verify Functionunsigned long sz,unsigned char *buf);- BlanckCheck  is necessary if Flash space is not mapped into CPU memory space- Verify       is necessary if Flash space is not mapped into CPU memory space- if EraseChip is not provided than EraseSector for all sectors is called
*//**  Initialize Flash Programming Functions*    Parameter:      adr:  Device Base Address*                    clk:  Clock Frequency (Hz)*                    fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)*    Return Value:   0 - OK,  1 - Failed*/int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {/* Add your Code */return (0);                                  // Finished without Errors
}/**  De-Initialize Flash Programming Functions*    Parameter:      fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)*    Return Value:   0 - OK,  1 - Failed*/int UnInit (unsigned long fnc) {/* Add your Code */return (0);                                  // Finished without Errors
}/**  Erase complete Flash Memory*    Return Value:   0 - OK,  1 - Failed*/int EraseChip (void) {/* Add your Code */memset((unsigned char *)0, 0, 0x8000);return (0);                                  // Finished without Errors
}/**  Erase Sector in Flash Memory*    Parameter:      adr:  Sector Address*    Return Value:   0 - OK,  1 - Failed*/int EraseSector (unsigned long adr) {/* Add your Code */memset((unsigned char *)adr, 0, 1024);return (0);                                  // Finished without Errors
}/**  Program Page in Flash Memory*    Parameter:      adr:  Page Start Address*                    sz:   Page Size*                    buf:  Page Data*    Return Value:   0 - OK,  1 - Failed*/int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {/* Add your Code */memcpy((unsigned char *)adr, buf, sz);return (0);                                  // Finished without Errors
}

4、然后执行编译,会在文件夹下生成一个.FLM文件;

改一个名字,然后复制到\KEIL\ARM\Flash\路径下;

5、然后在工程下载器设置中,添加相应的FLM文件即可;

其他

还有啥问题暂时想不起来了,想起来再写。

基于安路FPGA的Cortex M0移植【FPGA】相关推荐

  1. 安路FPSoC®产品SF1系列全新发布,高集成低功耗,助力实现多种应用场景

    安路科技精心打造的SF1系列FPSoC®器件现已全面推出,集成逻辑单元.存储单元.视频处理单元.RISC-V MCU硬核等资源,助力实现视频图像接口转换和工业控制交互. 随着科技的发展,在消费电子与工 ...

  2. 基于FPGA的DDS在安路TD和EG4A20BG256上遇到的问题及解决方法(四)

    DDS在TD软件实现中遇到的问题 1.使用tang primer的IDE TD时,运行编译报错license(许可证)过期.TD软件需要license来注册软件,否则无法使用开发软件的各种功能. 解决 ...

  3. 【安路FPGA】FPGA开发日记(一)

    一.开发环境的安装 首先去安路官网下载安装包工具与资料下载-国产FPGA创新者 - 安路科技 下载后解压点击安装包直接傻瓜式安装即可 备注:安装后无法打开或者缺文件等情况是安路安装包不包含一些C++库 ...

  4. 基于Java毕业设计安路友汽车租赁源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计安路友汽车租赁源码+系统+mysql+lw文档+部署软件 基于Java毕业设计安路友汽车租赁源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开发语 ...

  5. 安路FPGA学习之有趣的下载方式

    一时兴起记录下,方便自己回顾. 在画安路FPGA电路原理图的时候,看到这个电路部分很好,所以打算记录一下. 这个电路的功能是实现usb转jtag.使用的方案是stm32单片机,通过stm32芯片对us ...

  6. 基于Cortex M0+的STM32L0系列简介

    L0系列是意法半导体于2014年新推出的超低功耗的MCU,基于ARM Cortex M0+内核.目前有STM32L0x1,STM32L0x2,STM32L0x3三个子系列,默认主频为32M,RAM都是 ...

  7. 国产安路FPGA(一)-TD软件使用及问题记录

    国产安路FPGA(一)-TD软件使用及问题记录 一.概述 本次博客为系列博客,仅是为了记录再使用国产安路各种芯片和软件使用工具上的问题以及解决方式. TD软件所使用的版本为TD5.0.5_SP1-64 ...

  8. 国产安路FPGA 替代

    国产安路FPGA选型 有想做国产安路FPGA替代,或者使用安路FPGA中遇到的问题需要解答的,可以加群220344182.交流探讨.

  9. 基于FPGA+SDRAM+BT656视频解码移植总结

    基于FPGA+SDRAM+BT656视频解码移植总结 一.硬件准备 1.TVP5150模块(模拟视频信号解码模块). 2.模拟摄像头一个(PAL或NT格式输出 AV同轴) 3.FPGA开发板一块(EP ...

最新文章

  1. 哲学是什么?(选自:苏菲的世界)
  2. 翻译关于ViewController的一篇文章
  3. JSP+MySQL实例
  4. 10.31T4 HAOI2010最长公共子序列 计数+容斥原理
  5. Nodejs全局安装模块后找不到命令的解决方法
  6. 脚本_批量修改md为hexo标准post格式[博]
  7. 制造业中人工智能的应用有哪些?
  8. qt设置边框颜色_Qt开源作品14-导航按钮控件
  9. mysql 去除空格
  10. yum install mysql-server 指定版本_mysql 指定版本安装
  11. 【039】读典籍-在线阅读典籍并对应翻译
  12. 设计模式之代理模式(第二篇)
  13. 区块链共识算法及应用研究
  14. tif文件转为shp文件_arcgis中tif转成shp
  15. P2P穿透StunServer
  16. 简介表格让你牢牢记住spring的7种事务传播机制
  17. 小友VUI SDK 初探
  18. 数列的极限和无穷大量
  19. PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'C:\\Users\\upup\\AppData\\Local\\Temp\\pip-bui
  20. 一篇好文章:阿里云主机按指定端口范围批量打开端口

热门文章

  1. Zuul、Ribbon、Feign、Hystrix使用时的超时时间(timeout)设置问题
  2. 三星代工高通骁龙820芯片 采用14纳米工艺
  3. 一物一码(5): 一物一码之【开展一物一码营销活动基本流程1】
  4. 用unity画抛物面
  5. ros的PPPOE服务器封路由
  6. 制作最简单的根文件系统
  7. 百度编辑器上传图片添加水印方法
  8. js通过URL下载服务器文件(可行方法)
  9. c语言链表中何时用点何时用箭头,C语言指针五——指针应用:链表
  10. 淘宝商品数据分析怎么操作?从哪些方面下手?