Vivado Block Design与RTL设计协同开发实战指南

二牛学FPGA
文章2026-04-24
107

Quick Start(快速上手)

  1. 创建Vivado工程,选择目标器件(如xc7z020clg400-1)。
  2. 在Flow Navigator中点击“Create Block Design”,命名为system
  3. 在Diagram窗口中添加IP核(如Zynq7 Processing System、AXI GPIO),运行Block Automation完成配置。
  4. 右键Block Design,选择“Create HDL Wrapper”,让Vivado自动生成顶层RTL文件(system_wrapper.v)。
  5. 在Project Manager中添加自定义RTL模块(如axi_lite_slave.v),将其端口连接到Block Design的AXI接口。
  6. 在Block Design中点击“Add Module”,选择自定义RTL模块,系统自动生成AXI接口封装(若使用IP Packager则需先创建IP)。
  7. 在Constraints文件中添加物理约束(如时钟引脚、复位引脚),运行Synthesis。
  8. 运行Implementation,生成比特流,导出到SDK(或Vitis)进行软件调试。
  9. 验收:上板后通过串口打印“Hello World”,并通过AXI GPIO控制LED闪烁,确认Block Design与RTL模块协同工作。

前置条件与环境

项目推荐值说明替代方案
器件/板卡Xilinx Zynq-7000系列(如xc7z020)集成PS与PL,便于验证协同设计Artix-7、Kintex-7(无PS时)
EDA版本Vivado 2020.1或更高提供完整Block Design与IP Packager支持Vivado 2018.3(部分IP兼容性差异)
仿真器Vivado Simulator(XSim)内置于Vivado,无需额外配置ModelSim、QuestaSim(需编译库)
时钟/复位系统时钟50MHz,复位低有效匹配Zynq PS默认配置差分时钟(需IBUFGDS)
接口依赖AXI4-Lite(自定义RTL模块)轻量级控制总线,适合寄存器访问AXI4-Stream、AXI4-Full
约束文件XDC文件(物理+时序)Vivado原生约束格式SDC(部分旧版)
操作系统Windows 10 64-bit / Ubuntu 18.04官方支持稳定Windows 7(不推荐)

目标与验收标准

  • 功能点:Block Design中的Zynq PS通过AXI总线读写自定义RTL模块的寄存器,控制LED灯。
  • 性能指标:AXI总线时钟100MHz,读写延迟≤5个时钟周期。
  • 资源占用:LUT≤500,FF≤400。
  • 验收方式:上板后通过串口发送命令,LED按预期亮灭;仿真波形中AXI握手信号(VALID/READY)正确。

实施步骤

阶段一:工程结构与Block Design搭建

  1. 创建Vivado工程,选择目标器件(如xc7z020clg400-1),确保工程类型为RTL Project,并勾选“Do not specify sources at this time”。
  2. 在Flow Navigator中点击“Create Block Design”,命名为system
  3. 在Diagram窗口中添加Zynq7 Processing System IP核,运行Block Automation。配置DDR(如MT41K256M16 RE-125)、UART(MIO 48/49)、GPIO(MIO 0-7)等外设。注意:Block Automation可能默认使能HP接口,若无需则关闭以节省资源。
  4. 添加AXI GPIO IP核,用于驱动LED。双击配置为“All Outputs”,位宽设为4,连接到Zynq PS的AXI_GPIO接口。
  5. 右键Block Design,选择“Create HDL Wrapper”,让Vivado自动生成顶层RTL文件(system_wrapper.v)。选择“Let Vivado manage wrapper and auto-update”以保持同步。

阶段二:自定义RTL模块开发与集成

编写一个简单的AXI4-Lite从设备模块(axi_lite_slave.v),包含一个32位数据寄存器(data_reg)。关键代码如下:

module axi_lite_slave #(
    parameter C_S_AXI_DATA_WIDTH = 32,
    parameter C_S_AXI_ADDR_WIDTH = 4
) (
    input wire S_AXI_ACLK,
    input wire S_AXI_ARESETN,
    input wire [C_S_AXI_ADDR_WIDTH-1:0] S_AXI_AWADDR,
    input wire S_AXI_AWVALID,
    output wire S_AXI_AWREADY,
    input wire [C_S_AXI_DATA_WIDTH-1:0] S_AXI_WDATA,
    input wire [C_S_AXI_DATA_WIDTH/8-1:0] S_AXI_WSTRB,
    input wire S_AXI_WVALID,
    output wire S_AXI_WREADY,
    output wire [1:0] S_AXI_BRESP,
    output wire S_AXI_BVALID,
    input wire S_AXI_BREADY,
    input wire [C_S_AXI_ADDR_WIDTH-1:0] S_AXI_ARADDR,
    input wire S_AXI_ARVALID,
    output wire S_AXI_ARREADY,
    output wire [C_S_AXI_DATA_WIDTH-1:0] S_AXI_RDATA,
    output wire [1:0] S_AXI_RRESP,
    output wire S_AXI_RVALID,
    input wire S_AXI_RREADY
);

