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總線工作時序:
無須多言,看圖。
基本傳輸模式
多重傳輸
使用傳輸類型
增量突發傳輸
回環突發傳輸
未定義長度的增量突發傳輸