NIOS2随笔——BMP解码与VGA显示
1. 系统概述
本设计采用NIOS2 32位处理器,通过SPI接口将SD/TF卡中的BMP图片数据读取到内存中,SD/TF卡的文件系统为FAT32,NIOS2软件实现BMP解码后,启动framereader和Clocked Video Output模块,最终在VGA显示器上显示BMP图像,系统框图如下:
2. BMP格式
BMP(Bitmap)是Windows操作系统中的标准图像文件格式,采用位映射存储格式,没有采用任何压缩技术。图像深度可为1、4、8和24bit,图像的扫描方式是按照从左到右、从下到上的顺序。
BMP图像文件由四部分组成:
位图头文件数据结构
位图信息数据结构
调色板(可选)
位图数据
//位图文件头
typedef struct tagBITMAPFILEHEADER
{WORD bfType; //位图文件的类型,必须为BM-0x424d(1-2字节)DWORD bfSize; //位图文件的大小,以字节为单位(3-6字节,低位在前)WORD bfReserved1;//位图文件保留字,必须为0(7-8字节)WORD bfReserved2;//位图文件保留字,必须为0(9-10字节)DWORD bfOffBits; //位图数据的起始位置,以相对于位图(11-14字节,低位在前)//文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;
//位图信息头
typedef struct tagBITMAPINFOHEADER{DWORD biSize;//本结构所占用字节数(15-18字节)LONG biWidth;//位图的宽度,以像素为单位(19-22字节)LONG biHeight;//位图的高度,以像素为单位(23-26字节)WORD biPlanes;//目标设备的级别,必须为1(27-28字节)WORD biBitCount;//每个像素所需的位数,必须是1(双色),(29-30字节)//4(16色),8(256色)16(高彩色)或24(真彩色)之一DWORD biCompression;//位图压缩类型,必须是0(不压缩),(31-34字节)//1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一DWORD biSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)LONG biXPelsPerMeter;//位图水平分辨率,每米像素数(39-42字节)LONG biYPelsPerMeter;//位图垂直分辨率,每米像素数(43-46字节)DWORD biClrUsed;//位图实际使用的颜色表中的颜色数(47-50字节)DWORD biClrImportant;//位图显示过程中重要的颜色数(51-54字节)
}BITMAPINFOHEADER;
3. 搭建Qsys
在博文NIOS2随笔——FAT32文件系统的基础上,在Qsys平台上添加framereader和Clocked Video Output组件,设置分辨率为640*480,VGA相关内容可以参考博文FPGA设计——VGA (Altera)。
搭好的Qsys平台如下图:
4. NIOS2软件设计
往SD卡中保存一幅分辨率为640*480的24位BMP格式图片,图片名为:friend.bmp,电脑中打卡如下图:
在博文NIOS2随笔——FAT32文件系统的软件基础上,编写软件代码。
由于图像是24位图,没有调色板信息,所以软件只要按照BMP格式偏移54个字节后,读取的便是第一个图像字节数据。VGA显示部分,要对framereader组件初始化,然后存放在数组中的图像数据便会不停地被读取到Clocked Video Output模块,最后数据会被送到VGA编码芯片显示。软件代码设计如下:
//filename: main.c
//author: shugen.yin
//date: 2016.12.29
//function: BMP decode and VGA show
#include <stdio.h>
#include <system.h>
#include <string.h>
#include <io.h>
#include "unistd.h"
#include "sd_spi.h"
#include "ff.h"
#include "altera_avalon_pio_regs.h"#define FRAME_ADDR (framebuf0 + 0x00000000)
#define FRAME_WIDTH 640
#define FRAME_HEIGHT 480
#define FRAME_SIZE (FRAME_WIDTH*FRAME_HEIGHT)
unsigned int framebuf0[FRAME_SIZE];void FrameRd_init(){IOWR(ALT_VIP_VFR_0_BASE, 3, 0); // Frame SelectIOWR(ALT_VIP_VFR_0_BASE, 4, framebuf0); // Frame 0 Base AddressIOWR(ALT_VIP_VFR_0_BASE, 5, FRAME_SIZE/8); // Frame 0 Words => 640*480IOWR(ALT_VIP_VFR_0_BASE, 6, FRAME_SIZE); // Frame 0 Single Cycle Color PatternsIOWR(ALT_VIP_VFR_0_BASE, 7, 0); // Frame 0 Reserved BitIOWR(ALT_VIP_VFR_0_BASE, 8, FRAME_WIDTH); // Frame 0 WidthIOWR(ALT_VIP_VFR_0_BASE, 9, FRAME_HEIGHT); // Frame 0 HeightIOWR(ALT_VIP_VFR_0_BASE, 10, 3); // Frame 0 Interlaced => 3 = 0011 bedeutet progressive outputIOWR(ALT_VIP_VFR_0_BASE, 0, 1); // start Frame Reader}void frame_init(){BYTE pic_buf[FRAME_SIZE*3+54];UINT i;UINT j=0;f_mount(&fs,"",0);res=f_open(&fdst,"0:/friend.bmp", FA_READ);if(res==FR_OK){res = f_read(&fdst,pic_buf,FRAME_SIZE*3+54,&br);f_close(&fdst);}printf("file read success!\n");for(i=54;i<FRAME_SIZE*3+54;i=i+3){j++;framebuf0[FRAME_SIZE-j] = pic_buf[i]+(pic_buf[i+1])*256+(pic_buf[i+2])*65536;}printf("p_w_picpath processed done!\n");
}int main (void)
{frame_init();FrameRd_init();while(1);return 0;
}
5. 编译运行
编译成功后,以Hardware方式运行,终端打印:file read success! p_w_picpath processed done!
6. 最终结果
图片正常显示,和电脑上打开的friend.bmp一致。
转载于:https://blog.51cto.com/shugenyin/1887551
NIOS2随笔——BMP解码与VGA显示相关推荐
- STM32移植Littlevgl(LVGL)V8.0.2使用文件系统+BMP解码显示外部FLASH中图片
说明:选择BMP解码图片的方式,是因为此方式不需要占用太多的RAM 一.主要参数及版本 MCU:STM32F103ZET6 LCD:2.8寸ILI9341,使用FSMC驱动 SPI FLASH:W25 ...
- 基于FPGA的VGA显示彩条、字符、图片
目录 一.VGA介绍 (一) VGA协议 (二) VGA端口介绍 (三) 色彩原理 (四)VGA显示原理 VGA通信协议: VGA时序解析 时钟分频 二.实现 1.彩条显示 2.字符显示 3.图片显 ...
- FPGA学习——VGA显示
FPGA学习--VGA显示 一.VGA原理 (一)VGA协议 (二)VGA端口结构 (三)⾊彩原理 (四)扫描原理 1.扫描方式 2.逐行扫描 3.隔行扫描 (五)⾏场信号 二.显示姓名学号 (一)实 ...
- VGA系列之一:VGA显示网络图片
一休哥是在读研究生的时候开始正式接触FPGA的,之所以这么说呢,是因为之前本科参加电赛的时候也学过一点FPGA的知识,可惜学习周期太短导致那次电赛惨败.可能世上就是有这么巧的事,刚上研究生的第一天,老 ...
- FPGA—VGA显示
FPGA-VGA显示 一.VGA介绍 颜色显示 VGA接口 引脚分配 二.VGA显示彩色条纹 分辨率控制部分 颜色显示 顶层模块 三.字符显示 四.图片显示 一.VGA介绍 VGA的全称是Video ...
- 【FPGA实验】VGA显示
[FPGA实验]VGA显示 一. VGA介绍 VGA的全称是Video Graphics Array,即视频图形阵列,是一个使用模拟信号进行视频传 输的标准.早期的CRT显示器由于设计制造上的原因 ...
- VGA显示学号姓名以及彩条
目录 VGA显示原理 显示姓名学号以及色块 VGA显示原理 VGA(Video Graphics Array)视频图形阵列是 IBM 于1987年提出的一个使用模拟信号的电脑显示标准.VGA具有分辨率 ...
- VGA协议及VGA显示
VGA协议及VGA显示 一.VGA 1. 外部接口 2. 色彩原理 3. 扫描方式 二.彩色条纹显示 三.字符显示 四.图片显示 五.总结 参考 一.VGA 1. 外部接口 VGA并没有特殊的外部芯片 ...
- 【FPGA】VGA显示文字、彩条、图片——基于DE2-115
录 一.VGA概述 1.1 简述 1.2 管脚定义 1.3 行.场时序及分辨率 二.VGA显示文字 2.1 点阵汉字生成 2.2 工程建立 2.3 引入ip核-实现特定时钟频率+不同分辨率显示 2.3 ...
最新文章
- 2019 年ML NLP领域十大研究热点
- dede修改mysql,Dedecms(织梦)程序MySQL修复表和文章路径修改方法
- Gamma校正及其OpenCV实现
- 安全开发之碰撞检测与伤害计算逻辑
- 超越提升和迁移 充分利用云计算的七种方法
- 计算机工作原理 公开课,《计算机的基本工作原理》公开课材料(11页)-原创力文档...
- linux at24测试程序,linux 2.6下eeprom at24c08 i2c设备驱动(new style probe方式)
- 有钱了不起?!苹果猎头挖到马斯克没脾气,特斯拉股东公开求收购
- 统计局:去年12月天然气、电力生产增长较快
- DialogPlus
- 多布局怎么搭建_展会搭建如何吸引人的注意力?
- matlab怎样设置中文界面
- oracle10g exp下载,oracle 10g 导出数据 exp 10g
- 灰常实用的一键开关机电路,各位大佬进来mark一下?
- android 经验进度条,android ProgressBar(进度条)
- win10更新后闪屏处理方法
- React.Component
- java的mysql语句规范_mysql 规范
- ABC166E This Message Will Self-Destruct in 5s 题解
- matlab二阶阻尼震荡衰减,二阶欠阻尼电路的零响应输入-MATLAB课程设计.doc
热门文章
- 收获,不止SQL优化——抓住SQL的本质--第十四章
- springboot + vue项目跨域请求解决方案
- Spring Cloud 微服务实战系列-Ribbon整合RestTemplate实现负载均衡
- Oracle中两个重要的语句
- BZOJ3653 洛谷3899:谈笑风生——题解
- block--内存管理
- KCC创建复制拓扑失败-故障处理
- 解决Windows Server 2008 System4进程占用80端口 net stop http
- [重拾Oracle - 00]既然青春留不住,那么还是要学习-----工具:在线Oracle(Oracle Live SQL)...
- IOS 学习笔记 2015-04-15 手势密码(原)