AMBA-AHB仲裁机制

article/2025/8/21 12:07:06

前文        

        仲裁机制保证了任意时刻只有一个 master 可以接入总线。Arbiter 决定了哪个向其发出接入请求的 master 可以接入总线,这通过优先级算法实现。AHB规范并没有给出优先级算法,需要设计者根据具体的系统要求定义。一般情况下 arbiter 不会中断一个 burst 传输,将总线接入权让给其他 master。当然未定义长度的 burst 传输是可以打断的。这都要看优先级算法 是如何规定的。如果一笔 burst 被打断,master 再度获得接入权限,是会传递剩余的部分。 如一笔长度为 INCR8 的传输在传递 3beat 后被打断,master 再次获得接入授权后,会继续传 输剩余的 5beat,剩余部分可以由一个 SINGLE 和一个 INCR4 组成,或者是一个 INCR。
        用于仲裁的信号有:
HBUSREQx:master 向 arbiter 发出接入请求的信号。
HLOCKx:指示是否要进行不可中断的传输。这一信号与 HBURSEQx 同时由 master 向
arbiter 发出。
HGRANTx: arbiter 产生指示 master 获得授权。当 HGRANTx 信号为高同时 HREADY
为高时,master 可以向总线传输地址信号。
HMASTER[3:0]: arbiter 产生指示那个 master 获得授权。这一信号用于地址控制多路来
选择哪个 master 接入总线。
HMASTERLOCK: arbiter 产生指示当前传输是否为锁定序列传输。
HSPLIT: 供支持 SPLIT 传输使用。

 

​AHB协议仲裁机制详解​

​1. 仲裁机制核心功能​

仲裁器(Arbiter)是AHB总线的核心模块,用于在多主(Multi-Master)系统中协调总线访问权。其核心功能如下:

  • ​单主占用​​:确保同一时刻只有一个主设备(Master)接入总线。
  • ​优先级决策​​:基于自定义优先级算法(如固定优先级、轮询、动态优先级)选择授权的主设备。
  • ​突发完整性保护​​:通常不打断固定长度的突发传输(如INCR4WRAP8),但未定义长度的突发(如INCR)可能被中断。
​2. 仲裁信号与交互流程​

AHB协议通过以下信号实现仲裁控制:

​信号名称​​方向​​功能描述​
HBUSREQxMaster→Arbiter主设备请求总线访问(例如HBUSREQ0表示Master0请求总线)。
HLOCKxMaster→Arbiter指示当前传输为​​不可中断的锁定序列​​(如原子操作、关键数据搬运)。
HGRANTxArbiter→Master仲裁器授权主设备访问总线,需在HREADY=1时生效。
HMASTER[3:0]Arbiter→Slave标识当前获得总线授权的主设备编号,用于Slave选择数据源或响应。
HMASTERLOCKArbiter→Slave指示当前传输是否为锁定序列(与HLOCKx联动)。
HSPLIT[15:0]Slave→Arbiter支持SPLIT传输,从设备通知仲裁器释放指定主设备的总线占用。
​3. 优先级算法设计​

AHB协议未规定具体算法,设计者需根据系统需求选择:

​3.1 固定优先级(Fixed Priority)​
  • ​规则​​:主设备按预设优先级排序(如Master0 > Master1 > ...)。
  • ​场景​​:实时性要求高的系统(如中断控制器、DMA)。
  • ​示例​​:
    // 固定优先级仲裁器逻辑(Master0优先级最高)
    assign HGRANT0 = HBUSREQ0;
    assign HGRANT1 = HBUSREQ1 && !HBUSREQ0;
    assign HGRANT2 = HBUSREQ2 && !HBUSREQ0 && !HBUSREQ1;
