当前位置: 首页 > news >正文

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 Widthparameter DW=32)(input  wire          HCLK,       // Clockinput  wire          HRESETn,    // Resetinput  wire          HSEL0,      // HSEL for AHB Slave #0input  wire          HREADYOUT0, // HREADY for Slave connection #0input  wire          HRESP0,     // HRESP  for slave connection #0input  wire [DW-1:0] HRDATA0,    // HRDATA for slave connection #0input  wire          HSEL1,      // HSEL for AHB Slave #1input  wire          HREADYOUT1, // HREADY for Slave connection #1input  wire          HRESP1,     // HRESP  for slave connection #1input  wire [DW-1:0] HRDATA1,    // HRDATA for slave connection #1input  wire          HSEL2,      // HSEL for AHB Slave #2input  wire          HREADYOUT2, // HREADY for Slave connection #2input  wire          HRESP2,     // HRESP  for slave connection #2input  wire [DW-1:0] HRDATA2,    // HRDATA for slave connection #2output wire          HREADY,     // HREADY to AHB master and AHB slavesoutput wire          HRESP,      // HRESP to AHB masteroutput wire [DW-1:0] HRDATA      // Read data to AHB master);reg     [2:0] reg_hsel;     // Register selection controlwire    [2:0] nxt_hsel_reg; // next state for nxt_hsel_regassign  nxt_hsel_reg[0] = HSEL0 ;assign  nxt_hsel_reg[1] = HSEL1 ;assign  nxt_hsel_reg[2] = HSEL2 ;// Registering MuxCtrlalways @(posedge HCLK or negedge HRESETn)beginif (~HRESETn)reg_hsel <= {3{1'b0}};else if (HREADYOUT)reg_hsel <= nxt_hsel_reg;endassign 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传输的地址阶段重合了两个周期(正常的流水应该是一个周期)。

http://www.lryc.cn/news/473625.html

相关文章:

  • 初始Linux (2) : 权限
  • 在Mac下安装时间序列软件Hector
  • JVM1.8内存模型
  • windows C#-类型系统(上)
  • 【酷狗音乐】逆向登录参数分析
  • Jenkins面试整理-Jenkins Pipeline 是什么?
  • RHCE第三次实验
  • 基于LORA的一主多从监测系统_4G模块上巴法云
  • pip使用
  • Django ORM详解:外键使用(外键逻辑关联)与查询优化
  • 【Python】实战:使用input()从键盘获取一个字符串,判断这个字符串在列表中是否存在(函数体不能使用in),返回结果为True或False
  • 【YApi】接口管理平台
  • QNAP威联通NAS忘记密码怎么办?
  • MySQL FIND_IN_SET 函数详解
  • 【零售和消费品&厨房】厨房食材检测图像分割系统源码&数据集全套:改进yolo11-goldyolo
  • 自制田字格word
  • 微软官方 .NET 混淆软件 Dotfuscator
  • 19 Docker容器集群网络架构:二、etcd 集群部署
  • React + SpreadJS 开发时常见问题
  • docker 调用宿主机实现关机
  • 51单片机--- 16*32点阵滚动显示
  • 渗透测试-百日筑基—文件上传篇特征截断渲染%00绕过——下篇
  • 深度学习基础—循环神经网络(RNN)
  • 一二三应用开发平台自定义查询设计与实现系列2——查询方案功能实现
  • Redis 集群 问题
  • PyQt入门指南二十九 QListView列表视图组件
  • cisco网络安全技术第4章测试及考试
  • vue下载安装
  • C++ | Leetcode C++题解之第516题最长回文子序列
  • Python中的`update`方法详解及示例