ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

AMBA:AHB_Slave_Mux的解析与HREADY、HREADYOUT信号

AMBA:AHB_Slave_Mux的解析与HREADY、HREADYOUT信号 相关阅读AMBAhttps://blog.csdn.net/weixin_45791458/category_12800219.html?spm1001.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 DW32 ) ( 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{1b0}}; else if (HREADY) 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 ) ;可以看出HREADY信号在之前被选择的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选择了Slave2Slave2的HREADYOUT2信号为高但不能进行响应因为HREADY为低。这导致了Slave1传输的数据阶段和Slave2传输的地址阶段重合了两个周期正常的流水应该是一个周期。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表