0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AMBA总线中APB slave设计介绍

jf_GctfwYN7 来源:芯时代青年 2024-01-13 10:15 次阅读

上篇文章给大家介绍了APB协议相关的知识点,本篇文章通过一个实际的APB slave的设计帮助大家巩固对APB的掌握。

APB slave设计Spec

7245d8f6-b136-11ee-8b88-92fbcf53809c.jpg

其框图如上图所示,这里提一嘴,大家在做数字IC设计的时候,都应该像这样规划好各个模块的连接关系,确定好以后再写代码。该模块是一个基于APB协议完成寄存器配置或读取的设计实例。设计相对比较简单,但不失为一个很好的学习资料

上面APB相关的信号都介绍过,这里不再重复介绍,其中的ECOREVNUM的意思是ECO revision number,如果没有用到ARM的ECO的话,将该信号固定为全0即可。

右边这个slave_reg实际上就对应我们自己设计的IP的寄存器配置部分。这一部分的接口是native interface,也就是没有考虑通用性的原生接口。想要通过APB总线对其进行配置,就需要通过slave_interface这个模块进行协议转换,进而完成APB协议的传输。我们经常能够看到的apb2reg模块,实际上也是做了这件事。该APB slave有以下的特点:

  • 不支持反压
  • 不支持错误传输
  • 支持4个RW类型的寄存器
  • 支持12个RO类型寄存器
  • 支持字节选通信

APB slave设计代码

apb_slave_interface代码

下面是slave_interface的关键代码逻辑。我们对其进行分析:
  • 首先由于不支持反压和错误传输,因此将pready固定为1,pslverr固定为0。
  • APB传输进来的paddr可以直接赋给addr,作为读写的地址。
  • read_en需要在psel为1且pwrite为0的时候拉高。这实际上是希望在整个读传输过程中都让read_en信号有效。读者可能就想问了,读应该对应着两个阶段吗?不需要判断吗?实际上读的话,master那边自己控制好就行了,对于slave而言完全可以在第一拍和第二拍都把rdata提供好,这个是没有关系的。
  • write_en则对应着setup phase,实际上在这个场景中修改write_en的逻辑让该信号对应着access phase也是可以的,其它的信号直接赋值就可以,应该很好理解。
// APB interface
assign pready = 1'b1; //always ready. Can be customized to support waitstate if required.
assign pslverr = 1'b0; //always OKAY. Can be customized to support error response if required.


// register read and write signal
assign addr = paddr;
assign read_en = psel & (~pwrite); // assert for whole apb read transfer
assign write_en = psel & (~penable) & pwrite; // assert for 1st cycle of write transfer
// It is also possible to change the design to perform the write in the 2nd
// APB cycle. E.g.
// assign write_en = psel & penable & pwrite;
// However, if the design generate waitstate, this expression will result
// in write_en being asserted for multiple cycles.
assign byte_strobe = pstrb;
assign wdata = pwdata;
assign prdata = rdata;

apb_slave_reg代码

其关键逻辑如下所示,我们对其进行分析:
  • 首先由于分为RW寄存器和RO寄存器。这里确定写地址是否在规定区间,同时写使能是否有效,以及byte_strobe信号,来决定要不要写,写哪个字节。
  • 读的话就比较简单了,当读使能有效,根据地址信号决定rdata。实际上这就是个MUX选择逻辑。根据read_en加地址从多个寄存器的Q端选出某一个来。
