【中科亿海微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实现的差别
-
在HDL代码中申明内存数组: reg [WIDTH:0] memory[DEPTH: 0],
-
AHB2MEM.v文件中的AHB2MEM模块,同样被EDA软件推断出是RAM,读写只能按照32bit位宽(字,4字节)进行操作,不能单独对某个字节(byte)或者半字(halfword,2字节)进行操作。
-
AHB2MEM.v和AHB2MEM_V1.v固定了DEPTH,而AHB2MEM_V2.v中的DEPTH为可配置参数。DEPTH = 2 ** (WIDTH-2)
-
DEPTH大小影响RAM-Block/逻辑资源的使用率,对于使用RAM-Block的设计,配套的地址解码、写时读的直通路径等逻辑资源也会有少量的差异,如下图对比:
|