AMBA总线介绍

1 HSIZE

AHB总线的地址位宽和数据位宽一般都是32bit,一个字节8bit,一个字节占用一个地址空间,但当一个32bit的数据写入一个存储器中或者从一个存储器中读取,32bit数据几个时钟能够传输完成,这和hsize信号有关,这个信号表示一个时钟周期传输的数据的位宽,当hsize[2:0]=3'b000,一个时钟周期完成一个8bit数据传输,每个时钟,地址递增一个,所以hdata[31:0]需要4个时钟周期完成传输,如果hsize[2:0]=3'b001,一个时钟周期完成16bit数据传输,所以hdata[31:0]对应2个时钟周期,以此类推。



2 Burst传输



地址传输举例

  • 地址加1,表示加一个单位,是由HSIZE决定的,byte--地址增加0,1,2,3,4,5,6;halfword--地址增加0,2,4,6,8;word--地址增加0,4,8,c
  • WRAP4--4笔回环,每笔4byte

    地址回环操作

    Wrapping burst(回环):例如4beat的wrapping burst字传输(4byte)

    0x34 -> 0x38 -> 0x3c -> 0x30,这里什么时候地址回环很有讲究,由burst和hsize共同决定,比如上面的例子是:4beat * 4byte = 16 byte =0x10,注意这里的0x10是地址的序号,而一个地址可以存储8bit数据也就是1byte数据,所以这里16byte是地址0x10。每当取数据遇到0x10的整数倍时,就要返回回环。上面的例子就是要遇到0x40了,所以需要返回回环。那如果是8beat的4byte的传输呢?那就是8beat * 4byte = 32 byte = 0x20,每0x20的整数倍就要进行回环,比如0x34 -> 0x38 -> 0x3c -> 0x20 -> 0x24 -> 0x28 -> 0x2c -> 0x30 这样走回环。如果他的起始地址恰好是回环地址的倍数,那Wrapping burst就和INCR没区别,比如INCR[4]。

INCR8 Burst

WRAP8 Burst

INCR4 Burst

WRAP4 Burst

未定义长度的Burst传输

LDM AHB Activity

INCR4和Single传输混合使用的例子

注意



  • 如果需要跨越1kb边界的传输,可以将传输切分为小的传输,1k边界之前,1k边界之后

    INCR Burst over 1k boundary

  • 跨越1K边界需要重启一个burst传输
  • 1k=1024=0x400

3 地址译码



  • HADDR是一个广播信号,需要通过HSEL信号决定选择的slave

4 slave从设备的响应

响应种类







两周期响应



split和retry的区别







split效率比retry更高

5 Arbiter

仲裁举例

说明





AHB主设备接口



master发起仲裁请求,得到授权之后,锁定总线,发送控制信号、地址信号、写数据

AHB从设备接口



slave被选中之后,根据控制信号、地址信号进行写数据和读数据操作,并给出响应

AHB Arbiter接口



AHB Decoder接口

6 多层AHB系统结构举例



7 AHB总结







8 AHB Slave

  • ahb_clac_top.v
  • ahb_slave_.v
  • clac.v

    一共三个模块
  • master想要进行计算操作,需要配置AHB_slave_if中的寄存器(包括计算模块的使能寄存器\操作符寄存器\操作数寄存器),ahb_slave_if接收到master通过ahb发送过来信息之后配置寄存器,配置完成寄存器之后就会输出对于计算模块的输出信号,计算模块接受到输出信号之后,进行相应的计算,然后将结果返回给ahb_slave_if模块,然后返回给master
  • 计算模块主要处理计算,接收运算a,b和ctrl(运算符),进行加减,或,异或....运算,运算主要由clac模块进行
  • Master-->AHB-->接口(ahb_slave_if)配置寄存器(运算值,和运算类型及开始计算的标识)-->clac

8.1 clac.v模块

  • 接收来自ahb_slave_if.v的控制信号(操作符\操作数\使能信号),完成计算并返回相应的结果
  1. module clac {
  2. input ctrl, // 判断能不能进行计算
  3. input [1:0] clac_mode, // 四种计算模式,所以需要2bit
  4. input [15:0] opcode_a, //
  5. input [15:0] opcode_b,
  6. input reg [31:0] result // 返回结果
  7. };
  8. // 如果使能信号有效,那么就根据操作符对应的值进行相应的操作
  9. always @(*)
  10. begin
  11. if(ctrl)
  12. case(clac_mode)
  13. 2'b00 : result = opcode_a & opcode_b;
  14. 2'b01 result = opcode_a | opcode_b;
  15. 2'b10 :result = opcode_a ^ opcode_b;
  16. 2'b11 result = opcode_a + opcode_b;
  17. endcase
  18. else
  19. result = 32'b00;
  20. end
  21. endmodule

