Quick Start(快速上手)
- 创建Vivado工程,选择目标器件(如xc7z020clg400-1)。
- 在Flow Navigator中点击“Create Block Design”,命名为
system。 - 在Diagram窗口中添加IP核(如Zynq7 Processing System、AXI GPIO),运行Block Automation完成配置。
- 右键Block Design,选择“Create HDL Wrapper”,让Vivado自动生成顶层RTL文件(
system_wrapper.v)。 - 在Project Manager中添加自定义RTL模块(如
axi_lite_slave.v),将其端口连接到Block Design的AXI接口。 - 在Block Design中点击“Add Module”,选择自定义RTL模块,系统自动生成AXI接口封装(若使用IP Packager则需先创建IP)。
- 在Constraints文件中添加物理约束(如时钟引脚、复位引脚),运行Synthesis。
- 运行Implementation,生成比特流,导出到SDK(或Vitis)进行软件调试。
- 验收:上板后通过串口打印“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搭建
- 创建Vivado工程,选择目标器件(如xc7z020clg400-1),确保工程类型为RTL Project,并勾选“Do not specify sources at this time”。
- 在Flow Navigator中点击“Create Block Design”,命名为
system。 - 在Diagram窗口中添加Zynq7 Processing System IP核,运行Block Automation。配置DDR(如MT41K256M16 RE-125)、UART(MIO 48/49)、GPIO(MIO 0-7)等外设。注意:Block Automation可能默认使能HP接口,若无需则关闭以节省资源。
- 添加AXI GPIO IP核,用于驱动LED。双击配置为“All Outputs”,位宽设为4,连接到Zynq PS的AXI_GPIO接口。
- 右键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集成步骤:
- 在Project Manager中点击“Add Sources”,选择“Add or create design sources”,添加
axi_lite_slave.v。 - 打开Block Design,在Diagram空白处右键选择“Add Module”,找到
axi_lite_slave并添加。Vivado会自动检测端口,并提示创建AXI接口封装。若未自动封装,需手动使用IP Packager创建AXI4-Lite IP。 - 将自定义模块的AXI接口连接到Zynq PS的M_AXI_GP0接口。运行“Connection Automation”自动完成连接。
阶段三:约束与实现
- 在Constraints文件中添加物理约束。例如,时钟引脚约束:
set_property PACKAGE_PIN Y9 [get_ports sys_clk];复位引脚约束:set_property PACKAGE_PIN F9 [get_ports sys_rst_n]。 - 运行Synthesis。检查综合报告,确认自定义模块被正确推断,无LUT/FF超限。
- 运行Implementation。若时序违例,调整时钟约束或优化RTL代码。
- 生成比特流。导出硬件描述(File → Export → Export Hardware),包含比特流。
- 启动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模板,或联系技术支持获取。