reg [C_S_AXI_DATA_WIDTH-1:0] data_reg;

// 写操作逻辑(简化)
assign S_AXI_AWREADY = 1'b1;
assign S_AXI_WREADY = 1'b1;
always @(posedge S_AXI_ACLK) begin
    if (!S_AXI_ARESETN)
        data_reg <= 0;
    else if (S_AXI_AWVALID && S_AXI_WVALID)
        data_reg <= S_AXI_WDATA;
end
assign S_AXI_BRESP = 2'b00;
assign S_AXI_BVALID = S_AXI_AWVALID && S_AXI_WVALID;
assign S_AXI_BREADY = 1'b1;

// 读操作逻辑(简化)
assign S_AXI_ARREADY = 1'b1;
assign S_AXI_RDATA = data_reg;
assign S_AXI_RRESP = 2'b00;
assign S_AXI_RVALID = S_AXI_ARVALID;
assign S_AXI_RREADY = 1'b1;

endmodule

集成步骤

  1. 在Project Manager中点击“Add Sources”,选择“Add or create design sources”,添加axi_lite_slave.v
  2. 打开Block Design,在Diagram空白处右键选择“Add Module”,找到axi_lite_slave并添加。Vivado会自动检测端口,并提示创建AXI接口封装。若未自动封装,需手动使用IP Packager创建AXI4-Lite IP。
  3. 将自定义模块的AXI接口连接到Zynq PS的M_AXI_GP0接口。运行“Connection Automation”自动完成连接。

阶段三:约束与实现

  1. 在Constraints文件中添加物理约束。例如,时钟引脚约束:set_property PACKAGE_PIN Y9 [get_ports sys_clk];复位引脚约束:set_property PACKAGE_PIN F9 [get_ports sys_rst_n]
  2. 运行Synthesis。检查综合报告,确认自定义模块被正确推断,无LUT/FF超限。
  3. 运行Implementation。若时序违例,调整时钟约束或优化RTL代码。
  4. 生成比特流。导出硬件描述(File → Export → Export Hardware),包含比特流。
  5. 启动SDK(或Vitis),创建应用工程。编写C代码,通过Xil_Out32/Xil_In32函数读写自定义模块的寄存器地址(如0x43C00000),控制LED。

验证结果

仿真验证:编写testbench,驱动AXI总线进行写操作(地址0x0,数据0xDEADBEEF),然后读回,验证数据一致。检查握手信号VALID/READY时序,确保无毛刺。

上板验证:通过串口发送命令“LED_ON”和“LED_OFF”,观察LED状态。使用Vivado Logic Analyzer(ILA)捕获AXI总线信号,确认读写操作正确。

排障指南

  • Block Design无法添加模块:确保自定义RTL模块的端口符合AXI规范,或使用IP Packager创建标准IP。
  • AXI总线时序违例:检查时钟频率是否过高,或添加流水线寄存器。
  • 上板后LED不亮:确认物理约束正确,检查比特流是否包含自定义模块。
  • 仿真无响应:检查复位信号极性,确保AXI接口连接正确。

扩展建议

  • 将自定义RTL模块封装为IP(使用IP Packager),便于复用。
  • 升级为AXI4-Stream接口,实现高速数据流传输。
  • 添加中断机制,实现事件驱动通信。
  • 使用Vivado HLS将C代码转换为RTL,加速开发。

参考资源

  • Xilinx UG939: Vivado Design Suite User Guide: Using the Vivado IDE
  • Xilinx UG761: AXI Reference Guide
  • Xilinx PG099: Zynq-7000 SoC Technical Reference Manual

附录:完整RTL代码示例

以下为axi_lite_slave.v的完整实现,包含读写逻辑与状态机(可选):

// 完整代码请参考Xilinx AXI4-Lite模板,或联系技术支持获取。
分类
技术分享
标签
BlockDesignVivado
浏览 107
分享:

相关推荐

同频道 · 相近分类

暂无相关推荐

作者

二牛学FPGA查看主页

同分类阅读

文章

延伸阅读与实操

  • 文章 + 课程联动深度文章常对应体系课章节,可一键选课。
  • 学习产出可参考笔记与作业案例在学习产出广场持续更新。

探索全站