​3.2 轮询(Round-Robin)​
  • ​规则​​:主设备按循环顺序获得授权,避免低优先级设备“饿死”。
  • ​场景​​:公平性要求高的多任务系统(如CPU与GPU协同)。
  • ​示例​​:
    使用状态机记录当前授权设备,每次授权后切换至下一设备。
  • 轮询仲裁主要是通过循环调整优先级,避免低优先级设备长期无法获得总线。其核心是​​优先级寄存器轮转​​和​​突发传输周期控制​,下面是示例代码:

        轮询仲裁的规则是当0、1、2、、、N-1个data模块同时向仲裁器发出请求 (request) 时,初始情况下data_req_0的优先级最高,当仲裁器响应了data_req_0后,data_req_1的优先级最高,存在规律:当仲裁器响应了data_req_i后,就令data_req_(i+1)的优先级最高(假设i不是最高位)。

        轮询仲裁器实现:轮询仲裁器的实现分为检测仲裁器输入口data模块的request,根据当前仲裁器的优先级响应相应的request,仲裁器grant输出data端的请求,更新仲裁器的优先级。假设模块的请求为8bit的request,每1bit代表第1个模块发起的request,当request中有多个bit位同时为1时,代表有多个模块同时申请总线,这时候我们就需要根据轮询仲裁规则,给优先级最高的模块一个grant信号,因此我们设置grant信号也为一个8bit的信号,当总线把控制权给第i个模块时,就把grant信号的第i位拉高,其他位为0。

例如:request = 8'b1101_0011时,共有五个模块同时申请总线,此时优先级最高的为第0个模块,所以输出grant = 8'b0000_0001。并把第0个信号的优先级调到最低,第1个信号的优先级调到最高。此时优先级顺序为1>2>3>4>5>6>7>0,若此时又来一个request = request = 8'b1101_0101,由于bit 0位置的优先级最低,所以继续往后搜索,搜索到bit 2位置,所以输出grant = 8'b0000_0100,第2个信号优先级调到最低,第3个信号优先级调到最高,即输出后优先级顺序变为:3>4>5>6>7>0>1>2,以此类推,这就是轮询仲裁。

module rr_arbiter(input                clk         ,input                rstn        ,input        [7:0]   req         ,output  reg  [7:0]   grant       
);reg  [7:0] shift_req;
wire [7:0] prio_grant;
wire [2:0] shift_length;// 根据上一周期的grant,修改request,使得最低bit位优先级最高。
always @(*)begincase(grant)     //this grant is pre-cycle request's result8'b0000_0001:shift_req = {req[0:0],req[7:1]};8'b0000_0010:shift_req = {req[1:0],req[7:2]};8'b0000_0100:shift_req = {req[2:0],req[7:3]};8'b0000_1000:shift_req = {req[3:0],req[7:4]};8'b0001_0000:shift_req = {req[4:0],req[7:5]};8'b0010_0000:shift_req = {req[5:0],req[7:6]};8'b0100_0000:shift_req = {req[6:0],req[7:7]};default:shift_req = req;endcase
end// 找到修改后最低位的one-hot码(参考fixed_arbiter设计)
assign prio_grant = shift_req & (~(shift_req-1));  // 如果grant信号是1,那么移动长度计算需要+1,如果grant信号是0则不+1.
// 这是因为$clog2函数,有$clog2(0)=$clog2(1)=0的缘故,所以我们需要区分grant是不是0.
assign shift_length = grant?($clog2(prio_grant) + $clog2(grant)+1):($clog2(prio_grant) + $clog2(grant));always @(posedge clk)beginif(!rstn)begingrant <= 8'd0;endelse if(req==0) // 如果输入为0,那么grant信号直接给0grant <= 8'd0;elsecase(shift_length)3'd0:grant <= 8'b0000_0001;3'd1:grant <= 8'b0000_0010;3'd2:grant <= 8'b0000_0100;3'd3:grant <= 8'b0000_1000;3'd4:grant <= 8'b0001_0000;3'd5:grant <= 8'b0010_0000;3'd6:grant <= 8'b0100_0000;3'd7:grant <= 8'b1000_0000;endcase
endendmodule
module rr_arbiter_tb();
reg clk,rstn;
reg [7:0] req;wire [7:0] grant;initial beginforever #5 clk = ~clk;
endinitial beginclk = 0;rstn = 0;req = 8'd0;#10rstn = 1;#5req = #1 8'b1011_1110;#10req = #1 8'b0101_0010;#10req = #1 8'b1010_1000;#10req = #1 8'b1100_1000;#10req = #1 8'd0;#50$finish();
endrr_arbiter u_rr_arbiter(.clk    (clk)  ,.rstn   (rstn) ,.req    (req)  ,.grant  (grant)
);initial begin$fsdbDumpfile("rr_arbiter.fsdb");$fsdbDumpvars(0);
endendmodule

 

