首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数字IC设计之APB实例解析

数字IC设计之APB实例解析

作者头像
tech life
发布2020-06-11 12:21:37
发布2020-06-11 12:21:37
2.8K0
举报

文章共1433字,阐述了AMBA APB协议读写信号状态机转换,以及用一个示例展示了APB协议的读写寄存器。通过和这几个寄存器交互,设计者可以将自定义的模块挂接到基于AMBA总线的SoC系统中。


APB是AMBA中相对比较简单的接口协议,用于连接低带宽无需高性能流水线接口的外设。采用这种简单的协议,你可以轻松地将自定义外设挂在基于AMBA总线的SoC上。

许多APB外设都是慢速器件,例如UART、I2C等。一般SoC都是通过它们的寄存器进行访问。

APB每次传输至少需要两个周期,所有信号的转换仅在时钟的上升沿发生以便能够轻松地将APB外设集成到其他设计中。

APB还包括用于扩展APB传输的PREADY信号和用于指示传输失败的PSLVERR信号

在APB协议中有两种类型的写传输:无等待写传输和有等待写传输

无等待写传输:

在时钟的第一个上升沿,是Setup阶段,地址信号PADDR、数据信号PWDATA、写信号PWRITE和选择信号PSEL开始改变。

在随后的时钟沿之后,使能信号PENABLE拉高,表示进行Access阶段。地址信号PADDR、数据信号PWDATA、写信号PWRITE、选择信号PSEL在整个Access阶段都保持有效。

APB写传输在Access阶段结束时完成。使能信号PENABLE在传输结束时拉低,选择信号PSELx也拉低,除非后面紧接着另一个对该外设的传输。

有等待写传输:

在Access阶段,可以通过拉低PREADY来延长传输,这可确保对某些外设进行多周期访问。

建议在传输后不立即更改地址信号和写信号,在另一次访问之前保持稳定可以降低动态功耗

在APB协议中有两种类型的读传输:无等待读传输和有等待读传输

无等待读传输:

上图显示了无等待读传输。APB slave必须在读传输结束之前提供数据。

有等待读传输:

上图显示了PREADY信号如何扩展读传输。如果在Access阶段PREADY拉低,则读传输会延长。

下图是AMBA APB的工作流程

IDLE - 这是APB的默认状态。

SETUP- 当需要传输时,总线进入SETUP状态,其中相应的选择信号PSELx被置位。 总线仅在一个时钟周期内保持SETUP状态,并始终在时钟的下一个上升沿移至ACCESS状态。

ACCESS - 使能信号PENABLE在ACCESS状态下被置位。在从SETUP到ACCESS状态的转换期间,PADDR,PWRITE,PSELx和PWDATA信号必须保持稳定。

从ACCESS状态退出由来自APB slave的PREADY信号控制。如果APB slave将PREADY保持为低电平,则总线保持在ACCESS状态。如果APB slave将PREADY驱动为高电平,则退出ACCESS状态。

如果不再需要传输,则总线返回IDLE状态。如果紧跟着另一次传输则总线直接移动到SETUP状态

根据上面的状态转换图可以很轻松地编写基于FSM的VerilogHDL

下面是一个非状态机写法的APB slave 的verilog实例,大家可以在此基础上设计自己APB slave接口的自定义模块,将外设挂接到SoC上。

代码语言:javascript
复制
// Sample APB register code// Standard read/write registers// Adress offset://  0x00 : 32 bit read of  status32 register//  0x04 : 32 bit read&write of control32 port//  0x08 : 16 bit read of  status16 register//  0x0C : 16 bit read&write of control16 register
module apb_regs (  // system  input             reset_n,  input             enable,
  // APB  input             pclk,             input       [ 3:0]  paddr,    input             pwrite,   input             psel,  input             penable,  input      [31:0] pwdata,  output reg [31:0] prdata,  output            pready,  output            pslverr,
   //Interface   // Interface  input      [31:0] status32,  input      [15:0] status16,  input      [31:0] control32_rd,  input      [15:0] control16_rd,   output reg [31:0] control32_wr,  output reg [15:0] control16_wr,);...endmodule

其中,//system部分接口是系统全局信号用于复位和使能,//APB部分接口是APB协议所需信号。

//Interface部分接口是用于和自定义功能模块的接口寄存器即系统和模块之间交互桥梁。status32和status16全部为只读,control32和control16可读可写

代码语言:javascript
复制
wire apb_write = psel & penable &pwrite;wire apb_read  = psel & ~pwrite;

apb_write和apb_read是为了满足APB协议做的读写控制,具体可以查阅APB协议官方文档

代码语言:javascript
复制
assign pready = 1'b1;assign pslverr = 1'b0;

该APB slave模块只是对一些控制和状态寄存器进行读写,无等待传输同时不生成传输错误信号。

代码语言:javascript
复制
always @(posedge pclk or negedge reset_n)beginif (!reset_n)begin        control32_wr <= 32'h0;        control16_wr <= 16'h0;        prdata    <= 32'h0;     end       else if (enable)     begin        if (apb_write)        begin           case (paddr)           //4'h0:status32 read only           4'h4 : control32_wr <= pwdata;           //4'h8:status16 read only           4'hC : control16_wr  <=pwdata[15:0];           endcase        end // write        if (apb_read)        begin           case (paddr)           4'h0: prdata <= status32;           4'h4: prdata <= control32_rd;            4'h8: prdata[15:0] <= status16;           4'hC: prdata[15:0] <=control16_rd;           endcase        end // read        else           prdata <= 32'h0; // so we can OR all bussesendend
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数字芯片实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档