本项目旨在实现JPEG图像的解码过程,通过虚拟仿真技术,深入研究JPEG码流的解码模块、代码及仿真分析,最终实现对JPEG文件的完整解码.
- jpeg_input模块
- 通过data_r和last_b_q接口每次处理两个字节,便于标志位的识别.
- 利用状态机(LENH、LENL、DATA)实现内部码流控制.
- 位置计数器用于解析SOF采样精度、图像高宽、色彩通道数、水平采样因子、垂直采样因子等信息.
- jpeg_dht模块
- 与其他模块协作,如与jpeg_input模块通过数据接口连接,靠valid接口电平使能数据流分析.
- 负责解析文件头FFC4部分,并构建Huffman码表,为jpeg_mcu_proc模块解析SOS图像数据块部分提供Huffman解码.
- 可写哈夫曼表构建过程包括表号读取、位码读取、值码解析、查找表构建等步骤,创建的ram大小为8×1024,最多可存1024个码.
- 查找表解码流程通过lookup_input_i每次传入16bit,查找最短匹配的位序列,识别出变长的Huffman码,生成查找地址lookup_addr_r,通过查找地址查找ram,输出解码值.
- jpeg码流显示调试
- 发现jpeg码流是以字节为单位反序输入的,后续的读写代码再转化为正序.
- 使用C语言和Matlab代码实现jpeg到mif的转化,结果一致.
- 解决了不完全显示的问题,原因是代码中地址设置了截至的长度,修改后显示正常,address的位宽为12位,目前够用.
- jpeg_input模块调试
- 解决了length_q赋值不正确的问题,length_q主要用于读取每个标志位之后的该段的长度信息,实际实验中长度未超出255的范围.
- jpeg_in_top模块调试
- 解决了显示区域偏移的问题,通过将图片显示的偏移量置0,实现左上角显示.
- 代码fifo读空问题
- fifo的empty连着jpeg_input的input_valid,last_b_q的赋值已要求input_valid_i为非0.
- SD卡的认识
- SD卡从物理结构看包括存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器等5个部分.
- SD卡中JPEG的存储
- 使用Winhex文件打开SD卡中的JPEG文件.
- SD卡读取代码实现
- 实现了从SD卡中读取JPEG文件的代码.
- 通过Winhex软件获取需要显示的两个图片的地址位置,将两个地址位置给入Verilog代码中,绑定按键,通过按键状态来改变读取地址的位置,实现两张图片的切换.
- 成功实现了JPEG码流的解码过程,能够完整解析JPEG图像的各个部分.
- 通过虚拟仿真技术,验证了各模块的功能和协作关系,为后续的硬件实现奠定了基础.
- 创新性地实现了基于SD卡的JPEG文件读取和解码,拓展了项目的应用范围.