[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_PCIE通信(linux)连载-09PCIE 图像采集卡HDMI输入

文档创建者:FPGA课程
浏览次数:165
最后更新:2024-09-19
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 7-FPGA PCIE通信(Linux)
本帖最后由 FPGA课程 于 2024-9-19 08:59 编辑

​ 软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!



1概述
本方案使用自定义AXI4 IP FDMA 实现视频的采集和播放,关于FDMA的详细教程可以参考“米联客2024版FPGA数据缓存方案(PL-AXI-FDMA)”部分教程内容。
本方案实现了开发板HDMI视频采集后在PC上位机显示的功能。HDMI输入方案采用ADV7611,I2C的寄存器配置采用FPGA配置,已经封装成源码,方便大家使用。本方案的图片采集用到了XDMA的中断。
2系统构架
本系统HDMI输入方案采用ADV7611,I2C的寄存器配置采用Milianke uicfg7611 IP配置。通过Milianke uifdma_dbuf将数据写入 DDR。PCIE上位机使用XDMA IP通过AXI Interconnect IP读取存放在DDR中的视频数据。
ff0c3d70b0df40c58ffa36527b417790.jpg
3FPGA工程
cac82b2ca5874f0a8b309b369047e569.jpg
为了让AXI4总线效率最高,推荐进行如下设置
b6134be2673543f58428579298162e18.jpg
12fde1903c6a44059e1bada8a7c1726e.jpg
为了输出1920*1080的视频,还需要在模块调用中,设置缓存数量、视频视频分辨率等
62d0111154764fc7be8c609c5855712f.jpg
uifdma_dbuf每完成一帧图像传输后会发出中断信号,为了让uixdmairq可以正确获取到中断请求,需要对中断做一些变换。
  1. always @(posedge ui_clk)begin
  2. if(rstn_r3 == 1'b0)begin      xdma_irq_req <= 8'd0;
  3. end
  4. else if((fdma_wirq_r == 1'b0 & fdma_wirq == 1'b1))begin xdma_irq_req <= 0;
  5. xdma_irq_req[rbuf_sync_o[7:0]] <= 1'b1;
  6. end end
复制代码

4上位机程序设计
设置分辨率为1920*1080,视频输入是60FPS,上位机中断也是60FPS但是QT的显示效率较低,以60FPS的中断去显示,会卡死,所以上位机只处理一半的中断,图像输出30FPS。
  1. void MainWindow::on_pushButton_clicked()
  2. {
  3.     QString strmode = ui->pushButton->text();

  4.     if("PLAY" == strmode)
  5.     {
  6.         if(pcie_init()<0)
  7.         {
  8.             QMessageBox::information(this,"ERROR","pcie init error");
  9.             return;
  10.         }

  11.         image_h = ui->H_PIX->text().toUInt();
  12.         image_v = ui->V_PIX->text().toUInt();

  13.         m_Qimage = new QImage(c2h_align_mem_tmp,image_h,image_v,QImage::Format_RGB32);

  14.         if(!pcie_c2h_event0.isRunning()) {pcie_c2h_event0.isplay = true;pcie_c2h_event0.start();}
  15.        // if(!pcie_c2h_event1.isRunning()) {pcie_c2h_event1.isplay = true;pcie_c2h_event1.start();}
  16.         if(!pcie_c2h_event2.isRunning()) {pcie_c2h_event2.isplay = true;pcie_c2h_event2.start();}
  17.       //  if(!pcie_c2h_event3.isRunning()) {pcie_c2h_event3.isplay = true;pcie_c2h_event3.start();}
  18.         ui->pushButton->setText("STOP");

  19.     }
  20.     else
  21.     {

  22.         pcie_c2h_event0.isplay = false;
  23.         pcie_c2h_event1.isplay = false;
  24.         pcie_c2h_event2.isplay = false;
  25.         pcie_c2h_event3.isplay = false;

  26.     }
复制代码



5硬件安装
注意先下载程序,调试阶段下载bit文件,然后再开电脑。这样才能正确识别和后续测试工作正常开展。对于部分没有HDMI输入的开发板需要使用HDMI输入卡完成此实验。
283e89ffc3ba44ddb46af5be0d33ef70.jpg
6实验结果
开发板的HDMI输入接口插入HDMI视频源(一般为显卡输出),下图右侧为QT上位机显示采集的HDMI输入图像,分辨率为1920*1080。
b976e24b4b044c1285230e65b8da02b9.jpg



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则