AMBA基础知识1:AMBA AHB总线

来自:http://www.cnblogs.com/lyuyangly/p/4853833.html


Advanced Microcontroller Bus Architecture, 即AMBA,是ARM公司提出的总线规范,被很多SoC设计所采用,常用的实现有AHB(Advanced High-Performance Bus)和APB(Advanced Peripheral Bus)。AHB用于高性能系统,APB用于低速外设。以下代码实例使用的是SystemVerilog描述。

  (一)AHB总线信号接口:

  包括AHB主设备,AHB从设备,AHB仲裁器等。

复制代码
 1 interface   ahb_msr_intf #(
 2     parameter   AW  = 32,
 3                 DW  = 32
 4 ) (
 5     input   logic       HCLK,
 6     input   logic       HRESETn
 7 );
 8     logic               HGRANT;
 9     logic               HREADY;
10     HRESP_e             HRESP;
11     logic   [DW-1:0]    HRDATA;
12     
13     logic               HBUSREQ;
14     logic               HLOCK;
15     HTRANS_e            HTRANS;
16     logic   [AW-1:0]    HADDR;
17     logic               HWRITE;
18     HSIZE_e             HSIZE;
19     HBURST_e            HBURST;
20     HPROT_e             HPROT;
21     logic   [DW-1:0]    HWDATA;
22     
23     
24     modport m (
25         input   HGRANT, HREADY, HRESP, HRDATA,
26         output  HBUSREQ, HLOCK, HTRANS, HADDR, HWRITE, HSIZE, HBURST, HPROT, HWDATA
27     );
28     
29     modport s (
30         input   HBUSREQ, HLOCK, HTRANS, HADDR, HWRITE, HSIZE, HBURST, HPROT, HWDATA,
31         output  HGRANT, HREADY, HRESP, HRDATA
32     );
33     
34 endinterface: ahb_msr_intf
复制代码

  以上为AHB主设备接口。

复制代码
 1 interface   ahb_slv_intf #(
 2     parameter   AW  = 32,
 3                 DW  = 32
 4 ) (
 5     input   logic       HCLK,
 6     input   logic       HRESETn
 7 );
 8     logic               HSEL;
 9     logic   [AW-1:0]    HADDR;
10     HTRANS_e            HTRANS;
11     HSIZE_e             HSIZE;
12     HBURST_e            HBURST;
13     logic               HWRITE;
14     HPROT_e             HPROT;
15     logic   [DW-1:0]    HWDATA;
16 
17     logic               HREADY;
18     HRESP_e             HRESP;
19     logic   [DW-1:0]    HRDATA;
20     
21     
22     modport m (
23         input   HREADY, HRESP, HRDATA,
24         output  HSEL, HADDR, HTRANS, HSIZE, HBURST, HWRITE, HPROT, HWDATA
25     );
26     
27     modport s (
28         input   HSEL, HADDR, HTRANS, HSIZE, HBURST, HWRITE, HPROT, HWDATA,
29         output  HREADY, HRESP, HRDATA
30     );
31     
32 endinterface: ahb_slv_intf
复制代码

  以上为AHB从设备接口。下面对信号进行一一说明。

  HCLK 总线时钟

  HRESETn 总线复位信号,低电平有效。

  HADDR 地址总线,字节为单位。

  HTRANS[1:0] 传输类型,具体如下:

复制代码
1 typedef enum logic [1:0] {
2     HTRANS_IDLE     = 2'b00,
3     HTRANS_BUSY     = 2'b01,
4     HTRANS_NONSEQ   = 2'b10,
5     HTRANS_SEQ      = 2'b11
6 } HTRANS_e;
复制代码

  HWRITE 为高表示写传输,为低表示读传输。

  HSIZE 传输大小,可能的取值定义如下:

复制代码
 1 typedef enum logic [2:0] {
 2     HSIZE_BYTE      = 3'b000,   // 8bit
 3     HSIZE_HALFWORD  = 3'b001,   // 16bit
 4     HSIZE_WORD      = 3'b010,   // 32bit
 5     HSIZE_DWORD     = 3'b011,   // 64bit
 6     HSIZE_QWORD     = 3'b100,   // 128bit
 7     HSIZE_OWORD     = 3'b101,   // 256bit
 8     HSIZE_HWORD     = 3'b110,   // 512bit
 9     HSIZE_TWORD     = 3'b111    // 1024bit
10 } HSIZE_e;
复制代码

  HBURST 突发传输类型,突发传输模式可以为增量传输或者回环传输。

