目录
jpg是一种压缩的图片格式,之所以压缩是为了减小图片所占空间,jpg压缩原理这里不罗嗦,可以自行百度或者b站,大佬讲的比我好,jpg解压缩就是逆向过程,用opencv啥的解压缩就是一句话的事儿,但对于fpga硬件来说就是大型工程了。
本设计使用zynq7100位平台,将jpg图片的c语言数组写入PS侧DDR3中缓存作为jpg解码器的输入,使用自研的AXI4控制器从DDR3中读取出jpg图片数据,并转换为AXIS数据流送入jpg解码器解码为rgb数据输出,至此,jpg解码实际已经完成,但为了输出显示验证解码的效果,再加上基于FDMA的图像缓存架构将jpg解码后的rgb数据输出显示器显示,可以直观的查看显示器的输出与原始jpg图片的差异,以验证我们设计的正确性。。。。
本文详细描述了zynq7100位平台验证jpg解码器并将解码后的rgb数据输出显示器显示的设计方案,工程代码编译通过后上板调试验证,文章末尾有演示视频,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
JPG解码器是本设计的核心,其他设计都是围绕本模块来设计,目的就是为了验证本模块的正确性;
本JPG解码器具有以下特征:
1:纯verilog代码实现,不含有任何IP核;
2:移植性天花板,由于采用纯verilog代码实现,可在Xilinx、Altera和国产FPGA (比如紫光同创、安路)等之间任意移植;
3:32bit的AXI4-Stream数据流输入接口,可处理大批量数据;
4:支持任意分辨率jpg图片解码;
5:支持YUV4:4:4、YUV4:2:0色度采样输入;
6:支持固定的标准的霍夫曼解码(减少逻辑资源的使用和更快速解码);
7:支持动态霍夫曼解码(使用更多的逻辑资源和更慢速解码);
8:动态DQT;
9:输出24bit的RGB8:88格式,同时输出解码后的图片宽和高数据;
10:消耗逻辑资源少,具体如下:

jpg解码器模块设计框图如下:

解码过程就是编码过程的逆过程,原理可以百度一下或者csdn搜一下,本模块就是把用c语言或者c++实现的软件解码方式用verilog的硬件解码方式实现了,由于FPGA的并行性,所以解码速度更快,达到加速的目的。。。
设计思路和架构如下:

总体流程:
第一步:
下载一张jpg图片,用Matlab等工具将jpg图片转为c语言数组,提供的vivado工程中已包含此文件;
第二步:
用SDK将jpg图片c语言数组拷贝到PS侧DDR3中缓存,作为jpg解码器的输入源;
第三步:
AXI4主机控制器和AXI4-Stream主机控制器负责从PS侧DDR3中读取jpg数据,输出AXI4-Stream数据流给到jpg解码器;
第四步:
jpg解码器将AXI4-Stream格式的jpg数据解码为24bit的RGB数据输出,一同输出图片宽个高信息;至此,jpg解码实际已经完成,但为了输出显示验证解码的效果,再加上基于FDMA的图像缓存架构将jpg解码后的rgb数据输出显示器显示,可以直观的查看显示器的输出与原始jpg图片的差异,以验证我们设计的正确性。。。。
第五步:
使用FDMA数据缓存架构将解码后的RGB数据缓存至PS侧DDR3后再读出,这里做缓存的原因是做数据跨时钟处理,jpg解码后的rgb数据时钟是100M,而HDMI输出的像素时钟是148.5M。。。关于FDMA数据缓存架构,可以参考我之前写的文章直接点击此处查看
第六步:
HDMI输出分辨率使用1920x1080@60Hz,只要jpg图片分辨率小于1920x1080均可在此背景下输出,屏幕只会输出有效的jpg图片,其他区域为黑色,这也是我的一大原创。。。需要解码显示更大jpg图片分辨率的朋友可以修改输出VGA时序,比如改为4K分辨率,则可显示1920x1080的图片了。
HDMI发送没有使用HPY芯片,而是使用纯verilog实现的HDMI发送驱动,关于这一点,可以参考我之前写的文章直接点击此处查看
开发板:Xilinx zynq7100开发板;
开发环境:vivado2019.1;
输入:jpg图片;
输出:HDMI显示;
工程Block Design如下:

综合后的工程代码架构如下:

jpg解码器源码如下:

总工程师的资源消耗和功耗预估如下:
注意:这里是整个工程的资源消耗,并非jpg解码器;

SDK源码架构如下:

开发板如下:

需要你的板子有个HDMI输出接口
第一步:
编译,打开SDK,并进行debug单步调试,如下:


第二步:
选择你要解码输出的jpg图片分辨率,为了深度测试jpg解码器的性能,我这里设置了7种不同分辨率的jpg图片,分别如下:
jpg图片分辨率:1920x1080;
jpg图片分辨率:1280x720;
jpg图片分辨率:800x800;
jpg图片分辨率:800x600;
jpg图片分辨率:606x530;
jpg图片分辨率:474x458;
jpg图片分辨率:361x458;