​3.3 动态优先级(Dynamic Priority)​
  • ​规则​​:优先级根据系统状态(如负载、紧急任务)动态调整。
  • ​场景​​:复杂SoC中的资源调度(如AI加速器突发负载)。
  • ​示例​​:
    结合HSPLIT信号动态提升等待时间过长的主设备优先级。
  • 动态优先级结合固定优先级和等待时间阈值,提升公平性.

下面是一个例子,关键设计点​​:

  1. ​两级优先级​​:默认按固定优先级授权,若某设备等待时间超过阈值则临时提升其优先级。
  2. ​等待时间计数器​​:记录每个主设备从发出请求到获得授权的延迟,超过阈值时触发优先级调整。
  3. ​防止饿死​​:低优先级设备在长时间等待后可通过超时机制获得总线
// 动态优先级仲裁器(固定优先级 + 等待时间阈值)
module dynamic_priority_arbiter (input clk,input resetn,input [3:0] busreq,       // 4个主设备请求input [3:0] wait_time,    // 各设备等待时间计数input [3:0] time_threshold, // 等待时间阈值output reg [3:0] grant
);// 优先级判定逻辑
always @(*) begin// 检测是否有设备等待超时if (|(wait_time >= time_threshold)) begin// 优先授权超时设备(按固定优先级顺序)casex (wait_time >= time_threshold)4'b1xxx: grant = 4'b1000; // 设备3超时4'b01xx: grant = 4'b0100; // 设备2超时4'b001x: grant = 4'b0010; // 设备1超时4'b0001: grant = 4'b0001; // 设备0超时default: grant = 4'b0000;endcaseend else begin// 默认固定优先级(设备3 > 2 > 1 > 0)casex (busreq)4'b1xxx: grant = 4'b1000;4'b01xx: grant = 4'b0100;4'b001x: grant = 4'b0010;4'b0001: grant = 4'b0001;default: grant = 4'b0000;endcaseend
end// 等待时间计数器更新逻辑
always @(posedge clk) beginif (!resetn) beginwait_time <= 0;end else beginfor (int i=0; i<4; i++) beginif (busreq[i] && !grant[i]) wait_time[i] <= wait_time[i] + 1; // 未授权则累加else wait_time[i] <= 0;                // 授权或未请求则清零endend
endendmodule
​4. 突发传输中断与恢复​
​4.1 可中断条件​
  • ​未定义长度突发(INCR)​​:允许仲裁器中断,释放总线给更高优先级设备。
  • ​锁定传输(HLOCK=1)​​:不可中断,仲裁器必须等待传输完成。
​4.2 中断恢复机制​
  • ​示例​​:INCR8传输在3拍后被打断,剩余5拍需拆分传输:
    • ​拆分方式1​​:SINGLE(第4拍) + INCR4(第5~8拍)。
    • ​拆分方式2​​:INCR5(直接继续剩余传输)。
  • ​代码逻辑​​:
    // Master中断恢复逻辑
    if (burst_interrupted) beginHBURST = (remaining_beats == 1) ? SINGLE : INCR;HTRANS = NONSEQ; // 重新启动传输
    end
​5. 关键设计考量​
  1. ​总线效率与实时性平衡​
    • 高优先级设备频繁打断可能导致低优先级设备延迟激增,需设置最大等待阈值。
  2. ​锁定传输(Locked Transfer)​
    • 用于关键操作(如缓存一致性协议),需通过HLOCKx信号禁止仲裁器中断。
  3. ​SPLIT传输支持​
    • 从设备通过HSPLIT通知仲裁器释放指定主设备,适用于资源冲突场景(如共享外设忙)。
6.零周期等待示例

         下图显示了零等待周期,HREADY 为高时的判决情况。第一个周期 master 发出总线接入请求,第二个周期 arbiter 做出判决,第三个周期 arbiter 发出授权信号,第四周期master开始传递地址。

总结​

AHB仲裁机制通过灵活的优先级算法和信号交互,实现了多主系统的高效总线管理。设计时需重点考虑:

  • ​算法选择​​:根据实时性、公平性需求选择固定、轮询或动态优先级。
  • ​突发完整性​​:优先保障固定长度突发的完整执行,未定义突发需支持动态拆分。
  • ​异常处理​​:通过HSPLIT和锁定传输优化资源冲突与关键任务调度。
    该机制在复杂SoC中广泛用于平衡CPU、DMA、加速器等模块的总线竞争,是高性能系统设计的核心基础。

 