8.2 ahb_slave_if.v

  1. module ahb_slave_if{
  2. // input signals ahb输入
  3. input hclk, // 时钟
  4. input hrestn, // 复位
  5. input hsel,
  6. input hwrite,
  7. input hready,
  8. input [2:0] hsize,
  9. input [1:0] htrans,
  10. input [2:0] hburst,
  11. input [31:0] hwdata,
  12. input [7:0] haddr, // 总线信号
  13. input [31:0] result,
  14. // output signals slave输出
  15. output hready_resp, // 这是之前讲的hready
  16. output [1:0] hresp,
  17. output [31:0] hrdata,
  18. output ctrl,
  19. ouput [1:0] clac_mode,
  20. output [15:0] opcode_a,
  21. output [15:0] opcode_b
  22. };
  23. reg [31:0] hrdata;
  24. // ahb控制信号要打一拍,所以要设置寄存器
  25. reg hwrite_r;
  26. reg [2:0] hsize_r;
  27. reg [2:0] hburst_r
  28. reg [1:0] htrans_r;
  29. reg [7:0] haddr_r;
  30. // 将ahb总线的信号和打拍的信号转换为读写信号,通过写信号,写ahb_slave_if中的控制寄存器,通过读信号读取ahb_slave_if中的读数据寄存器
  31. wire ahb_write;
  32. wire ahb_read;
  33. // master要进行读写操作,需要配置这些寄存器
  34. reg enable_r;
  35. reg [1:0] ctrl_r;
  36. reg [15:0] opa_r;
  37. reg [15:0] opb_r;
  38. parameter IDLE = 2'b00, // 定义传输状态
  39. BUSY = 2'b01,
  40. NONSEQ = 2'b10,
  41. SEQ = 2'b11;
  42. // 寄存器有相应的地址,通过ahb传递过来的地址,配置相应的寄存器,配置好寄存器之后,clac模块才知道做什么
  43. parameter ENABLE_ADDR = 8'h00, // 定义寄存器地址
  44. CTRL_ADDR = 8'h04,
  45. OPA_ADDR = 8'h08,
  46. OPB_ADDR = 8'h0c,
  47. RESULT_ADDR = 8'h10;
  48. // 1.将ahb总线的地址信号和控制信号进行打拍,与数据阶段对齐
  49. // tmp the ahb address and control signals
  50. always@(posedge hckl or negedge hrestn)
  51. begin
  52. if(!hrestn)
  53. begin
  54. hwrite_r <= 1'b0;
  55. hsize_r <= 2'b0;
  56. hburst_r <= 3'b0;
  57. htrans_r <= 2'b0;
  58. haddr_r <= 8'b0;
  59. end
  60. else if(hready && hsel) // 如果hready拉高和hsel拉高,就将控制信号寄存
  61. begin // hsel是decoder输出的信号,hsel拉高,slave进行处理
  62. hwrite_r <= hwrite;
  63. hsize_r <= hsize;
  64. hburst_r <= hburst;
  65. htrans_r <= htrans; // 将数据与data phaze对齐
  66. haddr_r <= haddr;
  67. end
  68. else
  69. begin
  70. hwrite_r <= 1'b0;
  71. hsize_r <= 2'b0;
  72. hburst_r <= 3'b0;
  73. htrans_r <= 2'b0;
  74. haddr_r <= 8'b0;
  75. end
  76. end
  77. // 2.根据ahb信号产生读写信号
  78. // generate write and read signal
  79. assign ahb_write = ((htrans_r == NONSEQ)|| (htrans_r == SEQ)) && hwrite_r && hready
  80. assign ahb_read = ((htrans_r == NONSEQ)|| (htrans_r == SEQ)) && hwrite_r && hready
  81. // 3.进行写操作,需要配置控制寄存器
  82. always @(posedge hclk or negedge hrestn)
  83. begin
  84. if(!hrestn)
  85. begin
  86. enable_r <= 1'b0;;
  87. ctrl_r <= 2'b0;
  88. opa_r <= 16'b0;
  89. opb_r <= 16'b0;
  90. end
  91. else if(ahb_write)
  92. begin
  93. case(haddr_r)
  94. ENABLE_ADDR : enable_r = hwdata[0]; // 配置寄存器的地址从haddr中得到,根据地址配置相应的寄存器
  95. CTRL_ADDR : ctrl_r = hwdata[1:0];
  96. OPA_ADDR : opa_r = hwdata[15:0];
  97. OPB_ADDR : opb_r = hwdata[15:0];
  98. endcase
  99. end
  100. end
  101. // 4.进行读操作,
  102. // assign hrdata = ahb_read ? bogus_reg : 32'h0;
  103. always @(*)
  104. begin
  105. if(ahb_read)
  106. begin
  107. case(haddr_r[7:0])
  108. ENABLE_ADDR :hrdata = {31'b0,enable_r}; // 读数据,读取的是ahb_slave_if中寄存器的值,很据haddr中的低8bit找到相应的寄存器读取值
  109. CTRL_ADDR :hrdata = {31'b0,ctrl_r};
  110. OPA_ADDR :hrdata = {16'b0,opa_r};
  111. OPB_ADDR :hrdata = {16'b0,opb_r};
  112. RESULT_ADDR :hrdata = result;
  113. default :hrdata = 32'h0;
  114. endcase
  115. end
  116. else
  117. hrdata = 32'h0;
  118. end
  119. // 将控制信号输出给clac模块
  120. assign ctrl = enable_r;
  121. assign clac_mode = ctrl_r;
  122. assign opcode_a = opa_r;
  123. assign opcode_b = opb_r;
  124. // 返回给ahb的信号
  125. assign hready_resp = 1'b1; // hready_resp 固定为1表示能够随时输出计算结果
  126. assign hresp = 2'b00;
  127. endmodule

AMBA总线介绍-02的更多相关文章

  1. AMBA总线介绍

    The Advanced Microcontroller Bus Architecture (AMBA) specification defines an on- chip communication ...

  2. AMBA总线协议AHB、APB

    一.什么是AMBA总线 AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计采用,它规定了AHB (Advanced High-performance Bus).ASB (Advanced ...

  3. AMBA总线协议AHB、APB、AXI对比分析【转】

    转自:https://blog.csdn.net/ivy_reny/article/details/56274412 一.AMBA概述    AMBA (Advanced Microcontrolle ...

  4. AMBA总线基础知识简介

    AMBA:Advanced Microcontroller Bus Architecture,是ARMA公司的片内互联总线协议. 1995 - AMBA1.0 APB外设总线及ASB系统总线发布. 1 ...

  5. 01.课程介绍 & 02.最小可行化产品MVP

    01.课程介绍 02.最小可行化产品MVP 产品开发过程 最小化和可用之间找到一个平衡点

  6. vue项目搭建介绍02

    目录 vue项目搭建介绍02 python-pycharm设置: vue创建项目分类: vue-cli构建 自定义构建 基础的vue项目目录: vue项目搭建介绍02 python-pycharm设置 ...

  7. 黑马_13 Spring Boot:01.spring boot 介绍&&02.spring boot 入门

    13 Spring Boot: 01.spring boot 介绍&&02.spring boot 入门 04.spring boot 配置文件 SpringBoot基础 1.1 原有 ...

  8. 083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法

    083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法 本文知识点:构造方法-带参构造方法 说明:因为时间紧张, ...

  9. AXI总线介绍

    原帖地址:https://wenku.baidu.com/view/7c424c17e3bd960590c69ec3d5bbfd0a7956d5b9.html   1.AXI简介 AXI(Advanc ...

  10. SPI总线介绍

    1. 简介 SPI, Serial Peripheral Interface, 串行外设接口, 是一种高速的.全双工.同步的通信总线SPI在芯片的管脚上只占用四根线 SPI接口主要用于MCU与各种外围 ...

随机推荐

  1. 【C#】【命名空间(namespace)】.NET6.0后支持的顶级语句使用问题

    创建C#项目且使用.Net6.0以上的版本时,默认code会使用顶级语句形式: 1.略去static void Main(String[ ] args)主方法入口: 2.隐式使用(即隐藏且根据代码所需 ...

  2. 牛客刷Java记录第6天

    第一题 一个文件中的字符要写到另一个文件中,首先需要( ). A System.out.print (buffer[i]); B FileOutputStream fout = new FileOut ...

  3. DVWA SQL Injection(SQL注入)全等级

    SQL Injection(SQL回显注入) 目录: SQL Injection(SQL回显注入) 1. Low 2.Medium 3. High 4.Impossible 5.运用sqlmap自动化 ...

  4. Mysql性能优化这5点你知道吗?简单却容易被初学者忽略!

    Mysql性能优化这5点你知道吗?简单却容易被初学者忽略! 文编|JavaBuild 哈喽,大家好呀!我是JavaBuild,以后可以喊我鸟哥,嘿嘿!俺滴座右铭是不在沉默中爆发,就在沉默中灭亡,一起加 ...

  5. 国产Geoscene Server 4.0编译SOE总结

    背景:公司一直使用Arcgis Server 10.1.Visual Studio 2010开发SOE功能,随着国产化软件发展大趋势,SOE中的各种分析功能,需要升级到Geoscene Server环 ...

  6. 使用NPOI导出Excel,并在Excel指定单元格插入图片

    一.添加Nuget引用 二.弹框选择保存路径 string fileName = $"记录_{DateTime.Now.ToString("yyyyMMdd_HHmmss" ...

  7. Flutter 中常用的视频播放器

    Flutter 中常用的视频播放器有很多种,不同的播放器有着各自的优势和缺点.下面是一些常用的视频播放器,以及它们的优势.缺点和性能优化策略. video_player: 优势:Flutter 官方提 ...

  8. html2pdf

    nodejs 生成pdf比较靠谱,使用chrome核心渲染: puppeteer / phantom 爬虫都好用 good

  9. 第一部分_Shell介绍

    SHELL介绍 前言: 计算机只能认识(识别)机器语言(0和1),如(11000000 这种).但是,我们的程序猿们不能直接去写01这样的代码,所以,要想将程序猿所开发的代码在计算机上运行,就必须找& ...

  10. AIGC的阿克琉斯之踵

    摘要:现在,越来越多的企业和个人使用AIGC生成文章.图片.音乐甚至视频等内容,AIGC已经成为一种必备的工具.在游戏和原画师行业,甚至已经出现了第一批因为AI而失业的人. 本文分享自华为云社区< ...