复制代码
 1 typedef enum logic [2:0] {
 2     HBURST_SINGLE   = 3'b000,
 3     HBURST_INCR     = 3'b001,
 4     HBURST_WRAP4    = 3'b010,
 5     HBURST_INCR4    = 3'b011,
 6     HBURST_WRAP8    = 3'b100,
 7     HBURST_INCR8    = 3'b101,
 8     HBURST_WRAP16   = 3'b110,
 9     HBURST_INCR16   = 3'b111
10 } HBURST_e;
复制代码

  HPROT 提供总线访问的附加信息并且主要是打算给那些希望执行某种保护级别的模块
使用的。这个信号指示当前传输是否为预取指或者数据传输,同时也表示传输是保护模式访问还是用户模式访问。对带存储器管理单元的总线主机而言这些信号也用来指示当前传输是高速缓存的(cache)还是缓冲的(buffer)。定义如下:

复制代码
 1 //   cacheable   |   bufferable   | privileged |  data
 2 // not-cacheable | not-bufferable |    user    | opcode
 3 typedef enum logic [3:0] {
 4     HPROT_NNUO      = 4'b0000,
 5     HPROT_NNUD      = 4'b0001,
 6     HPROT_NNPO      = 4'b0010,
 7     HPROT_NNPD      = 4'b0011,
 8     HPROT_NBUO      = 4'b0100,
 9     HPROT_NBUD      = 4'b0101,
10     HPROT_NBPO      = 4'b0110,
11     HPROT_NBPD      = 4'b0111,
12     HPROT_CNUO      = 4'b1000,
13     HPROT_CNUD      = 4'b1001,
14     HPROT_CNPO      = 4'b1010,
15     HPROT_CNPD      = 4'b1011,
16     HPROT_CBUO      = 4'b1100,
17     HPROT_CBUD      = 4'b1101,
18     HPROT_CBPO      = 4'b1110,
19     HPROT_CBPD      = 4'b1111
20 } HPROT_e;
复制代码

  HWDATA 写数据。

  HSELx 从机选择。

  HRDATA 读数据。

  HREADY 为高时表示总线传输完成。

  HRESP 传输相应信号,表征传输状态,定义如下:

复制代码
1 typedef enum logic [1:0] {
2     HRESP_OKAY      = 2'b00,
3     HRESP_ERROR     = 2'b01,
4     HRESP_RETRY     = 2'b10,
5     HRESP_SPLIT     = 2'b11
6 } HRESP_e;
复制代码

  HSPLITx 16位信号,指示仲裁器总线主设备应该被允许重试一个分块传输,每一位对应一个总线主机。

  以下信号与仲裁器相关:

  HBUSREQx 总线主设备x请求申请总线控制权。最多16个主设备。

  HLOCKx 总线锁定请求,其他主设备无法或者仲裁器授权。

  HGRANTx 表示当前主设备为优先级最高的主设备。

  HMASTER 仲裁器信号表示正在执行传输或支持分块传输的从设备进行传输的主设备号。

  HMASTLOCK 主设备正在执行一个锁定顺序的传输。

  AHB 互联矩阵:

