前面分析了AHB总线协议。接下来分析APB总线协议。

  (一) APB总线接口:

  PCLK APB总线时钟。

  PRESETn APB总线复位。低有效。

  PADDR 地址总线。

  PSELx 从设备选择。

  PENABLE APB传输选通。

  PWRITE 高为写传输,低为读。

  PRDATA 读数据总线。

  PWDATA 写数据总线。

  接口信号定义如下:

  1. interface apb_slv_intf #(
  2. parameter AW = ,
  3. DW =
  4. ) (
  5. input logic PCLK,
  6. input logic PRESETn
  7. );
  8. logic PSEL;
  9. logic PENABLE;
  10. logic [AW-:] PADDR;
  11. logic PWRITE;
  12. logic [DW-:] PWDATA;
  13.  
  14. logic [DW-:] PRDATA;
  15.  
  16. modport m (
  17. input PRDATA,
  18. output PSEL, PENABLE, PADDR, PWRITE, PWDATA
  19. );
  20.  
  21. modport s (
  22. input PSEL, PENABLE, PADDR, PWRITE, PWDATA,
  23. output PRDATA
  24. );
  25.  
  26. endinterface: apb_slv_intf

  (二) APB总线时序图:

写传输

读传输

  注意在PENABLE信号有效后从设备需要给出有效数据/读取有效数据。

  (三) AHB总线到APB总线转换桥

  1. module ahb2apb_bridge #(
  2. parameter AHB_AW = ,
  3. AHB_DW = ,
  4. APB_AW = ,
  5. APB_DW = ,
  6. NSLV =
  7. ) (
  8. input logic HCLK,
  9. input logic HRESETn,
  10. input logic PCLK,
  11. input logic PRESETn,
  12. ahb_slv_intf.s ahb,
  13. apb_slv_intf.m apbv[NSLV]
  14. );
  15.  
  16. logic ahb_work;
  17. logic apb_work;
  18.  
  19. genvar i;
  20.  
  21. typedef enum logic [:] {
  22. AHB_IDLE = 'b00,
  23. AHB_WRITE = 'b01,
  24. AHB_READ = 'b10,
  25. AHB_WAIT = 'b11
  26. } ahb_state_e;
  27.  
  28. // Signal of AHB Domain
  29. struct {
  30. logic work;
  31. logic [AHB_AW-:] addr;
  32. logic [AHB_DW-:] data;
  33. logic write;
  34. ahb_state_e cstate, nstate;
  35. } ahbd;
  36.  
  37. typedef enum logic [:] {
  38. APB_IDLE = 'b00,
  39. APB_WRITE = 'b01,
  40. APB_READ = 'b10
  41. } apb_state_e;
  42.  
  43. // Signal of APB Domain
  44. struct {
  45. logic work;
  46. logic [APB_DW-:] data[NSLV];
  47. logic PSEL[NSLV];
  48. logic PENABLE[NSLV];
  49. apb_state_e cstate, nstate;
  50. } apbd;
  51.  
  52. // AHB Control Logic
  53. always_comb begin
  54. case (ahbd.cstate)
  55. AHB_IDLE: begin
  56. if (ahb.HSEL && ahb.HTRANS == HTRANS_NONSEQ) begin
  57. if (ahb.HWRITE)
  58. ahbd.nstate = AHB_WRITE;
  59. else
  60. ahbd.nstate = AHB_READ;
  61. end
  62. else
  63. ahbd.nstate = AHB_IDLE;
  64. end
  65. AHB_WRITE: begin
  66. if (apbd.work)
  67. ahbd.nstate = AHB_WAIT;
  68. else
  69. ahbd.nstate = AHB_WRITE;
  70. end
  71. AHB_READ: begin
  72. if (apbd.work)
  73. ahbd.nstate = AHB_WAIT;
  74. else
  75. ahbd.nstate = AHB_READ;
  76. end
  77. AHB_WAIT: begin
  78. if (!apbd.work)
  79. ahbd.nstate = AHB_IDLE;
  80. else
  81. ahbd.nstate = AHB_WAIT;
  82. end
  83. default: ahbd.nstate = AHB_IDLE;
  84. endcase
  85. end
  86.  
  87. always_ff @(posedge HCLK or negedge HRESETn) begin
  88. if (!HRESETn)
  89. ahbd.cstate <= AHB_IDLE;
  90. else
  91. ahbd.cstate <= ahbd.nstate;
  92. end
  93.  
  94. always_ff @(posedge HCLK or negedge HRESETn) begin
  95. if (!HRESETn) begin
  96. ahbd.work <= 'b0;
  97. ahbd.addr <= '0;
  98. ahbd.data <= '0;
  99. ahbd.write <= 'b0;
  100. ahb.HREADY <= 'b1;
  101. ahb.HRDATA[APB_DW-:] <= '0;
  102. end
  103. else begin
  104. case (ahbd.cstate)
  105. AHB_IDLE: begin
  106. if (ahb.HSEL && ahb.HTRANS == HTRANS_NONSEQ) begin
  107. ahbd.addr <= ahb.HADDR;
  108. ahbd.write <= ahb.HWRITE;
  109. ahb.HREADY <= 'b0;
  110. end
  111. else begin
  112. ahbd.addr <= '0;
  113. ahbd.write <= 'b0;
  114. ahb.HREADY <= 'b1;
  115. end
  116. ahbd.work <= 'b0;
  117. ahbd.data <= '0;
  118. ahb.HRDATA[APB_DW-:] <= apbd.data[ahbd.addr[AHB_AW-:AHB_AW-]];
  119. end
  120. AHB_WRITE: begin
  121. ahb.HREADY <= 'b0;
  122. ahbd.work <= 'b1;
  123. ahbd.data <= ahb.HWDATA;
  124. ahb.HRDATA[APB_DW-:] <= '0;
  125. end
  126. AHB_READ: begin
  127. ahbd.work <= 'b1;
  128. ahbd.data <= '0;
  129. ahb.HREADY <= 'b0;
  130. ahb.HRDATA[APB_DW-:] <= '0;
  131. end
  132. AHB_WAIT: begin
  133. ahbd.work <= 'b0;
  134. ahb.HREADY <= 'b0;
  135. ahb.HRDATA[APB_DW-:] <= '0;
  136. end
  137. endcase
  138. end
  139. end
  140.  
  141. assign ahb.HRESP = HRESP_OKAY;
  142. // assign ahb.HRDATA[AHB_DW-1:APB_DW] = '0;
  143.  
  144. // APB Control Logic
  145. always_comb begin
  146. case (apbd.cstate)
  147. APB_IDLE: begin
  148. if (ahbd.work) begin
  149. if (ahbd.write)
  150. apbd.nstate = APB_WRITE;
  151. else
  152. apbd.nstate = APB_READ;
  153. end
  154. else
  155. apbd.nstate = APB_IDLE;
  156. end
  157. APB_WRITE: apbd.nstate = APB_IDLE;
  158. APB_READ: apbd.nstate = APB_IDLE;
  159. default: apbd.nstate = APB_IDLE;
  160. endcase
  161. end
  162.  
  163. always_ff @(posedge PCLK or negedge PRESETn) begin
  164. if (!PRESETn)
  165. apbd.cstate <= APB_IDLE;
  166. else
  167. apbd.cstate <= apbd.nstate;
  168. end
  169.  
  170. always_ff @(posedge PCLK or negedge PRESETn) begin
  171. if (!PRESETn) begin
  172. apbd.work <= 'b0;
  173. for (int j = ; j < NSLV; j++) begin
  174. apbd.PSEL[j] <= 'b0;
  175. apbd.PENABLE[j] <= 'b0;
  176. end
  177. end
  178. else begin
  179. case (apbd.cstate)
  180. APB_IDLE: begin
  181. if (ahbd.work) begin
  182. apbd.work <= 'b1;
  183. for (int j = ; j < NSLV; j++)
  184. apbd.PSEL[j] <= (ahbd.addr[AHB_AW-:AHB_AW-] == j) ? 'b1 : 1'b0;
  185. end
  186. else begin
  187. apbd.work <= 'b0;
  188. for (int j = ; j < NSLV; j++)
  189. apbd.PSEL[j] <= 'b0;
  190. end
  191. for (int j = ; j < NSLV; j++)
  192. apbd.PENABLE[j] <= 'b0;
  193. end
  194. APB_WRITE: begin
  195. apbd.work <= 'b1;
  196. for (int j = ; j < NSLV; j++)
  197. apbd.PENABLE[j] <= (ahbd.addr[AHB_AW-:AHB_AW-] == j) ? 'b1 : 1'b0;
  198. end
  199. APB_READ: begin
  200. apbd.work <= 'b1;
  201. for (int j = ; j < NSLV; j++)
  202. apbd.PENABLE[j] <= (ahbd.addr[AHB_AW-:AHB_AW-] == j) ? 'b1 : 1'b0;
  203. end
  204. endcase
  205. end
  206. end
  207.  
  208. generate
  209. for (i = ; i < NSLV; i++) begin: apbv_loop
  210. assign apbv[i].PADDR = {'h0, ahbd.addr[APB_AW-4-1:0]};
  211. assign apbv[i].PWRITE = ahbd.write;
  212. assign apbv[i].PWDATA = ahbd.data[APB_DW-:];
  213. assign apbd.data[i] = apbv[i].PRDATA;
  214. assign apbv[i].PSEL = apbd.PSEL[i];
  215. assign apbv[i].PENABLE = apbd.PENABLE[i];
  216. end
  217. endgenerate
  218.  
  219. endmodule: ahb2apb_bridge

AMBA APB总线的更多相关文章

  1. AHB总线和APB总线

    AHB主要用于高性能模块(如CPU.DMA和DSP等)之间的连接,作为SoC的片上系统总线,它包括以下一些特性:单个时钟边沿操作:非三态的实现方式:支持突发传输:支持分段传输:支持多个主控制器:可配置 ...

  2. APB总线

    APB(Advance Peripheral Bus)是AMBA总线的一部分,从1998年第一版至今共有3个版本. AMBA 2 APB Specfication:定义最基本的信号interface, ...

  3. AMBA AHB总线

    Advanced Microcontroller Bus Architecture, 即AMBA,是ARM公司提出的总线规范,被很多SoC设计所采用,常用的实现有AHB(Advanced High-P ...

  4. STM32WB AHB总线、APB总线与外设

    方框图: 如图所示: 1)APB1外设 2)APB2外设 3)AHB1外设 4)AHB2外设 5)AHB3外设 6)AHB4外设(ABH共享总线外设) 内存映射关系图:

  5. AMBA总线介绍

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

  6. APB协议

    https://wenku.baidu.com/view/2663f629ef06eff9aef8941ea76e58fafab04592.html https://www.cnblogs.com/l ...

  7. AMBA总线协议AHB、APB

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

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

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

  9. [转]AMBA、AHB、APB、ASB总线简介

    [转]http://www.cnblogs.com/zhaozhong1989/articles/3092140.html 1.前言 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大.数字IC ...

