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显示相关推荐

  1. STM32移植Littlevgl(LVGL)V8.0.2使用文件系统+BMP解码显示外部FLASH中图片

    说明:选择BMP解码图片的方式,是因为此方式不需要占用太多的RAM 一.主要参数及版本 MCU:STM32F103ZET6 LCD:2.8寸ILI9341,使用FSMC驱动 SPI FLASH:W25 ...

  2. 基于FPGA的VGA显示彩条、字符、图片

    目录 一.VGA介绍 (一) VGA协议 (二) VGA端口介绍 (三) 色彩原理 (四)VGA显示原理 VGA通信协议: VGA时序解析 时钟分频 二.实现 ​1.彩条显示 2.字符显示 3.图片显 ...

  3. FPGA学习——VGA显示

    FPGA学习--VGA显示 一.VGA原理 (一)VGA协议 (二)VGA端口结构 (三)⾊彩原理 (四)扫描原理 1.扫描方式 2.逐行扫描 3.隔行扫描 (五)⾏场信号 二.显示姓名学号 (一)实 ...

  4. VGA系列之一:VGA显示网络图片

    一休哥是在读研究生的时候开始正式接触FPGA的,之所以这么说呢,是因为之前本科参加电赛的时候也学过一点FPGA的知识,可惜学习周期太短导致那次电赛惨败.可能世上就是有这么巧的事,刚上研究生的第一天,老 ...

  5. FPGA—VGA显示

    FPGA-VGA显示 一.VGA介绍 颜色显示 VGA接口 引脚分配 二.VGA显示彩色条纹 分辨率控制部分 颜色显示 顶层模块 三.字符显示 四.图片显示 一.VGA介绍 VGA的全称是Video ...

  6. 【FPGA实验】VGA显示

    [FPGA实验]VGA显示 一. VGA介绍 ​ VGA的全称是Video Graphics Array,即视频图形阵列,是一个使用模拟信号进行视频传 输的标准.早期的CRT显示器由于设计制造上的原因 ...

  7. VGA显示学号姓名以及彩条

    目录 VGA显示原理 显示姓名学号以及色块 VGA显示原理 VGA(Video Graphics Array)视频图形阵列是 IBM 于1987年提出的一个使用模拟信号的电脑显示标准.VGA具有分辨率 ...

  8. VGA协议及VGA显示

    VGA协议及VGA显示 一.VGA 1. 外部接口 2. 色彩原理 3. 扫描方式 二.彩色条纹显示 三.字符显示 四.图片显示 五.总结 参考 一.VGA 1. 外部接口 VGA并没有特殊的外部芯片 ...

  9. 【FPGA】VGA显示文字、彩条、图片——基于DE2-115

    录 一.VGA概述 1.1 简述 1.2 管脚定义 1.3 行.场时序及分辨率 二.VGA显示文字 2.1 点阵汉字生成 2.2 工程建立 2.3 引入ip核-实现特定时钟频率+不同分辨率显示 2.3 ...

最新文章

  1. 2019 年ML NLP领域十大研究热点
  2. dede修改mysql,Dedecms(织梦)程序MySQL修复表和文章路径修改方法
  3. Gamma校正及其OpenCV实现
  4. 安全开发之碰撞检测与伤害计算逻辑
  5. 超越提升和迁移 充分利用云计算的七种方法
  6. 计算机工作原理 公开课,《计算机的基本工作原理》公开课材料(11页)-原创力文档...
  7. linux at24测试程序,linux 2.6下eeprom at24c08 i2c设备驱动(new style probe方式)
  8. 有钱了不起?!苹果猎头挖到马斯克没脾气,特斯拉股东公开求收购
  9. 统计局:去年12月天然气、电力生产增长较快
  10. DialogPlus
  11. 多布局怎么搭建_展会搭建如何吸引人的注意力?
  12. matlab怎样设置中文界面
  13. oracle10g exp下载,oracle 10g 导出数据 exp 10g
  14. 灰常实用的一键开关机电路,各位大佬进来mark一下?
  15. android 经验进度条,android ProgressBar(进度条)
  16. win10更新后闪屏处理方法
  17. React.Component
  18. java的mysql语句规范_mysql 规范
  19. ABC166E This Message Will Self-Destruct in 5s 题解
  20. matlab二阶阻尼震荡衰减,二阶欠阻尼电路的零响应输入-MATLAB课程设计.doc

热门文章

  1. 收获,不止SQL优化——抓住SQL的本质--第十四章
  2. springboot + vue项目跨域请求解决方案
  3. Spring Cloud 微服务实战系列-Ribbon整合RestTemplate实现负载均衡
  4. Oracle中两个重要的语句
  5. BZOJ3653 洛谷3899:谈笑风生——题解
  6. block--内存管理
  7. KCC创建复制拓扑失败-故障处理
  8. 解决Windows Server 2008 System4进程占用80端口 net stop http
  9. [重拾Oracle - 00]既然青春留不住,那么还是要学习-----工具:在线Oracle(Oracle Live SQL)...
  10. IOS 学习笔记 2015-04-15 手势密码(原)