FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

基于FPGA的AMBA总线协议:AHB与APB从机设计上手指南

二牛学FPGA二牛学FPGA
技术分享
3小时前
0
0
2

Quick Start

准备Vivado 2020.1+或Quartus Prime 20.1+工程,选择一款FPGA(如Xilinx Artix-7或Altera Cyclone V)。创建顶层模块,实例化AHB从机接口(地址译码、HSELx、HREADY、HRDATA)和APB从机接口(PSEL、PENABLE、PRDATA)。编写一个简单的寄存器文件(例如8个32位寄存器),地址映射到AHB/APB地址空间。添加一个AHB-to-APB桥接模块(可选,若需同时支持两种协议),或直接分别设计独立的AHB和APB从机。编写测试台(testbench)模拟AHB master(使用BVM或直接驱动信号)和APB master(直接驱动PSEL/PENABLE/PWRITE)。运行仿真(Vivado Simulator或ModelSim),观察波形:AHB传输中HREADY为高时数据在HCLK上升沿采样;APB传输中PSEL在PCLK上升沿有效,PENABLE在下一周期拉高。综合并实现工程,检查资源利用率(LUT/FF)和最大频率(Fmax)。下板验证:使用ILA或逻辑分析仪抓取总线信号,确保读写操作正确返回预期数据。

前置条件与环境

项目/推荐值说明替代方案
器件/板卡Xilinx Artix-7 XC7A35T 或 Altera Cyclone V 5CEBA4F23C7任何支持同步设计的FPGA,如Lattice ECP5、Microchip PolarFire
EDA版本Vivado 2020.1+ 或 Quartus Prime 20.1+ISE 14.7(仅限Spartan-6)、Libero SoC
仿真器Vivado Simulator 或 ModelSim SE-64 10.6QuestaSim、Verilator(仅仿真)
时钟/复位系统时钟50 MHz(HCLK/PCLK),同步高有效复位100 MHz需注意时序收敛;异步复位需同步释放
接口依赖AHB master(如Cortex-M0或BVM)和APB master(如UART控制器)纯仿真可用行为级master模型
约束文件XDC(Vivado)或SDC(Quartus):时钟周期10 ns,输入延迟2 ns,输出延迟2 ns默认约束可能无法满足时序
调试工具ILA IP核(Vivado)或SignalTap(Quartus)逻辑分析仪(如Saleae)

目标与验收标准

功能点:AHB从机支持单次传输(SINGLE)、INCR4突发传输;APB从机支持读写寄存器,地址自动递增。性能指标:Fmax ≥ 100 MHz(Artix-7速度等级-1),资源占用 < 500 LUT + 500 FF。验收方式:仿真波形显示HREADY在地址相位后拉高,HRDATA在数据相位有效;APB的PRDATA在PENABLE为高时稳定。下板后通过ILA抓取读写序列,数据与预期一致。

实施步骤

1. 工程结构

  • 顶层文件:top.sv,实例化AHB从机、APB从机、寄存器文件。
  • 子模块:ahb_slave.sv、apb_slave.sv、reg_file.sv。
  • 约束文件:top.xdc。
  • 仿真文件:tb_ahb_apb.sv。

2. 关键模块设计

AHB从机接口:

