1. Quad SPI IP核与AXI Lite总线交互详解
在FPGA开发中,AXI Lite总线作为轻量级总线协议,常用于寄存器配置等低速数据传输场景。Quad SPI IP核通过AXI Lite接口实现主机与从机之间的通信,其交互过程遵循严格的握手协议。本文将深入解析读写操作的完整时序,并分享实际工程中的调试经验。
1.1 AXI Lite总线基础架构
AXI Lite总线包含以下关键信号:
- 地址/控制通道:ARADDR(读地址)、AWADDR(写地址)、ARVALID/AWVALID(地址有效)、ARREADY/AWREADY(地址就绪)
- 数据通道:RDATA(读数据)、WDATA(写数据)、WSTRB(字节使能)、RVALID(读数据有效)、RREADY(读数据就绪)、WVALID(写数据有效)、WREADY(写数据就绪)
- 响应通道:BRESP(写响应)、BVALID(响应有效)、BREADY(响应就绪)
注意:AXI Lite与完整AXI协议的主要区别在于不支持突发传输、数据宽度固定为32/64位,且没有缓存一致性相关信号。
2. 读寄存器操作时序解析
读操作分为地址阶段和数据阶段两个独立通道:
2.1 地址通道握手流程
- 主机置位ARVALID并输出ARADDR(目标寄存器地址)
- 从机检测到ARVALID后,若准备好接收地址则置位ARREADY
- 当ARVALID和ARREADY同时有效时,地址传输完成(图中T1时刻)
2.2 数据通道传输流程
- 从机准备好数据后,置位RVALID并输出RDATA
- 主机在能够接收数据时置位RREADY
- 当RVALID和RREADY同时有效时,数据传输完成(图中T2时刻)
verilog复制// 典型读操作Verilog代码片段
assign m_axi_arvalid = ~axi_read_done & start_read;
assign m_axi_rready = 1'b1; // 通常保持就绪
always @(posedge clk) begin
if (m_axi_arready && m_axi_arvalid) begin
addr_phase_done <= 1'b1;
end
if (m_axi_rvalid && m_axi_rready) begin
read_data <= m_axi_rdata;
axi_read_done <= 1'b1;
end
end
2.3 读操作关键注意事项
- 地址保持:ARADDR必须在ARVALID有效期间保持稳定
- 超时处理:建议添加超时计数器(典型值100个时钟周期)
- 背压管理:当从机无法及时响应时,可能拉低ARREADY,主机需等待
3. 写寄存器操作时序详解
写操作需要同时管理地址通道和数据通道:
3.1 并行通道操作要求
- 地址通道(AWADDR/AWVALID/AWREADY)和数据通道(WDATA/WVALID/WREADY)必须同时激活
- 写响应通道(BVALID/BREADY)在写操作完成后返回状态
3.2 典型写时序流程
- 主机同时置位AWVALID和WVALID,分别输出AWADDR和WDATA
- 从机在准备好后同时置位AWREADY和WREADY
- 当两组握手信号都完成时(图中T3时刻),写操作进入响应阶段
- 从机完成写入后,通过BVALID返回BRESP响应码
- 主机用BREADY确认接收响应(图中T4时刻)
verilog复制// 典型写操作Verilog实现
assign m_axi_awvalid = ~axi_write_done & start_write;
assign m_axi_wvalid = m_axi_awvalid; // 同步激活
assign m_axi_bready = 1'b1;
always @(posedge clk) begin
if (m_axi_awready && m_axi_awvalid &&
m_axi_wready && m_axi_wvalid) begin
data_phase_done <= 1'b1;
end
if (m_axi_bvalid && m_axi_bready) begin
axi_write_done <= 1'b1;
if (m_axi_bresp != 2'b00)
error_flag <= 1'b1; // 错误处理
end
end
3.3 写操作工程实践要点
- 字节使能:WSTRB信号必须正确设置(如0xF表示32位全写)
- 响应检查:必须验证BRESP是否为2'b00(OKAY响应)
- 数据对齐:确保WDATA与地址对齐(特别是非32位访问时)
4. Quad SPI IP核特殊配置
4.1 寄存器映射示例
| 地址偏移 | 寄存器名称 | 功能描述 |
|---|---|---|
| 0x00 | CTRL | 控制寄存器(使能位、模式选择) |
| 0x04 | SR | 状态寄存器(忙标志、中断状态) |
| 0x08 | TX_DATA | 发送数据FIFO |
| 0x0C | RX_DATA | 接收数据FIFO |
| 0x10 | CLK_DIV | 时钟分频系数 |
4.2 典型配置流程
- 写CLK_DIV设置SCK时钟频率(计算公式:SCK = 主时钟/(2*(CLK_DIV+1)))
- 写CTRL寄存器[0]位使能IP核
- 轮询SR寄存器[0]位等待就绪
- 写入TX_DATA启动传输
- 读取RX_DATA获取结果
5. 调试技巧与常见问题
5.1 信号捕获策略
-
ILA配置建议:
- 必须捕获所有握手信号(xxVALID/xxREADY)
- 数据信号建议设置为模拟波形显示
- 触发条件设置为ARVALID或AWVALID上升沿
-
典型错误波形分析:
- 地址通道握手成功但数据通道无响应:从机FIFO可能已满
- 写操作卡在响应阶段:从机可能未置位BVALID
- 读数据错误:检查地址映射和时钟域交叉
5.2 性能优化技巧
- 流水线操作:在读操作未完成时即可发起新的地址请求
- 时钟域处理:当主从机时钟不同源时,建议使用AXI Register Slice
- 位宽匹配:32位主机访问16位外设时,需处理高低字节选择
6. 实际工程案例
6.1 Flash配置实现
通过Quad SPI配置W25Q128FV Flash的步骤:
- 写0x40000000(CTRL)设置SPI模式为Quad(CTRL[3:2]=2'b11)
- 写0x40000008(TX_DATA)发送Flash命令(如0xEB快速读)
- 写0x40000008连续发送地址字节
- 读0x4000000C(RX_DATA)获取返回数据
6.2 时序约束关键点
tcl复制# XDC约束示例
set_property -dict {PACKAGE_PIN AJ16 IOSTANDARD LVCMOS18} [get_ports spi_io0]
set_input_delay -clock [get_clocks axi_clk] 2.0 [get_ports spi_io*]
set_output_delay -clock [get_clocks axi_clk] 1.5 [get_ports spi_io*]
在实测中发现,当SCK频率超过50MHz时,需要严格约束IO延迟才能保证采样稳定。建议在PCB布局时保持SPI信号线等长(±100ps偏差内)。