FPGA XDMA 中断模式实现 PCIE3.0 HDMI视频采集卡 提供2套工程源码和QT上位机源码
发布人:shili8
发布时间:2025-02-07 00:37
阅读次数:0
**FPGA XDMA 中断模式实现 PCIE3.0 HDMI视频采集卡**
**前言**
本文描述了如何使用 FPGA 实现 XDMA 中断模式来支持 PCIE3.0 HDMI 视频采集卡。我们将提供两套工程源码和 QT 上位机源码。
**硬件环境**
* FPGA:Xilinx Zynq-7000 AP SoC* PCIE3.0接口* HDMI视频输入**软件环境**
* Vivado2022.1* Xilinx SDK2022.1* QT5.15.2**工程源码**
### FPGA工程源码(Vivado)
markdown# FPGA工程源码## XDMA中断模式实现PCIE3.0HDMI视频采集卡## 硬件环境* FPGA:Xilinx Zynq-7000 AP SoC* PCIE3.0接口* HDMI视频输入## 软件环境* Vivado2022.1* Xilinx SDK2022.1##工程源码结构### xdma_axi_if.v定义AXI接口和XDMA中断信号cmodule xdma_axi_if (
// AXI接口 input wire [31:0] axi_addr,
input wire [31:0] axi_rdata,
output wire [1:0] axi_rvalid,
output wire [1:0] axi_wready,
// XDMA中断信号 output wire xdma_irq);
// AXI接口定义axi_if #(.AWIDTH(32), .DWIDTH(32)) i_axi_if (
.awaddr(axi_addr),
.awvalid(1'b0),
.awready(),
.wdata(axi_rdata),
.wvalid(1'b0),
.wready(),
.bvalid(1'b0),
.bready(),
.araddr(axi_addr),
.arvalid(1'b0),
.arready(),
.rdata(axi_rdata),
.rvalid(axi_rvalid)
);
// XDMA中断信号定义assign xdma_irq = axi_rvalid;
endmodule
### pcie_xdma_if.v定义PCIE接口和XDMA中断信号cmodule pcie_xdma_if (
// PCIE接口 input wire [31:0] pcie_addr,
output wire [1:0] pcie_rvalid,
// XDMA中断信号 output wire xdma_irq);
// PCIE接口定义pcie_if #(.AWIDTH(32), .DWIDTH(32)) i_pcie_if (
.awaddr(pcie_addr),
.awvalid(1'b0),
.awready(),
.wdata(axi_rdata),
.wvalid(1'b0),
.wready(),
.bvalid(1'b0),
.bready(),
.araddr(pcie_addr),
.arvalid(1'b0),
.arready(),
.rdata(axi_rdata),
.rvalid(pcie_rvalid)
);
// XDMA中断信号定义assign xdma_irq = pcie_rvalid;
endmodule
### xdma_axi_if_tb.v定义测试benchcmodule xdma_axi_if_tb;
// AXI接口和XDMA中断信号wire [31:0] axi_addr;
wire [31:0] axi_rdata;
wire [1:0] axi_rvalid;
wire [1:0] axi_wready;
wire xdma_irq;
// PCIE接口和XDMA中断信号wire [31:0] pcie_addr;
wire [1:0] pcie_rvalid;
wire xdma_irq_pcie;
// 实例化AXI接口和XDMA中断信号xdma_axi_if i_xdma_axi_if (
.axi_addr(axi_addr),
.axi_rdata(axi_rdata),
.axi_rvalid(axi_rvalid),
.axi_wready(axi_wready),
.xdma_irq(xdma_irq)
);
// 实例化PCIE接口和XDMA中断信号pcie_xdma_if i_pcie_xdma_if (
.pcie_addr(pcie_addr),
.pcie_rvalid(pcie_rvalid),
.xdma_irq(xdma_irq_pcie)
);
// 测试benchinitial begin // 初始化AXI接口和XDMA中断信号 axi_addr =32'h0000_0000;
axi_rdata =32'h0000_0000;
axi_rvalid =2'b00;
axi_wready =2'b00;
// 初始化PCIE接口和XDMA中断信号 pcie_addr =32'h0000_0000;
pcie_rvalid =2'b00;
xdma_irq_pcie =1'b0;
// 等待测试bench完成 #100ns;
end// 观察AXI接口和XDMA中断信号always @(posedge axi_rvalid) begin $display("AXI接口和XDMA中断信号:%h", axi_addr);
end// 观察PCIE接口和XDMA中断信号always @(posedge pcie_rvalid) begin $display("PCIE接口和XDMA中断信号:%h", pcie_addr);
endendmodule
### xdma_axi_if_tb.sv定义测试bench(使用SystemVerilog)cmodule xdma_axi_if_tb;
// AXI接口和XDMA中断信号wire [31:0] axi_addr;
wire [31:0] axi_rdata;
wire [1:0] axi_rvalid;
wire [1:0] axi_wready;
wire xdma_irq;
// PCIE接口和XDMA中断信号wire [31:0] pcie_addr;
wire [1:0] pcie_rvalid;
wire xdma_irq_pcie;
// 实例化AXI接口和XDMA中断信号xdma_axi_if i_xdma_axi_if (
.axi_addr(axi_addr),
.axi_rdata(axi_rdata),
.axi_rvalid(axi_rvalid),
.axi_wready(axi_wready),
.xdma_irq(xdma_irq)
);
// 实例化PCIE接口和XDMA中断信号pcie_xdma_if i_pcie_xdma_if (
.pcie_addr(pcie_addr),
.pcie_rvalid(pcie_rvalid),
.xdma_irq(xdma_irq_pcie)
);
// 测试benchinitial begin // 初始化AXI接口和XDMA中断信号 axi_addr =32'h0000_0000;
axi_rdata =32'h0000_0000;
axi_rvalid =2'b00;
axi_wready =2'b00;
// 初始化PCIE接口和XDMA中断信号 pcie_addr =32'h0000_0000;
pcie_rvalid =2'b00;
xdma_irq_pcie =1'b0;
// 等待测试bench完成 #100ns;
end// 观察AXI接口和XDMA中断信号always @(posedge axi_rvalid) begin $display("AXI接口和XDMA中断信号:%h", axi_addr);
end// 观察PCIE接口和XDMA中断信号always @(posedge pcie_rvalid) begin $display("PCIE接口和XDMA中断信号:%h", pcie_addr);
endendmodule
### xdma_axi_if_tb_qt.cpp定义QT上位机源码(使用C++)cpp#include
#include
#include
#include
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QLabel label("AXI接口和XDMA中断信号:");
QLineEdit edit;
QPushButton button("观察");
connect(&button, &QPushButton::clicked, [&]() {
QString text = edit.text();
if (!text.isEmpty()) {
int addr = text.toInt();
// 观察AXI接口和XDMA中断信号 label.setText(QString("AXI接口和XDMA中断信号:%1").arg(addr));
}
});
button.show();
return a.exec();
}
### xdma_axi_if_tb_qt.py定义QT上位机源码(使用Python)import sysfrom PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QPushButtonclass MyWindow(QLabel):
def __init__(self