您的位置:

AXI总线详解

一、AXI总线简介

作为ARM架构中最常用的总线之一,AXI(Advanced eXtensible Interface)总线是一种高性能、低功耗、可扩展的总线协议。该总线协议可以支持从数据流到存储处理器等各种应用,因此在现代数字系统中得到广泛应用。AXI总线采用了分层架构,其中主要分为AXI3和AXI4两个版本。AXI3被广泛应用于FPGA的设计中,而AXI4则被用于Soc的设计中。下面我们将逐一介绍AXI总线的优点和应用场景。

二、AXI总线的优点

1、高性能:AXI总线是一种高性能、低延迟的总线协议。它可以在处理器和外设之间通过简单的读写通信来传递数据。此外,AXI总线采用的是分层结构设计,可以更好地满足系统不同层次的传输需求。

<AXI3_general>
signal axi3_awaddr      : std_logic_vector(29 downto 0);
signal axi3_awprot      : std_logic_vector(2 downto 0);
signal axi3_awvalid     : std_logic;
signal axi3_awready     : std_logic;
signal axi3_wdata       : std_logic_vector(31 downto 0);
signal axi3_wstrb       : std_logic_vector(3 downto 0);
signal axi3_wvalid      : std_logic;
signal axi3_wready      : std_logic;
signal axi3_bresp       : std_logic_vector(1 downto 0);
signal axi3_bvalid      : std_logic;
signal axi3_bready      : std_logic;
signal axi3_araddr      : std_logic_vector(29 downto 0);
signal axi3_arprot      : std_logic_vector(2 downto 0);
signal axi3_arvalid     : std_logic;
signal axi3_arready     : std_logic;
signal axi3_rdata       : std_logic_vector(31 downto 0);
signal axi3_rresp       : std_logic_vector(1 downto 0);
signal axi3_rvalid      : std_logic;
signal axi3_rready      : std_logic;

2、低功耗:AXI总线可以通过数据缓存功能实现低功耗,可以增加数据处理效率。此外,AXI总线还可以设计时钟门控,降低电源使用。

<clk_en>
if rst = '1' then
    clk_en <= '0';
elsif rising_edge(clk) then
    if en = '1' then
        clk_en <= '1';
    else 
        clk_en <= '0';
    end if;
end if;

<axi4_wr>
if(wr_en = '1' and axi4_awready = '1' and axi4_wready = '1') then    
    axi4_awvalid <= '1';
    axi4_wvalid  <= '1';
    axi4_bready  <= '1';
    axi4_wdata   <= wr_data;
    axi4_wstrb   <= (others=>'1');
    axi_wr_addr  <= wr_addr;
    wr_en        <= '0';
end if;

3、可扩展性:AXI总线可以根据不同的传输需求,灵活地扩展传输带宽和传输功能,可以满足复杂设计的需求。

<AXI4_Lite>
-- AXI Light
signal awaddr: std_logic_vector(ADDR_WIDTH-1 downto 0);
signal awprot: std_logic_vector(2 downto 0);   
signal awvalid: std_logic;
signal awready: std_logic;            
                
signal wdata: std_logic_vector(DATA_WIDTH-1 downto 0);
signal wstrb: std_logic_vector((DATA_WIDTH/8)-1 downto 0);
signal wvalid: std_logic;
signal wready: std_logic;   

signal bresp: std_logic_vector(1 downto 0);            
signal bvalid: std_logic;
signal bready: std_logic;
            
signal araddr: std_logic_vector(ADDR_WIDTH-1 downto 0);
signal arprot: std_logic_vector(2 downto 0);
signal arvalid: std_logic;
signal arready: std_logic;

signal rdata: std_logic_vector(DATA_WIDTH-1 downto 0);
signal rresp: std_logic_vector(1 downto 0);
signal rvalid: std_logic; 
signal rready: std_logic;   

三、AXI总线的应用场景

1、存储器:AXI总线可用于存储器的访问,其中包括RAM、ROM、Cache等,可以在数据传输速度和系统功耗之间达到最佳平衡。

<axi_ramt>
process (axi4_arvalid, axi4_araddr, axi4_rready)
  variable rdata:std_logic_vector(DATA_WIDTH-1 downto 0);
begin
  if (axi4_arvalid = '1' and axi4_arready = '1') then
    read_code(axi4_araddr, rdata);
    axi4_rdata  <= rdata;
    axi4_rresp  <= "00";
    axi4_rvalid <= '1';
    ar_r_index(7 downto 0) <= ar_r_index(7 downto 0) + 1;
  end if;
end process;

2、多处理器系统:AXI总线可以作为多处理器系统之间的通信桥梁,在保证数据传输速度和性能的同时,也可以降低整体功耗和开销。

<axi_mpu>
process(axi4_arvalid,axi4_arready, axi4_araddr, axi4_rready)
variable status: std_logic_vector(1 downto 0);
begin
  if(axi4_arready = '1' and axi4_arvalid = '1') then
      case axi4_araddr is 
          when x"000" =>
              axi4_rdata   <= mpu_base;
              axi4_rresp   <= "00";
              axi4_rvalid  <= '1';
          when x"004" =>
              axi4_rdata  <= status;
              axi4_rresp  <= "00";
              axi4_rvalid <= '1';
          when others =>
              axi4_rdata   <= (others => '0');
              axi4_rresp   <= "11";
              axi4_rvalid  <= '0';
      end case;
      mpu_r_index(7 downto 0) <= mpu_r_index(7 downto 0) + 1;
  end if;
end process;

3、数字信号处理:AXI总线可以用于数字信号处理,可用于音频、视频等方面的处理。AXI总线可以提供快速的数据传输和数据处理能力。

<axi_dac>
process (axi4_awvalid, axi4_awaddr, axi4_wvalid, axi4_wstrb, axi4_wdata, axi4_bready)
 begin
   if (axi4_awvalid = '1' and axi4_awready = '1') then
        write_address(axi4_awaddr);
        axi4_awready <= '1';
        axi4_wready  <= '1';
        dac_w_index(7 downto 0) <= dac_w_index(7 downto 0) + 1;
    end if;
    if (axi4_wvalid = '1' and axi4_wready = '1') then
        dac_writes(axi4_wdata, axi4_wstrb);
        axi4_wready <= '1';
        axi4_bvalid <= '1';
        axi4_bresp  <= "00";
        b_done      <= '1';
    end if;
end process;

四、小结

AXI总线是一种高性能、低功耗、可扩展的总线协议,在数字系统的设计中得到广泛应用。文章中介绍了AXI总线的基本概念、优点和应用场景。希望小伙伴们多多了解、掌握和应用AXI总线,以便更好地完成数字系统的设计。