// Address decoding for write operations
assign wr_sel[0] = ((addr[(ADDRWIDTH-1):2]==10'b0000000000)&(write_en)) ? 1'b1: 1'b0;
assign wr_sel[1] = ((addr[(ADDRWIDTH-1):2]==10'b0000000001)&(write_en)) ? 1'b1: 1'b0;
assign wr_sel[2] = ((addr[(ADDRWIDTH-1):2]==10'b0000000010)&(write_en)) ? 1'b1: 1'b0;
assign wr_sel[3] = ((addr[(ADDRWIDTH-1):2]==10'b0000000011)&(write_en)) ? 1'b1: 1'b0;
// register write, byte enable
// Data register: data0
always @(posedge pclk or negedge presetn)
begin
if (~presetn)
begin
data0 <= {32{1'b0}}; // Reset data 0 to 0x00000000
end
else if (wr_sel[0])
begin
if (byte_strobe[0])
data0[ 7: 0] <= wdata[ 7: 0];
if (byte_strobe[1])
data0[15: 8] <= wdata[15: 8];
if (byte_strobe[2])
data0[23:16] <= wdata[23:16];
if (byte_strobe[3])
data0[31:24] <= wdata[31:24];
end
end

// register read

always @ (read_en or addr or data0 or data1 or data2 or data3 or ecorevnum)
begin
case (read_en)
1'b1:
begin
if (addr[11:4] == 8'h00) begin
case(addr[3:2])
2'b00: rdata = data0;
2'b01: rdata = data1;
2'b10: rdata = data2;
2'b11: rdata = data3;
default: rdata = {32{1'bx}};
endcase
end
else if (addr[11:6] == 6'h3F) begin
case(addr[5:2])
// Peripheral IDs and Component IDs.
// AHB example slave has part number of 818
4'b0100: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID4; // 0xFD0 : PID 4
4'b0101: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID5; // 0xFD4 : PID 5
4'b0110: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID6; // 0xFD8 : PID 6
4'b0111: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID7; // 0xFDC : PID 7
4'b1000: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID0; // 0xFE0 : PID 0 APB Example slave part number[7:0]
4'b1001: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID1; // 0xFE4 : PID 1 [7:4] jep106_id_3_0. [3:0] part number [11:8]
4'b1010: rdata = ARM_CMSDK_APB4_EG_SLAVE_PID2; // 0xFE8 : PID 2 [7:4] revision, [3] jedec_used. [2:0] jep106_id_6_4
4'b1011: rdata ={ARM_CMSDK_APB4_EG_SLAVE_PID3[31:8], ecorevnum[3:0], 4'h0};
// 0xFEC : PID 3 [7:4] ECO rev number, [3:0] modification number
4'b1100: rdata = ARM_CMSDK_APB4_EG_SLAVE_CID0; // 0xFF0 : CID 0
4'b1101: rdata = ARM_CMSDK_APB4_EG_SLAVE_CID1; // 0xFF4 : CID 1 PrimeCell class
4'b1110: rdata = ARM_CMSDK_APB4_EG_SLAVE_CID2; // 0xFF8 : CID 2
4'b1111: rdata = ARM_CMSDK_APB4_EG_SLAVE_CID3; // 0xFFC : CID 3
// Note : Customer changing the design should modify
// - jep106 value (www.jedec.org)
// - part number (customer define)
// - Optional revision and modification number (e.g. rXpY)
4'b0000, 4'b0001,4'b0010,4'b0011: rdata = {32'h00000000}; // default
default: rdata = {32{1'bx}}; // x propagation
endcase
end
else begin
rdata = {32'h00000000}; // default
end
end
1'b0:
begin
rdata = {32{1'b0}};
end
default:
begin
rdata = {32{1'bx}};
end
endcase
end

APB slave mux设计

这里再给大家介绍一下APB slave mux的概念,如下图所示,基于APB slave mux我们可以快速地将多个apb slave连接在上面。在实际的设计当中都是采用这样的方式,连接多个slave的。一般我们管这种模块叫做interconnect,顾名思义,将不同的模块连接起来。而APB的interconnect只能连接一个master,因此继续管他叫interconnect感觉差了点意思。所以一般就叫它slave mux了。

72607f3a-b136-11ee-8b88-92fbcf53809c.jpg7271b426-b136-11ee-8b88-92fbcf53809c.jpg其逻辑框图如上图所示,非常的简单啊。就是一个master和多个slave,通过这个额外的DECODE4bit进行16选1。其关键代码如下所示
  • 根据PSEL是否有效以及DECODE4BIT的值,完成16选1,PSEL0~PSEL15有一个或者0个拉高。
  • PREADYm默认为1,当PSEL为1的时候,根据译码结果选择相应的PREADY信号(当端口没有使能的时候en[x] == 0, 对应的PREADYx信号不会被选择)。
  • PSLVERR和PRDATA,选中谁就取谁的。
assign PSEL0 = PSEL & dec[ 0] & en[ 0];
assign PSEL1 = PSEL & dec[ 1] & en[ 1];
assign PSEL2 = PSEL & dec[ 2] & en[ 2];
//省略3~15
assign PREADY = ~PSEL |
( dec[ 0] & (PREADY0 | ~en[ 0]) ) |
( dec[ 1] & (PREADY1 | ~en[ 1]) ) |
( dec[ 2] & (PREADY2 | ~en[ 2]) ) |
//省略3~15
assign PSLVERR = ( PSEL0 & PSLVERR0 ) |
( PSEL1 & PSLVERR1 ) |
( PSEL2 & PSLVERR2 ) |
//省略3~15
assign PRDATA = ( {32{PSEL0 }} & PRDATA0 ) |
( {32{PSEL1 }} & PRDATA1 ) |
( {32{PSEL2 }} & PRDATA2 ) |
//省略3~15

这套代码的缺点或者说优点是,它是用组合逻辑做的,逻辑非常的简单。实际上就是多选1,一般来说APB的时钟频率很低,所以增加了一定的组合逻辑级数也不会出现时钟违例。这样做还可以节省一个时钟周期,大家也可以用时序逻辑去做,思路是类似的。还有一个问题就是这个模块没有PENABLE信号,这个其实挺致命,大家可以手动加上,跟PSEL的逻辑基本是一模一样的,非常简单。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117723
  • AMBA总线
    +关注

    关注

    0

    文章

    34

    浏览量

    9486

原文标题:深入理解AMBA总线 — APB slave设计

文章出处:【微信号:IC修真院,微信公众号:IC修真院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是APB协议/总线APB总线入门

    上一篇文章简单讲解了什么是AMBA总线,简单来说,AMBA总线是一系列协议。定义了适用于不同场景的总线家族。今天我们就来将
    的头像 发表于 01-02 11:37 957次阅读
    什么是<b class='flag-5'>APB</b>协议/<b class='flag-5'>总线</b>?<b class='flag-5'>APB</b><b class='flag-5'>总线</b>入门

    ARM总线协议AMBAAHB、APB的区别与联系

    , ASB, APB);Qchannel文章目录1 AMBA总线2 AHB2.1 一个典型的基于AHB的微控制器2.2 AHB总线互联结构:中心选择器连接master与
    发表于 02-09 07:46

    AMBAAPB、AHB简介

    STM32菜鸟学习手册——1、AMBAAPB、AHB简介芯片上总线标准种类繁多,而由ARM公司推出的AMBA片上总线受到了广大IP开发商和
    发表于 02-17 07:18

    AMBA AHB总线APB总线资料合集

    使用的是 SystemVerilog 描述。2、AMBA APB总线信号接口介绍前面分析了AHB总线协议。接下来分析
    发表于 04-07 10:03

    分享一个APB slave的verilog实例

    APBAMBA相对比较简单的接口协议。采用这种简单的协议,你可以轻松地将自定义外设挂在AMBA总线上。许多
    发表于 04-07 10:10

    AMBAAPB总线协议详解

    1、漫谈AMBA总线-APB首先考虑一下以下的场景:概念1: 主机(Master)订单的发起只能由水果店发起,所以水果店在这条水果运输总线里面运输水果占有主动地位。类比:在
    发表于 06-07 16:14

    基于AMBA APB总线NandFlash控制器的设计

    介绍了基于AMBA APB总线NandFlash控制器的设计,首先简单介绍了NandFlash的一些特点,然后详细
    发表于 11-03 15:22 54次下载

    基于AMBA总线介绍

    3.0:增加了AXI协议(了解);AMBA4.0:ACE协议(了解) 本文主要介绍AMBA2.0 (Advanced Microcontroller Bus Architecture,先进微控制
    的头像 发表于 05-19 14:22 1876次阅读
    基于<b class='flag-5'>AMBA</b><b class='flag-5'>总线</b><b class='flag-5'>介绍</b>​

    浅述AMBA-APB总线

    1 APB介绍 高级外设总线APB) 是高级微控制器总线架构 (AMBA) 协议系列的一部分
    的头像 发表于 07-23 10:04 1949次阅读
    浅述<b class='flag-5'>AMBA-APB</b><b class='flag-5'>总线</b>

    介绍AMBA2.0总线

    3.0:增加了AXI协议(了解);AMBA4.0:ACE协议(了解) 本文主要介绍AMBA2.0 (Advanced Microcontroller Bus Architecture,先进微控制
    的头像 发表于 09-06 09:53 2770次阅读
    <b class='flag-5'>介绍</b><b class='flag-5'>AMBA</b>2.0<b class='flag-5'>总线</b>

    AMBA总线那些事之APB

    之前老李问过大家想看哪方面的知识,有不少同学提议老李写写总线,特别是AMBA总线,所以老李决定从这期开始开始一个AMBA总线
    的头像 发表于 05-04 14:53 1908次阅读
    <b class='flag-5'>AMBA</b><b class='flag-5'>总线</b>那些事之<b class='flag-5'>APB</b>

    AMBA总线apb简介

    APB(Advanced Peripheral Bus),外围总线的意思。该总线协议是ARM公司提出的AMBA总线结构之一,几乎已成为一种标
    发表于 06-05 15:10 1145次阅读
    <b class='flag-5'>AMBA</b><b class='flag-5'>总线</b>—<b class='flag-5'>apb</b>简介

    AMBA总线那些事之APB协议入门

    咱们首先来介绍AMBA(Advanced Microcontroller Bus Architecture)家族中最简单的协议APB -- Advanced Peripheral Bus。
    发表于 06-05 15:30 1292次阅读
    <b class='flag-5'>AMBA</b><b class='flag-5'>总线</b>那些事之<b class='flag-5'>APB</b>协议入门

    关于AMBA APB总线的知识点介绍

    AMBA APB总线可以用在低带宽和不需要高性能的外设上(即低速且低频率的外设);可以将APB视作AHB的二级总线;   ·低功耗(
    发表于 11-29 15:19 316次阅读
    关于<b class='flag-5'>AMBA</b> <b class='flag-5'>APB</b><b class='flag-5'>总线</b>的知识点<b class='flag-5'>介绍</b>

    AMBA总线APB interconnect的介绍

    之前的两篇文章给大家介绍APB协议相关的知识点,并结合实际的代码给大家讲解了一下APB slave的设计。并说明了一下APB
    的头像 发表于 01-13 10:09 274次阅读
    <b class='flag-5'>AMBA</b><b class='flag-5'>总线</b>中<b class='flag-5'>APB</b> interconnect的<b class='flag-5'>介绍</b>