- Directory Organization
cores - Xilinx CoreGen generated cores are inside this directory (if it is not there anymore then you should be able to generate them using CoreGen with the parameters described in the section "Functional Description" of this document.)
docs - documents about this project
images - contains main test image to run testbench against
src - contains main source file compressor.vhd
testbench - contains main testbench file
- Description
This project features a complete JPEG Hardware Compressor (standard Baseline DCT, JFIF header) with 2:1:1 subsampling, able to compress at a rate of up to 24 images per second (on XC2V1000-4 @ 40 MHz with resolution 352x288).
Image resolution is not limited. It takes an RGB input (row-wise) and outputs to a memory the compressed JPEG image. Its quality is comparable to software solutions.
A testbench has been made that takes a bitmap image from your computer and writes a compressed JPEG file by simulating the code. Download the code and try it, it's easy.
The source code is VHDL and it is LGPL, so it can be used in commercial applications as long as the terms of the license are respected.
Anyone interested in the image standards used in this project, they can be downloaded from the following places:
JPEG (ITU-T81 standard): http://www.w3.org/Graphics/JPEG/itu-t81.pdf
JFIF (JPEG file headers): http://www.w3.org/Graphics/JPEG/jfif3.pdf
BMP (bitmaps for the testbench): http://netghost.narod.ru/gff/vendspec/micbmp/bmp.txt
Please note that there is another Tab in this web page named "Detailed Description" with further info on this core.
If you run into any problems downloading the files from the cvs please check that you are downloading them in binary form. For any questions my email is:
[email protected]
- Notes
Some quick notes until the time I upload the full documentation:
* This implementation is compliant with ISO standard (and ITU standard T-81), it features a compliant JPEG compressor Baseline DCT with Huffman encoding and 2x2 1x1 1x1 subsampling. The header is the widely employed JFIF. Baseline DCT JPEG with JFIF header is one of the most used image formats.
* Included with the source code is a Testbench which allows you to compress a bitmap (uncompressed 24 bit BMP) file located in the project folder (if using Active-HDL then in the design folder) just by simulating it. Its name MUST be "image.bmp". By the way, remember that a bitmap image stores the information bottom up, and JPEG is top-bottom, so you should flip (invert) the bitmap image (see the test image if you don't understand what I mean). This is only important for simulation.
* The testbench is made in such a way that it will automatically exit the simulation when it finishes. A 352x288 image takes almost 40 ms of simulation time (that will take some minutes depending on your machine). The output image will be in the same folder as "image.bmp" and its name will be "image.jpg" (it will overwrite previous outputs without warning).
* It has been simulated on Windows machines, so I can't guarantee anything on simulation over Linux though I don't think there could be any problem at all. Please update me on this.
* It has been synthesized and tested in a Xilinx Virtex-2 XC2V1000-4 running at 40 MHz (that is why it takes 40 ms, the testbench simulates a 40 MHz clock). This is one of the worst speed grades (-4), so with most other FPGAs you will get faster implementations.
* It uses at minimum 11 BlockRAMs (one of them for the DCT block), but you will need some more to store the final compressed image (whose size varies as compression depends on the image as well as in the compression level), the source code in the Downloads page includes a memory for this purpose of 51.200 bytes (buffer_img), that is 25 BlockRAMs.
* There is an easily overridable limitation on input image resolution, for a description on how to change the maximum input image size see the Notes at the beginning of the main source file "compressor.vhd".
* The only real limitation is that the input image must have width and height multiple of 16 (that is, an image 32x32 will produce a strictly compliant JPEG image file, but not a 32x24 or a 24x32 input image, although the resulting image will more likely still be viewable), this is due to the subsampling method employed. This limitation could be overriden with some extra logic (for padding as indicated in the JPEG standard).
* Finally I would like to apologize if you find this code somewhat messy. When I programmed it, I imposed myself very strict deadlines and making it opensource was not in my mind, mainly because, if I were to do it again, I would do it in other way to get much more performance. The main problem faced with this implementation was a very scarce availability of BlockRAM in the target FPGA, so some areas that could perfectly run in parallel, speeding a lot the whole process, had to be made sequential in order to save up BlockRAMs. Anyways, this code works (it functioned as a webcam, attached to a CMOS sensor) and, though not as fast as it could be, it has a good performance. This source code is LGPL. Any questions, suggestions, comments (positive criticism) is always welcome.
- Functional Description
The source code is composed of 9 VHDL files:
* compressor_tb.vhd : Testbench file for the project. It reads an uncompressed BMP located in the project folder (not necessarily the source code folder) and outputs a JPG compressed image (the actual writing of the output file is carried out by the next file).
* compressor.vhd : This is the main code file. Inside, there are a few concurrent instructions, declarations of the needed componentes (BlockRAMs and DCT block) and two processes which are responsible of the whole compression process. To better follow the next explanation consult the figure located after this explanation. The first process is RGB2YCbCr is in charge of converting the input signals (Red, Green and Blue, strobed by ProcessRGB signal) to the YCbCr color space and to apply a level shift as specified by the JPEG standard. The second is the process JPEG, it feeds the DCT block (DCT-2D Core in the figure) with data from the previous process (the interface between the two processes are three memories (Y, Cb and Cr Compression Buffers in the figure), one for luminance (Y) data, one for blue chrominance (Cb) and another for red chrominance (Cr)); after the DCT has processed the data (calculated the Forward 2D-DCT) it is quantized with the values stored in memory q_rom (Q ROM in the figure). As this quantization implies dividing by an integer number (remember that only divisions by power of 2 numbers and multiplications times an integer can be made really efficient in digital logic thru the use of shifts, right for division, left for multiplication), the solution was to convert the number to divide into a fraction with denominator 16384 for all the quantization values (128 for every compression level and there are three of these) so that we can multiply times an integer (left shift and some additions) and divide by a power of 2 number (right shift). For instance: to divide by 11 is the same as multiplying times 1/11, which is almost the same as multiplying times 1489/16384, which is actually equal to dividing by 11.003357. Using this apparently complicated way of handling real number operations we get the fastest implementation and no floating point, only a minimal error (you would never notice the visual difference). After quantization of all the values, Huffman encoding starts by looking up the tables stored in huff_rom (Huffman ROM in the figure) and storing in the final image buffer the compressed image (should be buffer_img but in the figure is left as a blue upwards pointing arrow). By the way, at the beginning, when a compression level is selected and the port CompressImage signals the start of a new image, the head
没有合适的资源?快使用搜索试试~ 我知道了~
JPEG_Hardware_Compressor_Encoder.rar_jpeg_jpeg encoder_jpeg hard
共61个文件
txt:11个
vhd:9个
xcp:7个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 121 浏览量
2022-09-20
16:18:26
上传
评论
收藏 1.41MB RAR 举报
温馨提示
JPEG Hardware Compressor Encoder
资源详情
资源评论
资源推荐
收起资源包目录
JPEG_Hardware_Compressor_Encoder.rar (61个子文件)
JPEG Hardware Compressor Encoder
jpeg
images
image.bmp 297KB
Thumbs.db 8KB
docs
lgpl.txt 26KB
jfif3.pdf 17KB
itu-t81.pdf 1.01MB
bmp.txt 38KB
readme.txt 10KB
cores
dct2d.vhd 4KB
q_rom_flist.txt 95B
q_rom.xco 2KB
tabla_q.vho 3KB
huff_rom.coe 8KB
huff_rom.edn 23KB
buffer_comp.vho 3KB
buffer_comp_flist.txt 121B
buffer_comp_chrom.edn 28KB
buffer_comp_chrom.vhd 4KB
tabla_q.vhd 4KB
buffer_comp_chrom.xcp 775B
buffer_img.coe 2KB
q_rom.coe 6KB
buffer_img_flist.txt 130B
q_rom.edn 19KB
buffer_comp_chrom_flist.txt 157B
tabla_q_flist.txt 109B
q_rom.mif 5KB
tabla_q.edn 17KB
buffer_comp.xco 2KB
buffer_comp.vhd 4KB
huff_rom.xco 2KB
buffer_img.xco 2KB
buffer_comp_chrom.xco 2KB
coregen.prj 7KB
buffer_img.mif 5KB
buffer_comp.edn 66KB
dct2d.xco 1KB
q_rom.vhd 4KB
buffer_img.xcp 836B
dct2d.edn 2.65MB
buffer_img.vhd 4KB
tabla_q.xco 2KB
buffer_img.edn 329KB
dct2d.vho 3KB
huff_rom.vho 3KB
huff_rom.xcp 826B
buffer_comp_chrom.vho 3KB
huff_rom.vhd 4KB
huff_rom.mif 7KB
buffer_img.vho 3KB
dct2d.xcp 440B
huff_rom_flist.txt 116B
tabla_q.coe 1KB
tabla_q.mif 3KB
q_rom.vho 3KB
dct2d_flist.txt 85B
q_rom.xcp 820B
tabla_q.xcp 823B
buffer_comp.xcp 769B
src
compressor.vhd 95KB
testbench
compressor_tb.vhd 10KB
readme.txt 10KB
共 61 条
- 1
刘良运
- 粉丝: 68
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0