随机推荐

  1. Chakra TypedArray代码实现笔记

    ArrayBuffer.cpp阅读 对象继承关系 JavascriptArrayBuffer: ArrayBuffer: ArrayBufferBase: DynamicObject: Recycla ...

  2. poj 1125 谣言传播 Floyd 模板题

    假如有3个点 点1到点2要5分钟 点1到点3要3分钟 那么5分钟的时间可以传遍全图 所以要先找一个点到其他点的最长时间 再从最长的时间里找出最小值 Sample Input 3 // 结点数2 2 4 ...

  3. (第4篇)hadoop之魂--mapreduce计算框架,让收集的数据产生价值

    摘要: 通过前面的学习,大家已经了解了HDFS文件系统.有了数据,下一步就要分析计算这些数据,产生价值.接下来我们介绍Mapreduce计算框架,学习数据是怎样被利用的. 博主福利 给大家赠送一套ha ...

  4. Android的简单应用(二)——使用dispatchKeyEvent双击退出程序

    原文:https://www.cnblogs.com/cpacm/archive/2014/11/10/4087070.html   Android系统按键操作最先是在dispatchKeyEvent ...

  5. day16--HTML、CSS、JavaScript总结

        HTML 一大堆的标签:块级.行内 CSS position background text-align padding font-size background-image z-index ...

  6. openstack学习-KeyStone安装(二)

    一.安装keystone # yum install -y openstack-keystone httpd mod_wsgi memcached python-memcached 二.设置Memca ...

  7. “教你如何玩转Web响应式布局” 的更多相关文章

    “教你如何玩转Web响应式布局” 的更多相关文章 网址:http://www.360doc.com/relevant/641896074_more.shtml

  8. HDU1512 ZOJ2334 Monkey King 左偏树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - ZOJ2334 题目传送门 - HDU1512 题意概括 在一个森林里住着N(N<=10000)只猴子. ...

  9. Jetbrains 2018 等系列软件激活破解除去黄色警告框方法(含多个平台)

    现在以IDEA 2018软件在windows为例进行讲解破解方法,其它软件及其在不同平台的破解方法原理 大同小异,有需要的有兴趣的可以尝试一下. 最近更新了Intellij IDEA到2018.1.5 ...

  10. FZU 2150 Fire Game(双起点)【BFS】

    <题目链接> 题目大意: 两个熊孩子在n*m的平地上放火玩,#表示草,两个熊孩子分别选一个#格子点火,火可以向上向下向左向右在有草的格子蔓延,点火的地方时间为0,蔓延至下一格的时间依次加一 ...