FPGA纯verilog代码实现jpg解码rgb并输出显示,提供工程源码和技术支持

1、jpg简介

jpg是一种压缩的图片格式,之所以压缩是为了减小图片所占空间,jpg压缩原理这里不罗嗦,可以自行百度或者b站,大佬讲的比我好,jpg解压缩就是逆向过程,用opencv啥的解压缩就是一句话的事儿,但对于fpga硬件来说就是大型工程了。

2、设计思路和框架

整个工程思路框图如下:
在这里插入图片描述

第一步:百度下载一张1280X720尺寸的jpg格式图片,用matlab等工具将jpg图片转为c语言数组;
第二步:用vivado的sdk将c语言数组拷贝到zynq的ps端ddr3;
第三步:用axi4主控制器从zynq的ps端ddr3中把jpg图像读到zynq的pl端fpga,并转为axis数据流;
第四步:jpg图像的axis数据流进入jpg解码器模块,并解码转化为rgb数据,并生成场同步信号vs和数据有效信号de;
第五步:用fdma方案将rgb数据写入ddr3做三帧缓存并读出;
第六步:读出的rgb图像数据送hdmi显示模块输出显示器;
补充说明:
1:由于jpg是单张图片,并不像视频那样是连续的,所以这里从ps端ddr3中读取图像需要认为的给一个脉冲信号,相当于视频的场同步信号vs,由于使用的是zynq,所以直接用axi_gpio输出给fpga,这样就能由sdk软件控制jpg图片的读取;
2:第五步中的fdma方案是我一直用的图像缓存方案,可参考我之前的文章fdma三帧缓存方案

3、vivado工程介绍

FPGA工程如下:
BD部分:
在这里插入图片描述
FPGA代码部分:
在这里插入图片描述
SDK代码部分:

int main()
{
    init_platform();
    write_pic();	//拷贝jpg数组到内存
	XGpioCfg = XGpio_LookupConfig(XPAR_AXI_GPIO_0_DEVICE_ID);
	XGpio_CfgInitialize(&video_gpio, XGpioCfg, XGpioCfg->BaseAddress);
	XGpio_SetDataDirection(&video_gpio, 1, 0);
	XGpio_SetDataDirection(&video_gpio, 2, 0);
	XGpio_DiscreteWrite(&video_gpio, 2, 4096*30);
	XGpio_DiscreteWrite(&video_gpio, 1, 1);
	while(1){
		XGpio_DiscreteWrite(&video_gpio, 1, 1);
		usleep(30000);
		XGpio_DiscreteWrite(&video_gpio, 1, 3);	//SDK触发jpg读脉冲,切记要用debug单步调试模式
		XGpio_DiscreteWrite(&video_gpio, 1, 1);
	}
    cleanup_platform();
    return 0;
}

4、上板调试验证并演示

上板调试:
开发板:米联客zynq7100开发板;
开发环境:vivado2019.1;
输入:1280X720尺寸jpg图片;
输出:720P分辨率HDMI视频,rgb888格式;
调试要点:
1、运行SDK时切记要用debug单步调试模式,这样才能稳步触发jpg读图片并解码,因为在while(1)死循环里时间间隔太小,硬件反应不过来,如果需要持续触发则需要加适当的延时;
2、SDK拷贝图片进ddr3时需要4K对齐;
3、XGpio_DiscreteWrite(&video_gpio, 2, 4096*30);这句话是jpg读图片的地址长度,可以适当设置大一些,因为jpg解码器在读到jpg数据包帧尾时就完成了解码,多余的数据不会再利用;
直接上调试结果:
在这里插入图片描述
左边屏幕为jpg原图;左边屏幕为解码后输出hdmi显示的rgb视频;