http://www.hkcw.cn/article/UteupQuLfV.shtml

相关文章

长期口臭可能是你的身体在求救 三步教你自救

有些人表面光鲜亮丽一张嘴却让人“退避三舍”尤其在晨起、空腹时口臭问题更明显不仅尴尬还可能暗藏健康隐患科学应对口臭还你清新口气!先对号入座你的口臭是临时客串还是疾病信号?1、生理性口臭:临时“小插曲”饮食作祟:大蒜、洋葱、韭菜等含硫化合物的食物,会通过血液循环…

辰亦儒老婆曾之乔回应二胎计划 随缘就好

5月29日,女演员曾之乔出席活动时分享了她的产后生活,表示生完宝宝后感到非常幸福,并透露怀孕期间给儿子取的小名叫“甜蜜”。她还提到与丈夫辰亦儒采取“责任制”方式照顾宝宝,两人会排班负责。对于是否计划要二胎,她表示一切随缘。曾之乔和辰亦儒在2009年合作《爱似百汇》…

kafka学习笔记(三、消费者Consumer使用教程——从指定位置消费)

1.简介 Kafka的poll()方法消费无法精准的掌握其消费的起始位置&#xff0c;auto.offset.reset参数也只能在比较粗粒度的指定消费方式。更细粒度的消费方式kafka提供了seek()方法可以指定位移消费允许消费者从特定位置&#xff08;如固定偏移量、时间戳或分区首尾&#xff09;开…

旅客私自携带230万美元现金入境 折合人民币超1600万元

近日,皇岗海关在福田口岸旅检渠道查获一名旅客违规携带未申报的230万美元现金入境,折合人民币超过1600万元。皇岗海关关员在福田口岸旅检进境大厅对旅客及行李物品进行监管时,发现一名经“无申报通道”通关的旅客携带的行李机检图像异常。随后,该旅客被引导至查验区进一步检…

精度更高、速度更快!从RT-DETR到RF-DETR全面突破实时检测瓶颈

【导读】 YOLO虽快&#xff0c;但其依赖的非最大抑制&#xff08;NMS&#xff09;后处理拖累速度与精度。DETR架构首次实现无需NMS的“一对一”预测&#xff0c;却受限于计算成本。如今&#xff0c;RT-DETR 通过混合编码器、不确定性查询选择等创新突破实时瓶颈&#xff1b;RF…

提升搜索效率:深入了解Amazon Kendra的强大功能

从智能文档搜索到精准的自然语言处理&#xff0c;Amazon Kendra为企业提供了一个强大的解决方案&#xff0c;帮助我们突破传统搜索引擎的局限&#xff0c;快速实现信息的高效整合与检索&#xff0c;接下来让我们一起探索Amazon Kendra如何成为工作中的得力助手&#xff0c;提升…

社群营销:信任比流量值钱

你肯定见过那种群里天天甩链接的&#xff0c;动不动就所有人&#xff0c;点进去全是促销信息——这种玩意儿不叫社群营销&#xff0c;顶多是广告轰炸。 搞社群得先把自己当人&#xff0c;也把别人当人。别整那些机器人自动回复&#xff0c;谁半夜两点发消息都秒回&#xff0c;…

嵌入式工作项目中的线程管理(监控线程和重启线程的具体实现)

嵌入式工作项目中的线程管理(监控线程和重启线程的具体实现) 1. 背景 环境:ARMv7,Linux; 软件所处位置:应用层; 问题出现概率:偶先,概率极小; 问题描述: 一个负责校时的进程,里面有一个是网络校时的线程和一个 GPS 校时的线程,还有处理其他一些业务的线程;出现…

【图像处理基石】立体匹配的经典算法有哪些?

1. 立体匹配的经典算法有哪些&#xff1f; 立体匹配是计算机视觉中从双目图像中获取深度信息的关键技术&#xff0c;其经典算法按技术路线可分为以下几类&#xff0c;每类包含若干代表性方法&#xff1a; 1.1 基于区域的匹配算法&#xff08;Local Methods&#xff09; 通过…

Unity QFramework 简介

目录 什么是MVC模式&#xff1f; QFramework 架构提供了 Model 的概念 QFramework 架构引入 Command 的方式 QFramework 架构引入 Event事件机制 四个层&#xff1a;表现层、系统层、数据层、工具层 委托和回调函数的关系 命令和事件的区别 工具篇 QFramework整体基于M…

