APB(Advanced Peripheral Bus)是AMBA总线体系的一部分。相较于AMBA总线体系中的其他总线,APB总线具有低功耗,低复杂度的特征。APB总线主要应用于对性能要求不太高的低带宽外设接口。
本文所讲述的是AMBA4中的APB协议。其信号如下:

其中,PCLK和PRESETn分别为时钟信号和复位信号,PADDR为地址(至多32位),PPROT为保护类型,PSELx为选中信号,当它为1时,表明选中该从设备,因此每个从设备都会有一个对应的PSELx信号,PENABLE为使能信号,下面会详细阐述,PWRITE表示本次传输的方向,1表示写,0表示读,PWDATA为要写的数据,至多32bit,PSTRB为字节选中信号,第i位为1,表示第i*8到第i*8+7位是有效的,PRDATA为读出的数据,同样至多32位,PSLVERR为传输失败指示信号,为1且PENABLE、PSELx、PREADY均为高时,表明传输错误,否则表示传输正确。
下图是PPROT信号各个位的含义

Write transfers

With no wait states

无等待的写传输,如下图所示,写传输分为两个阶段:Setup PhaseAccess Phase,第一个周期,PADDR给出要写的地址、PWRITE为1表示写传输,同时PSELx拉高选中设备,PWDATA给出要写的数据,此时PENABLE为0,这个阶段叫做Setup Phase。第二个周期,上述信号保持不变,主机和从机分别拉高PENABLE和PREADY,写入数据完成,下一个周期,PSELx、PENABLE以及PREADY均拉低。(若紧接着下一次传输,则PSELx无需拉低)

With wait states

有等待的写传输,如下图所示,第一个阶段和上面相同,第二阶段,PENABLE拉高,直到检测到从机的PREADY信号也为高时,Access阶段才完成。而在等待PREADY信号为高期间,PADDR,PWRITE,PSELx,PWDATA,PSTRB,PPROT信号均应该保持不变。

从有等待写传输和无等待写传输的时序中,我们可以看出,Access Phase只有在PSEL、PENABLE和PREADY信号同时为高时,才会发生,否则需要等待。

Read transfers

With no wait states

与无等待的写传输唯一不同的地方,就是在下图中,PWRITE信号是0,表示读数据。

With wait states

APB总线的状态机

下图为APB总线协议的状态机,需要注意的是,当ACCESS完成后,如果还有一次传输,则直接跳转到SETUP阶段,否则跳回IDLE阶段。

System Verilog代码

slave

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/03/29 21:22:43
// Design Name:
// Module Name: apb_slave
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module apb_slave(
input logic PCLK,
input logic PRESETn,
input logic [31:0] PADDR,
input logic [2:0] PPROT,
input logic PSELx,
input logic PENABLE,
input logic PWRITE,
input logic [31:0] PWDATA,
input logic [3:0] PSTRB,
output logic PREADY,
output logic [31:0] PRDATA,
output logic PSLVERR);
localparam N  =  32;
logic [31:0] REG [0:N-1];
logic [31:0] ADDR;
logic [3:0] STRB;
logic WRITE;
//ADDR锁存
always_ff@(posedge PCLK)
if(PSELx&&~PENABLE)ADDR<=PADDR;
//STRB锁存
always_ff@(posedge PCLK)
if(PSELx&&~PENABLE)STRB<=PSTRB;
//WRITE
always_ff@(posedge PCLK)
if(PSELx&&~PENABLE)                      //SETUP阶段WRITE<=PWRITE;
//PREADY
always_ff@(posedge PCLK,negedge PRESETn)
if(~PRESETn)PREADY<=1;
else if(PSELx&&~PENABLE)           //SETUP阶段结束PREADY<=1;
else if(PSELx&&PENABLE&&PREADY)   //ACCESS阶段结束PREADY<=0;
//PRDATA
assign PRDATA=REG[ADDR];
//WRITE
always_ff@(posedge PCLK,negedge PRESETn)
if(~PRESETn)
beginfor(int i=0;i<N;i++)REG[i]=0;
end
else if(PENABLE&&PSELx&&PREADY&&WRITE)      //将数据写入寄存器
beginfor(int i=0;i<4;i++)beginif(STRB[i])REG[ADDR][(i*8)+:8]<=PWDATA[(i*8)+:8];end
end
//PSLVERR
assign PSLVERR=0;
endmodule