5、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:文章末尾的V名片。
网盘资料如下:
在这里插入图片描述

  • 18
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
FPGA,DM6467,DM8168,DM8148,H264编码解码代码和ADI设置工具等资 1.DM6467,DM8168,dm8148,DM8148,dm8168,H264,encode,decode编码解码码 IVAHD and M3 Based Platform(DM8148平台,DM8168)代码,DM6467平台C64X+平台 如果做视频会议和网络监控等需要对码流严格控制的应用,必须要修改TI的代码,TI全系列视频压缩算法的RC码流控制都是只有几行代码,效果很差。 2.ADI平台设置工具,支持最新的ADV7441a芯片的采集指令生成,是ADI内部高级工程师专用工具,采用EXECL表格填写需要配置的信号格式后自动生成芯片设置指令(二进制指令码),直接大大缩短ADI芯片的开发和调试周期。 3.FPGA图像编码代码,印度最厉害公司H264编码代码,Altera平台,全套代码。超低延迟广播级1080p编码解码。 4.xilinx平台FPGA图像编码代码H264编码代码。IP Core 5.FPGA:xilinx平台全套pcie、DDR2码及详细手册说明。 6.FPGA:xilinx平台RapidIO license ,xilinx官方网站价值3万美金。 7.PC104+平台军工级别高清视频采集监控编码卡,在西安飞机总装上稳定运行,列装到最新型号的飞机上 1.DM6467,DM8168,dm8148,DM8148,dm8168,H264,encode,decode编码解码码 IVAHD and M3 Based Platform(DM8148平台,DM8168)代码,DM6467平台C64X+平台 MPEG2.D解码码 MJPEG.E编码码 MJPEG.D解码码 ON2VP7.D解码码 ON2VP6.D解码码 AVS10.D解码码 H264AVC.E编码码 H264AVC.D解码码 HDVICP20码 -------------------------------------------- 库+API MPEG4.E.SP编码 VC1.D解码 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DM6467平台H264编码解码代码 H264AVC.D.C64XPLUSSRC 解码C64+码 H264AVC.E.C64XPLUSSRC 编码C64+码 H264AVC_E_BP_DM6446编码码 JPEG_D_DM6467解码码 MPEG4_D_ASP_DM6467SRC解码码 MPEG4_E_ASP_DM6467SRC编码码 H264AVC.E.BP.DM6467SRC编码码 ===================================================== 7.PC104+平台军工级别高清视频采集监控编码卡 1920*1080 1600*1200高清实时监控 支持DVI,VGA,PAL 支持标准的VGA信号和VGA绿同步(RGBSOG)信号。 支持VGA 信号采集出现偏移时调整。DVI数字信号不存在信号采集偏移问题。 支持对模拟输入信号的亮度、对比度、饱和度、色差的调整。 板卡除了支持双声道声音输入和音视频同步记录外,还增加了麦克风信号输入采集功能。 支持ROI功能和设置。 支持OSD功能(支持0度,90度,270度,还支持ROI里的OSD),其它要求可以开发。 支持编码帧率设置。 支持多卡同时工作情况下的PAL、VGA、DVI信号的分辨率随机改变并在恢复正常分辨率设置后系统正常稳定工作。 支持多卡同时工作情况下的PAL、VGA、DVI信号的随机中断,随机时间恢复后正常稳定工作。完全解决了瞬间信号中断引起的断屏和板卡等待信号的问题,支持极短时间内信号中断恢复,达到完全再现视频信号的要求。
你可以使用Verilog代码实现FPGA上的图像缩放。下面是一个简单的示例,展示了如何使用双线性插值算法进行图像缩放: ```verilog module image_scale ( input wire clk, input wire rst, input wire [7:0] in_width, input wire [7:0] in_height, input wire [7:0] out_width, input wire [7:0] out_height, input wire [15:0] in_image [0:1023][0:767], output wire [15:0] out_image [0:511][0:383] ); // 计算水平和垂直比例因子 reg [15:0] scale_x; reg [15:0] scale_y; always @(in_width, out_width) begin scale_x = (in_width << 16) / (out_width + 1); end always @(in_height, out_height) begin scale_y = (in_height << 16) / (out_height + 1); end // 缩放图像 always @(posedge clk or posedge rst) begin if (rst) begin // 复位状态 // ... end else begin // 缩放计算 // ... end end endmodule ``` 在上面的示例中,`in_width`和`in_height`表示输入图像的宽度和高度,`out_width`和`out_height`表示期望的输出图像的宽度和高度。`in_image`是一个二维数组,用于存储输入图像的像素值。`out_image`也是一个二维数组,用于存储输出图像的像素值。 你需要在`always @(posedge clk or posedge rst)`块中实现图像缩放的逻辑。你可以使用双线性插值算法来计算输出图像的每个像素值。具体的实现方法超出了本文的范围,但你可以参考相关资料来了解如何在Verilog实现双线性插值算法。 请注意,上述代码提供了一个基本的框架,你需要根据实际需求进行适当的修改和完善。同时,你还需要根据你使用的开发板和FPGA器件进行相应的时钟和复位处理。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

9527华安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值