非线性声学计算与强化学习融合框架:突破复杂环境人机交互的新技术

随着人工智能的快速发展&#xff0c;尤其是在深度学习和强化学习领域&#xff0c;声学计算和人机交互进入前所未有的扩展和创新阶段。尽管传统声学方法取得了显著成功&#xff0c;但这些线性或准线性方法在实际环境中往往存在关键的不足&#xff0c;尤其在动态、复杂或混响环境…

广东河源再发3.0级地震 近期无大震风险

广东河源再发3.0级地震 近期无大震风险!中国地震台网正式测定,5月30日2时21分在广东河源市源城区(北纬23.72度,东经114.68度)发生3.0级地震,震源深度10千米。河源市地震局表示,目前未收到人员伤亡和财产损失报告。该局会商研判认为,本次地震是前一天5月29日13时17分发生…

极致视频压缩日记 - 1.2GB=>200MB - 低码率高画质 - 批量多目录自动转换脚本

效果图 格式av10.3M的码率&#xff0c;跟格式h.2645M的码率&#xff0c;画质竟然差不多&#xff01; GPU拉满全速编码&#xff01; 目标 1.视频瘦身储存&#xff0c;画质不变 2.自动批量压缩视频&#xff0c;多层目录递归处理 (脚本https://www.amjun.com/2327.html) 3.免费 (…

媒体:升学不再只有“独木桥” 职教贯通培养拓宽道路

媒体:升学不再只有“独木桥” 职教贯通培养拓宽道路!随着职教贯通培养模式的不断推进,我国学生的升学选择已经更加多元。高考不再是唯一的出路。5月28日,教育部公布2025年全国高考报名人数为1335万人,比2024年的1342万人减少7万人。这是自2017年以来高考报名人数首次减少。…

多地曝“谷子店”闭店消息 “谷子经济”面临转型挑战

手办模玩生产车间里,年轻人正在参与“谷子”涂装工作。消费者正在挑选“谷子”。“谷子经济”还能像过去那样“丰收”吗?挣“二次元”的钱,难不难?不只是做单一的“谷子”销售,还自主开发产品,做IP代运营,一步一步介入“谷子经济”全链条。自己开发App,为平台用户建立“…

我国入境游出境游持续升温 双向奔赴激发市场活力

走进2025上海国际旅游交易博览会现场,可以感受到入境和出境旅游市场的繁荣。中外客商、展商根据满满的时间表,听宣讲、看项目、谈合作,为世界旅游市场注入动力。今年的上海国际旅游交易博览会于5月27日至29日举行,吸引了来自全球80多个国家和地区的700多家展商参展,展会规…

白宫称美国法院“叫停”关税是司法越权

美国联邦巡回上诉法院当地时间29日批准特朗普政府的请求,暂时中止美国国际贸易法院此前做出的禁止执行特朗普政府对多国加征关税措施的行政令的裁决。自美国国际贸易法院28日裁定禁止执行美政府多个关税行政令后,特朗普政府多名官员就指责这一裁决,提起了上诉。△白宫新闻秘…

运镜决定节奏:AI视频创作中的动态叙事法则

在AI视频创作工具日益普及的今天&#xff0c;如何通过镜头语言精准掌控节奏&#xff0c;成为创作者的核心竞争力。运镜——即镜头的移动方式&#xff08;如推、拉、摇、移&#xff09;与视角选择&#xff08;如仰拍、俯拍、主观视角&#xff09;——不仅是技术操作&#xff0c;…

【Redis】string

String 字符串 字符串类型是 Redis 最基础的数据类型&#xff0c;关于字符串需要特别注意&#xff1a; 首先 Redis 中所有的键的类型都是字符串类型&#xff0c;而且其他几种数据结构也都是在字符串的基础上构建的。字符串类型的值实际可以是字符串&#xff0c;包含一般格式的…

Java 文件操作 和 IO(3)-- Java文件内容操作(1)-- 字节流操作

Java 文件操作 和 IO&#xff08;3&#xff09;-- Java文件内容操作&#xff08;1&#xff09;-- 字节流操作 文章目录 Java 文件操作 和 IO&#xff08;3&#xff09;-- Java文件内容操作&#xff08;1&#xff09;-- 字节流操作观前提醒&#xff1a;1. Java中操作文件的简单介…