查看: 1032|回复: 0

[原创] 测评|米尔基于ARM+FPGA开发板的pcie2screen测试例程

[复制链接]
  • TA的每日心情

    2019-10-15 10:48
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2023-2-24 16:42:32 | 显示全部楼层 |阅读模式
    分享到:
    本篇测评由电子发烧友的优秀测评者“zealsoft”提供。

    本次测试内容为米尔MYD-JX8MMA7开发板其ARM端的测试例程pcie2screen并介绍一下FPGA端程序的修改。

    01.测试例程pcie2screen   
    例程pcie2screen是配合MYD-JX8MMA7开发板所带的MYIR_PCIE_5T_CMOS 工程的测试例,它的作用是显示FPGA所连接的摄像头所采集的视频。运行该程序后屏幕会显示一个标题为demo的窗口。
    128.png



    使用鼠标点击 ready按钮,demo 窗口会显示连续的视频,说明摄像头、DDR、PCIE接口各部分正常。如果没有接摄像头,该程序会显示杂乱无章的图像。    该测试例的源码没有包括在SDK中,可以向米尔公司的技术人员索取。该实例程序是用Qt开发的,使用了OpenGL技术。程序包括以下几个主要的类:
    • MainWindow:QMainWindow子类,是显示窗口的。
    • uOpenglYuv:QOpenGLWidget子类,用于显示采集到的图像。该类的initializeGL函数用于初始化OpenGL。paintGL函数是用于绘制图像的,其中最核心的语句是:
    1. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, vW, vH, 0, GL_RGBA, GL_UNSIGNED_BYTE, pRGB);
    复制代码

    其中的pRGB保存从FPGA读取的数据。从这句我们可以看出该程序所要求的图像的格式。

    • xdma_getImg:主线程类
    • xdma_programe:对RIFFA接口进行了封装,其中的read_pack用于读取FPGA数据,被主线程循环调用。其函数定义如下:


    1. int xdma_programe::read_pack(char *pData, int len)
    复制代码


    从函数中可以看出,在每次读数据前,该函数先向FPGA写一次数据(数据无意义,和FPGA的状态机有关),每次读入一整帧的数据。

    02.FPGA端程序的修改   
    FPGA端的逻辑控制在chnl_tester.v中,它定义了一个状态机,用于对数据收发进行控制。状态机定义如下:
    1. always @(posedge CLK or posedge RST) begin
    2.         if (RST) begin
    3.                 rLen <= #1 0;
    4.                 rCount <= #1 0;
    5.                 rState <= #1 0;
    6.                 rData <= #1 0;
    7.                 vout_vs_r <= #1 0;
    8.         end
    9.         else begin
    10.           case (rState)

    11.                 3'd0: begin // Wait for start of RX, save length
    12.                         if (CHNL_RX) begin
    13.                                 rLen <= #1 CHNL_RX_LEN;
    14.                                 rCount <= #1 0;
    15.                                 rState <= #1 3'd1;
    16.                         end
    17.                 end

    18.                 3'd1: begin // Wait for last data in RX, save value
    19.                         if (CHNL_RX_DATA_VALID) begin
    20.                                 rData <= #1 CHNL_RX_DATA;
    21.                                 rCount <= #1 rCount + (C_PCI_DATA_WIDTH/32);
    22.                         end
    23.                         if (rCount >= rLen)begin
    24.                                 rState <= #1 3'd2;
    25.                                 end
    26.                 end

    27.                 3'd2: begin // Prepare for TX
    28.                         if (read_valid) begin               
    29.                              rCount <= #1 0;
    30.                              rState <= #1 3'd3;
    31.                              end
    32.                 end

    33.                 3'd3: begin // Start TX with save length and data value
    34.                         if (CHNL_TX_DATA_REN) begin
    35.                                 //rData <= #1 data_in;
    36.                                 rCount <= #1 rCount + (C_PCI_DATA_WIDTH/32);
    37.                                 if (rCount >= rLen)
    38.                                         rState <= #1 3'd4;               
    39.                         end
    40.                 end
    41.                 3'd4: begin
    42.             if (vout_vs_r)         
    43.                 rState <= #1 3'd5;
    44.             else begin               
    45.                         vout_vs_r <= #1 1;
    46.                         rState <= #1 3'd4;
    47.                         rCount <= #1 0;
    48.                         end
    49.                 end        
    50.                 3'd5: begin
    51.              if (vs_flag) begin         
    52.                  rState <= #1 3'd0;
    53.                  vout_vs_r <= #1 0;
    54.                  end
    55.              else                 
    56.                  rState <= #1 3'd5;
    57.          end                                      
    58.           endcase
    59.         end
    60. end
    复制代码


    我们手头没有摄像头进行测试,所以简单修改该程序,使程序发送蓝色渐变色带信号。核心修改如下:
    1. ……
    2. reg [31:0] rColor = 0;
    3. ……
    4. assign CHNL_TX_DATA = (read_en)? {rColor, rColor}:64'd0;
    5. ……
    6.                 3'd3: begin // Start TX with save length and data value
    7.                         if (CHNL_TX_DATA_REN) begin
    8.                                 //rData <= #1 data_in;
    9. //                                if (rCount % 5 == 4)
    10.                 rColor <= #1 rColor + 1;
    11.                                 if(rColor >= 255)
    12.                                     rColor <= #1 0;
    13.                                 rCount <= #1 rCount + (C_PCI_DATA_WIDTH/32);
    14.                                 if (rCount >= rLen)
    15.                                         rState <= #1 3'd4;               
    16.                         end
    17.                 end
    18. ……
    复制代码


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 13:35 , Processed in 0.126453 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.