master

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/03/29 21:42:49
// Design Name:
// Module Name: apb_master
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module apb_master(
input logic start,
//
input logic PCLK,
input logic PRESETn,
output logic PWRITE,
output logic PENABLE,
output logic PSELx,
output logic [31:0] PADDR,
output logic [2:0] PPROT,
output logic [3:0] PSTRB,
input logic [31:0] PRDATA,
output logic [31:0] PWDATA,
input logic PREADY,
input logic PSLVERR);
localparam WRITE = 0;
localparam READ = 1;
localparam IDLE = 2;
localparam END= 3;
logic [1:0] cur_state;
logic [1:0] next_state;
always_ff@(posedge PCLK,negedge PRESETn)
if(~PRESETn)cur_state<=IDLE;
elsecur_state<=next_state;
//
always_comb
begin
case(cur_state)IDLE:if(start)next_state=WRITE;elsenext_state=IDLE;WRITE:if(PENABLE&&PSELx&&PREADY&&PWRITE)next_state=READ;elsenext_state=WRITE;READ:if(PENABLE&&PSELx&&PREADY&&~PWRITE)next_state=END;elsenext_state=READ;END:next_state=END;
endcase
end
//PWRITE
always_comb
beginif(cur_state==WRITE)PWRITE=1;elsePWRITE=0;
end
//PADDR
assign PADDR=32'd4;
//PSTRB
assign PSTRB=4'b0101;
//PWDATA
assign PWDATA={8'h3,8'h4,8'h5,8'h6};
//PSELx
always_ff@(posedge PCLK,negedge PRESETn)
if(~PRESETn)PSELx<=0;
else if(next_state==WRITE&&cur_state!=WRITE)               //PSELx<=1;
else if(next_state==READ&&cur_state!=READ)PSELx<=1;
else if(PENABLE&&PSELx&&PREADY)                           //一次ACCESS完成PSELx<=0;
//PENABLE
always_ff@(posedge PCLK,negedge PRESETn)
if(~PRESETn)PENABLE<=0;
else if(PSELx&&~PENABLE)                   //SETUP结束PENABLE<=1;
else if(PENABLE&&PSELx&&PREADY)           //ACCESS结束PENABLE<=0;
endmodule

