AMBA AHB總線


  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總線工作時序:

  無須多言,看圖。

基本傳輸模式

多重傳輸

 

使用傳輸類型

 

增量突發傳輸

回環突發傳輸

未定義長度的增量突發傳輸

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM