用FPGA实战AHB总线从零搭建可综合的AMBA互联系统在数字IC设计领域总线协议如同城市的交通网络决定了各个功能模块之间数据流动的效率和秩序。AMBA总线作为ARM公司推出的片上互联标准已经成为高性能嵌入式系统的基石。然而传统的理论学习方式往往让工程师陷入协议细节的泥潭难以真正掌握其精髓。本文将带领读者通过FPGA实战从零开始构建一个完整的AHB总线系统让抽象的总线协议活起来。1. AHB总线系统设计概述AHBAdvanced High-performance Bus是AMBA协议家族中的高性能成员专为高时钟频率系统模块设计。与纸上谈兵的理论学习不同我们将采用做中学的方式通过Verilog实现一个包含主设备(Master)、从设备(Slave)、仲裁器(Arbiter)和解码器(Decoder)的完整AHB系统。典型AHB系统包含以下核心组件AHB Master负责发起读写操作如处理器、DMA控制器等AHB Slave响应地址空间内的读写请求如存储器、外设等AHB Arbiter确保同一时间只有一个Master可以使用总线AHB Decoder解码地址并生成对应的Slave片选信号我们的实战项目将实现一个简化的系统两个MasterCPU和DMA通过AHB总线访问三个SlaveSRAM、ROM和APB桥。这种架构在嵌入式系统中非常典型能够覆盖AHB协议的大部分关键特性。提示在开始编码前建议先用框图绘制系统架构明确各模块的接口和连接关系。良好的前期规划可以避免后期大量的返工。2. AHB主设备(Master)设计与实现AHB Master是总线操作的发起者需要严格按照协议时序产生控制信号。我们将实现一个支持单次传输和增量突发(INCR burst)的简化Master模块。2.1 Master接口信号定义module ahb_master ( input wire HCLK, // 总线时钟 input wire HRESETn, // 总线复位(低有效) // 仲裁器接口 output wire HBUSREQ, // 总线请求 input wire HGRANT, // 总线授权 output wire HLOCK, // 锁定传输 // 全局信号 output wire [31:0] HADDR, // 地址总线 output wire [2:0] HSIZE, // 传输大小 output wire [2:0] HBURST, // 突发类型 output wire [1:0] HTRANS, // 传输类型 output wire HWRITE, // 读写控制 // 数据总线 output wire [31:0] HWDATA,// 写数据 input wire [31:0] HRDATA, // 读数据 // 响应信号 input wire HREADY, // 传输完成 input wire [1:0] HRESP, // 响应状态 // 用户接口 input wire start, // 用户启动信号 input wire [31:0] addr, // 用户地址 input wire write, // 用户读写 input wire [31:0] wdata, // 用户写数据 output reg [31:0] rdata, // 用户读数据 output reg done // 操作完成 );2.2 Master状态机设计AHB Master的核心是一个状态机负责按照协议时序产生各种控制信号。典型的状态包括IDLE状态等待用户启动信号发起总线请求ADDR_PHASE状态驱动地址和控制信号DATA_PHASE状态完成数据传输WAIT状态处理Slave插入的等待周期localparam [1:0] IDLE_ST 2b00, ADDR_ST 2b01, DATA_ST 2b10, WAIT_ST 2b11; always (posedge HCLK or negedge HRESETn) begin if (!HRESETn) begin state IDLE_ST; HTRANS IDLE; HBUSREQ 1b0; // 其他信号复位... end else begin case (state) IDLE_ST: begin if (start HGRANT) begin state ADDR_ST; HTRANS NONSEQ; HADDR addr; HWRITE write; HSIZE 3b010; // 32位传输 if (burst_en) HBURST INCR4; // 4拍突发 else HBURST SINGLE; end end ADDR_ST: begin if (HREADY) begin state DATA_ST; HTRANS burst_en ? SEQ : IDLE; if (HWRITE) HWDATA wdata; end end // 其他状态处理... endcase end end注意Master必须正确处理Slave返回的各种响应(HRESP)特别是ERROR、RETRY和SPLIT响应否则可能导致系统死锁。3. AHB从设备(Slave)设计与实现AHB Slave需要响应地址空间内的读写操作并按照协议产生适当的响应信号。我们将实现一个简单的SRAM控制器作为Slave示例。3.1 Slave接口与存储器模型module ahb_sram ( input wire HCLK, input wire HRESETn, // AHB Slave接口 input wire HSEL, // 片选信号 input wire [31:0] HADDR, // 地址总线 input wire [1:0] HTRANS, // 传输类型 input wire HWRITE, // 读写控制 input wire [2:0] HSIZE, // 传输大小 input wire [31:0] HWDATA, // 写数据 output reg [31:0] HRDATA, // 读数据 output reg HREADY, // 传输完成 output reg [1:0] HRESP // 响应状态 ); // 4KB SRAM模型 (32位宽) reg [31:0] memory [0:1023]; // 地址解码 wire [9:0] word_addr HADDR[11:2]; // 4KB空间32位字寻址3.2 Slave响应逻辑Slave必须根据HTRANS和HSEL信号判断是否需要响应当前传输并按照协议产生HREADY和HRESP信号。always (posedge HCLK or negedge HRESETn) begin if (!HRESETn) begin HREADY 1b1; HRESP OKAY; HRDATA 32h0; end else begin if (HSEL (HTRANS NONSEQ || HTRANS SEQ)) begin if (HWRITE) begin // 写操作 memory[word_addr] HWDATA; HREADY 1b1; HRESP OKAY; end else begin // 读操作 HRDATA memory[word_addr]; HREADY 1b1; HRESP OKAY; end end else begin HREADY 1b1; HRESP OKAY; end end endSlave响应类型对照表响应类型HRESPHREADY含义OKAY2b001传输正常完成ERROR2b011传输错误RETRY2b100→1要求重试传输SPLIT2b110→1分割传输4. 仲裁器与解码器设计仲裁器(Arbiter)和解码器(Decoder)是AHB总线的基础设施虽然功能相对固定但对系统性能有重要影响。4.1 仲裁器实现仲裁器采用简单的固定优先级算法CPU的优先级高于DMA。实际系统中可以根据需求实现更复杂的仲裁算法如轮询(Round-Robin)或基于带宽的动态优先级。module ahb_arbiter ( input wire HCLK, input wire HRESETn, // Master 0接口 (CPU) input wire HBUSREQ0, output wire HGRANT0, input wire HLOCK0, // Master 1接口 (DMA) input wire HBUSREQ1, output wire HGRANT1, input wire HLOCK1, // 全局信号 output reg [3:0] HMASTER, // 当前Master编号 output wire HMASTLOCK // 锁定传输指示 ); // 仲裁逻辑 always (posedge HCLK or negedge HRESETn) begin if (!HRESETn) begin HGRANT0 1b0; HGRANT1 1b0; HMASTER 4b0000; end else begin if (HLOCK0 HGRANT0) begin // 锁定传输中保持授权 end else if (HBUSREQ0) begin HGRANT0 1b1; HGRANT1 1b0; HMASTER 4b0000; end else if (HBUSREQ1) begin HGRANT0 1b0; HGRANT1 1b1; HMASTER 4b0001; end else begin HGRANT0 1b0; HGRANT1 1b0; HMASTER 4b0000; end end end assign HMASTLOCK (HGRANT0 HLOCK0) || (HGRANT1 HLOCK1); endmodule4.2 解码器实现解码器根据地址空间映射表生成各个Slave的片选信号。我们的系统采用如下地址映射Slave设备地址范围描述SRAM0x0000_0000 - 0x0000_0FFF4KB SRAMROM0x0000_1000 - 0x0000_1FFF4KB ROMAPB桥0x4000_0000 - 0x4000_FFFFAPB外设空间module ahb_decoder ( input wire [31:0] HADDR, output wire HSEL_SRAM, output wire HSEL_ROM, output wire HSEL_APB ); assign HSEL_SRAM (HADDR[31:12] 20h00000); assign HSEL_ROM (HADDR[31:12] 20h00001); assign HSEL_APB (HADDR[31:16] 16h4000); endmodule5. 系统集成与验证完成各个模块的设计后我们需要将它们集成到一个完整的系统中并进行全面的验证。5.1 顶层系统集成module ahb_system ( input wire clk, input wire resetn, // 其他系统接口... ); // 时钟和复位 wire HCLK clk; wire HRESETn resetn; // AHB信号 wire [31:0] HADDR; wire [2:0] HSIZE; wire [2:0] HBURST; wire [1:0] HTRANS; wire HWRITE; wire [31:0] HWDATA; wire [31:0] HRDATA; wire HREADY; wire [1:0] HRESP; // Master接口 wire HBUSREQ0, HGRANT0, HLOCK0; // CPU wire HBUSREQ1, HGRANT1, HLOCK1; // DMA // Slave片选 wire HSEL_SRAM, HSEL_ROM, HSEL_APB; // 实例化Master ahb_master cpu_master ( .HCLK(HCLK), .HRESETn(HRESETn), .HBUSREQ(HBUSREQ0), .HGRANT(HGRANT0), .HLOCK(HLOCK0), // 其他信号连接... ); // 实例化DMA Master ahb_master dma_master ( .HCLK(HCLK), .HRESETn(HRESETn), .HBUSREQ(HBUSREQ1), .HGRANT(HGRANT1), .HLOCK(HLOCK1), // 其他信号连接... ); // 实例化Arbiter ahb_arbiter arbiter ( .HCLK(HCLK), .HRESETn(HRESETn), .HBUSREQ0(HBUSREQ0), .HGRANT0(HGRANT0), .HLOCK0(HLOCK0), .HBUSREQ1(HBUSREQ1), .HGRANT1(HGRANT1), .HLOCK1(HLOCK1), .HMASTER(), .HMASTLOCK() ); // 实例化Decoder ahb_decoder decoder ( .HADDR(HADDR), .HSEL_SRAM(HSEL_SRAM), .HSEL_ROM(HSEL_ROM), .HSEL_APB(HSEL_APB) ); // 实例化Slave设备 ahb_sram sram ( .HCLK(HCLK), .HRESETn(HRESETn), .HSEL(HSEL_SRAM), // 其他信号连接... ); // 其他Slave实例化... endmodule5.2 验证策略与常见问题AHB系统的验证应当覆盖以下关键场景基本读写功能单次读写操作验证突发传输INCR4/WRAP4等突发传输验证仲裁测试多个Master同时请求总线时的优先级处理错误场景访问未映射地址空间Slave返回ERROR/RETRY/SPLIT响应总线锁定(HLOCK)场景常见问题及解决方案握手失败HREADY信号时序不正确检查Slave是否在地址周期后正确采样了控制信号确保Master在HREADY为高时才改变传输状态地址对齐错误// 检查地址是否按照HSIZE对齐 assert property ((posedge HCLK) (HTRANS NONSEQ || HTRANS SEQ) |- (HSIZE 3b000 || HADDR[0] 0) // 8位 (HSIZE 3b001 || HADDR[1:0] 0) // 16位 (HSIZE 3b010 || HADDR[2:0] 0) // 32位 );数据丢失突发传输中数据错位检查Master和Slave的地址增量逻辑验证HSIZE和HBURST信号的配合是否正确死锁问题确保仲裁器正确处理了SPLIT响应为每个Master设置合理的超时机制通过这个完整的AHB总线实现项目开发者不仅能够深入理解AMBA协议的精髓还能掌握复杂数字系统设计的方法论。FPGA实现使得这一学习过程更加直观和可验证为后续的ASIC设计打下坚实基础。
别再死记硬背AMBA总线了!用FPGA手把手带你搭建一个AHB总线系统(Verilog实战)
用FPGA实战AHB总线从零搭建可综合的AMBA互联系统在数字IC设计领域总线协议如同城市的交通网络决定了各个功能模块之间数据流动的效率和秩序。AMBA总线作为ARM公司推出的片上互联标准已经成为高性能嵌入式系统的基石。然而传统的理论学习方式往往让工程师陷入协议细节的泥潭难以真正掌握其精髓。本文将带领读者通过FPGA实战从零开始构建一个完整的AHB总线系统让抽象的总线协议活起来。1. AHB总线系统设计概述AHBAdvanced High-performance Bus是AMBA协议家族中的高性能成员专为高时钟频率系统模块设计。与纸上谈兵的理论学习不同我们将采用做中学的方式通过Verilog实现一个包含主设备(Master)、从设备(Slave)、仲裁器(Arbiter)和解码器(Decoder)的完整AHB系统。典型AHB系统包含以下核心组件AHB Master负责发起读写操作如处理器、DMA控制器等AHB Slave响应地址空间内的读写请求如存储器、外设等AHB Arbiter确保同一时间只有一个Master可以使用总线AHB Decoder解码地址并生成对应的Slave片选信号我们的实战项目将实现一个简化的系统两个MasterCPU和DMA通过AHB总线访问三个SlaveSRAM、ROM和APB桥。这种架构在嵌入式系统中非常典型能够覆盖AHB协议的大部分关键特性。提示在开始编码前建议先用框图绘制系统架构明确各模块的接口和连接关系。良好的前期规划可以避免后期大量的返工。2. AHB主设备(Master)设计与实现AHB Master是总线操作的发起者需要严格按照协议时序产生控制信号。我们将实现一个支持单次传输和增量突发(INCR burst)的简化Master模块。2.1 Master接口信号定义module ahb_master ( input wire HCLK, // 总线时钟 input wire HRESETn, // 总线复位(低有效) // 仲裁器接口 output wire HBUSREQ, // 总线请求 input wire HGRANT, // 总线授权 output wire HLOCK, // 锁定传输 // 全局信号 output wire [31:0] HADDR, // 地址总线 output wire [2:0] HSIZE, // 传输大小 output wire [2:0] HBURST, // 突发类型 output wire [1:0] HTRANS, // 传输类型 output wire HWRITE, // 读写控制 // 数据总线 output wire [31:0] HWDATA,// 写数据 input wire [31:0] HRDATA, // 读数据 // 响应信号 input wire HREADY, // 传输完成 input wire [1:0] HRESP, // 响应状态 // 用户接口 input wire start, // 用户启动信号 input wire [31:0] addr, // 用户地址 input wire write, // 用户读写 input wire [31:0] wdata, // 用户写数据 output reg [31:0] rdata, // 用户读数据 output reg done // 操作完成 );2.2 Master状态机设计AHB Master的核心是一个状态机负责按照协议时序产生各种控制信号。典型的状态包括IDLE状态等待用户启动信号发起总线请求ADDR_PHASE状态驱动地址和控制信号DATA_PHASE状态完成数据传输WAIT状态处理Slave插入的等待周期localparam [1:0] IDLE_ST 2b00, ADDR_ST 2b01, DATA_ST 2b10, WAIT_ST 2b11; always (posedge HCLK or negedge HRESETn) begin if (!HRESETn) begin state IDLE_ST; HTRANS IDLE; HBUSREQ 1b0; // 其他信号复位... end else begin case (state) IDLE_ST: begin if (start HGRANT) begin state ADDR_ST; HTRANS NONSEQ; HADDR addr; HWRITE write; HSIZE 3b010; // 32位传输 if (burst_en) HBURST INCR4; // 4拍突发 else HBURST SINGLE; end end ADDR_ST: begin if (HREADY) begin state DATA_ST; HTRANS burst_en ? SEQ : IDLE; if (HWRITE) HWDATA wdata; end end // 其他状态处理... endcase end end注意Master必须正确处理Slave返回的各种响应(HRESP)特别是ERROR、RETRY和SPLIT响应否则可能导致系统死锁。3. AHB从设备(Slave)设计与实现AHB Slave需要响应地址空间内的读写操作并按照协议产生适当的响应信号。我们将实现一个简单的SRAM控制器作为Slave示例。3.1 Slave接口与存储器模型module ahb_sram ( input wire HCLK, input wire HRESETn, // AHB Slave接口 input wire HSEL, // 片选信号 input wire [31:0] HADDR, // 地址总线 input wire [1:0] HTRANS, // 传输类型 input wire HWRITE, // 读写控制 input wire [2:0] HSIZE, // 传输大小 input wire [31:0] HWDATA, // 写数据 output reg [31:0] HRDATA, // 读数据 output reg HREADY, // 传输完成 output reg [1:0] HRESP // 响应状态 ); // 4KB SRAM模型 (32位宽) reg [31:0] memory [0:1023]; // 地址解码 wire [9:0] word_addr HADDR[11:2]; // 4KB空间32位字寻址3.2 Slave响应逻辑Slave必须根据HTRANS和HSEL信号判断是否需要响应当前传输并按照协议产生HREADY和HRESP信号。always (posedge HCLK or negedge HRESETn) begin if (!HRESETn) begin HREADY 1b1; HRESP OKAY; HRDATA 32h0; end else begin if (HSEL (HTRANS NONSEQ || HTRANS SEQ)) begin if (HWRITE) begin // 写操作 memory[word_addr] HWDATA; HREADY 1b1; HRESP OKAY; end else begin // 读操作 HRDATA memory[word_addr]; HREADY 1b1; HRESP OKAY; end end else begin HREADY 1b1; HRESP OKAY; end end endSlave响应类型对照表响应类型HRESPHREADY含义OKAY2b001传输正常完成ERROR2b011传输错误RETRY2b100→1要求重试传输SPLIT2b110→1分割传输4. 仲裁器与解码器设计仲裁器(Arbiter)和解码器(Decoder)是AHB总线的基础设施虽然功能相对固定但对系统性能有重要影响。4.1 仲裁器实现仲裁器采用简单的固定优先级算法CPU的优先级高于DMA。实际系统中可以根据需求实现更复杂的仲裁算法如轮询(Round-Robin)或基于带宽的动态优先级。module ahb_arbiter ( input wire HCLK, input wire HRESETn, // Master 0接口 (CPU) input wire HBUSREQ0, output wire HGRANT0, input wire HLOCK0, // Master 1接口 (DMA) input wire HBUSREQ1, output wire HGRANT1, input wire HLOCK1, // 全局信号 output reg [3:0] HMASTER, // 当前Master编号 output wire HMASTLOCK // 锁定传输指示 ); // 仲裁逻辑 always (posedge HCLK or negedge HRESETn) begin if (!HRESETn) begin HGRANT0 1b0; HGRANT1 1b0; HMASTER 4b0000; end else begin if (HLOCK0 HGRANT0) begin // 锁定传输中保持授权 end else if (HBUSREQ0) begin HGRANT0 1b1; HGRANT1 1b0; HMASTER 4b0000; end else if (HBUSREQ1) begin HGRANT0 1b0; HGRANT1 1b1; HMASTER 4b0001; end else begin HGRANT0 1b0; HGRANT1 1b0; HMASTER 4b0000; end end end assign HMASTLOCK (HGRANT0 HLOCK0) || (HGRANT1 HLOCK1); endmodule4.2 解码器实现解码器根据地址空间映射表生成各个Slave的片选信号。我们的系统采用如下地址映射Slave设备地址范围描述SRAM0x0000_0000 - 0x0000_0FFF4KB SRAMROM0x0000_1000 - 0x0000_1FFF4KB ROMAPB桥0x4000_0000 - 0x4000_FFFFAPB外设空间module ahb_decoder ( input wire [31:0] HADDR, output wire HSEL_SRAM, output wire HSEL_ROM, output wire HSEL_APB ); assign HSEL_SRAM (HADDR[31:12] 20h00000); assign HSEL_ROM (HADDR[31:12] 20h00001); assign HSEL_APB (HADDR[31:16] 16h4000); endmodule5. 系统集成与验证完成各个模块的设计后我们需要将它们集成到一个完整的系统中并进行全面的验证。5.1 顶层系统集成module ahb_system ( input wire clk, input wire resetn, // 其他系统接口... ); // 时钟和复位 wire HCLK clk; wire HRESETn resetn; // AHB信号 wire [31:0] HADDR; wire [2:0] HSIZE; wire [2:0] HBURST; wire [1:0] HTRANS; wire HWRITE; wire [31:0] HWDATA; wire [31:0] HRDATA; wire HREADY; wire [1:0] HRESP; // Master接口 wire HBUSREQ0, HGRANT0, HLOCK0; // CPU wire HBUSREQ1, HGRANT1, HLOCK1; // DMA // Slave片选 wire HSEL_SRAM, HSEL_ROM, HSEL_APB; // 实例化Master ahb_master cpu_master ( .HCLK(HCLK), .HRESETn(HRESETn), .HBUSREQ(HBUSREQ0), .HGRANT(HGRANT0), .HLOCK(HLOCK0), // 其他信号连接... ); // 实例化DMA Master ahb_master dma_master ( .HCLK(HCLK), .HRESETn(HRESETn), .HBUSREQ(HBUSREQ1), .HGRANT(HGRANT1), .HLOCK(HLOCK1), // 其他信号连接... ); // 实例化Arbiter ahb_arbiter arbiter ( .HCLK(HCLK), .HRESETn(HRESETn), .HBUSREQ0(HBUSREQ0), .HGRANT0(HGRANT0), .HLOCK0(HLOCK0), .HBUSREQ1(HBUSREQ1), .HGRANT1(HGRANT1), .HLOCK1(HLOCK1), .HMASTER(), .HMASTLOCK() ); // 实例化Decoder ahb_decoder decoder ( .HADDR(HADDR), .HSEL_SRAM(HSEL_SRAM), .HSEL_ROM(HSEL_ROM), .HSEL_APB(HSEL_APB) ); // 实例化Slave设备 ahb_sram sram ( .HCLK(HCLK), .HRESETn(HRESETn), .HSEL(HSEL_SRAM), // 其他信号连接... ); // 其他Slave实例化... endmodule5.2 验证策略与常见问题AHB系统的验证应当覆盖以下关键场景基本读写功能单次读写操作验证突发传输INCR4/WRAP4等突发传输验证仲裁测试多个Master同时请求总线时的优先级处理错误场景访问未映射地址空间Slave返回ERROR/RETRY/SPLIT响应总线锁定(HLOCK)场景常见问题及解决方案握手失败HREADY信号时序不正确检查Slave是否在地址周期后正确采样了控制信号确保Master在HREADY为高时才改变传输状态地址对齐错误// 检查地址是否按照HSIZE对齐 assert property ((posedge HCLK) (HTRANS NONSEQ || HTRANS SEQ) |- (HSIZE 3b000 || HADDR[0] 0) // 8位 (HSIZE 3b001 || HADDR[1:0] 0) // 16位 (HSIZE 3b010 || HADDR[2:0] 0) // 32位 );数据丢失突发传输中数据错位检查Master和Slave的地址增量逻辑验证HSIZE和HBURST信号的配合是否正确死锁问题确保仲裁器正确处理了SPLIT响应为每个Master设置合理的超时机制通过这个完整的AHB总线实现项目开发者不仅能够深入理解AMBA协议的精髓还能掌握复杂数字系统设计的方法论。FPGA实现使得这一学习过程更加直观和可验证为后续的ASIC设计打下坚实基础。