复制代码
  1 module ahb_matrix # (
  2     parameter   WIDTH   = 32,
  3                 NMSR    = 4,
  4                 NSLV    = 16
  5 ) (
  6     input   logic   HCLK,
  7     input   logic   HRESETn,
  8     ahb_msr_intf.s  ahbmv[NMSR],
  9     ahb_slv_intf.m  ahbsv[NSLV]
 10 );
 11 
 12     localparam  NMSRV   = $clog2(NMSR),
 13                 NSLVV   = $clog2(NSLV);
 14 
 15     logic               HBUSREQx[NMSR];
 16     logic               HGRANTx[NMSR];
 17     logic               HREADY;
 18     HRESP_e             HRESP;
 19     logic   [WIDTH-1:0] HRDATA;
 20 
 21     logic               HSEL[NSLV];
 22     logic   [31:0]      HADDR;
 23     logic               HWRITE;
 24     HTRANS_e            HTRANS;
 25     HSIZE_e             HSIZE;
 26     HBURST_e            HBURST;
 27     HPROT_e             HPROT;
 28     logic   [WIDTH-1:0] HWDATA;
 29 
 30     logic   [NMSRV-1:0] HMASTER, HMASTERd;
 31     logic   [NSLVV-1:0] HSLAVE, HSLAVEd;
 32     logic               errslv;
 33     
 34     genvar              i;
 35     
 36 
 37     struct {
 38         logic   [WIDTH-1:0] HADDR   [NMSR];
 39         logic               HWRITE  [NMSR];
 40         HTRANS_e            HTRANS  [NMSR];
 41         HSIZE_e             HSIZE   [NMSR];
 42         HBURST_e            HBURST  [NMSR];
 43         HPROT_e             HPROT   [NMSR];
 44         logic   [WIDTH-1:0] HWDATA  [NMSR];
 45     } ahbmd;
 46     
 47     struct {
 48         logic   [WIDTH-1:0] HRDATA  [NSLV];
 49         logic               HREADY  [NSLV];
 50         HRESP_e             HRESP   [NSLV];
 51     } ahbsd;
 52     
 53     
 54     generate
 55         for (i = 0; i < NSLV; i++) begin: ahbsv_loop
 56             assign ahbsv[i].HSEL    = HSEL[i];
 57             assign ahbsv[i].HADDR   = HADDR;
 58             assign ahbsv[i].HWRITE  = HWRITE;
 59             assign ahbsv[i].HTRANS  = HTRANS;
 60             assign ahbsv[i].HSIZE   = HSIZE;
 61             assign ahbsv[i].HBURST  = HBURST;
 62             assign ahbsv[i].HPROT   = HPROT;
 63             assign ahbsv[i].HWDATA  = HWDATA;
 64         end
 65     endgenerate
 66     
 67     generate
 68         for (i = 0; i < NMSR; i++) begin: ahbmv_loop
 69             assign HBUSREQx[i]      = ahbmv[i].HBUSREQ;
 70             assign ahbmv[i].HGRANT  = HGRANTx[i];
 71             assign ahbmv[i].HREADY  = HREADY;
 72             assign ahbmv[i].HRESP   = HRESP;
 73             assign ahbmv[i].HRDATA  = HRDATA;
 74         end
 75     endgenerate
 76     
 77     generate
 78         for (i = 0; i < NMSR; i++) begin: ahbmd_loop
 79             assign ahbmd.HADDR[i]  = ahbmv[i].HADDR;
 80             assign ahbmd.HWRITE[i] = ahbmv[i].HWRITE;
 81             assign ahbmd.HTRANS[i] = ahbmv[i].HTRANS;
 82             assign ahbmd.HSIZE[i]  = ahbmv[i].HSIZE;
 83             assign ahbmd.HBURST[i] = ahbmv[i].HBURST;
 84             assign ahbmd.HPROT[i]  = ahbmv[i].HPROT;
 85             assign ahbmd.HWDATA[i] = ahbmv[i].HWDATA;
 86         end
 87     endgenerate
 88     
 89     assign  HADDR   = ahbmd.HADDR[HMASTER];
 90     assign  HWRITE  = ahbmd.HWRITE[HMASTER];
 91     assign  HTRANS  = ahbmd.HTRANS[HMASTER];
 92     assign  HSIZE   = ahbmd.HSIZE[HMASTER];
 93     assign  HBURST  = ahbmd.HBURST[HMASTER];
 94     assign  HPROT   = ahbmd.HPROT[HMASTER];
 95     assign  HWDATA  = ahbmd.HWDATA[HMASTERd];
 96     
 97     generate
 98         for (i = 0; i < NSLV; i++) begin: ahbsd_loop
 99             assign ahbsd.HRDATA[i] = ahbsv[i].HRDATA;
100             assign ahbsd.HREADY[i] = ahbsv[i].HREADY;
101             assign ahbsd.HRESP[i]  = ahbsv[i].HRESP;
102         end
103     endgenerate
104     
105     assign  HRDATA  = ahbsd.HRDATA[HSLAVEd];
106     assign  HREADY  = errslv ? 1'b1 : ahbsd.HREADY[HSLAVEd];
107     assign  HRESP   = errslv ? HRESP_OKAY : ahbsd.HRESP[HSLAVEd];
108     
109     
110     always_ff @(posedge HCLK or negedge HRESETn) begin
111         if (!HRESETn)
112             HSLAVEd <= '0;
113         else if (HREADY)
114             HSLAVEd <= HSLAVE;
115     end
116     
117     ahb_arbiter #(
118         .NMSR       (NMSR)
119     ) ahb_arbiter (
120         .HCLK       (HCLK),
121         .HRESETn    (HRESETn),
122         .HBUSREQx   (HBUSREQx),
123         .HTRANS     (HTRANS),
124         .HBURST     (HBURST),
125         .HRESP      (HRESP),
126         .HREADY     (HREADY),
127         .HMASTER    (HMASTER),
128         .HMASTERd   (HMASTERd),
129         .HGRANTx    (HGRANTx)
130     );
131     
132     ahb_decoder #(
133         .NSLV       (NSLV)
134     ) ahb_decoder (
135         .HADDR      (HADDR),
136         .HSEL       (HSEL),
137         .HSLAVE     (HSLAVE),
138         .errslv     (errslv)
139     );
140 
141 endmodule: ahb_matrix
复制代码

  (二)AHB总线工作时序:

  无须多言,看图。

基本传输模式

多重传输

 

使用传输类型

 

增量突发传输

回环突发传输

未定义长度的增量突发传输