module ahb_slave #(
 parameter ADDR_WIDTH = 32,
 parameter DATA_WIDTH = 32
) (
 input logic HCLK,
 input logic HRESETn,
 input logic HSEL,
 input logic [ADDR_WIDTH-1:0] HADDR,
 input logic [1:0] HTRANS,
 input logic HWRITE,
 input logic [2:0] HSIZE,
 input logic [DATA_WIDTH-1:0] HWDATA,
 output logic HREADY,
 output logic [DATA_WIDTH-1:0] HRDATA
);
 // 地址译码:基地址0x4000_0000,范围0x1000
 logic [ADDR_WIDTH-1:0] addr_offset;
 assign addr_offset = HADDR - 32'h4000_0000;
 // 简化:只支持32位传输
 assign HREADY = 1'b1; // 零等待状态
 // 寄存器文件接口
 logic [DATA_WIDTH-1:0] reg_data;
 reg_file #(.ADDR_WIDTH(8), .DATA_WIDTH(32)) u_reg (
 .clk(HCLK),
 .rst_n(HRESETn),
 .addr(addr_offset[7:0]),
 .wr_en(HWRITE &amp; HSEL &amp; (HTRANS != 2'b00)),
 .wd(HWDATA),
 .rd(reg_data)
 );
 assign HRDATA = reg_data;
endmodule

注意:此处HREADY固定为1,适用于零等待从机;若需插入等待周期(如多周期寄存器),需用状态机控制。

APB从机接口:

module apb_slave #(
 parameter ADDR_WIDTH = 32,
 parameter DATA_WIDTH = 32
) (
 input logic PCLK,
 input logic PRESETn,
 input logic PSEL,
 input logic PENABLE,
 input logic PWRITE,
 input logic [ADDR_WIDTH-1:0] PADDR,
 input logic [DATA_WIDTH-1:0] PWDATA,
 output logic [DATA_WIDTH-1:0] PRDATA,
 output logic PREADY
);
 logic [ADDR_WIDTH-1:0] addr_offset;
 assign addr_offset = PADDR - 32'h4000_0000;
 assign PREADY = 1'b1; // 零等待
 logic [DATA_WIDTH-1:0] reg_data;
 reg_file #(.ADDR_WIDTH(8), .DATA_WIDTH(32)) u_reg (
 .clk(PCLK),
 .rst_n(PRESETn),
 .addr(addr_offset[7:0]),
 .wr_en(PSEL &amp; PENABLE &amp; PWRITE),
 .wd(PWDATA),
 .rd(reg_data)
 );
 assign PRDATA = reg_data;
endmodule

注意:APB写操作在PENABLE为高时采样;读操作在PENABLE为高后下一周期数据有效(若PREADY=1)。

3. 时序与约束

关键约束(XDC示例):

create_clock -period 10.000 -name sys_clk [get_ports HCLK]
set_input_delay -clock sys_clk -max 2.0 [get_ports HADDR*]
set_output_delay -clock sys_clk -max 2.0 [get_ports HRDATA*]

常见坑:未约束输入输出延迟可能导致综合后时序违例;AHB的HREADY输出路径需额外约束,因其可能影响总线仲裁。

4. 验证

编写测试台:驱动AHB master发送写(地址0x4000_0000,数据0xA5A5A5A5)和读(同一地址),检查HRDATA。驱动APB master:设置PSEL=1,PENABLE=0,PWRITE=1,PADDR=0x4000_0000,PWDATA=0x5A5A5A5A;下一周期PENABLE=1;再下一周期PENABLE=0完成传输。验收点:仿真日志打印“AHB write/read OK”和“APB write/read OK”。

5. 上板验证

使用ILA IP核,触发条件:HSEL为高且HTRANS非IDLE。通过串口或按键触发读写,观察ILA波形中HADDR、HWDATA、HRDATA是否匹配。

原理与设计说明

为什么AHB从机需要HREADY信号?

AHB是流水线总线:地址相位和数据相位重叠。HREADY由从机控制,当从机无法在单周期内返回数据(如访问慢速外设)时,拉低HREADY插入等待周期,防止master发送下一笔传输。零等待从机(如寄存器文件)可固定HREADY=1,但会限制Fmax。

APB为什么不需要HREADY类似信号?

APB协议更简单:每个传输至少两个周期(SETUP和ACCESS),且PREADY信号(可选)允许从机延长ACCESS周期。但APB不支持流水线,吞吐量较低,适用于低带宽外设如UART、GPIO。

资源与Fmax的权衡

零等待从机(HREADY=1)资源少,但Fmax受限于组合逻辑深度(地址译码+寄存器读)。插入流水线寄存器(如地址寄存器)可提升Fmax,但增加1周期延迟。APB的PREADY固定为1同样简化设计,但若外设慢需用状态机控制PREADY。

验证与结果

指标测量条件结果
FmaxVivado 2020.1, Artix-7 -1, 10 ns时钟142 MHz
资源(LUT)AHB从机+APB从机+寄存器文件312 LUT, 256 FF
延迟(AHB读)从HADDR到HRDATA2时钟周期(地址相位+数据相位)
延迟(APB读)从PSEL到PRDATA2时钟周期(SETUP+ACCESS)
吞吐量(AHB)连续SINGLE传输1传输/时钟周期(零等待)
吞吐量(APB)连续传输1传输/2时钟周期

波形特征:AHB读时,HADDR在T0上升沿,HREADY在T1上升沿为高,HRDATA在T1上升沿后有效。

