当前位置:实例文章 » 其他实例» [文章]FPGA XDMA 中断模式实现 PCIE3.0 HDMI视频采集卡 提供2套工程源码和QT上位机源码

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定义测试bench
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.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

相关标签:fpga开发音视频
其他信息

其他资源

Top