测试平台

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/03/29 21:56:45
// Design Name:
// Module Name: apb_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module apb_tb;
logic PCLK;
logic PRESETn;
logic [31:0] PADDR;
logic [2:0] PPROT;
logic PSELx;
logic PENABLE;
logic PWRITE;
logic [31:0] PWDATA;
logic [3:0] PSTRB;
logic PREADY;
logic [31:0] PRDATA;
logic PSLVERR;
logic start;
//PCLK
initial beginPCLK=0;forever begin#5 PCLK=~PCLK;end
end
//PRESETn
initial
beginPRESETn=0;#50PRESETn=1;
end
//start
initial
beginstart=0;#102start=1;#10start=0;
endapb_slave U1(.*
// logic PCLK,
// logic PRESETn,
// logic [31:0] PADDR,
// logic [2:0] PPROT,
// logic PSELx,
// logic PENABLE,
// logic PWRITE,
// logic [31:0] PWDATA,
// logic [3:0] PSTRB,
// logic PREADY,
// logic [31:0] PRDATA,
// logic PSLVERR);
//
apb_master U2(.*
// start,
// //
// logic PCLK,
// logic PRESETn,
// logic PWRITE,
// logic PENABLE,
// logic PSELx,
// logic [31:0] PADDR,
// logic [2:0] PPROT,
// logic [3:0] PSTRB,
// logic [31:0] PRDATA,
// logic [31:0] PWDATA,
// logic PREADY,
// logic PSLVERR);
endmodule

仿真波形

AMBA总线---APB总线协议相关推荐

  1. AMBA总线—APB总线协议详解

    文章目录 一.APB总线介绍 1.1.什么是APB总线 1.2.典型的基于 AMBA 总线的系统架构 1.3.APB信号列表(重点) 二.APB总线传输(时序) 2.1.APB 状态机 2.2.写操作 ...

  2. AMBA总线协议 之 APB总线协议

    AMBA总线协议概念: AMBA(Advanced Microcontroller Bus Architecture) 总线是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有 ...

  3. AMBA总线协议(一)——一文看懂APB总线协议

    0.AMBA总线概括 AMBA AHB 总线协议介绍请点击以下链接: AMBA总线协议(二)一文看懂AMBA2 AHB2与AMBA3 AHB-Lite总线协议的区别 AMBA总线协议(三)--一文看懂 ...

  4. AMBA APB总线协议(APB4)

    一.APB总线介绍 APB总线是ARM公司早期推出的一款用于设备通信的分时独占总线,目前主要用于慢速外设的寄存器配置总线.APB总线结构简单.接口信号少,可以带来更低的资源和功耗,在目前主流SoC设计 ...

  5. 数字IC设计入门篇:APB总线协议学习心得

    声明:本文章是本人学习AMBA  APB协议的一些个人理解,仅用于学习交流之用.本人学习APB协议时参考的是ARM公司官方的APB协议技术规范文档(编号:IHI0024D).受限于本人的知识水平,本文 ...

  6. (原创)LEON3入门教程(四):基于AMBA APB总线的七段数码管IP核设计

    摘要:这一小节将介绍下如何设计用户自定义的APB IP,并将IP嵌入到SOPC中去.一个APB IP核的主要分为三个部分:逻辑单元.寄存器单元和接口单元.所设计的IP是一个简单的七段数码管显示IP,只 ...

  7. AMBA总线—AHB总线协议详解

    文章目录 一.AMBA总线介绍 1.1.AMBA发展史 1.2.典型的AMBA系统 二.AHB总线(宏观构造) 2.1.AHB总线组成 2.2.AHB总线组成互连 2.3.AHB操作概述 2.4.AH ...

  8. AMBA与Wishbone总线简介

    什么是AMBA片上总线? 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大.数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用.在基于IP复用的So ...

  9. AMBA之AHB总线

    转载自漫谈AMBA总线-AHB AHB引言 在上篇文章文章我们已经分析了AMBA总线系列中的APB总线的优点和缺点.总结得出: 缺点1: APB支持且仅支持一个主机 缺点2: APB两个周期才能完成一 ...

最新文章

  1. matlab 多个表数据相加,Excel合并计算完成多表格数据汇总求和
  2. java空指针处理例子_被同事的空指针硬生生的折磨了好久,终于学会了如何处理空指针...
  3. 【直播预告 | 阿里云 CDP 公开课】11月25日下午14点准时开讲
  4. LeetCode4. Median of Two Sorted Arrays(二分法)
  5. Linux下开源邮件系统Postfix+Extmail+Extman环境部署
  6. python模拟足球_使用K-Means算法划分亚洲国家的三个足球梯队
  7. 500 Internal Server Error
  8. django新闻页面编写
  9. 组策略 之 注册表
  10. 七种常见的数据分析法之:帕累托法则
  11. mac系统修改idea运行内存
  12. 网络时代人物标签(两种)
  13. 进程管理软件SysCheck使用指南
  14. Android Alarm机制分析
  15. 地下管线探测仪/路由探测仪 TFN T-6000管线探测的利器!!
  16. 离散数学重点(第二部分)
  17. 开题报告:基于java电子书阅读系统 毕业设计论文开题报告模板
  18. 基于ATMEGA8A_AVR单片机温度测控系统proteus仿真
  19. 大学生申请软件著作权
  20. Multisim电容三点式振荡器如何调整到起振并保持足够振幅

热门文章

  1. 微信小程序案例——比较数字大小案例
  2. 增加8g服务器虚拟内存,电脑如何增加虚拟内存,8g虚拟内存设置多少好?
  3. 经典算法(2):黄金分割法(Gold)
  4. awk 匹配_详解Linux三剑客之awk
  5. PTA-至多删三个字符-(dp+容斥)
  6. Windows下Android源码下载
  7. EXCEPTION_ACCESS_VIOLATION
  8. MapX和MapXtreme区别
  9. matlab对图像频谱图分析,应用Matlab对图像信号进行频谱分析及滤波
  10. 高考成绩查询2021汕头市,2021汕头市地区高考成绩排名查询