2111|1

659

帖子

1

TA的资源

纯净的硅(中级)

楼主
 

【中科亿海微EQ6HL45开发平台测评体验】+ ARM Cortex-M0软核处理器(二) [复制链接]

 

4. ARM-CM0DS_Example-Design-Kit

本文根据ARM-CM0DS_Example-Design-Kit的资料,将其移植到EHiWAY的EQ6HL45-FPGA开发板,从而在该FPGA平台实现集成了ARM Cortex-M0内核的SoC/MCU。

4.1. ARMSOC_0

该例程无输出,仅作为模板,介绍了一个ARM Cortex-M0内核的简要系统的最小要求包含的IP核,即:CORTEXM0DS内核、AHBLite总线结构(包括总线解码器AHBDCD、复用器AHBMUX)。

4.2. ARMSOC_1

这是一个最基本的可运行程序的Cortex-M0内核的SoC,包含了Cortex-M0、Memory、LED三个IP核,之间采用一个简化后的AHB-Lite总线,包含了AHB-Lite总线解码器AHBDCD、复用器AHBMUX、在1KB的内存中初始化了一个小的led-blinky源程序,对SoC内部的一个简单的LED外设不停的赋值0-1-0-…,使得连接在FPGA的对应的IO引脚上的LED闪烁。该程序采用汇编代码编写,并基于Keil UVision MDK编译生成ARM Cortex-M0二进制代码,例化后固定在SoC内部的Memory中。

4.2.1. 创建FPGA工程项目project

按照eLinx2.1软件的FPGA工程项目project的创建流程,创建如下:

PS:当添加源文件(Add Source)之后,由于添加了cortexm0ds_logic.v这个比较大型的verilog源文件,eLinx2.1软件进行源文件的初步分析,需要较长时间,期间软件失去响应,但是在项目文件夹下有个out_put文件夹,里面有动态刷新的各种分析中间文件,最终分析结束后,该文件夹删除,同时软件恢复响应,进行下一步。

4.2.2. 使用Keil构建、调试ARM-CM0DS-EDK的软件代码

doc:

详情见ARM-CM0DS-EDK_Keil-build-debug文档 <./ARM-CM0DS-EDK_Keil-build-debug.rst>

ref:

利用Keil编译并调试程序

4.2.3. AHB2MEM适配移植

该项目最开始使用的是AHB2MEM_V2.v,EDA软件推断为RAM,将初始化文件code.hex转为.mif文件,Synthesis通过,但是implementation失败。

综合后的资源使用率情况:

但是implementation却失败

[INFO] [BitGen_Proc_6]:Launched bram extraction...

[INFO] [BitGen_Proc_7]:Bram extraction success.

[INFO] [BitGen_Proc_8]:Launched bram configuration...

[ERROR] [BitGen_Cbram_2]:Invalid memory initial bit value,make sure your memory initial file(or path) is legall!

[ERROR] [BitGen_Cbram_2]:init_file_layout=Port_B logical_pos=16 physical_pos=19

[ERROR] [BitGen_Cbram_2]:mem_initial_value=88
[ERROR] [BitGen_Proc_9]:Bram configuration failed!

4.2.3.1. 修改AHB2MEM_V2.v

采纳EHiWAY技术支持的建议,先注释掉RAM初始化的代码,如下:

// Memory Array
 reg [31:0] memory[0:(2**(MEMWIDTH-2)-1)] /* synthesis ramstyle = "no_rw_check" */;

/*
        initial
         begin
                $display("Reading code.hex into memory");
                $readmemh("../Software/code.hex", memory);
                $display("Done reading code.hex into memory");
         end
*/

之后,Synthesis和implementation都顺利通过,但是下载到FPGA里,很明显由于RAM没有初始化程序,ARM-CortexM0DS处理器不能正常运行,效果为LED无闪烁(全亮,因为默认LED引脚输出0,板子LED是共阳设计,所以引脚输出0的效果为点亮LED)。

TODO:

初始化RAM。

4.2.3.2. 适配AHB2MEM_V1.v(使用FPGA的大量LUT逻辑资源实现RAM)

AHB2MEM_V1.v文件中实现的AHB2MEM,最后被综合成全部使用逻辑资源,而非内置RAM资源来实现,当使用默认的4KB配置,即

reg [31:0] memory[0:1023];

其资源消耗过大,如下图:

因此配置Memory容量小一点,修改为

reg [31:0] memory[0:511];

综合后的资源使用率如图:

可见使用AHB2MEM_V1,逻辑资源使用率大幅度增加,而Memory资源使用率为0。同时在synthesis过程中,也能明显感觉到耗时更久。而implementation过程更是耗时。。。长到一个多小时都没有implementation出来,直接取消。

4.2.3.3. AHB2MEM.v(与AHB2MEM_V2.v类似)

该文件中的AHB2MEM模块,同样被EDA软件推断出是RAM,但是固定大小。编译全流程通过,

下载后运行效果与无初始化的AHB2MEM_V2一样。

如果添加RAM初始化的代码,跟AHB2MEM_V2.v的RAM初始化的编译过程一样,EDA软件将其推断为RAM,将初始化文件code.hex转为.mif文件,Synthesis通过,但是implementation失败。

4.2.3.4. 对比三种AHB2MEM实现的差别

  1. 在HDL代码中申明内存数组: reg [WIDTH:0] memory[DEPTH: 0],

    • 对memory的写入如果全部都是按照[WIDTH:0]位宽的话,则EDA软件会将其自动推断为BRAM模块,并映射到FPGA的RAM-Block中,譬如AHB2MEM.v和AHB2MEM_V2.v。

    • 如果写入不是按照[WIDTH:0],而是对部分位进行写入的话,则EDA软件不能将其映射到FPGA内部的RAM-Block中,只能用FPGA的LUT逻辑资源来实现,如AHB2MEM_V1.v的综合结果。

    • 位宽对memory的读取无影响。

  2. AHB2MEM.v文件中的AHB2MEM模块,同样被EDA软件推断出是RAM,读写只能按照32bit位宽(字,4字节)进行操作,不能单独对某个字节(byte)或者半字(halfword,2字节)进行操作。

  3. AHB2MEM.v和AHB2MEM_V1.v固定了DEPTH,而AHB2MEM_V2.v中的DEPTH为可配置参数。DEPTH = 2 ** (WIDTH-2)

  4. DEPTH大小影响RAM-Block/逻辑资源的使用率,对于使用RAM-Block的设计,配套的地址解码、写时读的直通路径等逻辑资源也会有少量的差异,如下图对比:

最新回复

很是用功呀,资料分享非常好!  详情 回复 发表于 2022-12-1 17:48
点赞 关注
 
 

回复
举报

6960

帖子

11

TA的资源

版主

沙发
 
很是用功呀,资料分享非常好!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表