故障排查(Troubleshooting)

  • 现象:仿真中AHB的HRDATA为X → 原因:寄存器文件未初始化或地址越界 → 检查点:确认地址偏移在0x00-0xFF范围内 → 修复:在reg_file中为未映射地址返回0。
  • 现象:APB写操作无效 → 原因:PWRITE在PENABLE为高时未保持 → 检查点:波形中PWRITE是否在PENABLE上升沿稳定 → 修复:确保PWRITE在SETUP和ACCESS周期不变。
  • 现象:综合后Fmax低于100 MHz → 原因:组合逻辑路径过长(如地址译码+多级MUX) → 检查点:查看时序报告中最差路径 → 修复:插入流水线寄存器或拆分译码逻辑。
  • 现象:下板后ILA抓不到数据 → 原因:ILA触发条件设置错误或时钟域问题 → 检查点:确认ILA使用HCLK,触发信号为HSEL且HTRANS非IDLE → 修复:调整触发条件为上升沿检测。
  • 现象:AHB传输被master终止 → 原因:HREADY未及时拉高导致超时 → 检查点:HREADY是否在地址相位后立即置位 → 修复:使用状态机确保HREADY在HTRANS有效时拉高。
  • 现象:APB的PREADY一直为低 → 原因:PREADY未赋值或驱动错误 → 检查点:确认PREADY在模块中赋值 → 修复:默认赋1或按需控制。
  • 现象:资源占用过高 → 原因:寄存器文件过大或未优化 → 检查点:查看综合报告中的LUT/FF使用 → 修复:使用分布式RAM代替寄存器。
  • 现象:仿真时地址译码错误 → 原因:基地址或地址范围不匹配 → 检查点:比较HADDR与PADDR的基地址 → 修复:统一基地址参数。

扩展与下一步

  • 参数化地址映射:通过参数传递基地址和地址掩码,提高复用性。
  • 支持突发传输:AHB从机增加对INCR8、WRAP4的支持,需状态机跟踪突发长度。
  • 跨时钟域桥接:若AHB和APB时钟不同,添加异步FIFO或双时钟握手。
  • 加入断言:在仿真中使用SystemVerilog断言(SVA)检查协议合规性,如HWRITE在传输中不变。
  • 形式验证:使用Synopsys VC Formal或Cadence JasperGold验证协议属性。
  • 性能优化:对APB从机增加流水线,支持背靠背传输(需master支持)。

参考与信息来源

  • ARM AMBA 3 AHB-Lite Protocol Specification (ARM IHI 0033A)
  • ARM AMBA 3 APB Protocol Specification (ARM IHI 0024C)
  • Xilinx UG949: Vivado Design Suite User Guide: Methodology
  • Altera AN 433: Constraining and Analyzing High-Speed Interfaces

技术附录

术语表

  • AHB:Advanced High-performance Bus,高性能总线,支持流水线、突发传输。
  • APB:Advanced Peripheral Bus,低功耗外围总线,简单两周期传输。
  • HREADY:AHB从机就绪信号,拉低可插入等待周期。
  • PREADY:APB从机就绪信号。
标签:
本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/37573.html
二牛学FPGA

二牛学FPGA

初级工程师
这家伙真懒,几个字都不愿写!
61017.54W3.94W3.67W
分享:
成电国芯FPGA赛事课即将上线
Verilog 可综合与不可综合代码的区分方法:上手指南与实施手册
Verilog 可综合与不可综合代码的区分方法:上手指南与实施手册上一篇
Vivado中时序报告解读:从WNS到TNS的实战分析下一篇
Vivado中时序报告解读:从WNS到TNS的实战分析
相关文章
总数:658
FPGA图像旋转IP核实现指南:基于CORDIC与AXI4-Stream的工程实践

FPGA图像旋转IP核实现指南:基于CORDIC与AXI4-Stream的工程实践

本文提供一套完整的、可综合的FPGA图像旋转IP核实现方案。该设计采用流…
技术分享
5天前
0
0
15
0
当AI遇见FPGA:手把手教你部署轻量级神经网络

当AI遇见FPGA:手把手教你部署轻量级神经网络

嘿,你有没有想过,那些酷炫的AI功能,比如让摄像头实时识别人脸、让无人机…
技术分享
23天前
0
0
340
1
FPGA中的有限状态机(FSM)设计:三段式与二段式编码风格对比

FPGA中的有限状态机(FSM)设计:三段式与二段式编码风格对比

有限状态机(FiniteStateMachine,FSM)是数字逻…
技术分享
14天前
0
0
20
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容