AMBA:AHB_Slave_Mux的解析与HREADY、HREADYOUT

相关阅读

AMBAicon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45791458/category_12800219.html?spm=1001.2014.3001.5482


简介 

        从1999年的AMBA2发布以来,AHB协议中就存在数据选择器,如图1所示的AHB2协议的总线互连。

图1 AHB2的总线互连

         这幅图画得比较粗糙,其中没有标出Master和Arbiter之间的HBUSREQ信号和HGRANT信号,Slave和Master之间的HRESP信号和HRAEDY信号以及Decoder和Slave之间的HSEL信号,图2是重新绘制的一个更加详细的结构。

图2 详细的AHB2的总线互连

        MUX1根据Arbiter给出的HMASTER信号将当前占用总线的Master的信号输出给所有Slave,它是纯组合逻辑的。

        Decoder根据HADDR的高位地址进行译码,产生相应的HSEL信号选择相应的Slave,它是纯组合逻辑的。

        MUX2根据Decoder提供的HSEL信号将相应Slave的信号输出给当前占用总线的Master,但它不是纯组合逻辑的。

问题阐述

        为了简单起见,我们使用图3所示的AHB-Lite说明问题,试想一下如果MUX2是组合逻辑会问题?

图3 AHB-Lite的总线互连

        因为AHB的流水线特性,所以一次传输的地址阶段和数据阶段是先后进行的,如果出现连续访问两个Slave的情况,前一次传输的数据阶段应该和后一次传输的地址阶段重合,如果MUX是纯组合逻辑的,则会出现传输失败的情况,如图4所示,此时Data(A)无法通过MUX传回Master了,因为此时Master发出的地址已经改变,该问题还会存在Slave和Master之间的HRESP信号和HRAEDY信号。

图4 连续访问两个Slave

解决问题

        想必读者也许已经想到了,只要在MUX中用寄存器保存选择信号就可以解决问题。事实也确实如此,图5展示了MUX的详细结构。

图5 MUX的详细结构

        可以看出其中分为HREADY和HREADYOUT信号两种,这是为了解决在连续访问两个Slave时的问题。

        MUX输出的HREADY信号提供给Master和Slave,如果为低表示:Master的下一次传输需要保持在地址阶段,即使Slave自身能够响应下一次传输(HREADYOUT信号为高)也不能响应,因为当前属于其他Slave的传输尚未完成,HREADY信号实际上与Slave输出的HREADYOUT信号相关。

代码实现

module AHB_Slave_Mux #(
  // Data Bus Width
  parameter DW=32
 )
 (
  input  wire          HCLK,       // Clock
  input  wire          HRESETn,    // Reset
  input  wire          HSEL0,      // HSEL for AHB Slave #0
  input  wire          HREADYOUT0, // HREADY for Slave connection #0
  input  wire          HRESP0,     // HRESP  for slave connection #0
  input  wire [DW-1:0] HRDATA0,    // HRDATA for slave connection #0
  input  wire          HSEL1,      // HSEL for AHB Slave #1
  input  wire          HREADYOUT1, // HREADY for Slave connection #1
  input  wire          HRESP1,     // HRESP  for slave connection #1
  input  wire [DW-1:0] HRDATA1,    // HRDATA for slave connection #1
  input  wire          HSEL2,      // HSEL for AHB Slave #2
  input  wire          HREADYOUT2, // HREADY for Slave connection #2
  input  wire          HRESP2,     // HRESP  for slave connection #2
  input  wire [DW-1:0] HRDATA2,    // HRDATA for slave connection #2
  output wire          HREADY,     // HREADY to AHB master and AHB slaves
  output wire          HRESP,      // HRESP to AHB master
  output wire [DW-1:0] HRDATA      // Read data to AHB master
  );

  reg     [2:0] reg_hsel;     // Register selection control
  wire    [2:0] nxt_hsel_reg; // next state for nxt_hsel_reg

  assign  nxt_hsel_reg[0] = HSEL0 ;
  assign  nxt_hsel_reg[1] = HSEL1 ;
  assign  nxt_hsel_reg[2] = HSEL2 ;

  // Registering MuxCtrl
  always @(posedge HCLK or negedge HRESETn)
  begin
   if (~HRESETn)
     reg_hsel <= {3{1'b0}};
   else if (HREADYOUT)
     reg_hsel <= nxt_hsel_reg;
  end

  assign HREADY =
           ((~reg_hsel[0]) | HREADYOUT0) &
           ((~reg_hsel[1]) | HREADYOUT1) &
           ((~reg_hsel[2]) | HREADYOUT2) ;

  assign HRDATA =
           ({DW{reg_hsel[0]}} & HRDATA0) |
           ({DW{reg_hsel[1]}} & HRDATA1) |
           ({DW{reg_hsel[2]}} & HRDATA2) ;

  assign HRESP =
           (reg_hsel[0] & HRESP0 ) |
           (reg_hsel[1] & HRESP1 ) |
           (reg_hsel[2] & HRESP2 ) ;

        可以看出,HREADYOUT信号在之前被选择的Slave输出的HREADYOUT信号为低时才为低,同时HRDATA信号和HRESP信号也是通过被寄存的HSEL信号进行选择的。

实际案例

        图6所示的时序图可以帮助读者更好地理解。

图6 连续访问两个Slave,且第一个Slave插入了等待

        图6中的Sx.y表示slave x的第y个地址或对相应的数据,Sx表示选中Slavex,为简便起见,假设全程进行读传输。

        在第三个时钟上升沿后,由于slave1还未准备好数据S1.4,因此将HREADYOUT1信号拉低,由于此时HSEL_reg保存选择Slave1,因此HREADY信号也被拉低,在HREADY信号为低时,HSEL_reg不会更新而是继续保存选择Slave1,需要注意的是,MUX是根据HSEL_reg选择传回的数据和相应信号的,因此数据S1.4能正确地传输回Master。

        HREADY信号同时提供给了Slave2,因为Slave1的传输尚未结束,所以即使已经是Slave2的地址阶段了,且HSEL选择了Slave2,Slave2的HREADYOUT2信号为高,但不能进行响应,因为HREADY为低。这导致了Slave1传输的数据阶段和Slave2传输的地址阶段重合了两个周期(正常的流水应该是一个周期)。

猜你喜欢

转载自blog.csdn.net/weixin_45791458/article/details/143417253