团队编号:CICC1156
团队名称:兔飞猛进
开发板:DDR200T
我们团队计划设计一个与图像处理有关的Soc,这类Soc对硬件的数据容量和吞吐量具有较大要求,但开源蜂鸟E203的内存模块仅有itcm和dtcm, 链接器脚本中的内存分配代码如下图。
MEMORY
{
ilm (rxai!w) : ORIGIN = 0x80000000, LENGTH = 64K
ram (wxa!ri) : ORIGIN = 0x90000000, LENGTH = 64K
}
itcm和dtcm的默认大小为64KB,尽管它们的大小可以通过config,v文件中的E203_CFG_ITCM_ADDR_WIDTH和E203_CFG_DTCM_ADDR_WIDTH两个宏定义来调节,但两者都是片上的SRAM资源,不适合配置过大的空间,因此仅通过itcm和dtcm用作内存是远远不足以满足要求的。
好在蜂鸟在处理器核上预留了内存地址拓展的接口信号,在e203_subsys_mems.v源文件中实现了一主多从的总线系统
// There are several slaves for Mem bus, including:
// * DM : 0x0000 0000 -- 0x0000 0FFF
// * MROM : 0x0000 1000 -- 0x0000 1FFF
// * QSPI0-RO : 0x2000 0000 -- 0x3FFF FFFF
// * SysMem : 0x8000 0000 -- 0xFFFF FFFF
通常会选择SysMem进行拓展,因为它的地址空间共有2G,能够满足大多数需求,并且接口清晰。
注意:sysmem地址空间(0x8000 0000—-0xFFFF FFFF)与itcm地址空间(0x8000 0000—-0x8001 0000)和dtcm地址空间(0x9000 0000—-0x9001 0000)有部分重叠,且处理器会优先访问itcm和dtcm。
下面是e203_subsys_mems.v文件中的icb总线接口和注释,可以清晰地看到icb总线协议的两个通道
// 命令通道
wire sysmem_icb_cmd_valid; //core读写ddr的请求信号
wire sysmem_icb_cmd_ready; //ddr接受core的信号
wire [E203_ADDR_SIZE-1:0] sysmem_icb_cmd_addr; //读写操作的地址
wire sysmem_icb_cmd_read; //读or写操作
wire [E203_XLEN-1:0] sysmem_icb_cmd_wdata; //写操作的数据
wire [E203_XLEN/8-1:0] sysmem_icb_cmd_wmask; //写操作的字节掩码
// 返回通道
wire sysmem_icb_rsp_valid; //ddr给core反馈的请求信号
wire sysmem_icb_rsp_ready; //core接受ddr反馈的信号
wire sysmem_icb_rsp_err; //反馈的错误标志
wire [E203_XLEN-1:0] sysmem_icb_rsp_rdata; //读反馈的数据
本次分享就到这里,下一篇将分享控制ddr的IP——mig的接口