深入 AXI4总线 (四):RAM 读取实战

光说不练,云玩家。这篇文章中我们就通过访问一个 AXI4 接口的 RAM 的实际操作,加深我们对 AXI4 总线的理解。

我们的实验平台是 ISE 14.7 以及 modelsim 10.2, RAM 的 ip 使用 ISE 的 block memory generator 生成,Intel 方面的工具和 ip 我不是太熟悉,但想必很多内容都是共通的。

Native V.S AXI4 ?

首先使用 ip 核生成器生成一个 AXI4 的 ip 核,我们先比较一下 Native 接口和 AXI4 接口的 RAM。

一号选手:Native

首先登场的是一号选手:Natiiiive,他有着小小的身板,地址,输入数据,输出数据,使能,时钟接口错落有致,简洁分明。小快灵是他的信仰,好用好上手是他的宣言。

二号选手:AXI4

接下来登场的是 AXIFour,他的身板恐怕是 Native 的三倍,更大的身板,更大的力量是他的座右铭。“通用性”,“标准总线”是他挂在嘴上的口头禅

Ok,Stop,两者之间其实并不是一个竞争关系,没有孰胜孰劣的比较。Native 接口数据线更少,但不够通用,自然也没有总线的概念;AXI4 支持标准化的,通用总线访问,可以将多个 RAM 挂载到一条总线上,通过 ID 区分不同的 RAM,但接口要确实复杂地多。

AXI 总线读写 RAM 实战

首先构建 AXI4 接口的 RAM ip核,在工程中添加 ip 核文件

选择 AXI 协议,另外关于 AXI-Lite 协议将会在以后的文章中介绍。AXI-Lite 协议简化了 AXI 协议,但不支持突发传输操作。

在 Slave Option 中选择 Memory Slave,因为 RAM 作为一个存储介质,不能主动发起操作,在 AXI 传输中只能作为从机。作为从机有两种选项,Memory Slave 作为存储介质,使用完整的 AXI 总线;Peripheral Slave 不是很熟悉,在该模式下不支持突发传输。

在 Memory Type 中,如果使用 AXI 总线,则只能选择单口RAM。而 Native 接口是支持多种模式的,包括 ROM,双口 RAM 等。

Native 接口下可以选择多种模式

之后选择适合的数据总线宽度和 RAM 深度即可以生成 RAM 。

在工程中为新生成的 ip 核添加 testbench。

首先是非突发传输(突发传输长度为 1 的突发传输。。)写入与读取操作,即写入地址,写入一次数据。读取操作时,也先写入数据,然后读取。下图中为了说明一些细节,进行了两次同样的流程。

Testbench 的时序部分


 
 
  1. initial begin
  2. // Initialize Inputs
  3. //....初值均赋为0 除 bready 外
  4. s_axi_bready = 1;
  5. // Wait 100 ns for global reset to finish
  6. #100;
  7. // Add stimulus here
  8. s_aresetn = 1;
  9. repeat( 2) begin
  10. #100;
  11. //aw channel
  12. s_axi_awaddr = 32 'b100;
  13. s_axi_awlen = 0;
  14. s_axi_awsize = 3'b010;
  15. s_axi_awburst = 0;
  16. #20;
  17. s_axi_awvalid = 1;
  18. #20;
  19. //wait(s_axi_awready == 1 && s_aclk == 1);
  20. s_axi_awvalid = 0;
  21. #100;
  22. //w channel
  23. s_axi_wdata = 32 'h01020304;
  24. s_axi_wstrb = 4'b1111;
  25. s_axi_wlast = 1;
  26. s_axi_wvalid = 1;
  27. #20;
  28. s_axi_wlast = 0;
  29. s_axi_wvalid = 0;
  30. s_axi_wstrb = 4 'b0;
  31. #100;
  32. //ar channel
  33. s_axi_araddr = 32'b100;
  34. s_axi_arlen = 0;
  35. s_axi_arsize = 3 'b010;
  36. s_axi_arburst = 0;
  37. #20;
  38. s_axi_arvalid = 1;
  39. #20;
  40. //wait(s_axi_arready == 1 && s_aclk == 1);
  41. s_axi_arvalid = 0;
  42. #100;
  43. //r channel
  44. s_axi_rready = 1;
  45. end
  46. end
  47. always #10 s_aclk = ~s_aclk;

我们关注一些细节,有关 RAM IP 核的一些特性,比如当完成一次写入时,RAM 的 AXREADY 信号会拉低约 6 个时钟之后,才会拉高允许下一次地址写入发生;而 XREADY 信号则会保持低电平直到下一次地址地址写入之后,才会拉高准备接收数据。

通过实践发现了 AXI4 在读取时的一个特性,如果在读取时,将突发传输长度设为 2,突发传输宽度设为 16 位,数据总线宽度为 32 位,即通过两次 16 位传输读取写入的 32 位数据 0x01020304。实践后发现,实际上会读取两次 0x01020304,需要主机自行整理数据,因为主机实际上知道,自己读取的数据宽度是 16 位,数据总线宽度为 32 位。

读者可以通过仿真结果看到本系列之前的文章中提到,握手机制,AXI 各信号线的含义以及突发传输机制等。

ljgibbs:深入 AXI4 总线(一)握手机制​zhuanlan.zhihu.com图标ljgibbs:深入 AXI4 总线(二)架构​zhuanlan.zhihu.com图标ljgibbs:深入 AXI4 总线(三)突发传输机制​zhuanlan.zhihu.com图标

 

接下来尝试突发传输操作

Testbench 部分


 
 
  1. // Wait 100 ns for global reset to finish
  2. #100;
  3. // Add stimulus here
  4. s_aresetn = 1;
  5. repeat( 2) begin
  6. #100;
  7. //aw channel
  8. s_axi_awaddr = 32 'b100;
  9. s_axi_awlen = 8'd3;
  10. s_axi_awsize = 3 'b010;
  11. s_axi_awburst = 2'b01;
  12. #20;
  13. s_axi_awvalid = 1;
  14. #20;
  15. //wait(s_axi_awready == 1 && s_aclk == 1);
  16. s_axi_awvalid = 0;
  17. #100;
  18. //w channel
  19. s_axi_wdata = 32 'h01020304;
  20. s_axi_wstrb = 4'b1111;
  21. repeat ( 3) begin
  22. s_axi_wdata = s_axi_wdata + 1 'b1;
  23. s_axi_wvalid = 1;
  24. #20;
  25. s_axi_wvalid = 0;
  26. #20;
  27. end
  28. s_axi_wdata = s_axi_wdata + 1'b1;
  29. s_axi_wvalid = 1;
  30. s_axi_wlast = 1;
  31. #20
  32. s_axi_wlast = 0;
  33. s_axi_wvalid = 0;
  34. #100;
  35. //ar channel
  36. s_axi_araddr = 32 'b100;
  37. s_axi_arlen = 8'd7;
  38. s_axi_arsize = 3 'b001;
  39. s_axi_arburst = 2'b01;
  40. #20;
  41. s_axi_arvalid = 1;
  42. #20;
  43. //wait(s_axi_arready == 1 && s_aclk == 1);
  44. s_axi_arvalid = 0;
  45. #100;
  46. //r channel
  47. s_axi_rready = 1;
  48. end
  49. end

突发传输类型为 INCR,写入时,突发传输长度为 4,宽度为 32 位;读取时长度为 8,宽度为 16 位,仿真的结果和预期一致。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值