在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4805|回复: 2

[求助] 基于AHB-Lite总线协议的RAM软核

[复制链接]
发表于 2013-5-29 19:18:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 lilyzhong 于 2013-5-29 19:20 编辑

大家好,不知道这个题目的说法对不对,如果不对,请指正最近在看m0芯片的一段design start代码,有点不明白
主要是在testbench中定义了一个基于AHB-Lite总线协议的RAM
//RAM定义 大小为8M
localparam ram_log2   = 18;  
reg [31:0] ram [0 : 2**ram_log2)-1];

//读取文件到RAM ram.bin是可执行文件
fd = $fopen("ram.bin","rb");
  for (i = 0; (i < (2**ram_log2)) && ($fread(data,fd) != -1); i = i + 1)
    ram = {data[7:0],data[15:8],data[23:16],data[31:24]};//此处为什么要讲数据翻转过来?

//是因为大小端的问题么,m0芯片定义的AHB-Lite接口用小端格式数据通道

//总线控制信号
always @(posedge HCLK)
  if (HREADY) begin
    htrans_last <= HTRANS;
    hwrite_last <= HWRITE;
    haddr_last  <= HADDR;
    hsize_last  <= HSIZE;
  end


//因为定义了一个TOP_OF_RAM=0x20000 这里只用到RAM的0---0x20000 低18位地址线寻址 高14位为0
wire hsel_ram = ~|haddr_last[31:ram_log2];

assign HRDATA[31:0] = hsel_ram ? ram[haddr_last[ram_log2+1:2]] : 32'd0;

reg [31:0] ram_tmp;

ram_tmp = ram[haddr_last[ram_log2+1:2]];
//这里为什么使用HADDR[19:2]寻址
HADDR[1:0]被作为控制信号,是否还作为地址的一部分?

//这部分是写数据到console
//看不懂HWDATA[7:0]与8‘hD之间的关系
always @(posedge HCLK)
  if(HRESETn & HREADY & hwrite_last & hsel_tty & htrans_last[1]) begin
    if(HWDATA[7:0] != 8'hD)
      $write("%c", HWDATA[7:0]);
    else begin
      $display("%t: Simulation stop requested by cpu\n", $time);
      $finish(2);
    end
  end


求解啊
发表于 2013-5-30 15:38:22 | 显示全部楼层
本帖最后由 newnewsitter 于 2013-5-30 15:50 编辑

大家好,不知道这个题目的说法对不对,如果不对,请指正最近在看m0芯片的一段design start代码,有点不明白
主要是在testbench中定义了一个基于AHB-Lite总线协议的RAM
//RAM定义 大小为8M
localparam ram_log2   = 18;  
reg [31:0] ram [0 : 2**ram_log2)-1];

//读取文件到RAM ram.bin是可执行文件
fd = $fopen("ram.bin","rb");
  for (i = 0; (i < (2**ram_log2)) && ($fread(data,fd) != -1); i = i + 1)

ram = {data[7:0],data[15:8],data[23:16],data[31:24]};//此处为什么要讲数据翻转过来?

//是因为大小端的问题么,m0芯片定义的AHB-Lite接口用小端格式数据通道
A:看起来是大小端问题,这应该是大端格式

//总线控制信号
always @(posedge HCLK)
  if (HREADY) begin
    htrans_last <= HTRANS;
    hwrite_last <= HWRITE;
    haddr_last  <= HADDR;
    hsize_last  <= HSIZE;
  end


//因为定义了一个TOP_OF_RAM=0x20000 这里只用到RAM的0---0x20000 低18位地址线寻址 高14位为0
wire hsel_ram = ~|haddr_last[31:ram_log2];

assign HRDATA[31:0] = hsel_ram ? ram[haddr_last[ram_log2+1:2]] : 32'd0;

reg [31:0] ram_tmp;

ram_tmp = ram[haddr_last[ram_log2+1:2]];
//这里为什么使用HADDR[19:2]寻址
HADDR[1:0]被作为控制信号,是否还作为地址的一部分?

A:总线上寻址的最小单位为BYTE,而这里RAM每一个entry的数据宽度是32-bit的,即4个BYTE,故HADDR[1:0]是作为每个entry的BYTE选择信号

//这部分是写数据到console
//看不懂HWDATA[7:0]与8‘hD之间的关系

A:应该是使仿真结束的magic word
always @(posedge HCLK)
  if(HRESETn & HREADY & hwrite_last & hsel_tty & htrans_last[1]) begin
    if(HWDATA[7:0] != 8'hD)
      $write("%c", HWDATA[7:0]);
    else begin
      $display("%t: Simulation stop requested by CPU\n", $time);
      $finish(2);
    end
  end
 楼主| 发表于 2013-5-30 16:22:09 | 显示全部楼层
回复 2# newnewsitter


    谢谢你关于寻址那里,虽然将[1:0]单独拿出来作为每个字节的地址,然后用[19:2]来传输地址信号,其中[19:18]=00,其余高位也为0,不管他怎么变,我是不是都可以看成是32位寻址。一个字节一个地址往上加。
再纠正原文一个错误,RAM大小是8Mb,是1MB
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-28 22:56 , Processed in 0.019746 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表