下面以1920x1080图片解码为例,首先取消上图中//WR_pic_1920x1080();前面的//,如此就选择了解码输出1920x1080图片,随后按照第一步开始单步debug,当dubug到while(1)死循环里面时,多点几次,让程序在while(1)里面多转几圈,屏幕就会出现RGB图片输出了,while(1)里面的代码作用是产生触发信号开启jpg解码器工作。。。
下面看输出效果:
解码jpg图片分辨率1920x1080的输出:


解码jpg图片分辨率1280x720的输出:


解码jpg图片分辨率800x800的输出:


解码jpg图片分辨率800x600的输出:


解码jpg图片分辨率606x530的输出:


解码jpg图片分辨率606x530的输出:


解码jpg图片分辨率606x530的输出:


下面看视频演示:
fpga-jpg
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:文章末尾的V名片。
网盘资料如下:

具体的文件构成如下:


我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。
我已经按照https://github.com/wayneeseguin/rvm#installation上的说明通过RVM安装了Ruby.有关信息,我有所有文件(readline-5.2.tar.gz、readline-6.2.tar.gz、ruby-1.9.3-p327.tar.bz2、rubygems-1.8.24.tgz、wayneeseguin-rvm-stable.tgz和yaml-0.1.4.tar.gz)在~/.rvm/archives目录中,我不想在任何目录中重新下载它们方式。当我这样做时:sudo/usr/bin/apt-getinstallbuild-essent
我的Ruby-on-Rails项目中有以下文件结构,用于规范:/spec/msd/serviceservice_spec.rb/support/my_modulerequests_stubs.rb我的request_stubs.rb有:moduleMyModule::RequestsStubsmodule_functiondeflist_clientsurl="dummysite.com/clients"stub_request(:get,url).to_return(status:200,body:"clientsbody")endend在我的service_spec.rb我有:re
Ruby是否支持(找不到更好的词)非转义(逐字)字符串?就像在C#中一样:@"c:\ProgramFiles\"...或者在Tcl中:{c:\ProgramFiles\} 最佳答案 是的,您需要在字符串前加上%前缀,然后是描述其类型的单个字符。你想要的是%q{c:\programfiles\}。镐书很好地涵盖了这一点here,部分是通用分隔输入。 关于ruby-Ruby是否支持逐字字符串?,我们在StackOverflow上找到一个类似的问题: https:/
我正在编写一个Rubygem,在我的代码中使用{key:'value'}哈希语法。我的测试都在1.9.x中通过,但我(可以理解)在1.8.7中得到syntaxerror,unexpected':',expecting')'。是否有支持1.8.x的最佳实践?我是否需要使用我们的老friend=>重写代码,还是有更好的策略? 最佳答案 我认为你运气不好,如果你想支持1.8,那么你必须使用=>。像往常一样,我会提到在1.9的某些情况下您必须使用=>:如果键不是一个符号。请记住,任何对象(符号、字符串、类、float……)都可以是Ruby哈
目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法 实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电
在Rails中,什么是集成更新模型某些元素的UDP监听过程的最佳方式(特别是它将向其中一个表添加行)。简单的答案似乎是在同一个进程中使用UDP套接字对象启动一个线程,但我什至不清楚我应该在哪里做适合Rails方式的事情。有没有一种巧妙的方法来开始收听UDP?具体来说,我希望能够编写一个UDPController并在每个数据报消息上调用一个特定的方法。理想情况下,我希望避免在UDP上使用HTTP(因为它会浪费一些在这种情况下非常宝贵的空间),但我完全控制消息格式,因此我可以为Rails提供它需要的任何信息。 最佳答案 Rails是一个
我有33个规范以大约5秒的速度运行,以这种速度运行会导致测试套件变慢。我追踪到请求规范(4秒以上),因为模型规范只用了一小部分时间。我已经检查过,我的请求规范没有任何过于复杂或不必要的东西,所以我不知道该去哪里让它们更快,而不是只在推送代码之前运行它们以确保一切正常.加快请求规范的最佳方法是什么? 最佳答案 我使用Spork来加速我的测试。它保持整个环境加载以赢得时间。看看这个博客:http://ykyuen.wordpress.com/2010/12/14/rails-running-rspec-with-spork-test-s
我是Ruby和Watir-Webdriver的新手。我有一套用VBScript编写的站点自动化程序,我想将其转换为Ruby/Watir,因为我现在必须支持Firefox。我发现我真的很喜欢Ruby,而且我正在研究Watir,但我已经花了一周时间试图让Webdriver显示我的登录屏幕。该站点以带有“我同意”区域的“警告屏幕”开头。用户点击我同意并显示登录屏幕。我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用VBScript这样做:objExplorer.Document.GetElementsByTagName("area")(0).click
我收到错误:unsupportedcipheralgorithm(AES-256-GCM)(RuntimeError)但我似乎具备所有要求:ruby版本:$ruby--versionruby2.1.2p95OpenSSL会列出gcm:$opensslenc-help2>&1|grepgcm-aes-128-ecb-aes-128-gcm-aes-128-ofb-aes-192-ecb-aes-192-gcm-aes-192-ofb-aes-256-ecb-aes-256-gcm-aes-256-ofbRuby解释器:$irb2.1.2:001>require'openssl';puts