0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用ALINX VD100开发板实现图像处理

ALINX 来源:ALINX 2025-05-12 09:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本篇文章来自 FPGA 大神、Ardiuvo & Hackster.IO 知名博主 Adam Taylor。在这里感谢 Adam Taylor 对 ALINX 产品的关注与测试。为了让文章更易阅读,我们在原文的基础上作了一些灵活的调整,包括对一些专业名词进行了补充解释,便于初学者快速理解。原文链接已贴在文章底部,点击"阅读原文"即可跳转。欢迎大家在评论区友好互动。

最近,我在办公室里搞了一块ALINX VD100

fab5d25a-24de-11f0-9310-92fbcf53809c.png

这是一块基于AMD Versal Edge AI平台的开发板,功能特别强大,可以用来做图像处理、人工智能等各种高阶应用。

为了方便随时开发,我把它连到了公司局域网,远程就能连接,由此开始了我的折腾之旅。

这次,我最想探索的是:怎么在这块板子上跑图像处理的应用

VD100不仅带了两个 MIPI 摄像头接口,还能直接连上LCD屏幕,基本满足了图像应用开发的需求。

第一步:让屏幕先亮起来!

搞摄像头太复杂,我决定先从屏幕入手——先通过测试图案生成器(Test Pattern Generator)验证 LCD 屏幕图像显示链路的有效性。

ALINX VD100开发板支持的 LCD 屏幕,分辨率是1280×720(WXGA 标准)


数据传输采用的是VESA 标准的 LVDS 接口

这里稍微解释一下:

LVDS(低压差分信号)是一种高速又抗干扰的数据传输方式,特别适合屏幕传输高速画面。

VESA 和 JEIDA 是常见的两种 LVDS 传输标准,咱们用的是 VESA。VESA 更国际通用,JEIDA 常见于日本厂商。

在 VESA 标准下使用 RG888 格式时,屏幕的每一帧图像数据和控制信号(如同步信号 hsync、vsync)会被打包进 4 条数据通道里,同时还有第 5 条通道专门传时钟(Clock),方便接收端正确还原数据。

faef468e-24de-11f0-9310-92fbcf53809c.png

每次时钟跳动时,每条数据通道都会同步传7 位数据。

听起来有点复杂?简单说就是:用 4+1 条小路,高速搬运屏幕画面。

开发流程:搭建系统设计

为了让板子顺利传屏幕数据,我们需要在 Vivado(AMD/Xilinx 的开发工具)里做一套设计,包括:

CIPS
→ 配置 VD100 平台上的 V100 SoM。

NOC
→ 配置 DDRMC,并开两条 MAXI 输出,提供数据存取支持。

视频测试图生成器 (Video Test Pattern Generator, TPG)
→ 通过 AXI Lite 总线连接到 NOC,生成标准图像(比如彩条、棋盘格)。

视频时序生成器 (Video Timing Controller, VTC)
→ 通过 AXI Lite 总线连接到 NOC,生成 LCD 显示需要的同步信号(如 hsync、vsync)。

AXI4-Stream to Video Out
→ 与上述两个生成器相连,把测试图和时序信息组织成并行视频流(RGB888格式)。

LCD_LVDS IP核
→ 把并行视频信号转成符合 LVDS 规范的数据流。

Advanced IO Wizard
→ 负责真正的串行化操作,把数据以 LVDS 标准发出去(包括 4 路数据+ 1 路时钟)。

最终 LCD 屏幕接收到 LVDS 信号并显示图像。

这套设计(可以在我的 GitHub 上找到)如下所示:

fb0de472-24de-11f0-9310-92fbcf53809c.png

通过这个系统,我们可以使用 CIPS 内置的处理器来控制测试图案,从而验证各颜色通道是否正常。

设置和驱动 LCD 显示器的 CIPS 端代码也非常简单,如下所示:

#include
#include"platform.h"
#include"xil_printf.h"
#include"xvtc.h"
#include"xparameters.h"
#include"xv_tpg.h"
#include"xvidc.h"
#include"vga.h"


XV_tpg   tpg;
XVtc   VtcInst;
VideoMode  video;
XVtc_Config *vtc_config ;


