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

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

3天内不再提示

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

FPGA技术专栏 ? 来源:FPGA技术专栏 ? 作者:FPGA技术专栏 ? 2025-05-16 09:46 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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


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



这是一块基于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),方便接收端正确还原数据。


wKgZPGgmmPOAY4ghAAAjOE6CVmI04.webp


每次时钟跳动时,每条数据通道都会同步传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 上找到)如下所示:


wKgZO2gmmPSASNduAAB2nuH_aHI71.webp


通过这个系统,我们可以使用 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 ;

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(&VtcInst,vtc_config ,XPAR_XVTC_0_BASEADDR);
    
    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 = 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 TPGnr");
        
    	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 Sourcenr");

    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 Gennr");    
	
	XVtc_SetGeneratorTiming(&VtcInst, &vtcTiming);
	XVtc_SetSource(&VtcInst, &SourceSelect);
	XVtc_EnableGenerator(&VtcInst);
    XVtc_RegUpdateEnable(&VtcInst);
	XVtc_Enable(&VtcInst);

    while(1){

    };

    cleanup_platform();
    return 0;
}


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


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

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


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


wKgZPGgmmPSAAYUWAABx7CtEwZo47.webp

wKgZO2gmmPSARyVfAACVymrdhl078.webp


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


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
    +关注

    关注

    1646

    文章

    22066

    浏览量

    619468
  • amd
    amd
    +关注

    关注

    25

    文章

    5594

    浏览量

    136505
  • 图像处理
    +关注

    关注

    27

    文章

    1328

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ALINX 技术分享】AMD Versal AI Edge 自适应计算加速平台Versal 介绍(2)

    ALINX 技术分享】AMD Versal AI Edge 自适应计算加速平台Versal 介绍,以及
    的头像 发表于 03-07 16:03 ?1800次阅读
    【<b class='flag-5'>ALINX</b> 技术分享】<b class='flag-5'>AMD</b> <b class='flag-5'>Versal</b> AI Edge 自适应计算加速<b class='flag-5'>平台</b>之 <b class='flag-5'>Versal</b> 介绍(2)

    在Vivado中构建AMD Versal可扩展嵌入式平台示例设计流程

    为了应对无线波束形成、大规模计算和机器学习推断等新一代应用需求的非线性增长,AMD 开发了一项全新的创新处理技术 AI 引擎,片内集成该AI Engine的FPGA
    的头像 发表于 04-09 15:14 ?2167次阅读
    在Vivado中构建<b class='flag-5'>AMD</b> <b class='flag-5'>Versal</b>可扩展嵌入式<b class='flag-5'>平台</b>示例设计流程

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

    这是一块基于 AMD Versal Edge AI 平台开发板,功能特别强大,可以用来做图像处理
    的头像 发表于 05-12 09:23 ?484次阅读
    使用<b class='flag-5'>ALINX</b> <b class='flag-5'>VD100</b><b class='flag-5'>开发板实现</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>

    基于DSP和FPGA的通用图像处理平台设计

    设计一种基于DSP和FPGA架构的通用图像处理平台,运用FPGA实现
    发表于 12-25 17:06 ?62次下载

    基于DSP和FPGA的通用图像处理平台设计

    基于DSP和FPGA的通用图像处理平台设计 摘要:设计一种基于DSP和FPGA架构的通用图像
    发表于 02-01 11:10 ?1604次阅读
    基于DSP和<b class='flag-5'>FPGA</b>的通用<b class='flag-5'>图像</b><b class='flag-5'>处理</b><b class='flag-5'>平台</b>设计

    Adam Taylor玩转MicroZed系列第80部分

    Adam Taylor玩转MicroZed系列的前期部分中,我们介绍了IP栈的概念。(见Adam Taylor玩转MicroZed
    发表于 01-13 11:17 ?1297次阅读
    <b class='flag-5'>Adam</b> <b class='flag-5'>Taylor</b>玩转MicroZed<b class='flag-5'>系列</b>第80部分

    Adam Taylor玩转MicroZed系列,第79部分

    By Adam Taylor 在本系列博客的前两部分中,我们研究了带有Zynq SoC PS(处理器系统)的以太网MAC(介质访问控制层),包括深入探讨了一个MAC使用范例。以太网MA
    发表于 01-13 11:24 ?934次阅读

    有哪些小技巧可以改进图像处理开发

    Adam Taylor讨论了使用Zynq?和Zynq UltraScale +?SoC开发图像处理应用程序时学到的一些技巧
    的头像 发表于 11-30 06:37 ?2445次阅读

    ALINX VERSAL SOM产品介绍

    近日,2024 AMD Adaptive Computing Summit(AMD ACS)在深圳举行,芯驿电子应邀出席作主题分享:《ALINX 基于 Versal
    的头像 发表于 08-05 10:33 ?1272次阅读

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

    Alinx 最新发布的新品 Z19-M 是一款创新的 FPGA+GPU 异构架构视频图像处理开发平台
    的头像 发表于 08-29 14:43 ?2203次阅读

    AMD推出第二代Versal Premium系列

    近日,AMD(超威,纳斯达克股票代码:AMD )今日宣布推出第二代 AMD Versal Premium 系列,这款自适应 SoC
    的头像 发表于 11-13 09:27 ?972次阅读

    ALINX 发布 AXVU13P:AMD Virtex UltraScale+ 高端 FPGA PCle 3.0 综合开发平台

    ALINX 正式发布 AMD Virtex UltraScale+ 系列 FPGA PCIe 3.0 综合开发
    的头像 发表于 12-20 16:46 ?868次阅读
    <b class='flag-5'>ALINX</b> 发布 AXVU13P:<b class='flag-5'>AMD</b> Virtex UltraScale+ 高端 <b class='flag-5'>FPGA</b> PCle 3.0 综合<b class='flag-5'>开发</b><b class='flag-5'>平台</b>

    面向AI与机器学习应用的开发平台 AMD/Xilinx Versal? AI Edge VEK280

    AMD/Xilinx Versal? AI Edge VEK280评估套件是一款面向AI与机器学习应用的开发平台,专为边缘计算场景优化设计。以下从核心配置、技术特性、应用场景及
    的头像 发表于 04-11 18:33 ?1382次阅读
    面向AI与机器学习应用的<b class='flag-5'>开发</b><b class='flag-5'>平台</b> <b class='flag-5'>AMD</b>/Xilinx <b class='flag-5'>Versal</b>? AI Edge VEK280

    高性能紧凑型 RFSoC FPGA 开发平台 AXW22,重塑射频开发体验

    如果您正在烦恼如何在 有限的物理空间和预算内,依然实现卓越的射频带宽与处理能力 ,ALINX 基于 AMD RFSoC FPGA
    的头像 发表于 06-24 10:24 ?265次阅读
    高性能紧凑型 RFSoC <b class='flag-5'>FPGA</b> <b class='flag-5'>开发</b><b class='flag-5'>平台</b> AXW22,重塑射频<b class='flag-5'>开发</b>体验

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

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