intmain()
{
  XVtc_SourceSelect SourceSelect;
  XVtc_Timing vtcTiming;
  u32 height,width,status;
 init_platform();


 print("Setting up Timing

");
  vtc_config =XVtc_LookupConfig(XPAR_XVTC_0_BASEADDR);    
 XVtc_CfgInitialize(&VtcInst,vtc_config ,XPAR_XVTC_0_BASEADDR);


 print("Setting up Video

");
  video = VMODE_1280x720 ;
 vtcTiming.HActiveVideo = video.width; 
 vtcTiming.HFrontPorch = video.hps - video.width; 
 vtcTiming.HSyncWidth = video.hpe - video.hps;  
 vtcTiming.HBackPorch = video.hmax - video.hpe +1; 
 vtcTiming.HSyncPolarity = video.hpol; 
 vtcTiming.VActiveVideo = video.height; 
 vtcTiming.V0FrontPorch = video.vps - video.height; 
 vtcTiming.V0SyncWidth = video.vpe - video.vps; 
 vtcTiming.V0BackPorch = video.vmax - video.vpe +1;; 
 vtcTiming.V1FrontPorch = video.vps - video.height; 
 vtcTiming.V1SyncWidth = video.vpe - video.vps; 
 vtcTiming.V1BackPorch = video.vmax - video.vpe +1;
 vtcTiming.VSyncPolarity = video.vpol; 
 vtcTiming.Interlaced =0;


 print("Setting up TPG

");


  XV_tpg_Initialize(&tpg,XPAR_XV_TPG_0_BASEADDR );
   status =XV_tpg_IsIdle(&tpg);
  XV_tpg_Set_height(&tpg, (u32) video.height);
XV_tpg_Set_width(&tpg, (u32) video.width);
 height =XV_tpg_Get_height(&tpg);
 width =XV_tpg_Get_width(&tpg);
XV_tpg_Set_colorFormat(&tpg,XVIDC_CSF_RGB);
  XV_tpg_Set_bckgndId(&tpg,XTPG_BKGND_TARTAN_COLOR_BARS);
XV_tpg_Set_maskId(&tpg,0x0);
XV_tpg_Set_motionSpeed(&tpg,0x4);
  XV_tpg_EnableAutoRestart(&tpg);
XV_tpg_Start(&tpg);


 print("Setting up Source

");


memset((void*)&SourceSelect,0,sizeof(XVtc_SourceSelect));
 SourceSelect.VBlankPolSrc =1;
 SourceSelect.VSyncPolSrc =1;
 SourceSelect.HBlankPolSrc =1;
 SourceSelect.HSyncPolSrc =1;
 SourceSelect.ActiveVideoPolSrc =1;
 SourceSelect.ActiveChromaPolSrc=1;
 SourceSelect.VChromaSrc =1;
 SourceSelect.VActiveSrc =1;
 SourceSelect.VBackPorchSrc =1;
 SourceSelect.VSyncSrc =1;
 SourceSelect.VFrontPorchSrc =1;
 SourceSelect.VTotalSrc =1;
 SourceSelect.HActiveSrc =1;
 SourceSelect.HBackPorchSrc =1;
 SourceSelect.HSyncSrc =1;
 SourceSelect.HFrontPorchSrc =1;
 SourceSelect.HTotalSrc =1;


 print("Run Timing Gen

");  


XVtc_SetGeneratorTiming(&VtcInst, &vtcTiming);
XVtc_SetSource(&VtcInst, &SourceSelect);
XVtc_EnableGenerator(&VtcInst);
 XVtc_RegUpdateEnable(&VtcInst);
XVtc_Enable(&VtcInst);


while(1){


  };


 cleanup_platform();
return0;
}

LCD_LVDS 这个模块,我是直接从 ALINX 的 GitHub 仓库上下载的。

下载好后,把它加到 Vivado 里面,就能像拼积木一样拖进设计里。

LCD_LVDS 下载链接:https://github.com/alinxalinx/VD100_2023.2/tree/master/Demo/course_s1

写好所有程序后,我们让开发板运行,屏幕上果然显示出了测试图案,色彩鲜明,说明各个颜色通道都正常了。开发板和屏幕之间的沟通,算是正式打通了!

fb3178ba-24de-11f0-9310-92fbcf53809c.png

fb6b2da8-24de-11f0-9310-92fbcf53809c.png

不过,这里面有个很有意思的事情。

Advanced IO Wizard 这个模块,默认是按 8 位一组来打包数据发出去的。

而我们的 VESA LVDS 传输,要求 7 位一组。这咋办?

我用到了一个叫做 Gearbox 的小模块,把 7 位数据转换成 4 位数据输出。

然后,用 Advanced IO Wizard 把 4 位数据高速串行发出去。

这样就实现了 7 位序列化,虽然中间多了一步变换,但整体还是很高效的。

不过,其实只要手动配置一下,Advanced IO Wizard 也是可以支持直接 7 位打包发送的,只是这次参考了 AMD 的官方应用笔记(参考代码叫 tx_piso_7to1),所以先用了 Gearbox 的方式。

未来有机会的话,我想试着优化一下,直接用 7 位串行模式,把系统做得更简洁高效!

接下来要做的

现在图像输出环节已经搞定了,接下来就是更刺激的前端部分:

通过 MIPI 接口接入摄像头,把真实拍到的图像,实时显示到屏幕上。

真正的图像处理任务,马上就要开始啦!

(未完待续)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1655

    文章

    22287

    浏览量

    630311
  • amd
    amd
    +关注

    关注

    25

    文章

    5647

    浏览量

    139028
  • 图像处理
    +关注

    关注

    28

    文章

    1340

    浏览量

    59181
  • lvds
    +关注

    关注

    2

    文章

    1216

    浏览量

    69125
  • 开发板
    +关注

    关注

    25

    文章

    6125

    浏览量

    113370

原文标题:【实战笔记】FPGA 大神 Adam Taylor 使用 ALINX VD100(AMD Versal系列)开发平台实现图像处理

文章出处:【微信号:ALINX,微信公众号:ALINX】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FPGA 大神 Adam Taylor 使用 ALINX VD100(AMD Versal系列)开发平台实现图像处理

    本篇文章来自 FPGA 大神、Ardiuvo XVtc VtcInst;VideoMode video;XVtc_Config *vtc_config ;int main(){ XVtc_SourceSelect SourceSelect; XVtc_Timing vtcTiming; u32 height,width,status; init_platform(); print("Setting up Timingnr"); vtc_config = XVtc_LookupConfig(XPAR_XVTC_0_BASEADDR); XVtc_CfgInitialize( print("Setting up Videonr"); video = VMODE_1280x720 ;vtcTiming.HActiveVideo = video.width;vtcTiming.HFrontPorch = video.hps - video.width;vtcTiming.HSyncWidth = video.hpe - video.hps;vtcTiming.HBackPorch = video.hmax - video.hpe + 1;vtcTiming.HSyncPolarity = video.hpol;vtcTiming.VActiveVideo
    的头像 发表于 05-16 09:46 2190次阅读
    FPGA 大神 Adam Taylor 使用 <b class='flag-5'>ALINX</b> <b class='flag-5'>VD100</b>(AMD Versal系列)<b class='flag-5'>开发</b>平台<b class='flag-5'>实现</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>

    51开发板实现计算器

    51开发板实现计算器,感兴趣的小伙伴们可以瞧一瞧。
    发表于 11-23 16:06 13次下载

    DSP开发板实验程序

    DSP开发板实验程序
    发表于 02-08 02:27 5次下载

    STM32F103ZET6开发板实现俄罗斯方块小游戏

    使用STM32F103ZET6开发板实现俄罗斯方块小游戏。
    发表于 12-19 15:27 40次下载

    使用51单片机开发板实现LED点阵显示数字0的程序免费下载

    本文档的主要内容详细介绍的是使用51单片机开发板实现LED点阵显示数字0的程序免费下载。
    发表于 10-31 08:00 2次下载
    使用51单片机<b class='flag-5'>开发板实现</b>LED点阵显示数字0的程序免费下载

    使用STM32开发板实现俄罗斯方块游戏的工程文件和源代码免费下载

    本文档的主要主要内容详细介绍的是使用STM32单片机开发板实现俄罗斯方块游戏的工程文件和源代码免费下载
    发表于 12-02 08:00 21次下载
    使用STM32<b class='flag-5'>开发板实现</b>俄罗斯方块游戏的工程文件和源代码免费下载

    使用单片机开发板实现LED流水和定时器的程序免费下载

    本文档的主要内容详细介绍的是使用单片机开发板实现LED流水和定时器的程序免费下载。
    发表于 06-10 17:15 2次下载
    使用单片机<b class='flag-5'>开发板实现</b>LED流水和定时器的程序免费下载

    迅为RK3568开发板实现的NVR/XVR方案

    迅为RK3568开发板实现的NVR/XVR方案
    的头像 发表于 06-14 18:00 2362次阅读
    迅为RK3568<b class='flag-5'>开发板实现</b>的NVR/XVR方案

    ALINX FPGA+GPU异架构视频图像处理开发平台介绍

    Alinx 最新发布的新品 Z19-M 是一款创新的 FPGA+GPU 异构架构视频图像处理开发平台,它结合了 AMD Zynq UltraScale+ MPSoC(FPGA)与 NV
    的头像 发表于 08-29 14:43 2740次阅读

    基于ALINX开发板Z19-P实现WIFI无线通信功能

    本教程基于 ALINX 开发板 Z19-P , 实现 WIFI 无线通信的功能,WIFI 模块使用 USB WIFIrtl8188cu。
    的头像 发表于 11-11 10:44 1217次阅读
    基于<b class='flag-5'>ALINX</b><b class='flag-5'>开发板</b>Z19-P<b class='flag-5'>实现</b>WIFI无线通信功能

    基于RV1126开发板实现人员检测方案

    在RV1126开发板实现人员检测:在图像中找出人。 方案设计逻辑流程图,方案代码分为分为两个业务流程,主体代码负责抓取、合成图像,算法代码负责人员检测功能。
    的头像 发表于 04-18 17:14 220次阅读
    基于RV1126<b class='flag-5'>开发板实现</b>人员检测方案

    基于RV1126开发板实现人脸识别方案

    在RV1126开发板实现人脸识别:在图像中找出人脸,并与数据库进行比对,得出该人脸对应的身份信息。 方案设计逻辑流程图,方案代码分为分为三个业务流程,主体代码负责抓取、合成图像,算法代码负责人脸识别功能,按键监听负
    的头像 发表于 04-18 16:55 83次阅读
    基于RV1126<b class='flag-5'>开发板实现</b>人脸识别方案

    在友晶DE1-SOC开发板实现Chirikov标准映射求解器

    该项目是在友晶DE1-SOC开发板实现Chirikov标准映射的求解器,并将其应用于图像加密和解密的概念验证。
    的头像 发表于 07-07 15:22 1632次阅读
    在友晶DE1-SOC<b class='flag-5'>开发板实现</b>Chirikov标准映射求解器

    ALINX AMD RFSoC射频开发板选型指南

    ALINX 作为 FPGA 开发板领域领先供应商,RFSoC 系列开发板精准定位于雷达通信、5G 基站、卫星通信、测试测量等对性能要求严苛的高端射频应用。
    的头像 发表于 07-11 10:03 1233次阅读
    <b class='flag-5'>ALINX</b> AMD RFSoC射频<b class='flag-5'>开发板</b>选型指南

    ALINX VD100低功耗端侧大模型部署方案,运行3B模型功耗仅5W?!

    完整模型,以降低延迟、保护隐私并节省通信成本。但真正落地时却发现:功耗吃紧、模型裁剪严重、开发流程繁琐,使得“能运行”远远达不到“用得好”。 基于 ALINX VD100 开发平台,客
    的头像 发表于 09-03 14:58 474次阅读
    <b class='flag-5'>ALINX</b> <b class='flag-5'>VD100</b>低功耗端侧大模型部署方案,运行3B模型功耗仅5W?!